@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,608 @@
|
|
|
1
|
+
import { distSq } from "../../math.js";
|
|
2
|
+
import { baseStats } from "../../defs.js";
|
|
3
|
+
import { snapshotOf } from "../../components.js";
|
|
4
|
+
import { builtSoFar } from "../../systems/construction.js";
|
|
5
|
+
import { queueOf, upgradeOf } from "../../systems/productionQueue.js";
|
|
6
|
+
import { gathering } from "../../orders/harvest.js";
|
|
7
|
+
import { defineModule } from "../module.js";
|
|
8
|
+
import { evaluate } from "../rules.js";
|
|
9
|
+
import { DEFAULT_PLACEMENT, placementNamed } from "./placement.js";
|
|
10
|
+
import { makerOf, techPath, techTrouble } from "./tech.js";
|
|
11
|
+
import { an, where } from "../geometry.js";
|
|
12
|
+
//#region src/ai/plans/build.ts
|
|
13
|
+
/** How far from a mine, towards home, a settler is sent to see where the hall by it would go */
|
|
14
|
+
var SETTLE_FROM = 10;
|
|
15
|
+
var WITHIN = 22;
|
|
16
|
+
var SITE_TIMEOUT = 60;
|
|
17
|
+
/** Under this part of its health a building is mended */
|
|
18
|
+
var MEND_UNDER = .9;
|
|
19
|
+
/** A step in words, for the report: `build lumbermill`, `townhall → keep`, `train peasant` */
|
|
20
|
+
var stepWords = (step) => step.how === "morph" ? `${step.from} → ${step.type}` : `${step.how} ${step.type}`;
|
|
21
|
+
/** Whether a want is plain data all through: what a save can keep */
|
|
22
|
+
var isData = (def) => typeof def.count !== "function" && typeof def.when !== "function" && typeof def.near !== "function" && typeof def.placement !== "function";
|
|
23
|
+
/**
|
|
24
|
+
* The brain's build plan (`ai.plans.build`): its wants, the steps to each, the spots, the builders, the purse. Add a
|
|
25
|
+
* want with `want`, read where each stands with `report`, and let `think` act on them once a think
|
|
26
|
+
*
|
|
27
|
+
* @beta
|
|
28
|
+
*/
|
|
29
|
+
var BuildPlan = class {
|
|
30
|
+
ai;
|
|
31
|
+
options = {};
|
|
32
|
+
wants = /* @__PURE__ */ new Map();
|
|
33
|
+
/** Memory of wants a save remembers that no module has asked for yet: given to them as they come */
|
|
34
|
+
pending = {};
|
|
35
|
+
added = 0;
|
|
36
|
+
thoughtAt = -1;
|
|
37
|
+
paths = /* @__PURE__ */ new Map();
|
|
38
|
+
/** What is on its way, by type, worked out once a think: asked for every want and every step */
|
|
39
|
+
onWay = /* @__PURE__ */ new Map();
|
|
40
|
+
/** The builders sent this think: not sent twice */
|
|
41
|
+
sent = /* @__PURE__ */ new Set();
|
|
42
|
+
/** The want saving up this think, if one is */
|
|
43
|
+
saving;
|
|
44
|
+
warned = /* @__PURE__ */ new Set();
|
|
45
|
+
constructor(ai, options = {}) {
|
|
46
|
+
this.ai = ai;
|
|
47
|
+
this.configure(options);
|
|
48
|
+
}
|
|
49
|
+
/** Takes options in, over what it had: the standing wants added, the table of placements merged, the flags replaced */
|
|
50
|
+
configure(options) {
|
|
51
|
+
this.options = {
|
|
52
|
+
...this.options,
|
|
53
|
+
...options,
|
|
54
|
+
placement: {
|
|
55
|
+
...this.options.placement,
|
|
56
|
+
...options.placement
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
for (const def of options.wants ?? []) this.want({
|
|
60
|
+
...def,
|
|
61
|
+
keep: true
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
/** The plan's options as they stand */
|
|
65
|
+
get settings() {
|
|
66
|
+
return this.options;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Adds a want, or replaces one of the same id (its memory kept): what the plan works towards from now. Gives back
|
|
70
|
+
* its id. A want with no `keep` is dropped once met
|
|
71
|
+
*/
|
|
72
|
+
want(def) {
|
|
73
|
+
if (!def.type) throw new Error("A want needs a type");
|
|
74
|
+
const id = def.id ?? `${def.type}#${++this.added}`;
|
|
75
|
+
const live = this.wants.get(id);
|
|
76
|
+
if (live) {
|
|
77
|
+
live.def = {
|
|
78
|
+
...def,
|
|
79
|
+
id
|
|
80
|
+
};
|
|
81
|
+
return id;
|
|
82
|
+
}
|
|
83
|
+
const memory = this.pending[id] ?? {
|
|
84
|
+
since: this.ai.tick,
|
|
85
|
+
order: this.added,
|
|
86
|
+
made: 0
|
|
87
|
+
};
|
|
88
|
+
delete this.pending[id];
|
|
89
|
+
this.added = Math.max(this.added, memory.order + 1);
|
|
90
|
+
this.wants.set(id, {
|
|
91
|
+
id,
|
|
92
|
+
def: {
|
|
93
|
+
...def,
|
|
94
|
+
id
|
|
95
|
+
},
|
|
96
|
+
memory,
|
|
97
|
+
count: 0,
|
|
98
|
+
have: 0,
|
|
99
|
+
onItsWay: 0,
|
|
100
|
+
status: "new",
|
|
101
|
+
steps: []
|
|
102
|
+
});
|
|
103
|
+
return id;
|
|
104
|
+
}
|
|
105
|
+
/** Takes a want out, and what a save remembered of it: whether there was one */
|
|
106
|
+
drop(id) {
|
|
107
|
+
const remembered = id in this.pending;
|
|
108
|
+
delete this.pending[id];
|
|
109
|
+
return this.wants.delete(id) || remembered;
|
|
110
|
+
}
|
|
111
|
+
/** A want by id */
|
|
112
|
+
get(id) {
|
|
113
|
+
return this.wants.get(id)?.def;
|
|
114
|
+
}
|
|
115
|
+
/** The wants, in the order added */
|
|
116
|
+
list() {
|
|
117
|
+
return this.ordered().map((live) => live.def);
|
|
118
|
+
}
|
|
119
|
+
/** Where a want stands, in words, as of the last think: `building a barracks at (40, 60)`, `saving for a town hall` */
|
|
120
|
+
status(id) {
|
|
121
|
+
return this.wants.get(id)?.status;
|
|
122
|
+
}
|
|
123
|
+
/** The want saving up, as of the last think: the most important one it could not pay for */
|
|
124
|
+
get savingFor() {
|
|
125
|
+
return this.saving;
|
|
126
|
+
}
|
|
127
|
+
/** How many of a type the player has, those under construction and those that count as it included */
|
|
128
|
+
have(type) {
|
|
129
|
+
return this.ai.view.mine.ofType(type).length;
|
|
130
|
+
}
|
|
131
|
+
/** How many of a type are on their way beyond those that stand: builders sent to build one, buildings turning into one, units queued */
|
|
132
|
+
onItsWay(type) {
|
|
133
|
+
const known = this.onWay.get(type);
|
|
134
|
+
if (known !== void 0) return known;
|
|
135
|
+
let count = 0;
|
|
136
|
+
for (const entity of this.ai.view.mine) {
|
|
137
|
+
const own = entity.own;
|
|
138
|
+
if (!own) continue;
|
|
139
|
+
if (own.order === "build" && own.build === type) count++;
|
|
140
|
+
else if (upgradeOf(entity)?.to === type) count++;
|
|
141
|
+
for (const item of queueOf(entity)) if ((item.kind === "morph" || item.kind === "unit") && item.id === type) count++;
|
|
142
|
+
}
|
|
143
|
+
this.onWay.set(type, count);
|
|
144
|
+
return count;
|
|
145
|
+
}
|
|
146
|
+
/** Whether a type is had or on its way: standing (finished or not), or a builder or a morph on the way to it */
|
|
147
|
+
had(type) {
|
|
148
|
+
return this.ai.view.me.tech.includes(type) || this.have(type) > 0 || this.onItsWay(type) > 0;
|
|
149
|
+
}
|
|
150
|
+
/** The steps to being able to make a type (`techPath`), worked out once a think */
|
|
151
|
+
path(type) {
|
|
152
|
+
let found = this.paths.get(type);
|
|
153
|
+
if (!found) this.paths.set(type, found = techPath(this.ai.view, type, (step) => this.onItsWay(step) > 0));
|
|
154
|
+
return found;
|
|
155
|
+
}
|
|
156
|
+
/** The first step towards a type not had yet, the type's own last: none when nothing is to be done, or the path is blocked */
|
|
157
|
+
next(type) {
|
|
158
|
+
const path = this.path(type);
|
|
159
|
+
if (techTrouble(path)) return void 0;
|
|
160
|
+
for (const step of path.steps) if (!this.had(step.type)) return step;
|
|
161
|
+
const maker = makerOf(this.ai.view, type);
|
|
162
|
+
return maker && {
|
|
163
|
+
type,
|
|
164
|
+
...maker,
|
|
165
|
+
for: type
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* The think, once a think: every want measured against what stands and is on its way (met ones dropped, or kept
|
|
170
|
+
* standing), those whose condition holds taken most important first, each advanced by the first step it can take:
|
|
171
|
+
* built, turned into, or saved for. Then the mending, where the plan is to
|
|
172
|
+
*/
|
|
173
|
+
think() {
|
|
174
|
+
const { ai } = this;
|
|
175
|
+
if (this.thoughtAt === ai.tick) return;
|
|
176
|
+
this.thoughtAt = ai.tick;
|
|
177
|
+
this.paths.clear();
|
|
178
|
+
this.onWay.clear();
|
|
179
|
+
this.sent.clear();
|
|
180
|
+
this.saving = void 0;
|
|
181
|
+
const following = ai.plans.follow() !== void 0;
|
|
182
|
+
const active = [];
|
|
183
|
+
for (const [id, live] of this.wants) {
|
|
184
|
+
const { def } = live;
|
|
185
|
+
live.steps = [];
|
|
186
|
+
live.holds = void 0;
|
|
187
|
+
live.count = typeof def.count === "function" ? def.count(ai) : def.count ?? 1;
|
|
188
|
+
live.have = this.have(def.type);
|
|
189
|
+
live.onItsWay = this.onItsWay(def.type);
|
|
190
|
+
if (live.have + live.onItsWay >= live.count) {
|
|
191
|
+
live.status = "met";
|
|
192
|
+
if (!def.keep) {
|
|
193
|
+
this.wants.delete(id);
|
|
194
|
+
continue;
|
|
195
|
+
}
|
|
196
|
+
if (!(def.rebuild ?? this.options.rebuild ?? true)) live.memory.satisfied = true;
|
|
197
|
+
continue;
|
|
198
|
+
}
|
|
199
|
+
if (live.memory.satisfied) {
|
|
200
|
+
live.status = "met once, not built anew";
|
|
201
|
+
continue;
|
|
202
|
+
}
|
|
203
|
+
if (def.when && !evaluate(def.when, ai)) {
|
|
204
|
+
live.status = "waits for its condition";
|
|
205
|
+
continue;
|
|
206
|
+
}
|
|
207
|
+
if (following && id !== "order") {
|
|
208
|
+
live.status = "waits for the build order";
|
|
209
|
+
continue;
|
|
210
|
+
}
|
|
211
|
+
active.push(live);
|
|
212
|
+
}
|
|
213
|
+
active.sort((a, b) => (b.def.priority ?? 0) - (a.def.priority ?? 0) || a.memory.order - b.memory.order);
|
|
214
|
+
for (const live of active) this.advance(live);
|
|
215
|
+
if (this.options.repair ?? true) this.mend();
|
|
216
|
+
}
|
|
217
|
+
/** One want, one think: the steps to it, and the first one it can take */
|
|
218
|
+
advance(live) {
|
|
219
|
+
const { ai } = this;
|
|
220
|
+
const { def } = live;
|
|
221
|
+
const path = this.path(def.type);
|
|
222
|
+
const trouble = techTrouble(path);
|
|
223
|
+
if (trouble) {
|
|
224
|
+
live.status = `blocked: ${trouble}`;
|
|
225
|
+
if (!this.warned.has(def.type)) {
|
|
226
|
+
this.warned.add(def.type);
|
|
227
|
+
ai.log.warn("ai", `the build plan cannot get to ${def.type}: ${trouble}`, { want: live.id });
|
|
228
|
+
}
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
const own = makerOf(ai.view, def.type);
|
|
232
|
+
const steps = [...path.steps, ...own ? [{
|
|
233
|
+
type: def.type,
|
|
234
|
+
...own,
|
|
235
|
+
for: def.type
|
|
236
|
+
}] : []];
|
|
237
|
+
live.steps = steps.map(stepWords);
|
|
238
|
+
let status;
|
|
239
|
+
for (const step of steps) {
|
|
240
|
+
const last = step.type === def.type;
|
|
241
|
+
if (!last && this.had(step.type)) {
|
|
242
|
+
if (!ai.view.me.tech.includes(step.type)) status ??= `waits for ${an(step.type)} to finish`;
|
|
243
|
+
continue;
|
|
244
|
+
}
|
|
245
|
+
const outcome = this.act(step, live, last);
|
|
246
|
+
status ??= outcome;
|
|
247
|
+
}
|
|
248
|
+
live.status = status ?? "nothing to do";
|
|
249
|
+
}
|
|
250
|
+
/** Takes a step for a want, where it can: what came of it, in words, for the status */
|
|
251
|
+
act(step, live, last) {
|
|
252
|
+
const { ai } = this;
|
|
253
|
+
const { view, registry } = ai;
|
|
254
|
+
const { def } = live;
|
|
255
|
+
const type = registry.unit(step.type);
|
|
256
|
+
switch (step.how) {
|
|
257
|
+
case "train": return last ? `to be trained` : `needs ${an(step.type)}`;
|
|
258
|
+
case "morph": {
|
|
259
|
+
const from = view.mine.where((entity) => entity.type === step.from && builtSoFar(entity) === void 0 && !upgradeOf(entity)?.to && !queueOf(entity).length).first();
|
|
260
|
+
if (!from) return `waits for ${an(step.from)} with nothing to do, to turn into ${an(step.type)}`;
|
|
261
|
+
if (!view.has(type.requires)) return `waits for what ${an(step.type)} requires`;
|
|
262
|
+
if (!this.pay(live, type.cost)) return this.short(live, step.type);
|
|
263
|
+
ai.send({
|
|
264
|
+
type: "upgradeBuilding",
|
|
265
|
+
building: from.id,
|
|
266
|
+
into: step.type
|
|
267
|
+
});
|
|
268
|
+
if (last) live.memory.made++;
|
|
269
|
+
ai.decide(`turns its ${step.from} into ${an(step.type)}${def.by ? `, for ${def.by}` : ""}`, { kind: "build" });
|
|
270
|
+
return `turning ${an(step.from)} into ${an(step.type)}`;
|
|
271
|
+
}
|
|
272
|
+
case "build": {
|
|
273
|
+
if (!view.has(type.requires)) return `waits for what ${an(step.type)} requires`;
|
|
274
|
+
const place = last ? this.placeOf(live) : void 0;
|
|
275
|
+
if (place && ai.def.knowledge !== false && !ai.knowledge.map.explored(this.settlePoint(place))) {
|
|
276
|
+
this.sendSettler(live, place);
|
|
277
|
+
this.canPay(live, type.cost);
|
|
278
|
+
return `no ground known at ${where(place)}, a worker sent to look`;
|
|
279
|
+
}
|
|
280
|
+
if (!this.canPay(live, type.cost)) return this.short(live, step.type);
|
|
281
|
+
const site = this.siteFor(type, last ? live : void 0);
|
|
282
|
+
if (!site) {
|
|
283
|
+
if (last && this.noSite(live)) return `gave up: no spot for ${an(step.type)}`;
|
|
284
|
+
return `no spot for ${an(step.type)}${last && live.memory.settler ? ", a worker sent to look" : ""}`;
|
|
285
|
+
}
|
|
286
|
+
live.memory.noSite = void 0;
|
|
287
|
+
const builder = this.builderFor(type, site);
|
|
288
|
+
if (!builder) return `no builder for ${an(step.type)}`;
|
|
289
|
+
this.ai.purse.spend(type.cost, def.priority ?? 0);
|
|
290
|
+
this.sent.add(builder.id);
|
|
291
|
+
ai.send({
|
|
292
|
+
type: "order",
|
|
293
|
+
entities: [builder.id],
|
|
294
|
+
order: {
|
|
295
|
+
type: "build",
|
|
296
|
+
unitType: step.type,
|
|
297
|
+
point: site
|
|
298
|
+
}
|
|
299
|
+
});
|
|
300
|
+
if (last) live.memory.made++;
|
|
301
|
+
ai.decide(`builds ${an(step.type)} at ${where(site)}${def.by ? `, for ${def.by}` : ""}${last ? "" : `, on the way to ${def.type}`}`, { kind: "build" });
|
|
302
|
+
return `building ${an(step.type)} at ${where(site)}`;
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Pays for a step out of the purse, with the want's `spare` left over, as important as the want is (what less
|
|
308
|
+
* important wants and modules hold is its to spend); where it cannot, the most important want that could not pay
|
|
309
|
+
* holds the money (one at a time), and what is less important waits
|
|
310
|
+
*/
|
|
311
|
+
pay(live, cost) {
|
|
312
|
+
if (!this.canPay(live, cost)) return false;
|
|
313
|
+
this.ai.purse.spend(cost, live.def.priority ?? 0);
|
|
314
|
+
return true;
|
|
315
|
+
}
|
|
316
|
+
/** Whether a want can pay for a step now (nothing spent); where it cannot, it may hold the money (`pay`) */
|
|
317
|
+
canPay(live, cost) {
|
|
318
|
+
const { purse } = this.ai;
|
|
319
|
+
const priority = live.def.priority ?? 0;
|
|
320
|
+
if (purse.affords(cost, live.def.spare ?? 0, priority)) return true;
|
|
321
|
+
if (this.saving === void 0 && cost && !live.def.spare) {
|
|
322
|
+
this.saving = live.id;
|
|
323
|
+
purse.reserve(live.id, cost, priority);
|
|
324
|
+
live.holds = { ...cost };
|
|
325
|
+
}
|
|
326
|
+
return false;
|
|
327
|
+
}
|
|
328
|
+
/** A step not paid for, in words: the want holds the money (saving), waits for money to spare (a luxury), or waits for the money */
|
|
329
|
+
short(live, type) {
|
|
330
|
+
if (live.holds) return `saving for ${an(type)}`;
|
|
331
|
+
if (live.def.spare) return `waits for ${live.def.spare} ${this.ai.purse.money} to spare for ${an(type)}`;
|
|
332
|
+
return `waits for the money for ${an(type)}`;
|
|
333
|
+
}
|
|
334
|
+
/** No spot found this think: for a want that does not stand, given up after `siteTimeout` seconds, and said */
|
|
335
|
+
noSite(live) {
|
|
336
|
+
const { ai } = this;
|
|
337
|
+
live.memory.noSite ??= ai.tick;
|
|
338
|
+
const to = this.placeOf(live);
|
|
339
|
+
if (to) this.sendSettler(live, to);
|
|
340
|
+
if (live.def.keep) return false;
|
|
341
|
+
const limit = (live.def.siteTimeout ?? this.options.siteTimeout ?? SITE_TIMEOUT) * ai.session.tickRate;
|
|
342
|
+
if (ai.tick - live.memory.noSite < limit) return false;
|
|
343
|
+
this.wants.delete(live.id);
|
|
344
|
+
ai.decide(`gives up on ${an(live.def.type)}: no spot for it in ${Math.round(limit / ai.session.tickRate)} s`, { kind: "build" });
|
|
345
|
+
return true;
|
|
346
|
+
}
|
|
347
|
+
/** Where a want says it goes, as a point: a point, a named entity it knows of, or what its function gives. Nothing for home */
|
|
348
|
+
placeOf(live) {
|
|
349
|
+
const { near } = live.def;
|
|
350
|
+
if (near === void 0) return void 0;
|
|
351
|
+
if (typeof near === "function") return near(this.ai);
|
|
352
|
+
if (typeof near === "string") {
|
|
353
|
+
const named = this.ai.view.named(near);
|
|
354
|
+
return named ? {
|
|
355
|
+
x: named.x,
|
|
356
|
+
z: named.z
|
|
357
|
+
} : void 0;
|
|
358
|
+
}
|
|
359
|
+
return near;
|
|
360
|
+
}
|
|
361
|
+
/** A spot for a type: where the want says, no further than it says, by its strategy; near home for a step on the way */
|
|
362
|
+
siteFor(type, live) {
|
|
363
|
+
const { view } = this.ai;
|
|
364
|
+
const near = (live && this.placeOf(live)) ?? view.home() ?? view.mine.where((_, def) => !!def.builds?.includes(type.id)).first();
|
|
365
|
+
if (!near) return void 0;
|
|
366
|
+
return this.site(type, {
|
|
367
|
+
near: {
|
|
368
|
+
x: near.x,
|
|
369
|
+
z: near.z
|
|
370
|
+
},
|
|
371
|
+
within: live?.def.within ?? this.options.within ?? WITHIN
|
|
372
|
+
}, live?.def.placement);
|
|
373
|
+
}
|
|
374
|
+
/**
|
|
375
|
+
* A spot for a type near a place, by a strategy: the one given, else what the type declares (`UnitTypeDef.ai.placement`),
|
|
376
|
+
* the plan's table by type then by role, the role's default, the rings around the place. What is built on a
|
|
377
|
+
* deposit goes on one whatever the name
|
|
378
|
+
*/
|
|
379
|
+
site(type, request, placement) {
|
|
380
|
+
return this.strategyFor(type, placement)(this.ai, type, {
|
|
381
|
+
...request,
|
|
382
|
+
ordinal: request.ordinal ?? this.have(type.id) + this.onItsWay(type.id)
|
|
383
|
+
});
|
|
384
|
+
}
|
|
385
|
+
strategyFor(type, placement) {
|
|
386
|
+
if (typeof placement === "function") return placement;
|
|
387
|
+
if (type.builtOn !== void 0) return placementNamed("byResource");
|
|
388
|
+
const table = this.options.placement ?? {};
|
|
389
|
+
const roles = this.ai.view.roles.of(type.id);
|
|
390
|
+
const chosen = placement ?? type.ai?.placement ?? table[type.id] ?? roles.map((role) => table[role]).find((each) => each !== void 0) ?? roles.map((role) => DEFAULT_PLACEMENT[role]).find((each) => each !== void 0);
|
|
391
|
+
if (typeof chosen === "function") return chosen;
|
|
392
|
+
return placementNamed(chosen ?? "nearHome");
|
|
393
|
+
}
|
|
394
|
+
/** The workers sent to look at the ground somewhere, by any want: not builders while they go */
|
|
395
|
+
settlers() {
|
|
396
|
+
const ids = /* @__PURE__ */ new Set();
|
|
397
|
+
for (const live of this.wants.values()) {
|
|
398
|
+
const settler = this.ai.view.byId(live.memory.settler);
|
|
399
|
+
if (settler?.own?.order === "move") ids.add(settler.id);
|
|
400
|
+
}
|
|
401
|
+
return ids;
|
|
402
|
+
}
|
|
403
|
+
/**
|
|
404
|
+
* Who builds a type at a spot: of the player's units that build it, those not hidden, not building, not sent this
|
|
405
|
+
* think, not off to look at ground and not in a squad or held by a rule; idle first, then whoever carries the least,
|
|
406
|
+
* then the nearest
|
|
407
|
+
*/
|
|
408
|
+
builderFor(type, site) {
|
|
409
|
+
const settlers = this.settlers();
|
|
410
|
+
const builders = this.ai.view.mine.where((entity, def) => !!def.builds?.includes(type.id) && !!entity.own && !entity.own.hidden && entity.own.order !== "build" && entity.own.order !== "repair" && !this.sent.has(entity.id) && !settlers.has(entity.id) && !this.ai.goals.ruled(entity.id) && !this.ai.squads.squadOf(entity)).items.slice();
|
|
411
|
+
builders.sort((a, b) => Number(!!a.own?.order) - Number(!!b.own?.order) || (snapshotOf(a, gathering)?.carrying ?? 0) - (snapshotOf(b, gathering)?.carrying ?? 0) || distSq(a, site) - distSq(b, site) || a.id - b.id);
|
|
412
|
+
return builders[0];
|
|
413
|
+
}
|
|
414
|
+
/** Where a settler stands to see a place: on its near side, towards home, so that it sees where the building would stand and not the mine alone */
|
|
415
|
+
settlePoint(to) {
|
|
416
|
+
const home = this.ai.view.home();
|
|
417
|
+
const away = home ? Math.sqrt(distSq(home, to)) : 0;
|
|
418
|
+
return home && away > SETTLE_FROM ? {
|
|
419
|
+
x: to.x + (home.x - to.x) / away * SETTLE_FROM,
|
|
420
|
+
z: to.z + (home.z - to.z) / away * SETTLE_FROM
|
|
421
|
+
} : {
|
|
422
|
+
x: to.x,
|
|
423
|
+
z: to.z
|
|
424
|
+
};
|
|
425
|
+
}
|
|
426
|
+
/**
|
|
427
|
+
* A worker sent to where a want goes, to see the ground: one at a time for the want, sent again if it was taken off
|
|
428
|
+
* it. To the near side of the place, towards home (`settlePoint`)
|
|
429
|
+
*/
|
|
430
|
+
sendSettler(live, to) {
|
|
431
|
+
const { ai } = this;
|
|
432
|
+
const { view } = ai;
|
|
433
|
+
const settling = view.byId(live.memory.settler);
|
|
434
|
+
if (settling?.owner === ai.playerId && settling.own?.order === "move") return;
|
|
435
|
+
const type = ai.registry.unit(live.def.type);
|
|
436
|
+
const settler = view.mine.where((entity, def) => !!def.builds?.includes(type.id) && !!entity.own && !entity.own.hidden && !snapshotOf(entity, gathering)?.carrying).nearest(to);
|
|
437
|
+
if (!settler) return;
|
|
438
|
+
live.memory.settler = settler.id;
|
|
439
|
+
ai.send({
|
|
440
|
+
type: "order",
|
|
441
|
+
entities: [settler.id],
|
|
442
|
+
order: {
|
|
443
|
+
type: "move",
|
|
444
|
+
point: this.settlePoint(to)
|
|
445
|
+
}
|
|
446
|
+
});
|
|
447
|
+
ai.decide(`sends a worker to see the ground at ${where(to)}, for ${an(live.def.type)}`, { kind: "build" });
|
|
448
|
+
}
|
|
449
|
+
/**
|
|
450
|
+
* Builds a type now, outside any want: a spot near a place (home when left out), a builder, the purse. What a
|
|
451
|
+
* module does for a one-off (the melee player's building on a mine). Whether it was sent
|
|
452
|
+
*/
|
|
453
|
+
build(type, options = {}) {
|
|
454
|
+
const { ai } = this;
|
|
455
|
+
const { view, purse } = ai;
|
|
456
|
+
const def = typeof type === "string" ? ai.registry.unit(type) : type;
|
|
457
|
+
if (!view.has(def.requires) || !purse.affords(def.cost, options.spare ?? 0)) return false;
|
|
458
|
+
const near = options.near ?? view.home() ?? view.mine.where((_, each) => !!each.builds?.includes(def.id)).first();
|
|
459
|
+
if (!near) return false;
|
|
460
|
+
const site = this.site(def, {
|
|
461
|
+
near: {
|
|
462
|
+
x: near.x,
|
|
463
|
+
z: near.z
|
|
464
|
+
},
|
|
465
|
+
within: options.within ?? this.options.within ?? WITHIN
|
|
466
|
+
}, options.placement);
|
|
467
|
+
if (!site) return false;
|
|
468
|
+
const builder = this.builderFor(def, site);
|
|
469
|
+
if (!builder || !purse.spend(def.cost)) return false;
|
|
470
|
+
this.sent.add(builder.id);
|
|
471
|
+
ai.send({
|
|
472
|
+
type: "order",
|
|
473
|
+
entities: [builder.id],
|
|
474
|
+
order: {
|
|
475
|
+
type: "build",
|
|
476
|
+
unitType: def.id,
|
|
477
|
+
point: site
|
|
478
|
+
}
|
|
479
|
+
});
|
|
480
|
+
ai.decide(`builds ${an(def.id)} at ${where(site)}${options.by ? `, for ${options.by}` : ""}`, { kind: "build" });
|
|
481
|
+
return true;
|
|
482
|
+
}
|
|
483
|
+
/**
|
|
484
|
+
* Mends: a worker sent to a damaged building of the player's that no enemy strength reaches, one a think, when
|
|
485
|
+
* the purse has what the mending will cost (`RuleSettings.economy.repairCost` of what is missing). Not one being mended already
|
|
486
|
+
*/
|
|
487
|
+
mend() {
|
|
488
|
+
const { ai } = this;
|
|
489
|
+
const { view, purse, registry } = ai;
|
|
490
|
+
const share = registry.settings.economy.repairCost;
|
|
491
|
+
for (const building of view.mine.buildings().finished()) {
|
|
492
|
+
const def = view.def(building);
|
|
493
|
+
const maxHp = building.maxHealth ?? baseStats(def, registry).health;
|
|
494
|
+
if (!(building.health < maxHp * MEND_UNDER) || !def.cost) continue;
|
|
495
|
+
if (ai.threat.at(building).enemy > 0) continue;
|
|
496
|
+
if (view.mine.where((entity, each) => !!each.builds?.length && entity.own?.order === "repair" && distSq(entity, building) < 36).length) continue;
|
|
497
|
+
const missing = 1 - building.health / maxHp;
|
|
498
|
+
const price = {};
|
|
499
|
+
for (const kind in def.cost) price[kind] = Math.ceil(def.cost[kind] * share * missing);
|
|
500
|
+
if (!purse.affords(price)) continue;
|
|
501
|
+
const worker = this.builderFor(def, building);
|
|
502
|
+
if (!worker || !worker.own || worker.own.order === "build") continue;
|
|
503
|
+
purse.spend(price);
|
|
504
|
+
this.sent.add(worker.id);
|
|
505
|
+
ai.send({
|
|
506
|
+
type: "order",
|
|
507
|
+
entities: [worker.id],
|
|
508
|
+
order: {
|
|
509
|
+
type: "repair",
|
|
510
|
+
target: building.id
|
|
511
|
+
}
|
|
512
|
+
});
|
|
513
|
+
ai.decide(`mends its ${def.id} at ${where(building)}: ${Math.round(missing * 100)}% gone, nobody near it`, { kind: "build" });
|
|
514
|
+
return;
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
/** The wants in the order they were added: what the report and a save list them in, the same in a loaded game */
|
|
518
|
+
ordered() {
|
|
519
|
+
return [...this.wants.values()].sort((a, b) => a.memory.order - b.memory.order);
|
|
520
|
+
}
|
|
521
|
+
/** Every want as the last think left it, in the order added, the one saving up named */
|
|
522
|
+
report() {
|
|
523
|
+
return {
|
|
524
|
+
wants: this.ordered().map((live) => ({
|
|
525
|
+
id: live.id,
|
|
526
|
+
type: live.def.type,
|
|
527
|
+
count: live.count,
|
|
528
|
+
have: live.have,
|
|
529
|
+
onItsWay: live.onItsWay,
|
|
530
|
+
priority: live.def.priority ?? 0,
|
|
531
|
+
...live.def.by !== void 0 && { by: live.def.by },
|
|
532
|
+
...live.def.keep && { keep: true },
|
|
533
|
+
status: live.status,
|
|
534
|
+
steps: [...live.steps],
|
|
535
|
+
...live.holds && { holds: { ...live.holds } }
|
|
536
|
+
})),
|
|
537
|
+
...this.saving !== void 0 && { saving: this.saving }
|
|
538
|
+
};
|
|
539
|
+
}
|
|
540
|
+
/**
|
|
541
|
+
* What it remembers, for a save: each standing want's memory (its code gives the want again), and the wants added
|
|
542
|
+
* as the game went that are plain data, whole. A want that does not stand and has code in it is not kept: the
|
|
543
|
+
* game loaded from the save would not know when the game saved from would have dropped it
|
|
544
|
+
*/
|
|
545
|
+
save() {
|
|
546
|
+
const wants = [];
|
|
547
|
+
for (const live of this.ordered()) if (live.def.keep) wants.push({
|
|
548
|
+
id: live.id,
|
|
549
|
+
memory: { ...live.memory }
|
|
550
|
+
});
|
|
551
|
+
else if (isData(live.def)) wants.push({
|
|
552
|
+
id: live.id,
|
|
553
|
+
memory: { ...live.memory },
|
|
554
|
+
data: structuredClone(live.def)
|
|
555
|
+
});
|
|
556
|
+
for (const id in this.pending) wants.push({
|
|
557
|
+
id,
|
|
558
|
+
memory: { ...this.pending[id] }
|
|
559
|
+
});
|
|
560
|
+
wants.sort((a, b) => a.memory.order - b.memory.order);
|
|
561
|
+
return {
|
|
562
|
+
v: 1,
|
|
563
|
+
wants,
|
|
564
|
+
added: this.added,
|
|
565
|
+
...this.saving !== void 0 && { saving: this.saving }
|
|
566
|
+
};
|
|
567
|
+
}
|
|
568
|
+
/** Takes back what `save` gave: whether it was read. The data wants are had again; memory waits for the wants code adds */
|
|
569
|
+
restore(memory) {
|
|
570
|
+
const given = memory;
|
|
571
|
+
if (!given || typeof given !== "object" || given.v !== 1 || !Array.isArray(given.wants)) return false;
|
|
572
|
+
this.pending = {};
|
|
573
|
+
if (typeof given.added === "number") this.added = Math.max(this.added, given.added);
|
|
574
|
+
this.saving = typeof given.saving === "string" ? given.saving : void 0;
|
|
575
|
+
for (const entry of given.wants) {
|
|
576
|
+
if (!entry || typeof entry.id !== "string") continue;
|
|
577
|
+
const live = this.wants.get(entry.id);
|
|
578
|
+
if (live) live.memory = { ...entry.memory };
|
|
579
|
+
else this.pending[entry.id] = { ...entry.memory };
|
|
580
|
+
if (entry.data && !live) this.want({
|
|
581
|
+
...entry.data,
|
|
582
|
+
id: entry.id
|
|
583
|
+
});
|
|
584
|
+
}
|
|
585
|
+
return true;
|
|
586
|
+
}
|
|
587
|
+
};
|
|
588
|
+
/**
|
|
589
|
+
* The build module: runs the brain's build plan (`ai.plans.build.think()`) in its place among a brain's modules, after
|
|
590
|
+
* what adds wants (rules, goals) and before what gives idle workers something else to do. With options for the plan
|
|
591
|
+
*
|
|
592
|
+
* @beta
|
|
593
|
+
*/
|
|
594
|
+
var build = (options = {}) => defineModule({
|
|
595
|
+
id: "build",
|
|
596
|
+
make: (ai) => {
|
|
597
|
+
ai.plans.build.configure(options);
|
|
598
|
+
return {
|
|
599
|
+
id: "build",
|
|
600
|
+
phase: "plan",
|
|
601
|
+
think: () => ai.plans.build.think()
|
|
602
|
+
};
|
|
603
|
+
}
|
|
604
|
+
});
|
|
605
|
+
//#endregion
|
|
606
|
+
export { BuildPlan, build };
|
|
607
|
+
|
|
608
|
+
//# sourceMappingURL=build.js.map
|