@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
package/dist/ai/lanes.js
ADDED
|
@@ -0,0 +1,715 @@
|
|
|
1
|
+
import { exp } from "../exactMath.js";
|
|
2
|
+
import { distSq } from "../math.js";
|
|
3
|
+
import { heroOfState } from "../hero.js";
|
|
4
|
+
import { farthestReach } from "../attacks.js";
|
|
5
|
+
import { defineModule, moduleKey } from "./module.js";
|
|
6
|
+
import "./reach.js";
|
|
7
|
+
import { consider, curve, defineGoal, goals } from "./goals.js";
|
|
8
|
+
import { rules, words } from "./rules.js";
|
|
9
|
+
import { point, where } from "./geometry.js";
|
|
10
|
+
import { defineTask } from "./task.js";
|
|
11
|
+
import { squads } from "./squads.js";
|
|
12
|
+
import { Team, team } from "./team.js";
|
|
13
|
+
import { defineBrain } from "./define.js";
|
|
14
|
+
import { micro } from "./micro.js";
|
|
15
|
+
//#region src/ai/lanes.ts
|
|
16
|
+
/** How far from a lane's line a unit is on it */
|
|
17
|
+
var ON_LANE = 7;
|
|
18
|
+
/** How far from a lane's line a tower is by it */
|
|
19
|
+
var BY_LANE = 9;
|
|
20
|
+
/** How near an ally's hero one of theirs is for the two to be in a fight */
|
|
21
|
+
var FIGHTING = 10;
|
|
22
|
+
/** How far behind where it stands a hero falls back to, where none of its side's towers is nearer */
|
|
23
|
+
var FALL_BACK = 14;
|
|
24
|
+
/** Seconds between two recalls of a hero: one that was hurt in the channel walks */
|
|
25
|
+
var RECALL_AGAIN = 10;
|
|
26
|
+
/**
|
|
27
|
+
* Where a place is along a line of points, and how far off it: `along` in cells from the first point, `off` from the
|
|
28
|
+
* line's nearest point. What every question of a lane comes to
|
|
29
|
+
*/
|
|
30
|
+
function measure(points, at) {
|
|
31
|
+
let best = Infinity;
|
|
32
|
+
let along = 0;
|
|
33
|
+
let walked = 0;
|
|
34
|
+
for (let i = 1; i < points.length; i++) {
|
|
35
|
+
const a = points[i - 1];
|
|
36
|
+
const dx = points[i].x - a.x;
|
|
37
|
+
const dz = points[i].z - a.z;
|
|
38
|
+
const lengthSq = dx * dx + dz * dz;
|
|
39
|
+
const length = Math.sqrt(lengthSq);
|
|
40
|
+
const t = lengthSq > 0 ? Math.min(Math.max(((at.x - a.x) * dx + (at.z - a.z) * dz) / lengthSq, 0), 1) : 0;
|
|
41
|
+
const ox = at.x - (a.x + dx * t);
|
|
42
|
+
const oz = at.z - (a.z + dz * t);
|
|
43
|
+
const off = ox * ox + oz * oz;
|
|
44
|
+
if (off < best) {
|
|
45
|
+
best = off;
|
|
46
|
+
along = walked + length * t;
|
|
47
|
+
}
|
|
48
|
+
walked += length;
|
|
49
|
+
}
|
|
50
|
+
return {
|
|
51
|
+
along,
|
|
52
|
+
off: Math.sqrt(best)
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
/** The length of a line of points */
|
|
56
|
+
function lengthOf(points) {
|
|
57
|
+
let length = 0;
|
|
58
|
+
for (let i = 1; i < points.length; i++) length += Math.sqrt(distSq(points[i - 1], points[i]));
|
|
59
|
+
return length;
|
|
60
|
+
}
|
|
61
|
+
/** The point so far along a line of points from its first */
|
|
62
|
+
function pointAlong(points, along) {
|
|
63
|
+
let left = Math.max(0, along);
|
|
64
|
+
for (let i = 1; i < points.length; i++) {
|
|
65
|
+
const a = points[i - 1];
|
|
66
|
+
const length = Math.sqrt(distSq(a, points[i]));
|
|
67
|
+
if (left <= length && length > 0) {
|
|
68
|
+
const t = left / length;
|
|
69
|
+
return {
|
|
70
|
+
x: a.x + (points[i].x - a.x) * t,
|
|
71
|
+
z: a.z + (points[i].z - a.z) * t
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
left -= length;
|
|
75
|
+
}
|
|
76
|
+
return point(points[points.length - 1]);
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Where a place is on a side's lane: how far along from the side's end, how far off the line
|
|
80
|
+
*
|
|
81
|
+
* @beta
|
|
82
|
+
*/
|
|
83
|
+
function onLane(lane, at) {
|
|
84
|
+
const measured = measure(lane.points, at);
|
|
85
|
+
return {
|
|
86
|
+
along: lane.from === 0 ? measured.along : lane.length - measured.along,
|
|
87
|
+
off: measured.off
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* The point so far along a side's lane from its end
|
|
92
|
+
*
|
|
93
|
+
* @beta
|
|
94
|
+
*/
|
|
95
|
+
function laneAt(lane, along) {
|
|
96
|
+
const clamped = Math.min(Math.max(along, 0), lane.length);
|
|
97
|
+
return pointAlong(lane.points, lane.from === 0 ? clamped : lane.length - clamped);
|
|
98
|
+
}
|
|
99
|
+
/** A unit's share of its health */
|
|
100
|
+
function health(ai, unit) {
|
|
101
|
+
const max = unit.maxHealth ?? ai.view.strength.statsOf(unit).health;
|
|
102
|
+
return max > 0 ? unit.health / max : 1;
|
|
103
|
+
}
|
|
104
|
+
/** How far a tower reaches: its attack's range and its size, a cell more */
|
|
105
|
+
function reachOf(ai, tower) {
|
|
106
|
+
return farthestReach(ai.view.def(tower), ai.view.strength.statsOf(tower)) + ai.view.def(tower).radius + 1;
|
|
107
|
+
}
|
|
108
|
+
/** Their towers, as remembered: buildings of theirs that attack */
|
|
109
|
+
var theirTowers = (ai) => ai.cache("lanes.theirTowers", () => ai.view.enemies.known().buildings().alive().where((_entity, def) => !!def.attacks?.length));
|
|
110
|
+
/** Whether a place is in reach of one of their towers with no minion of its side in that tower's reach to take the shots */
|
|
111
|
+
function exposed(ai, at, pad = 0) {
|
|
112
|
+
for (const tower of theirTowers(ai)) {
|
|
113
|
+
const reach = reachOf(ai, tower) + pad;
|
|
114
|
+
if (distSq(tower, at) > reach * reach) continue;
|
|
115
|
+
if (!ai.view.all.units().alive().near(tower, reachOf(ai, tower)).where((unit) => ai.view.isFriendly(unit) && !heroOfState(unit) && !ai.view.def(unit).hero).length) return true;
|
|
116
|
+
}
|
|
117
|
+
return false;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Whom a hero of a lanes brain hits (micro's `targets`, the file's comment): the minion its next hit kills, one of their
|
|
121
|
+
* heroes not under their tower, a building (a tower its side's minions take the shots of), the weakest of the rest; never
|
|
122
|
+
* what stands where their tower would turn on it
|
|
123
|
+
*
|
|
124
|
+
* @beta
|
|
125
|
+
*/
|
|
126
|
+
var lanesTargets = (options = {}) => (ai, squad, foes) => {
|
|
127
|
+
const { view } = ai;
|
|
128
|
+
const hitters = squad.units();
|
|
129
|
+
const middle = hitters.centre();
|
|
130
|
+
if (!middle) return void 0;
|
|
131
|
+
const safe = foes.where((foe, def) => {
|
|
132
|
+
if (def.kind === "building") return def.attacks?.length ? !exposed(ai, foe, -reachOf(ai, foe)) : !exposed(ai, foe);
|
|
133
|
+
if (def.hero || heroOfState(foe)) return !theirTowers(ai).some((tower) => {
|
|
134
|
+
const reach = reachOf(ai, tower) + 2;
|
|
135
|
+
return distSq(tower, foe) <= reach * reach;
|
|
136
|
+
});
|
|
137
|
+
return !exposed(ai, foe);
|
|
138
|
+
});
|
|
139
|
+
if (!safe.length) return void 0;
|
|
140
|
+
const nearest = (set) => set.reduce((best, each) => !best || distSq(each, middle) < distSq(best, middle) ? each : best, void 0);
|
|
141
|
+
if (options.lastHits !== false) {
|
|
142
|
+
const blow = Math.max(0, ...hitters.map((unit) => view.strength.statsOf(unit).attackDamage));
|
|
143
|
+
const last = nearest(safe.where((foe, def) => def.kind === "unit" && !def.hero && !heroOfState(foe) && foe.health <= blow).items);
|
|
144
|
+
if (last) return last;
|
|
145
|
+
}
|
|
146
|
+
const heroes = safe.where((foe, def) => !!def.hero || !!heroOfState(foe));
|
|
147
|
+
if (heroes.length) return heroes.items.reduce((best, each) => health(ai, each) < health(ai, best) ? each : best);
|
|
148
|
+
const buildings = safe.buildings();
|
|
149
|
+
if (buildings.length) return nearest(buildings.items);
|
|
150
|
+
return safe.items.reduce((best, each) => each.health < best.health || each.health === best.health && distSq(each, middle) < distSq(best, middle) ? each : best);
|
|
151
|
+
};
|
|
152
|
+
/**
|
|
153
|
+
* The lanes of a lanes brain, read as its side sees them, and what its heroes do on them (`ai.module('lanes')`'s
|
|
154
|
+
* `play`): the module's goals read it
|
|
155
|
+
*
|
|
156
|
+
* @beta
|
|
157
|
+
*/
|
|
158
|
+
var LanesPlay = class {
|
|
159
|
+
ai;
|
|
160
|
+
options;
|
|
161
|
+
/** What the play keeps between thinks, as `LanesPlayMemory`: the heroes resting and when each was sent home */
|
|
162
|
+
memory = {
|
|
163
|
+
v: 1,
|
|
164
|
+
resting: {},
|
|
165
|
+
recalled: {},
|
|
166
|
+
sent: {}
|
|
167
|
+
};
|
|
168
|
+
sides;
|
|
169
|
+
constructor(ai, options) {
|
|
170
|
+
this.ai = ai;
|
|
171
|
+
this.options = options;
|
|
172
|
+
}
|
|
173
|
+
/** The lanes as its side reads them: each measured from the end its side's spawner stands at. None it has no end of */
|
|
174
|
+
lanes() {
|
|
175
|
+
if (this.sides) return this.sides;
|
|
176
|
+
const { view } = this.ai;
|
|
177
|
+
const only = this.options.lanes;
|
|
178
|
+
const ours = (end) => !!end && (end.player === view.playerId || view.player(end.player)?.relation === "ally");
|
|
179
|
+
const found = [];
|
|
180
|
+
for (const lane of view.lanes()) {
|
|
181
|
+
if (only && !only.includes(lane.path)) continue;
|
|
182
|
+
const from = ours(lane.ends[0]) ? 0 : ours(lane.ends[1]) ? 1 : void 0;
|
|
183
|
+
if (from === void 0) continue;
|
|
184
|
+
found.push({
|
|
185
|
+
path: lane.path,
|
|
186
|
+
points: lane.points,
|
|
187
|
+
from,
|
|
188
|
+
length: lengthOf(lane.points)
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
if (view.players.length) this.sides = found;
|
|
192
|
+
return found;
|
|
193
|
+
}
|
|
194
|
+
/** A lane of its side's, by its path's name */
|
|
195
|
+
lane(path) {
|
|
196
|
+
return this.lanes().find((lane) => lane.path === path);
|
|
197
|
+
}
|
|
198
|
+
/** The units it commands: its heroes, or what `units` says. Alive */
|
|
199
|
+
commanded(units = this.ai.view.mine) {
|
|
200
|
+
const { units: commands } = this.options;
|
|
201
|
+
const alive = units.units().alive();
|
|
202
|
+
return commands ? alive.where((unit) => commands(this.ai, unit)) : alive.heroes();
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Where its heroes rest: `home`, else its side's building nearest the middle of its side's ends of the lanes (a core),
|
|
206
|
+
* else that middle, else its first building
|
|
207
|
+
*/
|
|
208
|
+
home() {
|
|
209
|
+
const { home } = this.options;
|
|
210
|
+
if (home) return typeof home === "function" ? home(this.ai) : point(home);
|
|
211
|
+
const ends = this.lanes().map((lane) => laneAt(lane, 0));
|
|
212
|
+
if (ends.length) {
|
|
213
|
+
const middle = {
|
|
214
|
+
x: ends.reduce((sum, end) => sum + end.x, 0) / ends.length,
|
|
215
|
+
z: ends.reduce((sum, end) => sum + end.z, 0) / ends.length
|
|
216
|
+
};
|
|
217
|
+
const { view } = this.ai;
|
|
218
|
+
const building = view.all.buildings().alive().where((entity) => view.isFriendly(entity)).near(middle, 16).nearest(middle);
|
|
219
|
+
return building ? point(building) : middle;
|
|
220
|
+
}
|
|
221
|
+
const first = this.ai.view.home();
|
|
222
|
+
return first && point(first);
|
|
223
|
+
}
|
|
224
|
+
/** Each lane as it stands this think: fronts, minions, heroes, towers. Once a think */
|
|
225
|
+
states() {
|
|
226
|
+
return this.ai.cache("lanes.states", () => this.lanes().map((lane) => this.stateOf(lane)));
|
|
227
|
+
}
|
|
228
|
+
/** One lane as it stands this think */
|
|
229
|
+
state(path) {
|
|
230
|
+
return this.states().find((state) => state.lane.path === path);
|
|
231
|
+
}
|
|
232
|
+
stateOf(lane) {
|
|
233
|
+
const { ai } = this;
|
|
234
|
+
const { view } = ai;
|
|
235
|
+
const state = {
|
|
236
|
+
lane,
|
|
237
|
+
ours: [],
|
|
238
|
+
theirs: [],
|
|
239
|
+
allies: [],
|
|
240
|
+
enemies: [],
|
|
241
|
+
ourTowers: [],
|
|
242
|
+
theirTowers: []
|
|
243
|
+
};
|
|
244
|
+
for (const unit of view.all.units().alive()) {
|
|
245
|
+
const friendly = view.isFriendly(unit);
|
|
246
|
+
if (!friendly && !(view.isHostile(unit) && !view.isCreep(unit))) continue;
|
|
247
|
+
const { along, off } = onLane(lane, unit);
|
|
248
|
+
if (off > ON_LANE) continue;
|
|
249
|
+
if (!!view.def(unit).hero || !!heroOfState(unit)) {
|
|
250
|
+
if (!friendly) state.enemies.push(unit);
|
|
251
|
+
else if (unit.owner !== view.playerId) state.allies.push(unit);
|
|
252
|
+
continue;
|
|
253
|
+
}
|
|
254
|
+
if (friendly) {
|
|
255
|
+
state.ours.push(unit);
|
|
256
|
+
if (state.front === void 0 || along > state.front) state.front = along;
|
|
257
|
+
} else {
|
|
258
|
+
state.theirs.push(unit);
|
|
259
|
+
if (state.theirFront === void 0 || along < state.theirFront) state.theirFront = along;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
const towers = view.all.known().buildings().alive().where((_entity, def) => !!def.attacks?.length);
|
|
263
|
+
for (const tower of towers) {
|
|
264
|
+
const { along, off } = onLane(lane, tower);
|
|
265
|
+
if (off > BY_LANE) continue;
|
|
266
|
+
if (view.isFriendly(tower)) state.ourTowers.push({
|
|
267
|
+
tower,
|
|
268
|
+
at: along
|
|
269
|
+
});
|
|
270
|
+
else if (view.isHostile(tower) && !view.isCreep(tower)) state.theirTowers.push({
|
|
271
|
+
tower,
|
|
272
|
+
at: along
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
return state;
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Where a hero walks on a lane now: a little behind its side's front; with no wave there, by its side's furthest tower
|
|
279
|
+
* on it (or a little out of its end); never into reach of a tower of theirs that no minion of its side is in reach of
|
|
280
|
+
*/
|
|
281
|
+
spot(path) {
|
|
282
|
+
const state = this.state(path);
|
|
283
|
+
if (!state) return void 0;
|
|
284
|
+
const { lane } = state;
|
|
285
|
+
const behind = this.options.behind ?? 3;
|
|
286
|
+
let along;
|
|
287
|
+
if (state.front !== void 0) along = state.front - behind;
|
|
288
|
+
else along = Math.max(6, ...state.ourTowers.map((each) => each.at - 2));
|
|
289
|
+
for (const { tower, at } of state.theirTowers) {
|
|
290
|
+
const reach = reachOf(this.ai, tower);
|
|
291
|
+
if (!state.ours.some((unit) => distSq(unit, tower) <= reach * reach) && along > at - reach - 1) along = at - reach - 1;
|
|
292
|
+
}
|
|
293
|
+
return laneAt(lane, Math.max(0, along));
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* What is at stake on a lane, 0..1: how far along its side's wave is (a tower of theirs to take, their core), or how
|
|
297
|
+
* near its side's end theirs is (its own towers under attack), whichever is more
|
|
298
|
+
*/
|
|
299
|
+
stake(path) {
|
|
300
|
+
const state = this.state(path);
|
|
301
|
+
if (!state) return 0;
|
|
302
|
+
const { length } = state.lane;
|
|
303
|
+
const ours = state.front === void 0 ? 0 : state.front / length;
|
|
304
|
+
const theirs = state.theirFront === void 0 ? 0 : 1 - state.theirFront / length;
|
|
305
|
+
return Math.min(1, Math.max(ours, theirs));
|
|
306
|
+
}
|
|
307
|
+
/** Where a hero outmatched on a lane falls back to: its side's nearest tower behind it, or so far back along it */
|
|
308
|
+
fallBack(path, from) {
|
|
309
|
+
const state = this.state(path);
|
|
310
|
+
if (!state) return void 0;
|
|
311
|
+
const { along } = onLane(state.lane, from);
|
|
312
|
+
const behind = state.ourTowers.filter((each) => each.at < along - 2).sort((a, b) => b.at - a.at)[0];
|
|
313
|
+
return behind ? laneAt(state.lane, behind.at - 2) : laneAt(state.lane, along - FALL_BACK);
|
|
314
|
+
}
|
|
315
|
+
/** The odds of its side against theirs where a unit stands (`Strength.odds`): their towers that reach there count */
|
|
316
|
+
oddsAt(at, reach = 9) {
|
|
317
|
+
const { view } = this.ai;
|
|
318
|
+
const near = view.all.units().alive().near(at, reach);
|
|
319
|
+
const ours = near.where((unit) => view.isFriendly(unit));
|
|
320
|
+
const theirs = [...near.where((unit) => view.isHostile(unit)).items];
|
|
321
|
+
for (const tower of theirTowers(this.ai)) {
|
|
322
|
+
const towerReach = reachOf(this.ai, tower);
|
|
323
|
+
if (distSq(tower, at) <= towerReach * towerReach) theirs.push(tower);
|
|
324
|
+
}
|
|
325
|
+
return theirs.length ? view.strength.odds(ours, theirs) : 1;
|
|
326
|
+
}
|
|
327
|
+
/** The heroes resting, alive */
|
|
328
|
+
resting() {
|
|
329
|
+
return this.commanded().where((hero) => this.memory.resting[hero.id] !== void 0).items;
|
|
330
|
+
}
|
|
331
|
+
/** Heroes turned for home, those back out: what the `lanes.back` goal reads. Each think, before the goals */
|
|
332
|
+
think() {
|
|
333
|
+
const { ai } = this;
|
|
334
|
+
const { memory } = this;
|
|
335
|
+
const backAt = this.options.backAt ?? .35;
|
|
336
|
+
const returnAt = this.options.returnAt ?? .85;
|
|
337
|
+
const restFor = (this.options.restFor ?? 40) * ai.session.tickRate;
|
|
338
|
+
const heroes = this.commanded();
|
|
339
|
+
for (const id in memory.resting) if (!heroes.has(Number(id))) delete memory.resting[id];
|
|
340
|
+
for (const id in memory.recalled) if (!heroes.has(Number(id))) delete memory.recalled[id];
|
|
341
|
+
for (const id in memory.sent) if (memory.resting[id] === void 0) delete memory.sent[id];
|
|
342
|
+
for (const hero of heroes) {
|
|
343
|
+
const share = health(ai, hero);
|
|
344
|
+
const since = memory.resting[hero.id];
|
|
345
|
+
if (since === void 0) {
|
|
346
|
+
if (share < backAt) {
|
|
347
|
+
memory.resting[hero.id] = ai.tick;
|
|
348
|
+
ai.decide(`${hero.type} ${hero.id} goes home to rest at ${Math.round(share * 100)}%`, { kind: "lanes" });
|
|
349
|
+
}
|
|
350
|
+
} else if (share >= returnAt || ai.tick - since >= restFor) {
|
|
351
|
+
delete memory.resting[hero.id];
|
|
352
|
+
ai.decide(`${hero.type} ${hero.id} rested, back out at ${Math.round(share * 100)}%`, { kind: "lanes" });
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
/**
|
|
357
|
+
* Sends a resting hero home: by an ability that takes it there (one whose effects, at its end, teleport home), where
|
|
358
|
+
* it has one ready and nothing hostile is near; else on foot. Nothing while it channels, or once home
|
|
359
|
+
*/
|
|
360
|
+
sendHome(hero) {
|
|
361
|
+
const { ai } = this;
|
|
362
|
+
const home = this.home();
|
|
363
|
+
if (!home || !hero.own || hero.own.hidden) return;
|
|
364
|
+
if (distSq(hero, home) <= 64 || hero.own.order === "cast") return;
|
|
365
|
+
const recalled = this.memory.recalled[hero.id];
|
|
366
|
+
const safe = !ai.view.hostile.alive().near(hero, 12).length;
|
|
367
|
+
if (this.options.recall !== false && safe && (recalled === void 0 || ai.tick - recalled >= RECALL_AGAIN * ai.session.tickRate)) {
|
|
368
|
+
const ability = hero.own.abilities?.find((state) => {
|
|
369
|
+
if (state.level < 1 || state.cooldown > 0 || state.charges === 0) return false;
|
|
370
|
+
const def = ai.registry.ability(state.id);
|
|
371
|
+
return [...def.effects, ...def.channel?.finished ?? []].some((effect) => effect.type === "teleport" && effect.to === "home");
|
|
372
|
+
});
|
|
373
|
+
if (ability) {
|
|
374
|
+
this.memory.recalled[hero.id] = ai.tick;
|
|
375
|
+
ai.send({
|
|
376
|
+
type: "cast",
|
|
377
|
+
entities: [hero.id],
|
|
378
|
+
ability: ability.id
|
|
379
|
+
});
|
|
380
|
+
ai.decide(`${hero.type} ${hero.id} recalls home`, { kind: "lanes" });
|
|
381
|
+
return;
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
if (hero.own.order === "move") return;
|
|
385
|
+
const sent = this.memory.sent[hero.id];
|
|
386
|
+
if (sent !== void 0 && ai.tick - sent < 3 * ai.session.tickRate) return;
|
|
387
|
+
this.memory.sent[hero.id] = ai.tick;
|
|
388
|
+
ai.send({
|
|
389
|
+
type: "order",
|
|
390
|
+
entities: [hero.id],
|
|
391
|
+
order: {
|
|
392
|
+
type: "move",
|
|
393
|
+
point: home
|
|
394
|
+
}
|
|
395
|
+
});
|
|
396
|
+
}
|
|
397
|
+
/** An ally's hero in a fight one of its heroes could go to: the most hurt, near enough; or a person's call for help */
|
|
398
|
+
call(from) {
|
|
399
|
+
const help = this.options.help;
|
|
400
|
+
if (help === false) return void 0;
|
|
401
|
+
const { ai } = this;
|
|
402
|
+
const { view } = ai;
|
|
403
|
+
const reach = help?.reach ?? 30;
|
|
404
|
+
const theirHeroes = view.enemies.units().alive().where((unit, def) => !!def.hero || !!heroOfState(unit));
|
|
405
|
+
let best;
|
|
406
|
+
for (const ally of view.allies.units().alive().heroes()) {
|
|
407
|
+
if (distSq(ally, from) > reach * reach || !theirHeroes.near(ally, FIGHTING).length) continue;
|
|
408
|
+
if (!best || health(ai, ally) < health(ai, best)) best = ally;
|
|
409
|
+
}
|
|
410
|
+
if (best) return point(best);
|
|
411
|
+
const ping = ai.area(Team).enabled ? ai.area(Team).requests("help").find((request) => request.by === "ping" && distSq(request.at, from) <= reach * reach) : void 0;
|
|
412
|
+
return ping && point(ping.at);
|
|
413
|
+
}
|
|
414
|
+
/** The ally's hero nearest a place: what a hero helping goes with */
|
|
415
|
+
allyAt(at) {
|
|
416
|
+
return this.ai.view.allies.units().alive().heroes().near(at, 2).first();
|
|
417
|
+
}
|
|
418
|
+
/** The nearest camp it may take from a place: not cleared, in reach, its creeps (as seen) beatable */
|
|
419
|
+
camp(hero) {
|
|
420
|
+
const camps = this.options.camps;
|
|
421
|
+
if (camps === false) return void 0;
|
|
422
|
+
const { ai } = this;
|
|
423
|
+
const { view } = ai;
|
|
424
|
+
const reach = camps?.reach ?? 50;
|
|
425
|
+
const odds = camps?.odds ?? .6;
|
|
426
|
+
let best;
|
|
427
|
+
for (const camp of view.camps()) {
|
|
428
|
+
if (camp.cleared) continue;
|
|
429
|
+
const d = distSq(camp, hero);
|
|
430
|
+
if (d > reach * reach || best && d >= best.d) continue;
|
|
431
|
+
const creeps = view.creeps.alive().near(camp, 8);
|
|
432
|
+
if (creeps.length ? view.strength.odds([hero], creeps) >= odds : camp.level <= 2 + 2 * (heroOfState(hero)?.level ?? 1)) best = {
|
|
433
|
+
at: {
|
|
434
|
+
x: camp.x,
|
|
435
|
+
z: camp.z
|
|
436
|
+
},
|
|
437
|
+
d
|
|
438
|
+
};
|
|
439
|
+
}
|
|
440
|
+
return best?.at;
|
|
441
|
+
}
|
|
442
|
+
};
|
|
443
|
+
/** The kit's lane task: a hero walks a lane behind its side's wave (`LanesPlay.spot`), falling back once outmatched */
|
|
444
|
+
var PUSH = defineTask({
|
|
445
|
+
id: "lanes.push",
|
|
446
|
+
start(ai, squad, state) {
|
|
447
|
+
state.phase = "going";
|
|
448
|
+
state.phaseSince = ai.tick;
|
|
449
|
+
pushOn(ai, squad, state, true);
|
|
450
|
+
},
|
|
451
|
+
think(ai, squad, state) {
|
|
452
|
+
pushOn(ai, squad, state, false);
|
|
453
|
+
},
|
|
454
|
+
where: (ai, _squad, state) => playOf(ai)?.spot(state.data.lane),
|
|
455
|
+
handles: [
|
|
456
|
+
"retreat",
|
|
457
|
+
"regroup",
|
|
458
|
+
"reinforce"
|
|
459
|
+
],
|
|
460
|
+
standing: true
|
|
461
|
+
});
|
|
462
|
+
/** The lanes module's play, where the brain has one */
|
|
463
|
+
var playOf = (ai) => ai.module(LANES)?.play;
|
|
464
|
+
/** A hero on its lane: to its spot, fighting on the way; back along it when outmatched */
|
|
465
|
+
function pushOn(ai, squad, state, first) {
|
|
466
|
+
const play = playOf(ai);
|
|
467
|
+
const path = state.data.lane;
|
|
468
|
+
const lane = play?.state(path);
|
|
469
|
+
const middle = squad.centre();
|
|
470
|
+
if (!play || !lane || !middle) {
|
|
471
|
+
squad.finish("lost");
|
|
472
|
+
return;
|
|
473
|
+
}
|
|
474
|
+
const fighting = ai.view.hostile.alive().near(middle, 9).length > 0;
|
|
475
|
+
if (fighting && play.oddsAt(middle) < (play.options.backOdds ?? .3)) {
|
|
476
|
+
const to = play.fallBack(path, middle);
|
|
477
|
+
if (to) {
|
|
478
|
+
ai.decide(`squad ${squad.name} falls back along ${path} to ${where(to)}: outmatched (odds ${play.oddsAt(middle).toFixed(2)})`, { kind: "lanes" });
|
|
479
|
+
squad.retreat(to, "outmatched on its lane");
|
|
480
|
+
return;
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
const spot = play.spot(path);
|
|
484
|
+
const phase = lane.front !== void 0 ? "pushing" : "waiting";
|
|
485
|
+
if (state.phase !== phase) {
|
|
486
|
+
state.phase = phase;
|
|
487
|
+
state.phaseSince = ai.tick;
|
|
488
|
+
}
|
|
489
|
+
const idle = squad.idleUnits();
|
|
490
|
+
if (fighting && !idle.length) return;
|
|
491
|
+
const sentTo = state.memory.at;
|
|
492
|
+
const moved = !sentTo || distSq(sentTo, spot) > 16;
|
|
493
|
+
const away = squad.units().some((unit) => distSq(unit, spot) > 16);
|
|
494
|
+
if (!first && !(away && (moved || idle.length && squad.mayResend()))) return;
|
|
495
|
+
state.memory.at = point(spot);
|
|
496
|
+
squad.fight(spot);
|
|
497
|
+
}
|
|
498
|
+
/**
|
|
499
|
+
* What finds a lanes brain's module with its shape (`ai.module(LANES)`)
|
|
500
|
+
*
|
|
501
|
+
* @beta
|
|
502
|
+
*/
|
|
503
|
+
var LANES = moduleKey("lanes");
|
|
504
|
+
/** The goals of a lanes brain over its play (the file's comment) */
|
|
505
|
+
function laneGoals(ai, play) {
|
|
506
|
+
/** Its heroes free to go: alive, not resting */
|
|
507
|
+
const free = (available) => play.commanded(available).where((hero) => play.memory.resting[hero.id] === void 0);
|
|
508
|
+
const nearestTo = (set, at) => at ? set.nearest(at) : set.first();
|
|
509
|
+
const push = (ai.session.can.computer?.lanes() ?? []).map((lane) => lane.path).filter((path) => !play.options.lanes || play.options.lanes.includes(path)).map((path) => {
|
|
510
|
+
const id = `lanes.push:${path}`;
|
|
511
|
+
return defineGoal({
|
|
512
|
+
id,
|
|
513
|
+
weight: 1,
|
|
514
|
+
commitment: 30,
|
|
515
|
+
considerations: [
|
|
516
|
+
consider("a lane of its side", () => play.lane(path) ? 1 : 0, curve.step(1)),
|
|
517
|
+
consider("a hero free", () => free(ai.view.mine).length, curve.step(1)),
|
|
518
|
+
consider("its wave on it", () => ai.view.strength.sum(play.state(path)?.ours ?? []), curve.custom((x) => .3 + .7 * (1 - exp(-x / 60)))),
|
|
519
|
+
consider("what is at stake", () => play.stake(path), curve.custom((x) => .4 + .6 * x)),
|
|
520
|
+
consider("the odds at its front", () => {
|
|
521
|
+
const spot = play.spot(path);
|
|
522
|
+
return spot ? play.oddsAt(spot, 14) : 0;
|
|
523
|
+
}, curve.custom((odds) => .2 + odds)),
|
|
524
|
+
consider("allies already on it", () => play.state(path)?.allies.length ?? 0, curve.inverse(2)),
|
|
525
|
+
consider("how far its hero is", () => {
|
|
526
|
+
const spot = play.spot(path);
|
|
527
|
+
const hero = nearestTo(free(ai.view.mine), spot);
|
|
528
|
+
return hero && spot ? Math.sqrt(distSq(hero, spot)) : 0;
|
|
529
|
+
}, curve.inverse(60))
|
|
530
|
+
],
|
|
531
|
+
claims: { units: (_ai, available) => {
|
|
532
|
+
const hero = nearestTo(free(available), play.spot(path));
|
|
533
|
+
return hero ? [hero] : [];
|
|
534
|
+
} },
|
|
535
|
+
run: (_ai, claimed) => {
|
|
536
|
+
const squad = claimed.squad(id, claimed.units, { retreatAt: false });
|
|
537
|
+
if (squad.idle) squad.task(PUSH, { lane: path });
|
|
538
|
+
}
|
|
539
|
+
});
|
|
540
|
+
});
|
|
541
|
+
const back = defineGoal({
|
|
542
|
+
id: "lanes.back",
|
|
543
|
+
weight: 10,
|
|
544
|
+
urgent: true,
|
|
545
|
+
commitment: 0,
|
|
546
|
+
considerations: [consider("a hero to rest", () => play.resting().length, curve.step(1))],
|
|
547
|
+
claims: { units: () => play.resting() },
|
|
548
|
+
run: (ai, claimed) => {
|
|
549
|
+
const hold = ai.goals.held("lanes.back");
|
|
550
|
+
const resting = play.resting();
|
|
551
|
+
const fresh = resting.filter((hero) => !hold?.units.includes(hero.id)).map((hero) => hero.id);
|
|
552
|
+
if (fresh.length) {
|
|
553
|
+
ai.goals.take(fresh, "urgent");
|
|
554
|
+
ai.goals.give("lanes.back", fresh);
|
|
555
|
+
}
|
|
556
|
+
const rested = claimed.units.where((hero) => play.memory.resting[hero.id] === void 0).ids();
|
|
557
|
+
if (rested.size) ai.goals.drop("lanes.back", rested);
|
|
558
|
+
for (const hero of resting) play.sendHome(hero);
|
|
559
|
+
}
|
|
560
|
+
});
|
|
561
|
+
const help = defineGoal({
|
|
562
|
+
id: "lanes.help",
|
|
563
|
+
weight: 1.3,
|
|
564
|
+
commitment: 6,
|
|
565
|
+
considerations: [consider("an ally in a fight near", () => {
|
|
566
|
+
const hero = free(ai.view.mine).first();
|
|
567
|
+
return hero && play.call(hero) ? 1 : 0;
|
|
568
|
+
}, curve.step(1)), consider("the odds there with it", () => {
|
|
569
|
+
const hero = free(ai.view.mine).first();
|
|
570
|
+
const at = hero && play.call(hero);
|
|
571
|
+
if (!hero || !at) return 0;
|
|
572
|
+
const near = ai.view.all.units().alive().near(at, 12);
|
|
573
|
+
const theirs = near.where((unit) => ai.view.isHostile(unit));
|
|
574
|
+
return theirs.length ? ai.view.strength.odds([...near.where((unit) => ai.view.isFriendly(unit)).items, hero], theirs) : 1;
|
|
575
|
+
}, curve.custom((odds) => odds >= ((play.options.help || {}).odds ?? .4) ? odds : 0))],
|
|
576
|
+
claims: { units: (_ai, available) => {
|
|
577
|
+
const heroes = free(available);
|
|
578
|
+
const hero = heroes.first();
|
|
579
|
+
const at = hero && play.call(hero);
|
|
580
|
+
const chosen = at && heroes.nearest(at);
|
|
581
|
+
return chosen ? [chosen] : [];
|
|
582
|
+
} },
|
|
583
|
+
run: (ai, claimed) => {
|
|
584
|
+
const hero = claimed.units.first();
|
|
585
|
+
const at = hero && play.call(hero);
|
|
586
|
+
if (!hero || !at) return;
|
|
587
|
+
const ally = play.allyAt(at);
|
|
588
|
+
const squad = claimed.squad("lanes.help", claimed.units, { retreatAt: false });
|
|
589
|
+
if (claimed.first) ai.decide(`${hero.type} ${hero.id} goes to help at ${where(at)}`, { kind: "lanes" });
|
|
590
|
+
if (squad.idle || ally && squad.current?.kind !== "escort") {
|
|
591
|
+
if (ally) squad.escort(ally.id);
|
|
592
|
+
else squad.attack(at);
|
|
593
|
+
}
|
|
594
|
+
}
|
|
595
|
+
});
|
|
596
|
+
const camp = defineGoal({
|
|
597
|
+
id: "lanes.camp",
|
|
598
|
+
weight: .6,
|
|
599
|
+
commitment: 15,
|
|
600
|
+
considerations: [consider("no wave to walk with", () => play.states().filter((state) => state.ours.length > 0).length, curve.inverse(.01)), consider("a camp it can take", () => {
|
|
601
|
+
const hero = free(ai.view.mine).first();
|
|
602
|
+
return hero && play.camp(hero) ? 1 : 0;
|
|
603
|
+
}, curve.step(1))],
|
|
604
|
+
claims: { units: (_ai, available) => {
|
|
605
|
+
const hero = free(available).first();
|
|
606
|
+
return hero && play.camp(hero) ? [hero] : [];
|
|
607
|
+
} },
|
|
608
|
+
run: (_ai, claimed) => {
|
|
609
|
+
const hero = claimed.units.first();
|
|
610
|
+
const at = hero && play.camp(hero);
|
|
611
|
+
const squad = claimed.squad("lanes.camp", claimed.units, { retreatAt: false });
|
|
612
|
+
if (squad.idle && at) squad.creep(at);
|
|
613
|
+
}
|
|
614
|
+
});
|
|
615
|
+
return [
|
|
616
|
+
...push,
|
|
617
|
+
back,
|
|
618
|
+
...play.options.help === false ? [] : [help],
|
|
619
|
+
...play.options.camps === false ? [] : [camp]
|
|
620
|
+
];
|
|
621
|
+
}
|
|
622
|
+
/**
|
|
623
|
+
* The module of a lanes brain: the lanes read for its side, its heroes' rest, and its goals put on the picker (the
|
|
624
|
+
* file's comment). Its options under the brain's settings (`AiSettings.lanes`)
|
|
625
|
+
*
|
|
626
|
+
* @beta
|
|
627
|
+
*/
|
|
628
|
+
var lanesPlay = (options = {}) => defineModule({
|
|
629
|
+
id: "lanes",
|
|
630
|
+
make: (ai) => {
|
|
631
|
+
const play = new LanesPlay(ai, {
|
|
632
|
+
...options,
|
|
633
|
+
...ai.settings.lanes
|
|
634
|
+
});
|
|
635
|
+
ai.squads.define(PUSH);
|
|
636
|
+
ai.goals.add(...laneGoals(ai, play));
|
|
637
|
+
return {
|
|
638
|
+
id: "lanes",
|
|
639
|
+
version: 1,
|
|
640
|
+
phase: "decide",
|
|
641
|
+
play,
|
|
642
|
+
think: () => play.think(),
|
|
643
|
+
save: () => structuredClone(play.memory),
|
|
644
|
+
restore: (data) => {
|
|
645
|
+
const kept = data && typeof data === "object" ? data : {};
|
|
646
|
+
play.memory.resting = { ...kept.resting };
|
|
647
|
+
play.memory.recalled = { ...kept.recalled };
|
|
648
|
+
play.memory.sent = { ...kept.sent };
|
|
649
|
+
},
|
|
650
|
+
inspect: () => ({
|
|
651
|
+
lanes: play.states().map((state) => ({
|
|
652
|
+
lane: state.lane.path,
|
|
653
|
+
front: state.front === void 0 ? void 0 : Math.round(state.front),
|
|
654
|
+
theirFront: state.theirFront === void 0 ? void 0 : Math.round(state.theirFront),
|
|
655
|
+
ours: state.ours.length,
|
|
656
|
+
theirs: state.theirs.length
|
|
657
|
+
})),
|
|
658
|
+
resting: Object.keys(play.memory.resting).map(Number)
|
|
659
|
+
})
|
|
660
|
+
};
|
|
661
|
+
}
|
|
662
|
+
});
|
|
663
|
+
/**
|
|
664
|
+
* The engine's computer player for a game of lanes (`lanesPack`): a brain of its rules, the words, `lanesPlay`, the
|
|
665
|
+
* team, the picker, squads and micro (the file's comment). Heroes walk the lanes with their waves, rest at home when
|
|
666
|
+
* hurt, help an ally's hero, take a camp with no wave to walk with. A variant is `lanesBrain.with({ ... })`; a game's
|
|
667
|
+
* own lanes brain is `lanesBrainOf({ id, lanes, ... })`
|
|
668
|
+
*
|
|
669
|
+
* @beta
|
|
670
|
+
*/
|
|
671
|
+
function lanesBrainOf(def) {
|
|
672
|
+
const { lanes, modules = [], settings, ...rest } = def;
|
|
673
|
+
return defineBrain({
|
|
674
|
+
...rest,
|
|
675
|
+
settings: {
|
|
676
|
+
...settings,
|
|
677
|
+
micro: {
|
|
678
|
+
heroesFlee: false,
|
|
679
|
+
unitsFlee: false,
|
|
680
|
+
focusEvery: 2,
|
|
681
|
+
targets: lanesTargets(lanes),
|
|
682
|
+
...settings?.micro
|
|
683
|
+
},
|
|
684
|
+
team: {
|
|
685
|
+
defendUsers: false,
|
|
686
|
+
askForHelp: false,
|
|
687
|
+
...settings?.team
|
|
688
|
+
}
|
|
689
|
+
},
|
|
690
|
+
modules: [
|
|
691
|
+
defineModule({
|
|
692
|
+
id: "rules",
|
|
693
|
+
make: (ai) => rules(ai.def.rules ?? [])(ai)
|
|
694
|
+
}),
|
|
695
|
+
words(),
|
|
696
|
+
team(),
|
|
697
|
+
lanesPlay(lanes),
|
|
698
|
+
...modules,
|
|
699
|
+
goals(),
|
|
700
|
+
squads(),
|
|
701
|
+
micro()
|
|
702
|
+
]
|
|
703
|
+
});
|
|
704
|
+
}
|
|
705
|
+
/**
|
|
706
|
+
* The engine's computer player for a game of lanes, as it is: `lanesBrainOf({ id: 'core.lanes' })`. List it in the
|
|
707
|
+
* game's `Rules.brains` and seat it (`world.computers.seat(player, { brain: lanesBrain })`)
|
|
708
|
+
*
|
|
709
|
+
* @beta
|
|
710
|
+
*/
|
|
711
|
+
var lanesBrain = lanesBrainOf({ id: "core.lanes" });
|
|
712
|
+
//#endregion
|
|
713
|
+
export { LANES, LanesPlay, laneAt, lanesBrain, lanesBrainOf, lanesPlay, lanesTargets, onLane };
|
|
714
|
+
|
|
715
|
+
//# sourceMappingURL=lanes.js.map
|