@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,677 @@
|
|
|
1
|
+
import { atan2 } from "../exactMath.js";
|
|
2
|
+
import { angleDiff, dist } from "../math.js";
|
|
3
|
+
import { at } from "../defs.js";
|
|
4
|
+
import { attackTiming, statsOf } from "../stats.js";
|
|
5
|
+
import { attackStarted, impact, missed, projectileRemoved, projectileSpawned, swingCancelled } from "../engineEvents.js";
|
|
6
|
+
import { distanceToEdge, edgeDistance, fighting, moving } from "../entity.js";
|
|
7
|
+
import { isDisarmed, isInvulnerable, isUntargetable, layerOf } from "../abilities/buffs.js";
|
|
8
|
+
import { cancellable } from "../hooks.js";
|
|
9
|
+
import { attackStat, farthestReach, groundAttack, pickAttack, rangeAgainst, reaches, tooNear } from "../attacks.js";
|
|
10
|
+
import { STRUCTURE_REACH, engageWith, engagedLike, isShunned, release, roomFor } from "../engagement.js";
|
|
11
|
+
import { faceTowards, halt, moveTo, moveToEntity, setAnchored } from "./movement.js";
|
|
12
|
+
import { FOE_BONUS, summoned } from "../summoned.js";
|
|
13
|
+
//#region src/systems/combat.ts
|
|
14
|
+
/** Extra reach allowed once a swing has started, so targets stepping back slightly still get hit */
|
|
15
|
+
/**
|
|
16
|
+
* How far past its range a swing already begun still lands (`engage`, and the stances pack, which lets go where the engine would chase)
|
|
17
|
+
*
|
|
18
|
+
* @internal
|
|
19
|
+
*/
|
|
20
|
+
var SWING_SLACK = .75;
|
|
21
|
+
var FACING_TOLERANCE = .4;
|
|
22
|
+
/** The least a swing takes: a hit is never in the tick its swing began */
|
|
23
|
+
var MIN_SWING = 1e-6;
|
|
24
|
+
/** What a swing is aimed at when it is aimed at the ground. No entity has this id */
|
|
25
|
+
var GROUND = -1;
|
|
26
|
+
/**
|
|
27
|
+
* How often an attack up a cliff goes wide
|
|
28
|
+
*
|
|
29
|
+
* @internal
|
|
30
|
+
*/
|
|
31
|
+
var UPHILL_MISS = .25;
|
|
32
|
+
/**
|
|
33
|
+
* Handed to the `canAttack` handlers, again and again, so that asking allocates nothing: one for each question under
|
|
34
|
+
* way, as a handler may ask again (could the target hit back?) while its caller's handlers are still being run
|
|
35
|
+
*/
|
|
36
|
+
var askings = [];
|
|
37
|
+
/** How many questions are under way, one inside the other */
|
|
38
|
+
var asked = 0;
|
|
39
|
+
/**
|
|
40
|
+
* Whether an attacker may attack a target: its attack reaches it, it is an enemy, and the `canAttack` hook agrees.
|
|
41
|
+
* `ordered`: a player told it to (an attack order), which a game may let it do to its own side (`CanAttack.ordered`)
|
|
42
|
+
*
|
|
43
|
+
* @beta
|
|
44
|
+
*/
|
|
45
|
+
function canAttack(world, attacker, target, ordered = false) {
|
|
46
|
+
if (!attacker.def.attacks?.length || !target.alive || target.hidden || target === attacker || target.def.invulnerable || target.def.targetableBy || target.isResource) return false;
|
|
47
|
+
if (target.buffs.length && (isInvulnerable(world, target) || isUntargetable(world, target))) return false;
|
|
48
|
+
if (attacker.buffs.length && isDisarmed(world, attacker)) return false;
|
|
49
|
+
const allowed = world.areEnemies(attacker.owner, target.owner) && world.settings.combat.pickAttack(world, attacker, target) >= 0;
|
|
50
|
+
if (!world.hooks.has("canAttack")) return allowed;
|
|
51
|
+
const asking = askings[asked] ??= cancellable({
|
|
52
|
+
attacker: void 0,
|
|
53
|
+
target: void 0,
|
|
54
|
+
cancelled: true,
|
|
55
|
+
ordered: false
|
|
56
|
+
});
|
|
57
|
+
asking.attacker = attacker;
|
|
58
|
+
asking.target = target;
|
|
59
|
+
asking.cancelled = !allowed;
|
|
60
|
+
asking.ordered = ordered;
|
|
61
|
+
asked++;
|
|
62
|
+
try {
|
|
63
|
+
return !world.hooks.run("canAttack", asking).cancelled;
|
|
64
|
+
} finally {
|
|
65
|
+
asked--;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Whether one of an attacker's attacks can hit a target where it is, whoever's it is: the ground, the air, the kinds it
|
|
70
|
+
* names (`pickAttack`). For a `canAttack` handler that lets a unit attack what is not an enemy
|
|
71
|
+
*
|
|
72
|
+
* @beta
|
|
73
|
+
*/
|
|
74
|
+
function attackReaches(world, attacker, target) {
|
|
75
|
+
return pickAttack(world, attacker, target) >= 0;
|
|
76
|
+
}
|
|
77
|
+
function canSee(world, viewer, target) {
|
|
78
|
+
return world.isVisibleTo(target, world.player(viewer.owner).team);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Whether the target stands on higher ground than the attacker. Nothing is uphill from the air
|
|
82
|
+
*
|
|
83
|
+
* @beta
|
|
84
|
+
*/
|
|
85
|
+
function shootsUphill(world, attacker, target) {
|
|
86
|
+
if (layerOf(world, attacker) === "air") return false;
|
|
87
|
+
const { terrain } = world;
|
|
88
|
+
return terrain.levelAt(target.pos.x, target.pos.z) > terrain.levelAt(attacker.pos.x, attacker.pos.z);
|
|
89
|
+
}
|
|
90
|
+
var searches = [];
|
|
91
|
+
/** How many searches are under way, one inside the other */
|
|
92
|
+
var searching = 0;
|
|
93
|
+
/** What a target with no room left for an attacker loses in its score: a free one of the same kind comes first, however far */
|
|
94
|
+
var CROWDED = 1e3;
|
|
95
|
+
/**
|
|
96
|
+
* Best enemy within `range` of the entity (its acquisition range by default), as the `targetScore` hook sees it. Those
|
|
97
|
+
* it leaves alone for now (`shun`) are not, unless `shunned` says to count them too: to know whether a fight is still on
|
|
98
|
+
*/
|
|
99
|
+
var acquireTarget = (world, entity, range, shunned = false) => searchTarget(world, entity, range, shunned).target;
|
|
100
|
+
/**
|
|
101
|
+
* Best enemy it can hit from where it stands: within the range of the attack it would use against each (`pickAttack`),
|
|
102
|
+
* and `slack` more. For one that holds its ground
|
|
103
|
+
*
|
|
104
|
+
* @beta
|
|
105
|
+
*/
|
|
106
|
+
function acquireInRange(world, entity, slack = 0) {
|
|
107
|
+
const attacks = entity.def.attacks;
|
|
108
|
+
if (!attacks?.length) return void 0;
|
|
109
|
+
const stats = statsOf(world, entity);
|
|
110
|
+
if (attacks.length === 1) return searchTarget(world, entity, attackStat(stats, attacks[0], "range") + slack).target;
|
|
111
|
+
return searchTarget(world, entity, farthestReach(entity.def, stats) + slack, false, slack).target;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* What the `targetScore` hook makes of a target for an attacker, the engine's own score under it: what a search would
|
|
115
|
+
* weigh it at, or -Infinity for one a game's hook leaves out. For a rule that hands an attacker a target without
|
|
116
|
+
* searching (an ally's help), so that the game weighs it as it weighs any
|
|
117
|
+
*/
|
|
118
|
+
function scoreTarget(world, entity, other) {
|
|
119
|
+
const distance = edgeDistance(entity, other);
|
|
120
|
+
const threat = other.def.threat ?? (other.def.attacks?.length ? 2 : other.isBuilding ? 0 : 1);
|
|
121
|
+
const engaged = other.id === entity.get(fighting)?.engaged ? 0 : engagedLike(world, other, entity);
|
|
122
|
+
const room = roomFor(world, other, entity);
|
|
123
|
+
const score = threat * 1e3 - distance - (engaged >= room ? CROWDED : 0);
|
|
124
|
+
if (!world.hooks.has("targetScore")) return score;
|
|
125
|
+
return world.hooks.run("targetScore", {
|
|
126
|
+
attacker: entity,
|
|
127
|
+
target: other,
|
|
128
|
+
distance,
|
|
129
|
+
engaged,
|
|
130
|
+
room,
|
|
131
|
+
score
|
|
132
|
+
}).score;
|
|
133
|
+
}
|
|
134
|
+
/** Nothing found, by an entity that does not attack */
|
|
135
|
+
var NOTHING = Object.freeze({
|
|
136
|
+
target: void 0,
|
|
137
|
+
passedOver: false
|
|
138
|
+
});
|
|
139
|
+
/**
|
|
140
|
+
* `acquireTarget`, and whether it passed over a target it leaves alone for now (`TargetFound`). What it gives back is
|
|
141
|
+
* the search's own, used again by the next search: read it at once
|
|
142
|
+
*/
|
|
143
|
+
function searchTarget(world, entity, range, shunned = false, inRange) {
|
|
144
|
+
if (!entity.def.attacks?.length) return NOTHING;
|
|
145
|
+
const reach = range ?? world.settings.combat.acquisitionRange(world, entity);
|
|
146
|
+
if (range === void 0 && reach <= 0) return NOTHING;
|
|
147
|
+
const search = searches[searching] ??= {
|
|
148
|
+
candidates: [],
|
|
149
|
+
scoring: {
|
|
150
|
+
attacker: void 0,
|
|
151
|
+
target: void 0,
|
|
152
|
+
distance: 0,
|
|
153
|
+
engaged: 0,
|
|
154
|
+
room: 0,
|
|
155
|
+
score: 0
|
|
156
|
+
},
|
|
157
|
+
found: {
|
|
158
|
+
target: void 0,
|
|
159
|
+
passedOver: false
|
|
160
|
+
}
|
|
161
|
+
};
|
|
162
|
+
searching++;
|
|
163
|
+
try {
|
|
164
|
+
return bestTarget(world, entity, reach, shunned, search, inRange);
|
|
165
|
+
} finally {
|
|
166
|
+
searching--;
|
|
167
|
+
search.candidates.length = 0;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
/** By world, then by owner: whether another owner is on the owner's side, for the grid to leave out cells of theirs alone */
|
|
171
|
+
var sidesOf = /* @__PURE__ */ new WeakMap();
|
|
172
|
+
function sideTest(world, owner) {
|
|
173
|
+
let byOwner = sidesOf.get(world);
|
|
174
|
+
if (!byOwner) sidesOf.set(world, byOwner = /* @__PURE__ */ new Map());
|
|
175
|
+
let side = byOwner.get(owner);
|
|
176
|
+
if (!side) byOwner.set(owner, side = (other) => world.areAllies(owner, other));
|
|
177
|
+
return side;
|
|
178
|
+
}
|
|
179
|
+
var hasDeadZone = (attack) => !!attack.minRange;
|
|
180
|
+
var firesOnTheMove = (attack) => !!attack.onTheMove;
|
|
181
|
+
/** `inRange`: only what the attack it would use reaches, and that much more (`acquireInRange`) */
|
|
182
|
+
function bestTarget(world, entity, reach, shunned, { candidates, scoring, found }, inRange) {
|
|
183
|
+
const hooked = world.hooks.has("targetScore");
|
|
184
|
+
world.spatial.query(entity.pos.x, entity.pos.z, reach + entity.def.radius, candidates, sideTest(world, entity.owner));
|
|
185
|
+
let best;
|
|
186
|
+
let bestScore = -Infinity;
|
|
187
|
+
let passed = false;
|
|
188
|
+
const { owner } = entity;
|
|
189
|
+
let sideOf = owner;
|
|
190
|
+
let ownSide = true;
|
|
191
|
+
const nearest = entity.def.attacks?.some(hasDeadZone) ?? false;
|
|
192
|
+
const brought = entity.get(summoned);
|
|
193
|
+
const foe = brought?.foe && brought.foeUntil > world.time ? brought.foe : 0;
|
|
194
|
+
for (const other of candidates) {
|
|
195
|
+
if (other.def.ignored) continue;
|
|
196
|
+
if (other.owner !== sideOf) {
|
|
197
|
+
sideOf = other.owner;
|
|
198
|
+
ownSide = world.areAllies(owner, sideOf);
|
|
199
|
+
}
|
|
200
|
+
if (ownSide) continue;
|
|
201
|
+
const distance = edgeDistance(entity, other);
|
|
202
|
+
if (distance > reach || !canAttack(world, entity, other) || !canSee(world, entity, other)) continue;
|
|
203
|
+
if (inRange !== void 0 && distance > rangeAgainst(world, entity, other) + inRange) continue;
|
|
204
|
+
if (nearest && tooNear(entity, other, Math.max(pickAttack(world, entity, other), 0))) continue;
|
|
205
|
+
if (!shunned && isShunned(world, entity, other)) {
|
|
206
|
+
passed = true;
|
|
207
|
+
continue;
|
|
208
|
+
}
|
|
209
|
+
const threat = other.def.threat ?? (other.def.attacks?.length ? 2 : other.isBuilding ? 0 : 1);
|
|
210
|
+
const engaged = other.id === entity.get(fighting)?.engaged ? 0 : engagedLike(world, other, entity);
|
|
211
|
+
const room = roomFor(world, other, entity);
|
|
212
|
+
let score = threat * 1e3 - distance - (engaged >= room ? CROWDED : 0);
|
|
213
|
+
if (foe && other.id === foe) score += FOE_BONUS;
|
|
214
|
+
if (hooked) {
|
|
215
|
+
scoring.attacker = entity;
|
|
216
|
+
scoring.target = other;
|
|
217
|
+
scoring.distance = distance;
|
|
218
|
+
scoring.engaged = engaged;
|
|
219
|
+
scoring.room = room;
|
|
220
|
+
scoring.score = score;
|
|
221
|
+
score = world.hooks.run("targetScore", scoring).score;
|
|
222
|
+
}
|
|
223
|
+
if (score > bestScore) {
|
|
224
|
+
bestScore = score;
|
|
225
|
+
best = other;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
found.target = best;
|
|
229
|
+
found.passedOver = passed;
|
|
230
|
+
return found;
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Calls off the swing under way, before its blow: said (`swingCancelled`) when there was one, for the screen to cut
|
|
234
|
+
* the attack to the walk. What has been swung already is not given back: the cooldown runs as it did
|
|
235
|
+
*/
|
|
236
|
+
function cancelSwing(world, entity) {
|
|
237
|
+
const combat = entity.get(fighting);
|
|
238
|
+
if (!combat) return;
|
|
239
|
+
if (combat.swing > 0) {
|
|
240
|
+
const target = combat.swingTarget > 0 ? world.get(combat.swingTarget) : void 0;
|
|
241
|
+
combat.swing = 0;
|
|
242
|
+
combat.swingTarget = 0;
|
|
243
|
+
world.events.emit(swingCancelled, {
|
|
244
|
+
attacker: entity,
|
|
245
|
+
target,
|
|
246
|
+
weapon: combat.weapon ?? 0
|
|
247
|
+
});
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
combat.swing = 0;
|
|
251
|
+
combat.swingTarget = 0;
|
|
252
|
+
}
|
|
253
|
+
var caught = [];
|
|
254
|
+
/** What an attack that hits an area does where it comes down */
|
|
255
|
+
function explode(world, point, hit, splash, owner, source) {
|
|
256
|
+
const { radius, fells, targets } = splash;
|
|
257
|
+
for (const other of [...world.spatial.query(point.x, point.z, radius, caught)]) {
|
|
258
|
+
if (!other.alive || other.hidden) continue;
|
|
259
|
+
const distance = distanceToEdge(point, other);
|
|
260
|
+
if (distance > radius) continue;
|
|
261
|
+
if (other.def.fellable) {
|
|
262
|
+
if (fells) world.kill(other, source, false, "felled");
|
|
263
|
+
continue;
|
|
264
|
+
}
|
|
265
|
+
if (other.def.invulnerable || other.def.targetableBy) continue;
|
|
266
|
+
if (other.buffs.length && isUntargetable(world, other)) continue;
|
|
267
|
+
if (!reaches(targets, other, other.flying ? layerOf(world, other) : "ground")) continue;
|
|
268
|
+
const share = world.settings.combat.splash(world, source, other, distance, radius);
|
|
269
|
+
if (share <= 0) continue;
|
|
270
|
+
world.damage(other, hit.damage * share, source, {
|
|
271
|
+
damageType: hit.type,
|
|
272
|
+
crit: hit.crit,
|
|
273
|
+
attack: true,
|
|
274
|
+
tags: hit.tags,
|
|
275
|
+
how: hit.how
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
world.events.emit(impact, {
|
|
279
|
+
x: point.x,
|
|
280
|
+
z: point.z,
|
|
281
|
+
radius,
|
|
282
|
+
owner
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
var splashOf = (attack, radius = attack.splash) => radius ? {
|
|
286
|
+
radius,
|
|
287
|
+
fells: attack.fells ?? false,
|
|
288
|
+
targets: attack.targets
|
|
289
|
+
} : void 0;
|
|
290
|
+
/** The attack of the entity at that place goes off: at the target, or at a spot on the ground */
|
|
291
|
+
function landHit(world, attacker, weapon, target, point = target.pos) {
|
|
292
|
+
const attack = attacker.def.attacks?.[weapon];
|
|
293
|
+
if (!attack) return;
|
|
294
|
+
const stats = statsOf(world, attacker);
|
|
295
|
+
const critical = world.settings.combat.critical(world, attacker, stats);
|
|
296
|
+
let crit = critical !== void 0;
|
|
297
|
+
const chance = target ? world.settings.combat.missChance(world, attacker, target) : 0;
|
|
298
|
+
let miss = chance > 0 && world.rng.next() < chance;
|
|
299
|
+
let damage = attackStat(stats, attack, "damage") * (critical ?? 1);
|
|
300
|
+
let type = attack.damageType ?? "physical";
|
|
301
|
+
let splash = splashOf(attack);
|
|
302
|
+
let speed = attack.projectileSpeed ?? 0;
|
|
303
|
+
let look;
|
|
304
|
+
let tags;
|
|
305
|
+
let how = typeof attack.how === "function" ? attack.how({
|
|
306
|
+
attacker,
|
|
307
|
+
target,
|
|
308
|
+
damage,
|
|
309
|
+
type,
|
|
310
|
+
crit,
|
|
311
|
+
tags
|
|
312
|
+
}) : attack.how;
|
|
313
|
+
if (world.hooks.has("beforeAttack")) {
|
|
314
|
+
const before = world.hooks.run("beforeAttack", {
|
|
315
|
+
attacker,
|
|
316
|
+
target,
|
|
317
|
+
point,
|
|
318
|
+
weapon,
|
|
319
|
+
damage,
|
|
320
|
+
type,
|
|
321
|
+
crit,
|
|
322
|
+
miss,
|
|
323
|
+
splash: splash?.radius,
|
|
324
|
+
projectileSpeed: speed,
|
|
325
|
+
look,
|
|
326
|
+
tags,
|
|
327
|
+
how,
|
|
328
|
+
cancelled: false
|
|
329
|
+
});
|
|
330
|
+
if (before.cancelled) return;
|
|
331
|
+
({damage, type, crit, miss, look, tags, how} = before);
|
|
332
|
+
speed = before.projectileSpeed;
|
|
333
|
+
splash = splashOf(attack, before.splash);
|
|
334
|
+
}
|
|
335
|
+
if (speed > 0) {
|
|
336
|
+
const projectile = {
|
|
337
|
+
id: world.newId(),
|
|
338
|
+
source: attacker.id,
|
|
339
|
+
owner: attacker.owner,
|
|
340
|
+
target: splash || !target ? 0 : target.id,
|
|
341
|
+
x: attacker.pos.x,
|
|
342
|
+
z: attacker.pos.z,
|
|
343
|
+
prevX: attacker.pos.x,
|
|
344
|
+
prevZ: attacker.pos.z,
|
|
345
|
+
sx: attacker.pos.x,
|
|
346
|
+
sz: attacker.pos.z,
|
|
347
|
+
tx: point.x,
|
|
348
|
+
tz: point.z,
|
|
349
|
+
speed,
|
|
350
|
+
damage,
|
|
351
|
+
type,
|
|
352
|
+
crit,
|
|
353
|
+
miss,
|
|
354
|
+
splash,
|
|
355
|
+
kind: attacker.def.id,
|
|
356
|
+
look,
|
|
357
|
+
tags,
|
|
358
|
+
...how && { how },
|
|
359
|
+
...weapon > 0 && { weapon }
|
|
360
|
+
};
|
|
361
|
+
world.projectiles.push(projectile);
|
|
362
|
+
world.events.emit(projectileSpawned, projectile);
|
|
363
|
+
} else if (miss) world.events.emit(missed, {
|
|
364
|
+
x: point.x,
|
|
365
|
+
z: point.z,
|
|
366
|
+
source: attacker,
|
|
367
|
+
target
|
|
368
|
+
});
|
|
369
|
+
else if (splash) explode(world, point, {
|
|
370
|
+
damage,
|
|
371
|
+
type,
|
|
372
|
+
crit,
|
|
373
|
+
tags,
|
|
374
|
+
how,
|
|
375
|
+
weapon
|
|
376
|
+
}, splash, attacker.owner, attacker);
|
|
377
|
+
else if (target && !(target.buffs.length && isUntargetable(world, target))) {
|
|
378
|
+
world.damage(target, damage, attacker, {
|
|
379
|
+
damageType: type,
|
|
380
|
+
crit,
|
|
381
|
+
attack: true,
|
|
382
|
+
tags,
|
|
383
|
+
how
|
|
384
|
+
});
|
|
385
|
+
const cleave = attacker.alive ? world.settings.combat.cleave(world, attacker, target, weapon) : void 0;
|
|
386
|
+
if (cleave) cleaveAround(world, attacker, target, attack, cleave, {
|
|
387
|
+
damage,
|
|
388
|
+
type,
|
|
389
|
+
crit,
|
|
390
|
+
tags,
|
|
391
|
+
how,
|
|
392
|
+
weapon
|
|
393
|
+
});
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
/**
|
|
397
|
+
* What a blow from up close of the attacker's weapon at that place cleaves (`AttackDef.cleave`, `BuffDef.cleave`): the
|
|
398
|
+
* attack's own, or a buff's at its level, whichever has the larger part. Nothing for none. The engine's
|
|
399
|
+
* `RuleSettings.combat.cleave`
|
|
400
|
+
*
|
|
401
|
+
* @beta
|
|
402
|
+
*/
|
|
403
|
+
function cleaveOf(world, attacker, _target, weapon) {
|
|
404
|
+
const own = attacker.def.attacks?.[weapon]?.cleave;
|
|
405
|
+
let best = own && {
|
|
406
|
+
part: at(own.part, 1),
|
|
407
|
+
radius: own.radius,
|
|
408
|
+
angle: own.angle
|
|
409
|
+
};
|
|
410
|
+
for (const instance of attacker.buffs) {
|
|
411
|
+
const cleave = world.registry.buff(instance.id).cleave;
|
|
412
|
+
if (!cleave) continue;
|
|
413
|
+
const part = at(cleave.part, instance.level);
|
|
414
|
+
if (!best || part > best.part) best = {
|
|
415
|
+
part,
|
|
416
|
+
radius: cleave.radius,
|
|
417
|
+
angle: cleave.angle
|
|
418
|
+
};
|
|
419
|
+
}
|
|
420
|
+
return best && best.part > 0 && best.radius > 0 ? best : void 0;
|
|
421
|
+
}
|
|
422
|
+
var cleft = [];
|
|
423
|
+
/**
|
|
424
|
+
* The enemies of the attacker round a target it struck from up close take their part of the blow: within `radius` of
|
|
425
|
+
* the target's edge, and within the cone of `angle` from the attacker through the target where it says. Not the target,
|
|
426
|
+
* nor what the attack cannot hit. Not an attack of theirs: nothing an attack sets off (`onHit`, life steal) goes off
|
|
427
|
+
* for each, and its tags say `cleave`
|
|
428
|
+
*/
|
|
429
|
+
function cleaveAround(world, attacker, target, attack, cleave, hit) {
|
|
430
|
+
const facing = atan2(target.pos.x - attacker.pos.x, target.pos.z - attacker.pos.z);
|
|
431
|
+
const tags = hit.tags ? [...hit.tags, "cleave"] : ["cleave"];
|
|
432
|
+
const reach = cleave.radius + target.def.radius + 2;
|
|
433
|
+
for (const other of [...world.spatial.query(target.pos.x, target.pos.z, reach, cleft)]) {
|
|
434
|
+
if (other === target || other === attacker || !other.alive || other.hidden || other.isResource) continue;
|
|
435
|
+
if (!world.areEnemies(attacker.owner, other.owner) || other.def.invulnerable || other.def.targetableBy) continue;
|
|
436
|
+
if (other.buffs.length && isUntargetable(world, other)) continue;
|
|
437
|
+
if (!reaches(attack.targets, other, other.flying ? layerOf(world, other) : "ground")) continue;
|
|
438
|
+
if (edgeDistance(target, other) > cleave.radius) continue;
|
|
439
|
+
if (cleave.angle !== void 0 && Math.abs(angleDiff(atan2(other.pos.x - attacker.pos.x, other.pos.z - attacker.pos.z), facing)) > cleave.angle / 2) continue;
|
|
440
|
+
world.damage(other, hit.damage * cleave.part, attacker, {
|
|
441
|
+
damageType: hit.type,
|
|
442
|
+
crit: hit.crit,
|
|
443
|
+
attack: false,
|
|
444
|
+
tags,
|
|
445
|
+
how: hit.how
|
|
446
|
+
});
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
/**
|
|
450
|
+
* A swing of the attack at that place begun: its time to the hit less how late in the tick the swing was due (the
|
|
451
|
+
* cooldown run past 0), so that the attacks keep to the attack speed instead of each waiting out a part of a tick (bug
|
|
452
|
+
* 17). At least a moment, so that the hit is the next tick's. Which attack swings is kept for a unit with more than one
|
|
453
|
+
*/
|
|
454
|
+
function startSwing(world, entity, combat, weapon) {
|
|
455
|
+
combat.swing = Math.max(attackTiming(world, entity, weapon).swing + Math.min(combat.cooldown, 0), MIN_SWING);
|
|
456
|
+
combat.cooldown = 0;
|
|
457
|
+
if (weapon > 0 || combat.weapon !== void 0) combat.weapon = weapon;
|
|
458
|
+
}
|
|
459
|
+
/**
|
|
460
|
+
* A swing landed: the time to the next, of whichever attack, is the period of the one that swung less its swing, less
|
|
461
|
+
* how far past the hit this tick went; and where the attack has a recovery (`AttackDef.recovery`), what it is told is
|
|
462
|
+
* held for so long. Gives the attack that swung, by place
|
|
463
|
+
*/
|
|
464
|
+
function endSwing(world, entity, combat) {
|
|
465
|
+
const weapon = combat.weapon ?? 0;
|
|
466
|
+
const { swing, period, recovery } = attackTiming(world, entity, weapon);
|
|
467
|
+
combat.cooldown = Math.max(period - swing + combat.swing, 0);
|
|
468
|
+
if (recovery > 0 && recovery + combat.swing > 0) combat.recovery = recovery + combat.swing;
|
|
469
|
+
combat.swing = 0;
|
|
470
|
+
combat.swingTarget = 0;
|
|
471
|
+
return weapon;
|
|
472
|
+
}
|
|
473
|
+
/** One tick of attacking a spot on the ground, for attacks that can. Getting into range is up to the caller */
|
|
474
|
+
function bombard(world, entity, point, dt) {
|
|
475
|
+
const combat = entity.get(fighting);
|
|
476
|
+
const weapon = groundAttack(entity.def);
|
|
477
|
+
if (!combat || weapon < 0) return "outOfRange";
|
|
478
|
+
const swinging = combat.swing > 0 && combat.swingTarget === GROUND;
|
|
479
|
+
const range = attackStat(statsOf(world, entity), entity.def.attacks[swinging ? combat.weapon ?? 0 : weapon], "range");
|
|
480
|
+
if (dist(entity.pos, point) - entity.def.radius > range + (swinging ? .75 : 0)) {
|
|
481
|
+
cancelSwing(world, entity);
|
|
482
|
+
return "outOfRange";
|
|
483
|
+
}
|
|
484
|
+
const m = entity.get(moving);
|
|
485
|
+
if (m) {
|
|
486
|
+
if (m.status === "moving") halt(world, entity);
|
|
487
|
+
setAnchored(world, entity, true);
|
|
488
|
+
}
|
|
489
|
+
faceTowards(world, entity, point, dt);
|
|
490
|
+
if (swinging) {
|
|
491
|
+
combat.swing -= dt;
|
|
492
|
+
if (combat.swing <= 0) landHit(world, entity, endSwing(world, entity, combat), void 0, point);
|
|
493
|
+
return "attacking";
|
|
494
|
+
}
|
|
495
|
+
const facing = atan2(point.x - entity.pos.x, point.z - entity.pos.z);
|
|
496
|
+
if (combat.cooldown <= 0 && Math.abs(angleDiff(entity.facing, facing)) < FACING_TOLERANCE) {
|
|
497
|
+
startSwing(world, entity, combat, weapon);
|
|
498
|
+
combat.swingTarget = GROUND;
|
|
499
|
+
world.events.emit(attackStarted, {
|
|
500
|
+
attacker: entity,
|
|
501
|
+
weapon
|
|
502
|
+
});
|
|
503
|
+
}
|
|
504
|
+
return "attacking";
|
|
505
|
+
}
|
|
506
|
+
/**
|
|
507
|
+
* Drives one tick of fighting a target: close the distance, turn, swing, hit.
|
|
508
|
+
* Every order that fights (attack, attack-move, hold, idle auto-attack) goes through here.
|
|
509
|
+
*/
|
|
510
|
+
function engage(world, entity, target, dt, chase, ordered = false) {
|
|
511
|
+
const combat = entity.get(fighting);
|
|
512
|
+
const attacks = entity.def.attacks;
|
|
513
|
+
if (!combat || !attacks?.length || !target || !canAttack(world, entity, target, ordered) || !canSee(world, entity, target)) {
|
|
514
|
+
cancelSwing(world, entity);
|
|
515
|
+
release(entity, world);
|
|
516
|
+
return "invalid";
|
|
517
|
+
}
|
|
518
|
+
engageWith(world, entity, target);
|
|
519
|
+
const distance = edgeDistance(entity, target);
|
|
520
|
+
const swinging = combat.swing > 0 && combat.swingTarget === target.id;
|
|
521
|
+
const weapon = attacks.length === 1 ? 0 : swinging ? combat.weapon ?? 0 : Math.max(world.settings.combat.pickAttack(world, entity, target), 0);
|
|
522
|
+
const range = attackStat(statsOf(world, entity), attacks[weapon], "range") + (target.isStructure ? STRUCTURE_REACH : 0);
|
|
523
|
+
const near = !swinging ? attacks[weapon].minRange : void 0;
|
|
524
|
+
if (near && distance < near) {
|
|
525
|
+
cancelSwing(world, entity);
|
|
526
|
+
if (!ordered || !chase || !entity.get(moving)) {
|
|
527
|
+
release(entity, world);
|
|
528
|
+
return "outOfRange";
|
|
529
|
+
}
|
|
530
|
+
const away = dist(entity.pos, target.pos) || 1;
|
|
531
|
+
const to = Math.min(near + .5, (near + range) / 2) + entity.def.radius + target.def.radius;
|
|
532
|
+
const step = {
|
|
533
|
+
x: target.pos.x + (entity.pos.x - target.pos.x) / away * to,
|
|
534
|
+
z: target.pos.z + (entity.pos.z - target.pos.z) / away * to
|
|
535
|
+
};
|
|
536
|
+
const m = entity.get(moving);
|
|
537
|
+
if (m.status !== "moving" || m.goalEntity || dist(m.goal, step) > .5) moveTo(world, entity, step);
|
|
538
|
+
return "chasing";
|
|
539
|
+
}
|
|
540
|
+
if (distance > range + (swinging ? .75 : 0)) {
|
|
541
|
+
cancelSwing(world, entity);
|
|
542
|
+
if (!chase || !entity.get(moving)) {
|
|
543
|
+
release(entity, world);
|
|
544
|
+
return "outOfRange";
|
|
545
|
+
}
|
|
546
|
+
moveToEntity(world, entity, target, Math.max(range - .15, .05));
|
|
547
|
+
return "chasing";
|
|
548
|
+
}
|
|
549
|
+
const m = entity.get(moving);
|
|
550
|
+
if (m) {
|
|
551
|
+
if (m.status === "moving") halt(world, entity);
|
|
552
|
+
setAnchored(world, entity, true);
|
|
553
|
+
}
|
|
554
|
+
faceTowards(world, entity, target.pos, dt);
|
|
555
|
+
if (swinging) {
|
|
556
|
+
combat.swing -= dt;
|
|
557
|
+
if (combat.swing <= 0) landHit(world, entity, endSwing(world, entity, combat), target);
|
|
558
|
+
return "attacking";
|
|
559
|
+
}
|
|
560
|
+
const facing = atan2(target.pos.x - entity.pos.x, target.pos.z - entity.pos.z);
|
|
561
|
+
if (combat.cooldown <= 0 && Math.abs(angleDiff(entity.facing, facing)) < FACING_TOLERANCE) {
|
|
562
|
+
startSwing(world, entity, combat, weapon);
|
|
563
|
+
combat.swingTarget = target.id;
|
|
564
|
+
world.events.emit(attackStarted, {
|
|
565
|
+
attacker: entity,
|
|
566
|
+
target,
|
|
567
|
+
weapon
|
|
568
|
+
});
|
|
569
|
+
}
|
|
570
|
+
return "attacking";
|
|
571
|
+
}
|
|
572
|
+
/**
|
|
573
|
+
* One tick of an attack that fires as the unit walks (`AttackDef.onTheMove`): what it shot at last tick while it can
|
|
574
|
+
* still be hit from where the unit is, else the best in range (looked for every fourth tick), swung at without a stop
|
|
575
|
+
* or a turn. Gives back what it is shooting at, none for nothing
|
|
576
|
+
*
|
|
577
|
+
* @beta
|
|
578
|
+
*/
|
|
579
|
+
function fireOnTheMove(world, entity, current, dt) {
|
|
580
|
+
const combat = entity.get(fighting);
|
|
581
|
+
const attacks = entity.def.attacks;
|
|
582
|
+
if (!combat || !attacks?.some(firesOnTheMove)) return void 0;
|
|
583
|
+
if (attacks.length && entity.buffs.length && isDisarmed(world, entity)) return void 0;
|
|
584
|
+
const usable = (target) => {
|
|
585
|
+
if (!target || !canAttack(world, entity, target) || !canSee(world, entity, target)) return false;
|
|
586
|
+
const weapon = attacks.length === 1 ? 0 : Math.max(pickAttack(world, entity, target), 0);
|
|
587
|
+
if (!attacks[weapon].onTheMove || tooNear(entity, target, weapon)) return false;
|
|
588
|
+
return edgeDistance(entity, target) <= attackStat(statsOf(world, entity), attacks[weapon], "range");
|
|
589
|
+
};
|
|
590
|
+
let target = current === void 0 ? void 0 : world.get(current);
|
|
591
|
+
if (!usable(target)) {
|
|
592
|
+
if (combat.swing > 0 && combat.swingTarget === current) cancelSwing(world, entity);
|
|
593
|
+
target = (world.tick + entity.id) % 4 === 0 ? acquireInRange(world, entity) : void 0;
|
|
594
|
+
if (!usable(target)) return void 0;
|
|
595
|
+
}
|
|
596
|
+
if (combat.swing > 0 && combat.swingTarget === target.id) {
|
|
597
|
+
combat.swing -= dt;
|
|
598
|
+
if (combat.swing <= 0) landHit(world, entity, endSwing(world, entity, combat), target);
|
|
599
|
+
return target.id;
|
|
600
|
+
}
|
|
601
|
+
if (combat.cooldown <= 0) {
|
|
602
|
+
const weapon = attacks.length === 1 ? 0 : Math.max(pickAttack(world, entity, target), 0);
|
|
603
|
+
startSwing(world, entity, combat, weapon);
|
|
604
|
+
combat.swingTarget = target.id;
|
|
605
|
+
world.events.emit(attackStarted, {
|
|
606
|
+
attacker: entity,
|
|
607
|
+
target,
|
|
608
|
+
weapon
|
|
609
|
+
});
|
|
610
|
+
}
|
|
611
|
+
return target.id;
|
|
612
|
+
}
|
|
613
|
+
/** Stops fighting: aborts the swing and lets the unit be pushed around again. */
|
|
614
|
+
function disengage(world, entity) {
|
|
615
|
+
cancelSwing(world, entity);
|
|
616
|
+
release(entity, world);
|
|
617
|
+
setAnchored(world, entity, false);
|
|
618
|
+
}
|
|
619
|
+
var combatSystem = {
|
|
620
|
+
name: "combat",
|
|
621
|
+
phase: "resolve",
|
|
622
|
+
update(world, dt) {
|
|
623
|
+
for (const entity of world.index.with(fighting)) {
|
|
624
|
+
const combat = entity.get(fighting);
|
|
625
|
+
if (!combat) continue;
|
|
626
|
+
if (combat.cooldown > 0) combat.cooldown -= dt;
|
|
627
|
+
else if (combat.cooldown < 0) combat.cooldown = 0;
|
|
628
|
+
if (combat.recovery !== void 0 && (combat.recovery -= dt) <= 0) delete combat.recovery;
|
|
629
|
+
}
|
|
630
|
+
const { projectiles } = world;
|
|
631
|
+
for (let i = projectiles.length - 1; i >= 0; i--) {
|
|
632
|
+
const p = projectiles[i];
|
|
633
|
+
const target = world.get(p.target);
|
|
634
|
+
if (target && !target.hidden) {
|
|
635
|
+
p.tx = target.pos.x;
|
|
636
|
+
p.tz = target.pos.z;
|
|
637
|
+
}
|
|
638
|
+
p.prevX = p.x;
|
|
639
|
+
p.prevZ = p.z;
|
|
640
|
+
const dx = p.x - p.tx;
|
|
641
|
+
const dz = p.z - p.tz;
|
|
642
|
+
const remaining = Math.sqrt(dx * dx + dz * dz);
|
|
643
|
+
const step = p.speed * dt;
|
|
644
|
+
if (remaining <= step + (target ? target.def.radius * .5 : 0)) {
|
|
645
|
+
if (p.miss) world.events.emit(missed, {
|
|
646
|
+
x: p.tx,
|
|
647
|
+
z: p.tz,
|
|
648
|
+
source: world.get(p.source),
|
|
649
|
+
target
|
|
650
|
+
});
|
|
651
|
+
else if (p.splash) explode(world, {
|
|
652
|
+
x: p.tx,
|
|
653
|
+
z: p.tz
|
|
654
|
+
}, p, p.splash, p.owner, world.get(p.source));
|
|
655
|
+
else if (target && !(target.buffs.length && isUntargetable(world, target))) {
|
|
656
|
+
const source = world.get(p.source);
|
|
657
|
+
world.damage(target, p.damage, source, {
|
|
658
|
+
damageType: p.type,
|
|
659
|
+
crit: p.crit,
|
|
660
|
+
attack: true,
|
|
661
|
+
tags: p.tags,
|
|
662
|
+
how: p.how
|
|
663
|
+
});
|
|
664
|
+
}
|
|
665
|
+
projectiles.splice(i, 1);
|
|
666
|
+
world.events.emit(projectileRemoved, p);
|
|
667
|
+
continue;
|
|
668
|
+
}
|
|
669
|
+
p.x += (p.tx - p.x) / remaining * step;
|
|
670
|
+
p.z += (p.tz - p.z) / remaining * step;
|
|
671
|
+
}
|
|
672
|
+
}
|
|
673
|
+
};
|
|
674
|
+
//#endregion
|
|
675
|
+
export { STRUCTURE_REACH, SWING_SLACK, UPHILL_MISS, acquireInRange, acquireTarget, attackReaches, bombard, canAttack, canSee, cancelSwing, cleaveOf, combatSystem, disengage, engage, fireOnTheMove, scoreTarget, searchTarget, shootsUphill };
|
|
676
|
+
|
|
677
|
+
//# sourceMappingURL=combat.js.map
|