@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,77 @@
|
|
|
1
|
+
import { at } from "../defs.js";
|
|
2
|
+
import { heroState } from "../hero.js";
|
|
3
|
+
import { casterFacts } from "./scaled.js";
|
|
4
|
+
//#region src/abilities/chance.ts
|
|
5
|
+
/**
|
|
6
|
+
* Chance and conditions of effects (E2E-PLAN AB6): an effect that happens by `chance`, drawn from the world's numbers so
|
|
7
|
+
* that every run comes out the same, and what an `if` asks of a unit (`UnitCondition`): a buff, health below a share, a
|
|
8
|
+
* hero, the tags of its type, enemy or ally; or code
|
|
9
|
+
*/
|
|
10
|
+
/** What code of an effect is asked with, as it lands */
|
|
11
|
+
var asked = (context) => ({
|
|
12
|
+
level: context.level,
|
|
13
|
+
caster: casterFacts(context.world, context.caster),
|
|
14
|
+
effect: context
|
|
15
|
+
});
|
|
16
|
+
/**
|
|
17
|
+
* Whether an effect that happens by chance (`EffectCommon.chance`) does this time: a draw from the world's numbers
|
|
18
|
+
* (`world.rng`) under its share at the context's level, or what its code says for the target. True with no chance, and
|
|
19
|
+
* then nothing is drawn (the world's numbers go on as they were); nothing is drawn for a share of 0 or of 1 either
|
|
20
|
+
*
|
|
21
|
+
* @beta
|
|
22
|
+
*/
|
|
23
|
+
function byChance(context, chance, target) {
|
|
24
|
+
if (chance === void 0) return true;
|
|
25
|
+
const share = typeof chance === "function" ? chance(asked(context), target) : at(chance, context.level);
|
|
26
|
+
if (share >= 1) return true;
|
|
27
|
+
if (!(share > 0)) return false;
|
|
28
|
+
return context.world.rng.next() < share;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Whether the type of a unit has one of the tags (`UnitTypeDef.tags`)
|
|
32
|
+
*
|
|
33
|
+
* @beta
|
|
34
|
+
*/
|
|
35
|
+
function hasTag(entity, tags) {
|
|
36
|
+
const own = entity.def.tags;
|
|
37
|
+
return !!own && tags.some((tag) => own.includes(tag));
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Whether what an `if` asks of a unit holds (`UnitCondition`, or code), as the effect of the context lands: every part
|
|
41
|
+
* it says. Nothing said holds; of no unit, nothing said does not
|
|
42
|
+
*
|
|
43
|
+
* @beta
|
|
44
|
+
*/
|
|
45
|
+
function conditionHolds(context, condition, unit) {
|
|
46
|
+
if (!condition) return true;
|
|
47
|
+
if (!unit) return false;
|
|
48
|
+
if (typeof condition === "function") return condition(asked(context), unit);
|
|
49
|
+
return unitMatches(context.world, condition, unit, context.caster.owner);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Whether what a `UnitCondition` says holds of a unit, out of an effect: every part it says. `is` (enemy or ally) is
|
|
53
|
+
* asked of the player `of`: it never holds with none. What an `if` asks (`conditionHolds`), what an effect's `where`
|
|
54
|
+
* asks and what a query of the world asks (`world.query`)
|
|
55
|
+
*
|
|
56
|
+
* @beta
|
|
57
|
+
*/
|
|
58
|
+
function unitMatches(world, condition, unit, of) {
|
|
59
|
+
const { buff, noBuff, healthBelow, healthAbove, hero, structure, tags, notTags, is } = condition;
|
|
60
|
+
if (buff !== void 0 && !unit.buffs.some((instance) => instance.id === buff)) return false;
|
|
61
|
+
if (noBuff !== void 0 && unit.buffs.some((instance) => instance.id === noBuff)) return false;
|
|
62
|
+
if (healthBelow !== void 0 && !(unit.health < healthBelow * unit.maxHealth)) return false;
|
|
63
|
+
if (healthAbove !== void 0 && !(unit.health >= healthAbove * unit.maxHealth)) return false;
|
|
64
|
+
if (hero !== void 0 && unit.has(heroState) !== hero) return false;
|
|
65
|
+
if (structure !== void 0 && unit.isStructure !== structure) return false;
|
|
66
|
+
if (tags && !hasTag(unit, tags)) return false;
|
|
67
|
+
if (notTags && hasTag(unit, notTags)) return false;
|
|
68
|
+
if (is !== void 0) {
|
|
69
|
+
if (of === void 0) return false;
|
|
70
|
+
if (is === "enemy" ? !world.areEnemies(of, unit.owner) : !world.areAllies(of, unit.owner)) return false;
|
|
71
|
+
}
|
|
72
|
+
return true;
|
|
73
|
+
}
|
|
74
|
+
//#endregion
|
|
75
|
+
export { byChance, conditionHolds, hasTag, unitMatches };
|
|
76
|
+
|
|
77
|
+
//# sourceMappingURL=chance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chance.js","names":[],"sources":["../../src/abilities/chance.ts"],"sourcesContent":["/**\n * Chance and conditions of effects (E2E-PLAN AB6): an effect that happens by `chance`, drawn from the world's numbers so\n * that every run comes out the same, and what an `if` asks of a unit (`UnitCondition`): a buff, health below a share, a\n * hero, the tags of its type, enemy or ally; or code\n */\nimport { at, type EffectValue, type EffectValueContext, type UnitCondition, type UnitConditionCheck } from '#engine/defs'\nimport type { Entity, PlayerId } from '#engine/entity'\nimport type { World } from '#engine/world'\nimport { heroState } from '#engine/hero'\nimport type { EffectContext } from './effects'\nimport { casterFacts } from './scaled'\n\n/** What code of an effect is asked with, as it lands */\nconst asked = (context: EffectContext): EffectValueContext => ({ level: context.level, caster: casterFacts(context.world, context.caster), effect: context })\n\n/**\n * Whether an effect that happens by chance (`EffectCommon.chance`) does this time: a draw from the world's numbers\n * (`world.rng`) under its share at the context's level, or what its code says for the target. True with no chance, and\n * then nothing is drawn (the world's numbers go on as they were); nothing is drawn for a share of 0 or of 1 either\n *\n * @beta\n */\nexport function byChance(context: EffectContext, chance: EffectValue | undefined, target?: Entity): boolean {\n\tif (chance === undefined) return true\n\tconst share = typeof chance === 'function' ? chance(asked(context), target) : at(chance, context.level)\n\tif (share >= 1) return true\n\tif (!(share > 0)) return false\n\treturn context.world.rng.next() < share\n}\n\n/**\n * Whether the type of a unit has one of the tags (`UnitTypeDef.tags`)\n *\n * @beta\n */\nexport function hasTag(entity: Entity, tags: readonly string[]): boolean {\n\tconst own = entity.def.tags\n\treturn !!own && tags.some((tag) => own.includes(tag))\n}\n\n/**\n * Whether what an `if` asks of a unit holds (`UnitCondition`, or code), as the effect of the context lands: every part\n * it says. Nothing said holds; of no unit, nothing said does not\n *\n * @beta\n */\nexport function conditionHolds(context: EffectContext, condition: UnitCondition | UnitConditionCheck | undefined, unit: Entity | undefined): boolean {\n\tif (!condition) return true\n\tif (!unit) return false\n\tif (typeof condition === 'function') return condition(asked(context), unit)\n\treturn unitMatches(context.world, condition, unit, context.caster.owner)\n}\n\n/**\n * Whether what a `UnitCondition` says holds of a unit, out of an effect: every part it says. `is` (enemy or ally) is\n * asked of the player `of`: it never holds with none. What an `if` asks (`conditionHolds`), what an effect's `where`\n * asks and what a query of the world asks (`world.query`)\n *\n * @beta\n */\nexport function unitMatches(world: World, condition: UnitCondition, unit: Entity, of?: PlayerId): boolean {\n\tconst { buff, noBuff, healthBelow, healthAbove, hero, structure, tags, notTags, is } = condition\n\tif (buff !== undefined && !unit.buffs.some((instance) => instance.id === buff)) return false\n\tif (noBuff !== undefined && unit.buffs.some((instance) => instance.id === noBuff)) return false\n\tif (healthBelow !== undefined && !(unit.health < healthBelow * unit.maxHealth)) return false\n\tif (healthAbove !== undefined && !(unit.health >= healthAbove * unit.maxHealth)) return false\n\tif (hero !== undefined && unit.has(heroState) !== hero) return false\n\tif (structure !== undefined && unit.isStructure !== structure) return false\n\tif (tags && !hasTag(unit, tags)) return false\n\tif (notTags && hasTag(unit, notTags)) return false\n\tif (is !== undefined) {\n\t\tif (of === undefined) return false\n\t\tif (is === 'enemy' ? !world.areEnemies(of, unit.owner) : !world.areAllies(of, unit.owner)) return false\n\t}\n\treturn true\n}\n"],"mappings":";;;;;;;;;;AAaA,IAAM,SAAS,aAAgD;CAAE,OAAO,QAAQ;CAAO,QAAQ,YAAY,QAAQ,OAAO,QAAQ,MAAM;CAAG,QAAQ;AAAQ;;;;;;;;AAS3J,SAAgB,SAAS,SAAwB,QAAiC,QAA0B;CAC3G,IAAI,WAAW,KAAA,GAAW,OAAO;CACjC,MAAM,QAAQ,OAAO,WAAW,aAAa,OAAO,MAAM,OAAO,GAAG,MAAM,IAAI,GAAG,QAAQ,QAAQ,KAAK;CACtG,IAAI,SAAS,GAAG,OAAO;CACvB,IAAI,EAAE,QAAQ,IAAI,OAAO;CACzB,OAAO,QAAQ,MAAM,IAAI,KAAK,IAAI;AACnC;;;;;;AAOA,SAAgB,OAAO,QAAgB,MAAkC;CACxE,MAAM,MAAM,OAAO,IAAI;CACvB,OAAO,CAAC,CAAC,OAAO,KAAK,MAAM,QAAQ,IAAI,SAAS,GAAG,CAAC;AACrD;;;;;;;AAQA,SAAgB,eAAe,SAAwB,WAA2D,MAAmC;CACpJ,IAAI,CAAC,WAAW,OAAO;CACvB,IAAI,CAAC,MAAM,OAAO;CAClB,IAAI,OAAO,cAAc,YAAY,OAAO,UAAU,MAAM,OAAO,GAAG,IAAI;CAC1E,OAAO,YAAY,QAAQ,OAAO,WAAW,MAAM,QAAQ,OAAO,KAAK;AACxE;;;;;;;;AASA,SAAgB,YAAY,OAAc,WAA0B,MAAc,IAAwB;CACzG,MAAM,EAAE,MAAM,QAAQ,aAAa,aAAa,MAAM,WAAW,MAAM,SAAS,OAAO;CACvF,IAAI,SAAS,KAAA,KAAa,CAAC,KAAK,MAAM,MAAM,aAAa,SAAS,OAAO,IAAI,GAAG,OAAO;CACvF,IAAI,WAAW,KAAA,KAAa,KAAK,MAAM,MAAM,aAAa,SAAS,OAAO,MAAM,GAAG,OAAO;CAC1F,IAAI,gBAAgB,KAAA,KAAa,EAAE,KAAK,SAAS,cAAc,KAAK,YAAY,OAAO;CACvF,IAAI,gBAAgB,KAAA,KAAa,EAAE,KAAK,UAAU,cAAc,KAAK,YAAY,OAAO;CACxF,IAAI,SAAS,KAAA,KAAa,KAAK,IAAI,SAAS,MAAM,MAAM,OAAO;CAC/D,IAAI,cAAc,KAAA,KAAa,KAAK,gBAAgB,WAAW,OAAO;CACtE,IAAI,QAAQ,CAAC,OAAO,MAAM,IAAI,GAAG,OAAO;CACxC,IAAI,WAAW,OAAO,MAAM,OAAO,GAAG,OAAO;CAC7C,IAAI,OAAO,KAAA,GAAW;EACrB,IAAI,OAAO,KAAA,GAAW,OAAO;EAC7B,IAAI,OAAO,UAAU,CAAC,MAAM,WAAW,IAAI,KAAK,KAAK,IAAI,CAAC,MAAM,UAAU,IAAI,KAAK,KAAK,GAAG,OAAO;CACnG;CACA,OAAO;AACR"}
|
|
@@ -26,3 +26,21 @@ export declare function readyAgain(state: AbilityState): void;
|
|
|
26
26
|
* @beta
|
|
27
27
|
*/
|
|
28
28
|
export declare function restoreCharges(world: World, entity: Entity, ability: string, count?: number): void;
|
|
29
|
+
/**
|
|
30
|
+
* Sets how many seconds an entity's ability waits before it can be used again (`AbilityState.cooldown`), whatever it
|
|
31
|
+
* had left: 0 makes it ready. What a game's effect or hook does where the data's `cooldown` is not the way (a
|
|
32
|
+
* cooldown that depends on what the cast hit, a recast that starts it). False for an ability the entity does not have
|
|
33
|
+
*
|
|
34
|
+
* @beta
|
|
35
|
+
*/
|
|
36
|
+
export declare function setCooldown(entity: Entity, ability: string, seconds: number): boolean;
|
|
37
|
+
/**
|
|
38
|
+
* Takes seconds off what is left of an entity's ability's cooldown (`AbilityState.cooldown`): a number of them, or a
|
|
39
|
+
* `share` of what is left (0.5: half). Never below 0. A kill that cuts a cooldown, a hit that refunds a part of it.
|
|
40
|
+
* False for an ability the entity does not have
|
|
41
|
+
*
|
|
42
|
+
* @beta
|
|
43
|
+
*/
|
|
44
|
+
export declare function reduceCooldown(entity: Entity, ability: string, by: number | {
|
|
45
|
+
share: number;
|
|
46
|
+
}): boolean;
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { at } from "../defs.js";
|
|
2
|
+
import { cooldownOf } from "../stats.js";
|
|
3
|
+
import { chargesLeft } from "../shared.js";
|
|
4
|
+
//#region src/abilities/charges.ts
|
|
5
|
+
/**
|
|
6
|
+
* Charges: an ability used so many times before it waits (`AbilityDef.charges`). A use spends one, and one comes back
|
|
7
|
+
* every `refill` seconds while it holds fewer than it can. What a state says nothing of is full, so an ability learned,
|
|
8
|
+
* a level gone up and a save from before it all start full without anyone filling them in
|
|
9
|
+
*/
|
|
10
|
+
/** Seconds a use takes to come back: shortened as the cooldown is, but for what is carried or brought along (`plain`) */
|
|
11
|
+
function refillOf(world, caster, ability, level, plain) {
|
|
12
|
+
const seconds = at(ability.charges?.refill, level);
|
|
13
|
+
return plain ? seconds : cooldownOf(world, caster, seconds);
|
|
14
|
+
}
|
|
15
|
+
/** One of the spells a hero brought along rather than learned: nothing shortens those */
|
|
16
|
+
var brought = (caster, id) => caster.def.hero?.spells?.includes(id) ?? false;
|
|
17
|
+
/** Full again: what it says of its uses goes, so that it holds all it can */
|
|
18
|
+
function fill(state) {
|
|
19
|
+
delete state.charges;
|
|
20
|
+
delete state.refill;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Spends a use of an ability with charges, as it goes off: the refill starts, where it was not running already.
|
|
24
|
+
* `plain` for what nothing shortens (an item's, a spell brought along). Nothing for one without charges, and nothing
|
|
25
|
+
* while the debug switch for no cooldowns is on
|
|
26
|
+
*/
|
|
27
|
+
function spendUse(world, caster, ability, state, plain) {
|
|
28
|
+
const left = chargesLeft(ability, state);
|
|
29
|
+
if (left === void 0 || world.cheats.noCooldowns) return;
|
|
30
|
+
state.charges = Math.max(left - 1, 0);
|
|
31
|
+
if (!((state.refill ?? 0) > 0)) state.refill = refillOf(world, caster, ability, state.level, plain);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* The seconds of a tick go by for the uses of an ability (`pass`: Infinity fills them at once): one back every
|
|
35
|
+
* `refill`, until it holds all it can. `item` for the ability of something carried
|
|
36
|
+
*/
|
|
37
|
+
function refillUses(world, caster, state, pass, item = false) {
|
|
38
|
+
if (state.charges === void 0) return;
|
|
39
|
+
const ability = world.registry.abilities.has(state.id) ? world.registry.ability(state.id) : void 0;
|
|
40
|
+
const max = ability && chargesLeft(ability, { level: state.level });
|
|
41
|
+
if (!ability || max === void 0 || pass === Infinity) return fill(state);
|
|
42
|
+
state.refill = (state.refill ?? 0) - pass;
|
|
43
|
+
while (state.refill <= 0) {
|
|
44
|
+
state.charges++;
|
|
45
|
+
if (state.charges >= max) return fill(state);
|
|
46
|
+
const next = refillOf(world, caster, ability, state.level, item || brought(caster, ability.id));
|
|
47
|
+
if (next <= 0) return fill(state);
|
|
48
|
+
state.refill += next;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/** Ready again at once, with all the uses it holds: a hero revived, the `refresh` effect */
|
|
52
|
+
function readyAgain(state) {
|
|
53
|
+
state.cooldown = 0;
|
|
54
|
+
fill(state);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Gives an entity's ability with charges uses back, up to all it holds: `count` of them, or all when left out. What a
|
|
58
|
+
* game's effect or hook does where the data's `refill` is not the way (a kill gives one back). Its cooldown stays
|
|
59
|
+
*
|
|
60
|
+
* @beta
|
|
61
|
+
*/
|
|
62
|
+
function restoreCharges(world, entity, ability, count = Infinity) {
|
|
63
|
+
const state = entity.abilities.find((known) => known.id === ability);
|
|
64
|
+
if (!state || state.charges === void 0) return;
|
|
65
|
+
const max = world.registry.abilities.has(ability) ? chargesLeft(world.registry.ability(ability), { level: state.level }) : void 0;
|
|
66
|
+
if (max === void 0 || state.charges + count >= max) return fill(state);
|
|
67
|
+
state.charges += Math.max(Math.floor(count), 0);
|
|
68
|
+
}
|
|
69
|
+
/** The state of an entity's ability, by its id */
|
|
70
|
+
var stateOf = (entity, ability) => entity.abilities.find((known) => known.id === ability);
|
|
71
|
+
/**
|
|
72
|
+
* Sets how many seconds an entity's ability waits before it can be used again (`AbilityState.cooldown`), whatever it
|
|
73
|
+
* had left: 0 makes it ready. What a game's effect or hook does where the data's `cooldown` is not the way (a
|
|
74
|
+
* cooldown that depends on what the cast hit, a recast that starts it). False for an ability the entity does not have
|
|
75
|
+
*
|
|
76
|
+
* @beta
|
|
77
|
+
*/
|
|
78
|
+
function setCooldown(entity, ability, seconds) {
|
|
79
|
+
const state = stateOf(entity, ability);
|
|
80
|
+
if (!state) return false;
|
|
81
|
+
state.cooldown = Math.max(seconds, 0);
|
|
82
|
+
return true;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Takes seconds off what is left of an entity's ability's cooldown (`AbilityState.cooldown`): a number of them, or a
|
|
86
|
+
* `share` of what is left (0.5: half). Never below 0. A kill that cuts a cooldown, a hit that refunds a part of it.
|
|
87
|
+
* False for an ability the entity does not have
|
|
88
|
+
*
|
|
89
|
+
* @beta
|
|
90
|
+
*/
|
|
91
|
+
function reduceCooldown(entity, ability, by) {
|
|
92
|
+
const state = stateOf(entity, ability);
|
|
93
|
+
if (!state) return false;
|
|
94
|
+
const seconds = typeof by === "number" ? by : state.cooldown * by.share;
|
|
95
|
+
state.cooldown = Math.max(state.cooldown - seconds, 0);
|
|
96
|
+
return true;
|
|
97
|
+
}
|
|
98
|
+
//#endregion
|
|
99
|
+
export { readyAgain, reduceCooldown, refillUses, restoreCharges, setCooldown, spendUse };
|
|
100
|
+
|
|
101
|
+
//# sourceMappingURL=charges.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"charges.js","names":[],"sources":["../../src/abilities/charges.ts"],"sourcesContent":["/**\n * Charges: an ability used so many times before it waits (`AbilityDef.charges`). A use spends one, and one comes back\n * every `refill` seconds while it holds fewer than it can. What a state says nothing of is full, so an ability learned,\n * a level gone up and a save from before it all start full without anyone filling them in\n */\nimport { type AbilityDef, at } from '#engine/defs'\nimport type { AbilityState, Entity } from '#engine/entity'\nimport { chargesLeft } from '#engine/shared'\nimport { cooldownOf } from '#engine/stats'\nimport type { World } from '#engine/world'\n\n/** Seconds a use takes to come back: shortened as the cooldown is, but for what is carried or brought along (`plain`) */\nfunction refillOf(world: World, caster: Entity, ability: AbilityDef, level: number, plain: boolean): number {\n\tconst seconds = at(ability.charges?.refill, level)\n\treturn plain ? seconds : cooldownOf(world, caster, seconds)\n}\n\n/** One of the spells a hero brought along rather than learned: nothing shortens those */\nconst brought = (caster: Entity, id: string) => caster.def.hero?.spells?.includes(id) ?? false\n\n/** Full again: what it says of its uses goes, so that it holds all it can */\nfunction fill(state: AbilityState): void {\n\tdelete state.charges\n\tdelete state.refill\n}\n\n/**\n * Spends a use of an ability with charges, as it goes off: the refill starts, where it was not running already.\n * `plain` for what nothing shortens (an item's, a spell brought along). Nothing for one without charges, and nothing\n * while the debug switch for no cooldowns is on\n */\nexport function spendUse(world: World, caster: Entity, ability: AbilityDef, state: AbilityState, plain: boolean): void {\n\tconst left = chargesLeft(ability, state)\n\tif (left === undefined || world.cheats.noCooldowns) return\n\tstate.charges = Math.max(left - 1, 0)\n\tif (!((state.refill ?? 0) > 0)) state.refill = refillOf(world, caster, ability, state.level, plain)\n}\n\n/**\n * The seconds of a tick go by for the uses of an ability (`pass`: Infinity fills them at once): one back every\n * `refill`, until it holds all it can. `item` for the ability of something carried\n */\nexport function refillUses(world: World, caster: Entity, state: AbilityState, pass: number, item = false): void {\n\tif (state.charges === undefined) return\n\tconst ability = world.registry.abilities.has(state.id) ? world.registry.ability(state.id) : undefined\n\tconst max = ability && chargesLeft(ability, { level: state.level })\n\tif (!ability || max === undefined || pass === Infinity) return fill(state)\n\tstate.refill = (state.refill ?? 0) - pass\n\twhile (state.refill <= 0) {\n\t\tstate.charges++\n\t\tif (state.charges >= max) return fill(state)\n\t\tconst next = refillOf(world, caster, ability, state.level, item || brought(caster, ability.id))\n\t\tif (next <= 0) return fill(state)\n\t\tstate.refill += next\n\t}\n}\n\n/** Ready again at once, with all the uses it holds: a hero revived, the `refresh` effect */\nexport function readyAgain(state: AbilityState): void {\n\tstate.cooldown = 0\n\tfill(state)\n}\n\n/**\n * Gives an entity's ability with charges uses back, up to all it holds: `count` of them, or all when left out. What a\n * game's effect or hook does where the data's `refill` is not the way (a kill gives one back). Its cooldown stays\n *\n * @beta\n */\nexport function restoreCharges(world: World, entity: Entity, ability: string, count = Infinity): void {\n\tconst state = entity.abilities.find((known) => known.id === ability)\n\tif (!state || state.charges === undefined) return\n\tconst max = world.registry.abilities.has(ability) ? chargesLeft(world.registry.ability(ability), { level: state.level }) : undefined\n\tif (max === undefined || state.charges + count >= max) return fill(state)\n\tstate.charges += Math.max(Math.floor(count), 0)\n}\n\n/** The state of an entity's ability, by its id */\nconst stateOf = (entity: Entity, ability: string): AbilityState | undefined => entity.abilities.find((known) => known.id === ability)\n\n/**\n * Sets how many seconds an entity's ability waits before it can be used again (`AbilityState.cooldown`), whatever it\n * had left: 0 makes it ready. What a game's effect or hook does where the data's `cooldown` is not the way (a\n * cooldown that depends on what the cast hit, a recast that starts it). False for an ability the entity does not have\n *\n * @beta\n */\nexport function setCooldown(entity: Entity, ability: string, seconds: number): boolean {\n\tconst state = stateOf(entity, ability)\n\tif (!state) return false\n\tstate.cooldown = Math.max(seconds, 0)\n\treturn true\n}\n\n/**\n * Takes seconds off what is left of an entity's ability's cooldown (`AbilityState.cooldown`): a number of them, or a\n * `share` of what is left (0.5: half). Never below 0. A kill that cuts a cooldown, a hit that refunds a part of it.\n * False for an ability the entity does not have\n *\n * @beta\n */\nexport function reduceCooldown(entity: Entity, ability: string, by: number | { share: number }): boolean {\n\tconst state = stateOf(entity, ability)\n\tif (!state) return false\n\tconst seconds = typeof by === 'number' ? by : state.cooldown * by.share\n\tstate.cooldown = Math.max(state.cooldown - seconds, 0)\n\treturn true\n}\n"],"mappings":";;;;;;;;;;AAYA,SAAS,SAAS,OAAc,QAAgB,SAAqB,OAAe,OAAwB;CAC3G,MAAM,UAAU,GAAG,QAAQ,SAAS,QAAQ,KAAK;CACjD,OAAO,QAAQ,UAAU,WAAW,OAAO,QAAQ,OAAO;AAC3D;;AAGA,IAAM,WAAW,QAAgB,OAAe,OAAO,IAAI,MAAM,QAAQ,SAAS,EAAE,KAAK;;AAGzF,SAAS,KAAK,OAA2B;CACxC,OAAO,MAAM;CACb,OAAO,MAAM;AACd;;;;;;AAOA,SAAgB,SAAS,OAAc,QAAgB,SAAqB,OAAqB,OAAsB;CACtH,MAAM,OAAO,YAAY,SAAS,KAAK;CACvC,IAAI,SAAS,KAAA,KAAa,MAAM,OAAO,aAAa;CACpD,MAAM,UAAU,KAAK,IAAI,OAAO,GAAG,CAAC;CACpC,IAAI,GAAG,MAAM,UAAU,KAAK,IAAI,MAAM,SAAS,SAAS,OAAO,QAAQ,SAAS,MAAM,OAAO,KAAK;AACnG;;;;;AAMA,SAAgB,WAAW,OAAc,QAAgB,OAAqB,MAAc,OAAO,OAAa;CAC/G,IAAI,MAAM,YAAY,KAAA,GAAW;CACjC,MAAM,UAAU,MAAM,SAAS,UAAU,IAAI,MAAM,EAAE,IAAI,MAAM,SAAS,QAAQ,MAAM,EAAE,IAAI,KAAA;CAC5F,MAAM,MAAM,WAAW,YAAY,SAAS,EAAE,OAAO,MAAM,MAAM,CAAC;CAClE,IAAI,CAAC,WAAW,QAAQ,KAAA,KAAa,SAAS,UAAU,OAAO,KAAK,KAAK;CACzE,MAAM,UAAU,MAAM,UAAU,KAAK;CACrC,OAAO,MAAM,UAAU,GAAG;EACzB,MAAM;EACN,IAAI,MAAM,WAAW,KAAK,OAAO,KAAK,KAAK;EAC3C,MAAM,OAAO,SAAS,OAAO,QAAQ,SAAS,MAAM,OAAO,QAAQ,QAAQ,QAAQ,QAAQ,EAAE,CAAC;EAC9F,IAAI,QAAQ,GAAG,OAAO,KAAK,KAAK;EAChC,MAAM,UAAU;CACjB;AACD;;AAGA,SAAgB,WAAW,OAA2B;CACrD,MAAM,WAAW;CACjB,KAAK,KAAK;AACX;;;;;;;AAQA,SAAgB,eAAe,OAAc,QAAgB,SAAiB,QAAQ,UAAgB;CACrG,MAAM,QAAQ,OAAO,UAAU,MAAM,UAAU,MAAM,OAAO,OAAO;CACnE,IAAI,CAAC,SAAS,MAAM,YAAY,KAAA,GAAW;CAC3C,MAAM,MAAM,MAAM,SAAS,UAAU,IAAI,OAAO,IAAI,YAAY,MAAM,SAAS,QAAQ,OAAO,GAAG,EAAE,OAAO,MAAM,MAAM,CAAC,IAAI,KAAA;CAC3H,IAAI,QAAQ,KAAA,KAAa,MAAM,UAAU,SAAS,KAAK,OAAO,KAAK,KAAK;CACxE,MAAM,WAAW,KAAK,IAAI,KAAK,MAAM,KAAK,GAAG,CAAC;AAC/C;;AAGA,IAAM,WAAW,QAAgB,YAA8C,OAAO,UAAU,MAAM,UAAU,MAAM,OAAO,OAAO;;;;;;;;AASpI,SAAgB,YAAY,QAAgB,SAAiB,SAA0B;CACtF,MAAM,QAAQ,QAAQ,QAAQ,OAAO;CACrC,IAAI,CAAC,OAAO,OAAO;CACnB,MAAM,WAAW,KAAK,IAAI,SAAS,CAAC;CACpC,OAAO;AACR;;;;;;;;AASA,SAAgB,eAAe,QAAgB,SAAiB,IAAyC;CACxG,MAAM,QAAQ,QAAQ,QAAQ,OAAO;CACrC,IAAI,CAAC,OAAO,OAAO;CACnB,MAAM,UAAU,OAAO,OAAO,WAAW,KAAK,MAAM,WAAW,GAAG;CAClE,MAAM,WAAW,KAAK,IAAI,MAAM,WAAW,SAAS,CAAC;CACrD,OAAO;AACR"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Crowd control that takes a unit's orders (E2E-PLAN AB5): a buff's `control` (`fear`, `charm`, `taunt`, or code) steers
|
|
3
|
+
* its carrier every tick in place of its orders, which wait as they do through a stun and go on after; new orders are
|
|
4
|
+
* refused while it lasts (`giveOrder`). Run by the order system (`systems/orders.ts`)
|
|
5
|
+
*/
|
|
6
|
+
import type { ControlKind } from '#engine/defs';
|
|
7
|
+
import { type Entity } from '#engine/entity';
|
|
8
|
+
import type { World } from '#engine/world';
|
|
9
|
+
/**
|
|
10
|
+
* A unit a buff's control holds (`BuffDef.control`): the buff, and who put it on. Set the first tick it holds it, and
|
|
11
|
+
* taken off the first tick after, as what it was told goes on. Saved with the unit, told to everyone who sees it
|
|
12
|
+
*
|
|
13
|
+
* @beta
|
|
14
|
+
*/
|
|
15
|
+
export declare const controlled: import("#engine/components").Component<{
|
|
16
|
+
buff: string;
|
|
17
|
+
source: number;
|
|
18
|
+
}, {
|
|
19
|
+
buff: string;
|
|
20
|
+
source: number;
|
|
21
|
+
}>;
|
|
22
|
+
/**
|
|
23
|
+
* One tick of a unit under a control: the first, what it was doing is put off (a channel broken off, the rest to start
|
|
24
|
+
* over after); then it does what the control says. False when nothing controls it, after it let go of one
|
|
25
|
+
*/
|
|
26
|
+
export declare function steerControlled(world: World, entity: Entity, dt: number): boolean;
|
|
27
|
+
/** Whether a control buff (`BuffDef.control`) holds its carrier as its id says: the words there are */
|
|
28
|
+
export declare const CONTROL_KINDS: readonly ControlKind[];
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { cos, hypot, sin } from "../exactMath.js";
|
|
2
|
+
import { orderSays } from "../orders/facts.js";
|
|
3
|
+
import { defineComponent } from "../components.js";
|
|
4
|
+
import { edgeDistance, fighting, moving } from "../entity.js";
|
|
5
|
+
import { controlOf } from "./buffs.js";
|
|
6
|
+
import { halt, moveTo, moveToEntity } from "../systems/movement.js";
|
|
7
|
+
import { canAttack, engage } from "../systems/combat.js";
|
|
8
|
+
import { clearOrders, resetStance } from "../orders/queue.js";
|
|
9
|
+
//#region src/abilities/control.ts
|
|
10
|
+
/**
|
|
11
|
+
* A unit a buff's control holds (`BuffDef.control`): the buff, and who put it on. Set the first tick it holds it, and
|
|
12
|
+
* taken off the first tick after, as what it was told goes on. Saved with the unit, told to everyone who sees it
|
|
13
|
+
*
|
|
14
|
+
* @beta
|
|
15
|
+
*/
|
|
16
|
+
var controlled = defineComponent({
|
|
17
|
+
id: "core.controlled",
|
|
18
|
+
replicate: "everyone"
|
|
19
|
+
});
|
|
20
|
+
/** How far ahead of itself a frightened unit runs, each time it looks where to */
|
|
21
|
+
var FLEE_STEP = 4;
|
|
22
|
+
/** Ticks between two looks where to run, or to walk after whom it is charmed by */
|
|
23
|
+
var RETHINK = 8;
|
|
24
|
+
/** How close a charmed unit comes to who charmed it */
|
|
25
|
+
var CHARMED_RANGE = .5;
|
|
26
|
+
/**
|
|
27
|
+
* One tick of a unit under a control: the first, what it was doing is put off (a channel broken off, the rest to start
|
|
28
|
+
* over after); then it does what the control says. False when nothing controls it, after it let go of one
|
|
29
|
+
*/
|
|
30
|
+
function steerControlled(world, entity, dt) {
|
|
31
|
+
const instance = entity.buffs.length ? controlOf(world, entity) : void 0;
|
|
32
|
+
const held = entity.get(controlled);
|
|
33
|
+
if (!instance) {
|
|
34
|
+
if (held) release(world, entity);
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
if (!held || held.buff !== instance.id || held.source !== instance.source) {
|
|
38
|
+
if (!held) putOff(world, entity);
|
|
39
|
+
entity.set(controlled, {
|
|
40
|
+
buff: instance.id,
|
|
41
|
+
source: instance.source
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
const source = world.get(instance.source);
|
|
45
|
+
const control = world.registry.buff(instance.id).control;
|
|
46
|
+
if (typeof control === "function") control(world, entity, instance, dt, source?.alive ? source : void 0);
|
|
47
|
+
else steer(world, entity, control, source?.alive ? source : void 0, dt);
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
/** What it was doing waits: a channel is broken off, the rest starts over once the control lets go */
|
|
51
|
+
function putOff(world, entity) {
|
|
52
|
+
if (orderSays(world, entity, "channelling")) {
|
|
53
|
+
clearOrders(world, entity);
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
const order = entity.orders[0];
|
|
57
|
+
if (order?.started) {
|
|
58
|
+
world.registry.order(order.type).end?.(world, entity, order);
|
|
59
|
+
order.started = false;
|
|
60
|
+
}
|
|
61
|
+
resetStance(world, entity);
|
|
62
|
+
}
|
|
63
|
+
/** The control let go: it stands, and what it was told starts over */
|
|
64
|
+
function release(world, entity) {
|
|
65
|
+
entity.remove(controlled);
|
|
66
|
+
resetStance(world, entity);
|
|
67
|
+
}
|
|
68
|
+
function steer(world, entity, kind, source, dt) {
|
|
69
|
+
const m = entity.get(moving);
|
|
70
|
+
if (kind === "taunt") {
|
|
71
|
+
if (!source) return halt(world, entity);
|
|
72
|
+
if (entity.get(fighting) && canAttack(world, entity, source, true)) {
|
|
73
|
+
engage(world, entity, source, dt, !!m, true);
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
if (m) moveToEntity(world, entity, source, CHARMED_RANGE);
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
if (!m) return;
|
|
80
|
+
const rethink = m.status !== "moving" || (world.tick + entity.id) % RETHINK === 0;
|
|
81
|
+
if (kind === "charm") {
|
|
82
|
+
if (!source) return halt(world, entity);
|
|
83
|
+
if (edgeDistance(entity, source) > CHARMED_RANGE && rethink) moveToEntity(world, entity, source, CHARMED_RANGE);
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
if (!rethink) return;
|
|
87
|
+
let dx = source ? entity.pos.x - source.pos.x : sin(entity.facing);
|
|
88
|
+
let dz = source ? entity.pos.z - source.pos.z : cos(entity.facing);
|
|
89
|
+
const length = hypot(dx, dz);
|
|
90
|
+
if (length < 1e-6) {
|
|
91
|
+
dx = sin(entity.facing);
|
|
92
|
+
dz = cos(entity.facing);
|
|
93
|
+
} else {
|
|
94
|
+
dx /= length;
|
|
95
|
+
dz /= length;
|
|
96
|
+
}
|
|
97
|
+
const aim = {
|
|
98
|
+
x: entity.pos.x + dx * FLEE_STEP,
|
|
99
|
+
z: entity.pos.z + dz * FLEE_STEP
|
|
100
|
+
};
|
|
101
|
+
const spot = (entity.flying ? world.air : world.nav).closestPoint(aim, FLEE_STEP) ?? aim;
|
|
102
|
+
moveTo(world, entity, spot);
|
|
103
|
+
}
|
|
104
|
+
/** Whether a control buff (`BuffDef.control`) holds its carrier as its id says: the words there are */
|
|
105
|
+
var CONTROL_KINDS = [
|
|
106
|
+
"fear",
|
|
107
|
+
"charm",
|
|
108
|
+
"taunt"
|
|
109
|
+
];
|
|
110
|
+
//#endregion
|
|
111
|
+
export { CONTROL_KINDS, controlled, steerControlled };
|
|
112
|
+
|
|
113
|
+
//# sourceMappingURL=control.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"control.js","names":[],"sources":["../../src/abilities/control.ts"],"sourcesContent":["/**\n * Crowd control that takes a unit's orders (E2E-PLAN AB5): a buff's `control` (`fear`, `charm`, `taunt`, or code) steers\n * its carrier every tick in place of its orders, which wait as they do through a stun and go on after; new orders are\n * refused while it lasts (`giveOrder`). Run by the order system (`systems/orders.ts`)\n */\nimport type { BuffControl, ControlKind } from '#engine/defs'\nimport { defineComponent } from '#engine/components'\nimport { type Entity, edgeDistance, fighting, moving } from '#engine/entity'\nimport { cos, hypot, sin } from '#engine/exactMath'\nimport { orderSays } from '#engine/orders/facts'\nimport { clearOrders, resetStance } from '#engine/orders/queue'\nimport { canAttack, engage } from '#engine/systems/combat'\nimport { halt, moveTo, moveToEntity } from '#engine/systems/movement'\nimport type { World } from '#engine/world'\nimport { controlOf } from './buffs'\n\n/**\n * A unit a buff's control holds (`BuffDef.control`): the buff, and who put it on. Set the first tick it holds it, and\n * taken off the first tick after, as what it was told goes on. Saved with the unit, told to everyone who sees it\n *\n * @beta\n */\nexport const controlled = defineComponent<{ buff: string; source: number }>({ id: 'core.controlled', replicate: 'everyone' })\n\n/** How far ahead of itself a frightened unit runs, each time it looks where to */\nconst FLEE_STEP = 4\n/** Ticks between two looks where to run, or to walk after whom it is charmed by */\nconst RETHINK = 8\n/** How close a charmed unit comes to who charmed it */\nconst CHARMED_RANGE = 0.5\n\n/**\n * One tick of a unit under a control: the first, what it was doing is put off (a channel broken off, the rest to start\n * over after); then it does what the control says. False when nothing controls it, after it let go of one\n */\nexport function steerControlled(world: World, entity: Entity, dt: number): boolean {\n\tconst instance = entity.buffs.length ? controlOf(world, entity) : undefined\n\tconst held = entity.get(controlled)\n\tif (!instance) {\n\t\tif (held) release(world, entity)\n\t\treturn false\n\t}\n\tif (!held || held.buff !== instance.id || held.source !== instance.source) {\n\t\tif (!held) putOff(world, entity)\n\t\tentity.set(controlled, { buff: instance.id, source: instance.source })\n\t}\n\tconst source = world.get(instance.source)\n\tconst control = world.registry.buff(instance.id).control!\n\tif (typeof control === 'function') (control as BuffControl)(world, entity, instance, dt, source?.alive ? source : undefined)\n\telse steer(world, entity, control, source?.alive ? source : undefined, dt)\n\treturn true\n}\n\n/** What it was doing waits: a channel is broken off, the rest starts over once the control lets go */\nfunction putOff(world: World, entity: Entity): void {\n\tif (orderSays(world, entity, 'channelling')) {\n\t\tclearOrders(world, entity)\n\t\treturn\n\t}\n\tconst order = entity.orders[0]\n\tif (order?.started) {\n\t\tworld.registry.order(order.type).end?.(world, entity, order)\n\t\torder.started = false\n\t}\n\tresetStance(world, entity)\n}\n\n/** The control let go: it stands, and what it was told starts over */\nfunction release(world: World, entity: Entity): void {\n\tentity.remove(controlled)\n\tresetStance(world, entity)\n}\n\nfunction steer(world: World, entity: Entity, kind: ControlKind, source: Entity | undefined, dt: number): void {\n\tconst m = entity.get(moving)\n\tif (kind === 'taunt') {\n\t\tif (!source) return halt(world, entity)\n\t\t// at who taunted it, with what it has; walking up to them where it cannot strike them\n\t\tif (entity.get(fighting) && canAttack(world, entity, source, true)) {\n\t\t\tengage(world, entity, source, dt, !!m, true)\n\t\t\treturn\n\t\t}\n\t\tif (m) moveToEntity(world, entity, source, CHARMED_RANGE)\n\t\treturn\n\t}\n\tif (!m) return\n\tconst rethink = m.status !== 'moving' || (world.tick + entity.id) % RETHINK === 0\n\tif (kind === 'charm') {\n\t\tif (!source) return halt(world, entity)\n\t\tif (edgeDistance(entity, source) > CHARMED_RANGE && rethink) moveToEntity(world, entity, source, CHARMED_RANGE)\n\t\treturn\n\t}\n\t// fear: away from who frightened it, the way it faces when there is nobody to run from\n\tif (!rethink) return\n\tlet dx = source ? entity.pos.x - source.pos.x : sin(entity.facing)\n\tlet dz = source ? entity.pos.z - source.pos.z : cos(entity.facing)\n\tconst length = hypot(dx, dz)\n\tif (length < 1e-6) {\n\t\tdx = sin(entity.facing)\n\t\tdz = cos(entity.facing)\n\t} else {\n\t\tdx /= length\n\t\tdz /= length\n\t}\n\tconst aim = { x: entity.pos.x + dx * FLEE_STEP, z: entity.pos.z + dz * FLEE_STEP }\n\tconst spot = (entity.flying ? world.air : world.nav).closestPoint(aim, FLEE_STEP) ?? aim\n\tmoveTo(world, entity, spot)\n}\n\n/** Whether a control buff (`BuffDef.control`) holds its carrier as its id says: the words there are */\nexport const CONTROL_KINDS: readonly ControlKind[] = ['fear', 'charm', 'taunt']\n"],"mappings":";;;;;;;;;;;;;;;AAsBA,IAAa,aAAa,gBAAkD;CAAE,IAAI;CAAmB,WAAW;AAAW,CAAC;;AAG5H,IAAM,YAAY;;AAElB,IAAM,UAAU;;AAEhB,IAAM,gBAAgB;;;;;AAMtB,SAAgB,gBAAgB,OAAc,QAAgB,IAAqB;CAClF,MAAM,WAAW,OAAO,MAAM,SAAS,UAAU,OAAO,MAAM,IAAI,KAAA;CAClE,MAAM,OAAO,OAAO,IAAI,UAAU;CAClC,IAAI,CAAC,UAAU;EACd,IAAI,MAAM,QAAQ,OAAO,MAAM;EAC/B,OAAO;CACR;CACA,IAAI,CAAC,QAAQ,KAAK,SAAS,SAAS,MAAM,KAAK,WAAW,SAAS,QAAQ;EAC1E,IAAI,CAAC,MAAM,OAAO,OAAO,MAAM;EAC/B,OAAO,IAAI,YAAY;GAAE,MAAM,SAAS;GAAI,QAAQ,SAAS;EAAO,CAAC;CACtE;CACA,MAAM,SAAS,MAAM,IAAI,SAAS,MAAM;CACxC,MAAM,UAAU,MAAM,SAAS,KAAK,SAAS,EAAE,CAAC,CAAC;CACjD,IAAI,OAAO,YAAY,YAAY,QAAyB,OAAO,QAAQ,UAAU,IAAI,QAAQ,QAAQ,SAAS,KAAA,CAAS;MACtH,MAAM,OAAO,QAAQ,SAAS,QAAQ,QAAQ,SAAS,KAAA,GAAW,EAAE;CACzE,OAAO;AACR;;AAGA,SAAS,OAAO,OAAc,QAAsB;CACnD,IAAI,UAAU,OAAO,QAAQ,aAAa,GAAG;EAC5C,YAAY,OAAO,MAAM;EACzB;CACD;CACA,MAAM,QAAQ,OAAO,OAAO;CAC5B,IAAI,OAAO,SAAS;EACnB,MAAM,SAAS,MAAM,MAAM,IAAI,CAAC,CAAC,MAAM,OAAO,QAAQ,KAAK;EAC3D,MAAM,UAAU;CACjB;CACA,YAAY,OAAO,MAAM;AAC1B;;AAGA,SAAS,QAAQ,OAAc,QAAsB;CACpD,OAAO,OAAO,UAAU;CACxB,YAAY,OAAO,MAAM;AAC1B;AAEA,SAAS,MAAM,OAAc,QAAgB,MAAmB,QAA4B,IAAkB;CAC7G,MAAM,IAAI,OAAO,IAAI,MAAM;CAC3B,IAAI,SAAS,SAAS;EACrB,IAAI,CAAC,QAAQ,OAAO,KAAK,OAAO,MAAM;EAEtC,IAAI,OAAO,IAAI,QAAQ,KAAK,UAAU,OAAO,QAAQ,QAAQ,IAAI,GAAG;GACnE,OAAO,OAAO,QAAQ,QAAQ,IAAI,CAAC,CAAC,GAAG,IAAI;GAC3C;EACD;EACA,IAAI,GAAG,aAAa,OAAO,QAAQ,QAAQ,aAAa;EACxD;CACD;CACA,IAAI,CAAC,GAAG;CACR,MAAM,UAAU,EAAE,WAAW,aAAa,MAAM,OAAO,OAAO,MAAM,YAAY;CAChF,IAAI,SAAS,SAAS;EACrB,IAAI,CAAC,QAAQ,OAAO,KAAK,OAAO,MAAM;EACtC,IAAI,aAAa,QAAQ,MAAM,IAAI,iBAAiB,SAAS,aAAa,OAAO,QAAQ,QAAQ,aAAa;EAC9G;CACD;CAEA,IAAI,CAAC,SAAS;CACd,IAAI,KAAK,SAAS,OAAO,IAAI,IAAI,OAAO,IAAI,IAAI,IAAI,OAAO,MAAM;CACjE,IAAI,KAAK,SAAS,OAAO,IAAI,IAAI,OAAO,IAAI,IAAI,IAAI,OAAO,MAAM;CACjE,MAAM,SAAS,MAAM,IAAI,EAAE;CAC3B,IAAI,SAAS,MAAM;EAClB,KAAK,IAAI,OAAO,MAAM;EACtB,KAAK,IAAI,OAAO,MAAM;CACvB,OAAO;EACN,MAAM;EACN,MAAM;CACP;CACA,MAAM,MAAM;EAAE,GAAG,OAAO,IAAI,IAAI,KAAK;EAAW,GAAG,OAAO,IAAI,IAAI,KAAK;CAAU;CACjF,MAAM,QAAQ,OAAO,SAAS,MAAM,MAAM,MAAM,IAAA,CAAK,aAAa,KAAK,SAAS,KAAK;CACrF,OAAO,OAAO,QAAQ,IAAI;AAC3B;;AAGA,IAAa,gBAAwC;CAAC;CAAQ;CAAS;AAAO"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { removeBuff } from "./buffs.js";
|
|
2
|
+
import { summoned } from "../summoned.js";
|
|
3
|
+
import { valueOf } from "./amounts.js";
|
|
4
|
+
import { defineEffect, effectTargets } from "./effects.js";
|
|
5
|
+
//#region src/abilities/dispel.ts
|
|
6
|
+
/**
|
|
7
|
+
* Takes buffs off a unit, as a dispel does: the good ones of an enemy of `by`, the bad ones of a friend. Those that say
|
|
8
|
+
* they cannot be (`BuffDef.dispellable: false`) stay. How many it took
|
|
9
|
+
*
|
|
10
|
+
* @beta
|
|
11
|
+
*/
|
|
12
|
+
function dispelBuffs(world, entity, by) {
|
|
13
|
+
const enemy = world.areEnemies(by.owner, entity.owner);
|
|
14
|
+
let taken = 0;
|
|
15
|
+
for (const instance of [...entity.buffs]) {
|
|
16
|
+
const def = world.registry.buff(instance.id);
|
|
17
|
+
if (!!def.harmful === enemy) continue;
|
|
18
|
+
if (!(typeof def.dispellable === "function" ? def.dispellable(world, entity, instance, by) : def.dispellable !== false)) continue;
|
|
19
|
+
removeBuff(world, entity, instance.id);
|
|
20
|
+
taken++;
|
|
21
|
+
}
|
|
22
|
+
return taken;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* The effect types of the dispel family, among them `dispel`, which the engine adds to its effect types
|
|
26
|
+
*
|
|
27
|
+
* @internal
|
|
28
|
+
*/
|
|
29
|
+
var dispelEffects = [defineEffect({
|
|
30
|
+
type: "dispel",
|
|
31
|
+
run: (context, effect) => {
|
|
32
|
+
const { world, caster } = context;
|
|
33
|
+
const hurt = valueOf(context, effect.amount);
|
|
34
|
+
for (const entity of effectTargets(context, {
|
|
35
|
+
...effect,
|
|
36
|
+
affects: effect.affects ?? "all"
|
|
37
|
+
}, "enemies")) {
|
|
38
|
+
if (!entity.isUnit) continue;
|
|
39
|
+
dispelBuffs(world, entity, caster);
|
|
40
|
+
if (hurt > 0 && entity.has(summoned) && world.areEnemies(caster.owner, entity.owner)) world.damage(entity, hurt, caster, {
|
|
41
|
+
damageType: "magic",
|
|
42
|
+
ability: context.ability.id
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
fields: ["amount"]
|
|
47
|
+
})];
|
|
48
|
+
//#endregion
|
|
49
|
+
export { dispelBuffs, dispelEffects };
|
|
50
|
+
|
|
51
|
+
//# sourceMappingURL=dispel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dispel.js","names":[],"sources":["../../src/abilities/dispel.ts"],"sourcesContent":["import type { Entity } from '#engine/entity'\nimport { summoned } from '#engine/summons'\nimport type { World } from '#engine/world'\nimport { removeBuff } from './buffs'\nimport { defineEffect, type EffectType, effectTargets } from './effects'\nimport { valueOf } from './amounts'\n\n/*\n * Dispelling and spell immunity. A dispel takes what is good off enemies and what is bad off friends, and hurts what a\n * spell brought into the world; a unit immune to spells is not touched by abilities, those of its friends too, unless\n * an ability says it gets through (`AbilityDef.piercesImmunity`)\n */\n\n/**\n * Takes buffs off a unit, as a dispel does: the good ones of an enemy of `by`, the bad ones of a friend. Those that say\n * they cannot be (`BuffDef.dispellable: false`) stay. How many it took\n *\n * @beta\n */\nexport function dispelBuffs(world: World, entity: Entity, by: Entity): number {\n\tconst enemy = world.areEnemies(by.owner, entity.owner)\n\tlet taken = 0\n\tfor (const instance of [...entity.buffs]) {\n\t\tconst def = world.registry.buff(instance.id)\n\t\tif (!!def.harmful === enemy) continue\n\t\tconst dispellable = typeof def.dispellable === 'function' ? def.dispellable(world, entity, instance, by) : def.dispellable !== false\n\t\tif (!dispellable) continue\n\t\tremoveBuff(world, entity, instance.id)\n\t\ttaken++\n\t}\n\treturn taken\n}\n\n/**\n * The effect types of the dispel family, among them `dispel`, which the engine adds to its effect types\n *\n * @internal\n */\nexport const dispelEffects: EffectType[] = [\n\t/**\n\t * Takes the good buffs off enemies and the bad ones off friends, where it lands (`radius`, or the target alone), and\n\t * deals `amount` to every unit there a spell brought (`summoned`), which is magic\n\t */\n\tdefineEffect({ type: 'dispel', run: (context, effect) => {\n\t\t\tconst { world, caster } = context\n\t\t\tconst hurt = valueOf(context, effect.amount)\n\t\t\tfor (const entity of effectTargets(context, { ...effect, affects: effect.affects ?? 'all' }, 'enemies')) {\n\t\t\t\tif (!entity.isUnit) continue\n\t\t\t\tdispelBuffs(world, entity, caster)\n\t\t\t\tif (hurt > 0 && entity.has(summoned) && world.areEnemies(caster.owner, entity.owner))\n\t\t\t\t\tworld.damage(entity, hurt, caster, { damageType: 'magic', ability: context.ability.id })\n\t\t\t}\n\t\t}, fields: ['amount'] })\n]\n"],"mappings":";;;;;;;;;;;AAmBA,SAAgB,YAAY,OAAc,QAAgB,IAAoB;CAC7E,MAAM,QAAQ,MAAM,WAAW,GAAG,OAAO,OAAO,KAAK;CACrD,IAAI,QAAQ;CACZ,KAAK,MAAM,YAAY,CAAC,GAAG,OAAO,KAAK,GAAG;EACzC,MAAM,MAAM,MAAM,SAAS,KAAK,SAAS,EAAE;EAC3C,IAAI,CAAC,CAAC,IAAI,YAAY,OAAO;EAE7B,IAAI,EADgB,OAAO,IAAI,gBAAgB,aAAa,IAAI,YAAY,OAAO,QAAQ,UAAU,EAAE,IAAI,IAAI,gBAAgB,QAC7G;EAClB,WAAW,OAAO,QAAQ,SAAS,EAAE;EACrC;CACD;CACA,OAAO;AACR;;;;;;AAOA,IAAa,gBAA8B,CAK1C,aAAa;CAAE,MAAM;CAAU,MAAM,SAAS,WAAW;EACvD,MAAM,EAAE,OAAO,WAAW;EAC1B,MAAM,OAAO,QAAQ,SAAS,OAAO,MAAM;EAC3C,KAAK,MAAM,UAAU,cAAc,SAAS;GAAE,GAAG;GAAQ,SAAS,OAAO,WAAW;EAAM,GAAG,SAAS,GAAG;GACxG,IAAI,CAAC,OAAO,QAAQ;GACpB,YAAY,OAAO,QAAQ,MAAM;GACjC,IAAI,OAAO,KAAK,OAAO,IAAI,QAAQ,KAAK,MAAM,WAAW,OAAO,OAAO,OAAO,KAAK,GAClF,MAAM,OAAO,QAAQ,MAAM,QAAQ;IAAE,YAAY;IAAS,SAAS,QAAQ,QAAQ;GAAG,CAAC;EACzF;CACD;CAAG,QAAQ,CAAC,QAAQ;AAAE,CAAC,CACzB"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { EffectCommon, EffectFields } from '#engine/defs';
|
|
2
2
|
import type { EditableField } from '#engine/gameData';
|
|
3
3
|
/** The fields every effect may have, whatever its type (`EffectCommon`): offered on every row of effects */
|
|
4
|
-
export declare const COMMON_EFFECT_FIELDS: Readonly<Record<keyof EffectCommon, EditableField>>;
|
|
4
|
+
export declare const COMMON_EFFECT_FIELDS: Readonly<Record<keyof EffectCommon, EditableField | readonly EditableField[]>>;
|
|
5
5
|
/**
|
|
6
6
|
* The engine's fields of an effect by name (`EffectFields`), as the Data panel shows them; `effects`, `onEnd` and
|
|
7
7
|
* `otherwise` are lists of effects. Those of a few values (a missile's `arc`) are a field for each, null for one that
|