@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
|
@@ -0,0 +1,720 @@
|
|
|
1
|
+
import { distSq } from "../../math.js";
|
|
2
|
+
import { baseStats } from "../../defs.js";
|
|
3
|
+
import { heroOfState } from "../../hero.js";
|
|
4
|
+
import { defineModule, moduleKey } from "../module.js";
|
|
5
|
+
import { consider, curve, defineGoal } from "../goals.js";
|
|
6
|
+
import { where } from "../geometry.js";
|
|
7
|
+
import { flagOf } from "../profiles.js";
|
|
8
|
+
import { Defence } from "../defence.js";
|
|
9
|
+
import { Team } from "../team.js";
|
|
10
|
+
import { Waves } from "../waves.js";
|
|
11
|
+
//#region src/ai/melee/goals.ts
|
|
12
|
+
/**
|
|
13
|
+
* What finds the melee army's module with its shape (`ai.module(MELEE_ARMY)`)
|
|
14
|
+
*
|
|
15
|
+
* @beta
|
|
16
|
+
*/
|
|
17
|
+
var MELEE_ARMY = moduleKey("melee.army");
|
|
18
|
+
/**
|
|
19
|
+
* The melee brain's army (`MeleeArmy`) of a brain: its waves, numbers and memory, for the tests and the debug tools.
|
|
20
|
+
* Throws for a brain without the `melee.army` module
|
|
21
|
+
*
|
|
22
|
+
* @beta
|
|
23
|
+
*/
|
|
24
|
+
function meleeArmyOf(ai) {
|
|
25
|
+
const module = ai.module(MELEE_ARMY);
|
|
26
|
+
if (!module?.army) throw new Error(`The brain "${ai.def.id}" has no melee.army module`);
|
|
27
|
+
return module.army;
|
|
28
|
+
}
|
|
29
|
+
/** How near a base their army seen counts as there */
|
|
30
|
+
var ARMY_NEAR = 36;
|
|
31
|
+
/** How near a base a guard stands to guard it */
|
|
32
|
+
var GUARDING = 16;
|
|
33
|
+
/** The fewest raiders or harassers a party is sent with */
|
|
34
|
+
var PARTY_LEAST = 2;
|
|
35
|
+
/** Why a wave that razed what it went for and does not go on walks home (its `retreat`'s `why`) */
|
|
36
|
+
var RAZED = "razed";
|
|
37
|
+
/**
|
|
38
|
+
* The melee player's army: its waves of its own and the goals beside them (the file's comment), its numbers from its
|
|
39
|
+
* options (`firstAttack`, `attackEvery`, `waveSize`) and the defence's radius, its memory. Made for a brain by
|
|
40
|
+
* the `army()` module; reached as `ai.module(MELEE_ARMY)?.army` (`meleeArmyOf(ai)`)
|
|
41
|
+
*
|
|
42
|
+
* @beta
|
|
43
|
+
*/
|
|
44
|
+
var MeleeArmy = class {
|
|
45
|
+
ai;
|
|
46
|
+
options;
|
|
47
|
+
/** What the army remembers between thinks: wave size, next times and counts */
|
|
48
|
+
memory;
|
|
49
|
+
/** Seconds into the game the first wave is due */
|
|
50
|
+
firstAttack;
|
|
51
|
+
/** Seconds between one wave's time and the next */
|
|
52
|
+
attackEvery;
|
|
53
|
+
/** How far from a base, in cells, the army defends */
|
|
54
|
+
defendRadius;
|
|
55
|
+
constructor(ai, options) {
|
|
56
|
+
this.ai = ai;
|
|
57
|
+
this.options = options;
|
|
58
|
+
this.firstAttack = options.firstAttack ?? 150;
|
|
59
|
+
this.attackEvery = options.attackEvery ?? 45;
|
|
60
|
+
this.defendRadius = ai.area(Defence).radius;
|
|
61
|
+
this.memory = {
|
|
62
|
+
v: 1,
|
|
63
|
+
waveSize: options.waveSize ?? 6,
|
|
64
|
+
nextAttack: this.firstAttack,
|
|
65
|
+
nextCreeping: options.creep && options.creep.from || 30,
|
|
66
|
+
attacks: 0
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
get time() {
|
|
70
|
+
return this.ai.time;
|
|
71
|
+
}
|
|
72
|
+
/** Its fighters: what is gathering (a ghoul at the trees) is at work, not in the army */
|
|
73
|
+
armyOf(units) {
|
|
74
|
+
return units.fighters().where((entity) => entity.own?.order !== "harvest");
|
|
75
|
+
}
|
|
76
|
+
/** The fighters no goal holds and with nothing to do: what a wave or a party is made of. Once a think */
|
|
77
|
+
ready() {
|
|
78
|
+
return this.ai.cache("melee.ready", () => this.readyOf(this.ai.goals.pool()));
|
|
79
|
+
}
|
|
80
|
+
readyOf(units) {
|
|
81
|
+
return this.armyOf(units).where((unit) => !unit.own?.order);
|
|
82
|
+
}
|
|
83
|
+
/** Their army as last seen within so many seconds, summed by type: a force to weigh odds against */
|
|
84
|
+
theirs(seconds) {
|
|
85
|
+
return this.ai.cache(`melee.theirs.${seconds}`, () => {
|
|
86
|
+
const theirs = {};
|
|
87
|
+
for (const army of this.ai.knowledge.enemy.armySeen(seconds)) for (const [type, count] of Object.entries(army.types)) theirs[type] = (theirs[type] ?? 0) + count;
|
|
88
|
+
return theirs;
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
/** The odds of a force of mine against their army as last seen within so many seconds: 1 where none was seen */
|
|
92
|
+
oddsAgainstTheirs(mine, seconds) {
|
|
93
|
+
if (!mine.length) return 0;
|
|
94
|
+
const theirs = this.theirs(seconds);
|
|
95
|
+
if (!Object.keys(theirs).length) return 1;
|
|
96
|
+
return this.ai.view.strength.odds(mine, theirs);
|
|
97
|
+
}
|
|
98
|
+
/** The odds of a force of mine against what is remembered to reach a place (towers, their army seen near it), by the square law */
|
|
99
|
+
oddsAt(mine, at) {
|
|
100
|
+
const { view } = this.ai;
|
|
101
|
+
const strength = view.strength.sum([...mine]);
|
|
102
|
+
if (strength <= 0) return 0;
|
|
103
|
+
const theirs = view.threat.at(at, { remembered: true }).enemy;
|
|
104
|
+
if (theirs <= 0) return 1;
|
|
105
|
+
return strength * strength / (strength * strength + theirs * theirs);
|
|
106
|
+
}
|
|
107
|
+
/** Whether its team asks it to join an attack together it has not answered, while its waves wait for the team's (`together`) */
|
|
108
|
+
invited() {
|
|
109
|
+
const team = this.ai.area(Team);
|
|
110
|
+
const plan = team.together ? team.plan : void 0;
|
|
111
|
+
return !!plan && plan.by !== this.ai.playerId && this.ai.tick < plan.at && !plan.declined.includes(this.ai.playerId);
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Whether it has no mercy (No Mercy, a flag of its profile): the enemy's army as last seen (the last minute) weak
|
|
115
|
+
* against what it has ready, at the odds the flag says (0.75 for `true`), and it goes before its time
|
|
116
|
+
*/
|
|
117
|
+
merciless() {
|
|
118
|
+
const flag = flagOf(this.ai, "noMercy");
|
|
119
|
+
if (!flag) return false;
|
|
120
|
+
const odds = typeof flag === "number" ? flag : .75;
|
|
121
|
+
const ready = this.ready();
|
|
122
|
+
if (!ready.length) return false;
|
|
123
|
+
return this.oddsAgainstTheirs(ready, 60) >= odds;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Whether the wave is worth sending now: what is ready would not lose outright against their army as last seen
|
|
127
|
+
* (`goOdds`), or it has waited long enough (`waitAtMost`). Nothing seen of their army: worth it
|
|
128
|
+
*/
|
|
129
|
+
worthGoing() {
|
|
130
|
+
const goOdds = this.options.goOdds ?? .4;
|
|
131
|
+
if (goOdds === false) return true;
|
|
132
|
+
if (this.oddsAgainstTheirs(this.ready(), 60) >= goOdds) return true;
|
|
133
|
+
return this.waitedEnough();
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Whether a wave of theirs just died at its gate (so many of their fighters fallen near its bases in the last twenty
|
|
137
|
+
* seconds): their base is empty of it, and what is ready goes at once
|
|
138
|
+
*/
|
|
139
|
+
counterAttack() {
|
|
140
|
+
if (this.options.counter === false) return false;
|
|
141
|
+
return this.ai.cache("melee.counter", () => {
|
|
142
|
+
const { view, knowledge, registry } = this.ai;
|
|
143
|
+
const bases = view.bases();
|
|
144
|
+
let fallen = 0;
|
|
145
|
+
for (const death of knowledge.events.deaths(20)) {
|
|
146
|
+
if (view.player(death.owner)?.relation !== "enemy" || !registry.units.has(death.type)) continue;
|
|
147
|
+
const def = registry.unit(death.type);
|
|
148
|
+
if (def.kind !== "unit" || !def.attacks?.length || def.harvester) continue;
|
|
149
|
+
if (bases.some((base) => distSq(base.at, death.at) < 900)) fallen++;
|
|
150
|
+
}
|
|
151
|
+
return fallen >= (this.options.counterAfter ?? 3);
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Whether their army is away from what a wave would go for (`strike`): at least one sighting of it within `awayFor`
|
|
156
|
+
* seconds (nothing seen says nothing of where it is), every one far from the target and from every base of mine and
|
|
157
|
+
* every building of my allies' (an army at my gate is the defence's, at an ally's the team's: not a reason to trade
|
|
158
|
+
* bases), and what is ready (half a wave at the least) would hold against what is remembered to reach the target
|
|
159
|
+
* (its towers). Once a think
|
|
160
|
+
*/
|
|
161
|
+
armyAway() {
|
|
162
|
+
const strike = this.options.strike;
|
|
163
|
+
if (strike === false) return false;
|
|
164
|
+
return this.ai.cache("melee.strike", () => {
|
|
165
|
+
const { view, knowledge } = this.ai;
|
|
166
|
+
if (this.ai.area(Waves).active || this.out("wave")) return false;
|
|
167
|
+
const ready = this.ready();
|
|
168
|
+
if (ready.length < Math.max(PARTY_LEAST, Math.ceil(this.memory.waveSize / 2))) return false;
|
|
169
|
+
const sightings = knowledge.enemy.armySeen(strike?.awayFor ?? 60).filter((army) => view.player(army.owner)?.relation === "enemy");
|
|
170
|
+
if (!sightings.length) return false;
|
|
171
|
+
const target = this.targetFor(ready.centre());
|
|
172
|
+
if (!target) return false;
|
|
173
|
+
if (sightings.some((army) => distSq(army.at, target) < 5184)) return false;
|
|
174
|
+
const home = this.defendRadius + ARMY_NEAR;
|
|
175
|
+
const ours = [...view.bases().map((base) => base.at), ...view.allies.buildings()];
|
|
176
|
+
if (sightings.some((army) => ours.some((at) => distSq(army.at, at) < home * home))) return false;
|
|
177
|
+
return this.oddsAt(ready, target) >= (strike?.odds ?? .6);
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
/** Whether the wave has waited past its time as long as it will (`waitAtMost`): it goes with what it has then */
|
|
181
|
+
waitedEnough() {
|
|
182
|
+
const { waiting } = this.memory;
|
|
183
|
+
return waiting !== void 0 && this.time - waiting >= (this.options.waitAtMost ?? this.attackEvery * 2);
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Whether the wave is ready: as many as it asks for stand idle; or half of them, once it has waited long enough and
|
|
187
|
+
* they would hold against what is remembered to reach the target (half a wave is not fed to the towers)
|
|
188
|
+
*/
|
|
189
|
+
waveReady() {
|
|
190
|
+
const ready = this.ready();
|
|
191
|
+
const { waveSize } = this.memory;
|
|
192
|
+
if (ready.length >= waveSize) return true;
|
|
193
|
+
if (!(this.waitedEnough() || this.counterAttack() || this.armyAway()) || ready.length < Math.max(PARTY_LEAST, Math.ceil(waveSize / 2))) return false;
|
|
194
|
+
const goOdds = this.options.goOdds ?? .4;
|
|
195
|
+
if (goOdds === false) return true;
|
|
196
|
+
const target = this.targetFor(ready.centre());
|
|
197
|
+
return !!target && this.oddsAt(ready, target) >= goOdds;
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Where a wave goes: of the rival's buildings it knows of (in sight or remembered, not a creep's), the nearest, or
|
|
201
|
+
* (`target: 'weakest'`) the one the least of their strength is remembered to reach (an expansion before a main with
|
|
202
|
+
* towers), the nearest among those alike; else a base it was told of
|
|
203
|
+
*/
|
|
204
|
+
targetFor(from) {
|
|
205
|
+
const { view } = this.ai;
|
|
206
|
+
const known = view.enemies.known().buildings();
|
|
207
|
+
const bases = this.ai.options.enemyBases ?? [];
|
|
208
|
+
if (!known.length || !from) return bases.length ? bases[this.memory.attacks % bases.length] : void 0;
|
|
209
|
+
if ((this.options.target ?? "weakest") === "nearest") {
|
|
210
|
+
const near = known.nearest(from);
|
|
211
|
+
return {
|
|
212
|
+
x: near.x,
|
|
213
|
+
z: near.z
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
let best;
|
|
217
|
+
for (const building of known) {
|
|
218
|
+
const threat = view.threat.at(building, { remembered: true }).enemy;
|
|
219
|
+
const distance = distSq(from, building);
|
|
220
|
+
const alike = best && Math.abs(threat - best.threat) <= Math.max(threat, best.threat) * .1;
|
|
221
|
+
if (!best || (alike ? distance < best.distance : threat < best.threat)) best = {
|
|
222
|
+
at: {
|
|
223
|
+
x: building.x,
|
|
224
|
+
z: building.z
|
|
225
|
+
},
|
|
226
|
+
threat,
|
|
227
|
+
distance
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
return best.at;
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* A way of its own for a wave (Random Paths, a flag of its profile): by the brain's numbers, straight, or by a place a
|
|
234
|
+
* third of the way's length to one side or the other of its middle. None for straight, or without the flag
|
|
235
|
+
*/
|
|
236
|
+
wayOf(squad, target) {
|
|
237
|
+
if (!flagOf(this.ai, "randomPaths")) return void 0;
|
|
238
|
+
const from = squad.centre();
|
|
239
|
+
if (!from) return void 0;
|
|
240
|
+
const side = this.ai.rng.int(-1, 1);
|
|
241
|
+
if (side === 0) return void 0;
|
|
242
|
+
const dx = target.x - from.x;
|
|
243
|
+
const dz = target.z - from.z;
|
|
244
|
+
const { width, depth } = this.ai.session.terrain;
|
|
245
|
+
const x = (from.x + target.x) / 2 - dz / 3 * side;
|
|
246
|
+
const z = (from.z + target.z) / 2 + dx / 3 * side;
|
|
247
|
+
return {
|
|
248
|
+
x: Math.min(width - 2, Math.max(2, x)),
|
|
249
|
+
z: Math.min(depth - 2, Math.max(2, z))
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* How the squads it sends out behave: they fall back from a fight away from home at the odds a wave used to (the
|
|
254
|
+
* profile's `retreatOdds`, or Groups Flee), fight on to the last near home, and a wave is made up from home
|
|
255
|
+
* (`reinforce`); the seat's say goes over it
|
|
256
|
+
*/
|
|
257
|
+
get outward() {
|
|
258
|
+
return {
|
|
259
|
+
retreatAt: .3,
|
|
260
|
+
home: this.defendRadius + 6,
|
|
261
|
+
reinforce: this.options.reinforce ?? true,
|
|
262
|
+
...this.ai.squads.defaults
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
/** A party's options: as a wave's, but it falls back sooner and nobody comes after it */
|
|
266
|
+
party(retreatAt) {
|
|
267
|
+
return {
|
|
268
|
+
...this.outward,
|
|
269
|
+
retreatAt,
|
|
270
|
+
reinforce: false
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
/** Sends a wave: its squad to attack the target, the next wave set, said where it says things */
|
|
274
|
+
launch(squad, target, together) {
|
|
275
|
+
const { ai, memory } = this;
|
|
276
|
+
const known = ai.view.enemies.known().buildings();
|
|
277
|
+
const size = squad.length;
|
|
278
|
+
const early = this.time < memory.nextAttack;
|
|
279
|
+
const counter = early && this.counterAttack();
|
|
280
|
+
const struck = early && !counter && this.armyAway();
|
|
281
|
+
const via = this.wayOf(squad, target);
|
|
282
|
+
squad.attack(target, via ? { via } : {});
|
|
283
|
+
ai.knowledge.own.attackSent(target, size);
|
|
284
|
+
memory.attacks++;
|
|
285
|
+
memory.waveSize = Math.min(memory.waveSize + (this.options.waveGrowth ?? 2), this.options.waveMax ?? 24);
|
|
286
|
+
memory.waiting = void 0;
|
|
287
|
+
const mistakes = ai.profile.mistakes ?? 0;
|
|
288
|
+
memory.nextAttack = this.time + this.attackEvery * (mistakes > 0 ? 1 - mistakes * ai.rng.next() : 1);
|
|
289
|
+
ai.area(Team).say("attacking");
|
|
290
|
+
ai.decide(`sends wave ${memory.attacks} of ${size} at ${where(target)}${together ? ", together with its team" : known.length ? ", a building of theirs it knows" : ", a base it was told of"}${counter ? ", answering their wave that fell at its gate" : struck ? ", their army away" : ""}; the next is ${memory.waveSize} strong at ${Math.round(memory.nextAttack)} s`, {
|
|
291
|
+
kind: "army",
|
|
292
|
+
goal: "attack"
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* The squad a goal of its sent out (`wave`, `creep`, `raid`, `harass`, `expand`), while it is on its errand: on its
|
|
297
|
+
* way, fighting, falling back, or (a wave) done with its target, to go on or to be sent home. None once its task is
|
|
298
|
+
* over, or before it was sent
|
|
299
|
+
*/
|
|
300
|
+
out(name) {
|
|
301
|
+
const squad = this.ai.squads.named(name);
|
|
302
|
+
if (!squad) return void 0;
|
|
303
|
+
if (!squad.idle) return squad;
|
|
304
|
+
return name === "wave" && squad.done === "cleared" ? squad : void 0;
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Whether a wave that razed what it went for goes on: it may, it is still a few, it is strong enough against their
|
|
308
|
+
* army as last seen and against what is remembered to reach the next target (its towers), and it knows of more of theirs
|
|
309
|
+
*/
|
|
310
|
+
mayPressOn(squad) {
|
|
311
|
+
if (!(this.options.pressOn ?? true) || squad.length < PARTY_LEAST) return false;
|
|
312
|
+
const odds = this.options.pressOdds ?? .5;
|
|
313
|
+
if (this.oddsAgainstTheirs(squad.units(), 60) < odds) return false;
|
|
314
|
+
if (!this.ai.view.enemies.known().buildings().length) return false;
|
|
315
|
+
const target = this.targetFor(squad.centre());
|
|
316
|
+
return !!target && this.oddsAt(squad.units(), target) >= odds;
|
|
317
|
+
}
|
|
318
|
+
/** The camp its ready units and hero can take near home, when it is time to go creeping */
|
|
319
|
+
campToTake(ready) {
|
|
320
|
+
const creep = this.options.creep;
|
|
321
|
+
if (creep === false) return void 0;
|
|
322
|
+
if (this.time < this.memory.nextCreeping || this.memory.nextAttack - this.time < 40) return void 0;
|
|
323
|
+
const party = [...ready];
|
|
324
|
+
const hero = party.find((unit) => heroOfState(unit));
|
|
325
|
+
const home = this.ai.view.home();
|
|
326
|
+
if (!hero || !home || party.length < (creep?.party ?? 3)) return void 0;
|
|
327
|
+
const strength = party.length * 1.2 + (heroOfState(hero)?.level ?? 1);
|
|
328
|
+
const reach = creep?.reach ?? 70;
|
|
329
|
+
const camps = this.ai.view.camps().filter((camp) => !camp.cleared && camp.level <= strength && distSq(camp, home) < reach * reach);
|
|
330
|
+
let best;
|
|
331
|
+
let bestDistance = Infinity;
|
|
332
|
+
for (const camp of camps) {
|
|
333
|
+
const d = distSq(home, camp);
|
|
334
|
+
if (d < bestDistance) {
|
|
335
|
+
bestDistance = d;
|
|
336
|
+
best = camp;
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
return best;
|
|
340
|
+
}
|
|
341
|
+
/** Where a raid would go: the base of theirs with the most workers seen lately and no army seen near it, with how many */
|
|
342
|
+
raidTarget() {
|
|
343
|
+
return this.ai.cache("melee.raid", () => {
|
|
344
|
+
const raid = this.options.raid;
|
|
345
|
+
if (raid === false || this.ai.area(Waves).active) return void 0;
|
|
346
|
+
const { enemy } = this.ai.knowledge;
|
|
347
|
+
const workers = enemy.workersSeen(raid?.workersSeenFor ?? 120).filter((worker) => worker.died === void 0);
|
|
348
|
+
if (!workers.length) return void 0;
|
|
349
|
+
const armies = enemy.armySeen(raid?.armyAwayFor ?? 45);
|
|
350
|
+
const home = this.ai.view.home();
|
|
351
|
+
let best;
|
|
352
|
+
for (const base of enemy.bases()) {
|
|
353
|
+
if (base.gone || armies.some((army) => distSq(army.at, base.at) < 1296)) continue;
|
|
354
|
+
const count = workers.filter((worker) => distSq(worker.at, base.at) < 900).length;
|
|
355
|
+
if (!count) continue;
|
|
356
|
+
const distance = home ? distSq(home, base.at) : 0;
|
|
357
|
+
if (!best || count > best.workers || count === best.workers && distance < best.distance) best = {
|
|
358
|
+
at: {
|
|
359
|
+
x: base.at.x,
|
|
360
|
+
z: base.at.z
|
|
361
|
+
},
|
|
362
|
+
workers: count,
|
|
363
|
+
distance
|
|
364
|
+
};
|
|
365
|
+
}
|
|
366
|
+
return best && {
|
|
367
|
+
at: best.at,
|
|
368
|
+
workers: best.workers
|
|
369
|
+
};
|
|
370
|
+
});
|
|
371
|
+
}
|
|
372
|
+
/** The fastest fighters of some, no heroes among them, up to so many: a party; none where fewer than two */
|
|
373
|
+
fastest(units, count) {
|
|
374
|
+
const { registry, view } = this.ai;
|
|
375
|
+
const speed = (unit) => baseStats(view.def(unit), registry).moveSpeed;
|
|
376
|
+
const chosen = units.filter((unit) => !heroOfState(unit)).sort((a, b) => speed(b) - speed(a) || a.id - b.id).slice(0, count);
|
|
377
|
+
return chosen.length >= Math.min(count, PARTY_LEAST) ? chosen : [];
|
|
378
|
+
}
|
|
379
|
+
/** The raiders of what may go: the fastest few, where a raid is on and they would not die at the base */
|
|
380
|
+
raiders(available) {
|
|
381
|
+
const raid = this.options.raid;
|
|
382
|
+
if (raid === false) return [];
|
|
383
|
+
const target = this.raidTarget();
|
|
384
|
+
if (!target) return [];
|
|
385
|
+
const chosen = this.fastest(this.readyOf(available), raid?.size ?? 3);
|
|
386
|
+
return chosen.length && this.oddsAt(chosen, target.at) >= (raid?.odds ?? .6) ? chosen : [];
|
|
387
|
+
}
|
|
388
|
+
/** Their main as known: the first base of theirs with a hall, nearest home */
|
|
389
|
+
theirMain() {
|
|
390
|
+
return this.ai.cache("melee.theirMain", () => {
|
|
391
|
+
if (this.ai.area(Waves).active) return void 0;
|
|
392
|
+
const home = this.ai.view.home();
|
|
393
|
+
const mains = this.ai.knowledge.enemy.bases().filter((base) => base.hall && !base.gone && !base.expansion);
|
|
394
|
+
let best;
|
|
395
|
+
let bestDistance = Infinity;
|
|
396
|
+
for (const base of mains) {
|
|
397
|
+
const d = home ? distSq(home, base.at) : 0;
|
|
398
|
+
if (d < bestDistance) {
|
|
399
|
+
bestDistance = d;
|
|
400
|
+
best = base;
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
return best;
|
|
404
|
+
});
|
|
405
|
+
}
|
|
406
|
+
/** The party that harasses: the hero and the fastest few, where their army was not seen at their main lately and the party would hold */
|
|
407
|
+
harassers(available) {
|
|
408
|
+
const harass = this.options.harass;
|
|
409
|
+
if (harass === false) return [];
|
|
410
|
+
const main = this.theirMain();
|
|
411
|
+
if (!main) return [];
|
|
412
|
+
if (this.ai.knowledge.enemy.armySeen(60).some((army) => distSq(army.at, main.at) < 1296)) return [];
|
|
413
|
+
const ready = this.readyOf(available);
|
|
414
|
+
const heroes = ready.filter((unit) => !!heroOfState(unit));
|
|
415
|
+
const size = harass?.size ?? 3;
|
|
416
|
+
const chosen = [...heroes.slice(0, 1), ...this.fastest(ready, Math.max(0, size - Math.min(1, heroes.length)))];
|
|
417
|
+
if (!chosen.length || !heroes.length && chosen.length < Math.min(size, PARTY_LEAST)) return [];
|
|
418
|
+
return this.oddsAt(chosen, main.at) >= (harass?.odds ?? .6) ? chosen : [];
|
|
419
|
+
}
|
|
420
|
+
/** Whether a base of mine still wants guards: past home, with no finished tower among its buildings */
|
|
421
|
+
wantsGuards(base) {
|
|
422
|
+
return !base.buildings.withRole("tower").finished().length;
|
|
423
|
+
}
|
|
424
|
+
/** The bases past home that want guards and have none: no fighters of mine standing by them. Once a think */
|
|
425
|
+
unguarded() {
|
|
426
|
+
return this.ai.cache("melee.unguarded", () => {
|
|
427
|
+
if (this.ai.area(Waves).active) return [];
|
|
428
|
+
const { view } = this.ai;
|
|
429
|
+
const fighters = this.armyOf(view.mine);
|
|
430
|
+
return view.bases().slice(1).filter((base) => this.wantsGuards(base) && !fighters.near(base.at, GUARDING).length);
|
|
431
|
+
});
|
|
432
|
+
}
|
|
433
|
+
/** The base the expand squad guards, where it still wants guards */
|
|
434
|
+
guarded() {
|
|
435
|
+
const squad = this.ai.squads.named("expand");
|
|
436
|
+
const at = squad?.current?.kind === "defend" ? squad.current.data.at : void 0;
|
|
437
|
+
if (!at) return void 0;
|
|
438
|
+
const base = this.ai.view.bases().find((each) => distSq(each.at, at) < 256);
|
|
439
|
+
return base && this.wantsGuards(base) ? base : void 0;
|
|
440
|
+
}
|
|
441
|
+
/** The guards for the first base wanting them: the fighters nearest it, so many, from what stands idle past a wave */
|
|
442
|
+
guards(available) {
|
|
443
|
+
const expand = this.options.expand;
|
|
444
|
+
if (expand === false) return [];
|
|
445
|
+
const base = this.unguarded()[0];
|
|
446
|
+
if (!base) return [];
|
|
447
|
+
const ready = this.readyOf(available);
|
|
448
|
+
const guards = expand?.guards ?? 2;
|
|
449
|
+
if (ready.length < guards + this.memory.waveSize + (expand?.spare ?? 0)) return [];
|
|
450
|
+
return ready.items.slice().sort((a, b) => distSq(a, base.at) - distSq(b, base.at) || a.id - b.id).slice(0, guards);
|
|
451
|
+
}
|
|
452
|
+
/** The goals, for the picker: attack, creep, raid, harass, expand (each unless left out) */
|
|
453
|
+
goals() {
|
|
454
|
+
const { options } = this;
|
|
455
|
+
const goals = [this.attackGoal()];
|
|
456
|
+
if (options.creep !== false) goals.push(this.creepGoal());
|
|
457
|
+
if (options.raid !== false) goals.push(this.raidGoal());
|
|
458
|
+
if (options.harass !== false) goals.push(this.harassGoal());
|
|
459
|
+
if (options.expand !== false) goals.push(this.expandGoal());
|
|
460
|
+
return goals;
|
|
461
|
+
}
|
|
462
|
+
attackGoal() {
|
|
463
|
+
return defineGoal({
|
|
464
|
+
id: "attack",
|
|
465
|
+
weight: .8,
|
|
466
|
+
considerations: [
|
|
467
|
+
consider("its time has come", () => this.ai.area(Waves).active ? -1 : this.out("wave") ? 1 : this.invited() || this.merciless() || this.counterAttack() || this.armyAway() ? 0 : this.time - this.memory.nextAttack, curve.step(0)),
|
|
468
|
+
consider("the wave is ready", () => this.out("wave") || this.waveReady() ? 1 : this.ready().length / this.memory.waveSize, curve.step(1)),
|
|
469
|
+
consider("worth going", () => this.out("wave") ? 1 : this.worthGoing() ? 1 : 0, curve.step(1))
|
|
470
|
+
],
|
|
471
|
+
claims: { units: (_ai, available) => this.readyOf(available) },
|
|
472
|
+
run: (_ai, claimed) => this.attack(claimed)
|
|
473
|
+
});
|
|
474
|
+
}
|
|
475
|
+
/** The attack goal's turn: the wave out watched (its fall back, its wait for the team, its next target), or sent */
|
|
476
|
+
attack(claimed) {
|
|
477
|
+
const { ai, memory } = this;
|
|
478
|
+
const team = ai.area(Team);
|
|
479
|
+
const out = ai.squads.named("wave");
|
|
480
|
+
if (!claimed.first && out) {
|
|
481
|
+
if (out.current?.kind === "retreat" && out.current.data.why === RAZED) return;
|
|
482
|
+
if (out.current?.kind === "retreat") {
|
|
483
|
+
memory.nextAttack = Math.max(memory.nextAttack, out.current.since / ai.session.tickRate + this.attackEvery);
|
|
484
|
+
if (memory.saidRetreat !== out.current.since) {
|
|
485
|
+
memory.saidRetreat = out.current.since;
|
|
486
|
+
team.say("retreating");
|
|
487
|
+
}
|
|
488
|
+
return;
|
|
489
|
+
}
|
|
490
|
+
if (out.current?.kind === "defend" && out.current.data.waiting) {
|
|
491
|
+
const plan = team.plan;
|
|
492
|
+
if (plan && plan.joined.includes(ai.playerId) && ai.tick < plan.at) return;
|
|
493
|
+
const target = plan?.target ?? this.targetFor(out.centre());
|
|
494
|
+
if (target) this.launch(out, target, !!plan);
|
|
495
|
+
return;
|
|
496
|
+
}
|
|
497
|
+
if (out.idle && out.done === "cleared") {
|
|
498
|
+
const target = this.mayPressOn(out) && this.targetFor(out.centre());
|
|
499
|
+
if (target) {
|
|
500
|
+
out.attack(target);
|
|
501
|
+
ai.knowledge.own.attackSent(target, out.length);
|
|
502
|
+
ai.decide(`wave ${memory.attacks} of ${out.length} goes on to ${where(target)}: what it went for is razed`, {
|
|
503
|
+
kind: "army",
|
|
504
|
+
goal: "attack"
|
|
505
|
+
});
|
|
506
|
+
} else {
|
|
507
|
+
out.retreat(void 0, RAZED);
|
|
508
|
+
ai.decide(`wave ${memory.attacks} of ${out.length} goes home: what it went for is razed`, {
|
|
509
|
+
kind: "army",
|
|
510
|
+
goal: "attack"
|
|
511
|
+
});
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
return;
|
|
515
|
+
}
|
|
516
|
+
if (!claimed.first) return;
|
|
517
|
+
const wave = claimed.units;
|
|
518
|
+
const target = this.targetFor(wave.centre());
|
|
519
|
+
if (!target) return;
|
|
520
|
+
const squad = claimed.squad("wave", wave, this.outward);
|
|
521
|
+
if (team.together) {
|
|
522
|
+
if (team.plan && ai.tick < team.plan.at ? team.plan : void 0) team.join();
|
|
523
|
+
else team.propose(target);
|
|
524
|
+
squad.defend(wave.centre() ?? target, 12);
|
|
525
|
+
squad.current.data.waiting = true;
|
|
526
|
+
const at = (team.plan?.at ?? ai.tick) / ai.session.tickRate;
|
|
527
|
+
ai.decide(`wave ${memory.attacks + 1} of ${wave.length} waits to attack together at ${Math.round(at)} s`, {
|
|
528
|
+
kind: "army",
|
|
529
|
+
goal: "attack"
|
|
530
|
+
});
|
|
531
|
+
return;
|
|
532
|
+
}
|
|
533
|
+
this.launch(squad, target, false);
|
|
534
|
+
}
|
|
535
|
+
creepGoal() {
|
|
536
|
+
return defineGoal({
|
|
537
|
+
id: "creep",
|
|
538
|
+
weight: .5,
|
|
539
|
+
considerations: [consider("a camp to take", () => this.out("creep") ? 1 : this.campToTake(this.ready()) ? 1 : 0, curve.step(1))],
|
|
540
|
+
claims: { units: (_ai, available) => this.readyOf(available) },
|
|
541
|
+
run: (ai, claimed) => {
|
|
542
|
+
if (!claimed.first) return;
|
|
543
|
+
const camp = this.campToTake(claimed.units);
|
|
544
|
+
if (!camp) return;
|
|
545
|
+
this.memory.nextCreeping = this.time + (this.options.creep && this.options.creep.every || 40);
|
|
546
|
+
claimed.squad("creep", claimed.units, this.outward).creep(camp);
|
|
547
|
+
ai.decide(`goes creeping at ${where(camp)} with ${claimed.units.length}`, {
|
|
548
|
+
kind: "army",
|
|
549
|
+
goal: "creep"
|
|
550
|
+
});
|
|
551
|
+
}
|
|
552
|
+
});
|
|
553
|
+
}
|
|
554
|
+
raidGoal() {
|
|
555
|
+
const raid = this.options.raid || {};
|
|
556
|
+
const every = raid.every ?? 60;
|
|
557
|
+
return defineGoal({
|
|
558
|
+
id: "raid",
|
|
559
|
+
weight: .6,
|
|
560
|
+
commitment: 20,
|
|
561
|
+
cooldown: every,
|
|
562
|
+
considerations: [
|
|
563
|
+
consider("their workers seen where their army is not", () => this.out("raid") ? 1 : this.raidTarget()?.workers ?? 0, curve.step(1)),
|
|
564
|
+
consider("seconds since the last raid", () => this.out("raid") || this.memory.raided === void 0 ? every : (this.ai.tick - this.memory.raided) / this.ai.session.tickRate, curve.step(every)),
|
|
565
|
+
consider("raiders to spare", () => this.out("raid") ? 1 : this.raiders(this.ai.goals.pool()).length, curve.step(1))
|
|
566
|
+
],
|
|
567
|
+
claims: { units: (_ai, available) => this.raiders(available) },
|
|
568
|
+
run: (ai, claimed) => {
|
|
569
|
+
if (!claimed.first) return;
|
|
570
|
+
const target = this.raidTarget();
|
|
571
|
+
if (!target) return;
|
|
572
|
+
this.memory.raided = ai.tick;
|
|
573
|
+
claimed.squad("raid", claimed.units, this.party(raid.retreatAt ?? .5)).harass(target.at);
|
|
574
|
+
ai.decide(`raids their workers at ${where(target.at)} with ${claimed.units.length}: ${target.workers} seen there, their army elsewhere`, {
|
|
575
|
+
kind: "army",
|
|
576
|
+
goal: "raid"
|
|
577
|
+
});
|
|
578
|
+
}
|
|
579
|
+
});
|
|
580
|
+
}
|
|
581
|
+
harassGoal() {
|
|
582
|
+
const harass = this.options.harass || {};
|
|
583
|
+
const every = harass.every ?? 90;
|
|
584
|
+
return defineGoal({
|
|
585
|
+
id: "harass",
|
|
586
|
+
weight: .5,
|
|
587
|
+
commitment: 30,
|
|
588
|
+
cooldown: every,
|
|
589
|
+
considerations: [
|
|
590
|
+
consider("before the first wave", () => this.out("harass") ? 1 : this.memory.attacks === 0 && this.time < this.memory.nextAttack ? 1 : 0, curve.step(1)),
|
|
591
|
+
consider("their main known", () => this.out("harass") ? 1 : this.theirMain() ? 1 : 0, curve.step(1)),
|
|
592
|
+
consider("seconds since the last", () => this.out("harass") || this.memory.harassed === void 0 ? every : (this.ai.tick - this.memory.harassed) / this.ai.session.tickRate, curve.step(every)),
|
|
593
|
+
consider("a party to send", () => this.out("harass") ? 1 : this.harassers(this.ai.goals.pool()).length, curve.step(1))
|
|
594
|
+
],
|
|
595
|
+
claims: { units: (_ai, available) => this.harassers(available) },
|
|
596
|
+
run: (ai, claimed) => {
|
|
597
|
+
if (!claimed.first) return;
|
|
598
|
+
const main = this.theirMain();
|
|
599
|
+
if (!main) return;
|
|
600
|
+
this.memory.harassed = ai.tick;
|
|
601
|
+
claimed.squad("harass", claimed.units, this.party(harass.retreatAt ?? .5)).harass(main.at);
|
|
602
|
+
ai.decide(`harasses their main at ${where(main.at)} with ${claimed.units.length} before its first wave`, {
|
|
603
|
+
kind: "army",
|
|
604
|
+
goal: "harass"
|
|
605
|
+
});
|
|
606
|
+
}
|
|
607
|
+
});
|
|
608
|
+
}
|
|
609
|
+
expandGoal() {
|
|
610
|
+
return defineGoal({
|
|
611
|
+
id: "expand",
|
|
612
|
+
weight: .7,
|
|
613
|
+
commitment: 30,
|
|
614
|
+
considerations: [consider("a new base to hold", () => this.guarded() ? 1 : this.unguarded().length, curve.step(1)), consider("guards to spare", () => this.guarded() ? 1 : this.guards(this.ai.goals.pool()).length, curve.step(1))],
|
|
615
|
+
claims: { units: (_ai, available) => this.guards(available) },
|
|
616
|
+
run: (ai, claimed) => {
|
|
617
|
+
if (!claimed.first) return;
|
|
618
|
+
const base = this.unguarded()[0];
|
|
619
|
+
if (!base) return;
|
|
620
|
+
claimed.squad("expand", claimed.units, {
|
|
621
|
+
...this.outward,
|
|
622
|
+
reinforce: false
|
|
623
|
+
}).defend(base.at, GUARDING);
|
|
624
|
+
ai.decide(`leaves ${claimed.units.length} to guard its base at ${where(base.at)}: no tower there yet`, {
|
|
625
|
+
kind: "army",
|
|
626
|
+
goal: "expand"
|
|
627
|
+
});
|
|
628
|
+
}
|
|
629
|
+
});
|
|
630
|
+
}
|
|
631
|
+
/** Once a think, before the picker: whether the wave began waiting past its time, short of its size or outmatched */
|
|
632
|
+
think() {
|
|
633
|
+
const { memory } = this;
|
|
634
|
+
if (this.ai.area(Waves).active || this.out("wave")) return;
|
|
635
|
+
if (this.time < memory.nextAttack) {
|
|
636
|
+
memory.waiting = void 0;
|
|
637
|
+
return;
|
|
638
|
+
}
|
|
639
|
+
if (memory.waiting !== void 0) return;
|
|
640
|
+
const ready = this.ready().length;
|
|
641
|
+
const short = ready < memory.waveSize;
|
|
642
|
+
if (!short && this.worthGoing()) return;
|
|
643
|
+
memory.waiting = this.time;
|
|
644
|
+
this.ai.decide(`wave ${memory.attacks + 1} waits: ${short ? `${ready} of ${memory.waveSize} ready` : `outmatched by their army as last seen (odds ${this.oddsAgainstTheirs(this.ready(), 60).toFixed(2)})`}`, {
|
|
645
|
+
kind: "army",
|
|
646
|
+
goal: "attack"
|
|
647
|
+
});
|
|
648
|
+
}
|
|
649
|
+
/** What it remembers, for a save: a copy */
|
|
650
|
+
save() {
|
|
651
|
+
return { ...this.memory };
|
|
652
|
+
}
|
|
653
|
+
/** Takes back what `save` gave */
|
|
654
|
+
restore(data) {
|
|
655
|
+
const given = data ?? {};
|
|
656
|
+
const { memory } = this;
|
|
657
|
+
memory.waveSize = given.waveSize ?? memory.waveSize;
|
|
658
|
+
memory.nextAttack = given.nextAttack ?? memory.nextAttack;
|
|
659
|
+
memory.nextCreeping = given.nextCreeping ?? memory.nextCreeping;
|
|
660
|
+
memory.attacks = given.attacks ?? memory.attacks;
|
|
661
|
+
for (const key of [
|
|
662
|
+
"saidRetreat",
|
|
663
|
+
"waiting",
|
|
664
|
+
"raided",
|
|
665
|
+
"harassed"
|
|
666
|
+
]) if (given[key] !== void 0) memory[key] = given[key];
|
|
667
|
+
else delete memory[key];
|
|
668
|
+
}
|
|
669
|
+
/** What it is thinking, for the debug tools: how hard it plays, its next wave, its roles */
|
|
670
|
+
inspect() {
|
|
671
|
+
const { ai, memory } = this;
|
|
672
|
+
const { view } = ai;
|
|
673
|
+
const first = (role) => view.typesOf(role)[0]?.id;
|
|
674
|
+
return {
|
|
675
|
+
difficulty: ai.profile.difficulty ?? "normal",
|
|
676
|
+
personality: ai.profile.personality ?? "balanced",
|
|
677
|
+
nextAttack: Math.max(0, Math.round(memory.nextAttack - this.time)),
|
|
678
|
+
waveSize: memory.waveSize,
|
|
679
|
+
attacks: memory.attacks,
|
|
680
|
+
...memory.waiting !== void 0 && { waiting: Math.round(this.time - memory.waiting) },
|
|
681
|
+
roles: {
|
|
682
|
+
worker: first("worker"),
|
|
683
|
+
hall: first("hall"),
|
|
684
|
+
farm: [...view.typesOf("supply")].sort((a, b) => (a.cost?.[ai.purse.money] ?? 0) - (b.cost?.[ai.purse.money] ?? 0))[0]?.id,
|
|
685
|
+
barracks: view.typesOf("barracks").map((def) => def.id),
|
|
686
|
+
altars: view.typesOf("altar").map((def) => def.id)
|
|
687
|
+
}
|
|
688
|
+
};
|
|
689
|
+
}
|
|
690
|
+
};
|
|
691
|
+
/**
|
|
692
|
+
* The melee brain's army module: the goals of the army put on the picker (attack, creep, raid, harass, expand), the
|
|
693
|
+
* wave's wait counted. Before the picker (`goals`), after the building and the production, as the old turn had it. With how the army goes where the seat says nothing (`MeleeArmyOptions`)
|
|
694
|
+
*
|
|
695
|
+
* @beta
|
|
696
|
+
*/
|
|
697
|
+
var army = (options = {}) => defineModule({
|
|
698
|
+
id: "melee.army",
|
|
699
|
+
make: (ai) => {
|
|
700
|
+
const army = new MeleeArmy(ai, {
|
|
701
|
+
...options,
|
|
702
|
+
...ai.settings.army
|
|
703
|
+
});
|
|
704
|
+
ai.goals.add(...army.goals());
|
|
705
|
+
return {
|
|
706
|
+
id: "melee.army",
|
|
707
|
+
version: 1,
|
|
708
|
+
phase: "decide",
|
|
709
|
+
army,
|
|
710
|
+
think: () => army.think(),
|
|
711
|
+
save: () => army.save(),
|
|
712
|
+
restore: (data) => army.restore(data),
|
|
713
|
+
inspect: () => army.inspect()
|
|
714
|
+
};
|
|
715
|
+
}
|
|
716
|
+
});
|
|
717
|
+
//#endregion
|
|
718
|
+
export { MELEE_ARMY, MeleeArmy, army, meleeArmyOf };
|
|
719
|
+
|
|
720
|
+
//# sourceMappingURL=goals.js.map
|