@v12-engine/engine 0.1.1 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/abilities/amounts.d.ts +28 -0
- package/dist/abilities/amounts.js +74 -0
- package/dist/abilities/amounts.js.map +1 -0
- package/dist/abilities/buffs.d.ts +106 -6
- package/dist/abilities/buffs.js +443 -0
- package/dist/abilities/buffs.js.map +1 -0
- package/dist/abilities/castTold.d.ts +2 -0
- package/dist/abilities/castTold.js +66 -0
- package/dist/abilities/castTold.js.map +1 -0
- package/dist/abilities/chance.d.ts +38 -0
- package/dist/abilities/chance.js +77 -0
- package/dist/abilities/chance.js.map +1 -0
- package/dist/abilities/charges.d.ts +18 -0
- package/dist/abilities/charges.js +101 -0
- package/dist/abilities/charges.js.map +1 -0
- package/dist/abilities/control.d.ts +28 -0
- package/dist/abilities/control.js +113 -0
- package/dist/abilities/control.js.map +1 -0
- package/dist/abilities/dispel.js +51 -0
- package/dist/abilities/dispel.js.map +1 -0
- package/dist/abilities/effectFields.d.ts +1 -1
- package/dist/abilities/effectFields.js +676 -0
- package/dist/abilities/effectFields.js.map +1 -0
- package/dist/abilities/effectIndex.d.ts +27 -0
- package/dist/abilities/effectIndex.js +64 -0
- package/dist/abilities/effectIndex.js.map +1 -0
- package/dist/abilities/effects/buff.d.ts +9 -3
- package/dist/abilities/effects/buff.js +84 -0
- package/dist/abilities/effects/buff.js.map +1 -0
- package/dist/abilities/effects/conditions.d.ts +2 -0
- package/dist/abilities/effects/conditions.js +41 -0
- package/dist/abilities/effects/conditions.js.map +1 -0
- package/dist/abilities/effects/core.js +54 -0
- package/dist/abilities/effects/core.js.map +1 -0
- package/dist/abilities/effects/damage.d.ts +1 -1
- package/dist/abilities/effects/damage.js +43 -0
- package/dist/abilities/effects/damage.js.map +1 -0
- package/dist/abilities/effects/heal.d.ts +2 -2
- package/dist/abilities/effects/heal.js +51 -0
- package/dist/abilities/effects/heal.js.map +1 -0
- package/dist/abilities/effects/missile.d.ts +13 -1
- package/dist/abilities/effects/missile.js +104 -0
- package/dist/abilities/effects/missile.js.map +1 -0
- package/dist/abilities/effects/morph.d.ts +5 -0
- package/dist/abilities/effects/morph.js +43 -0
- package/dist/abilities/effects/morph.js.map +1 -0
- package/dist/abilities/effects/moves.d.ts +16 -4
- package/dist/abilities/effects/moves.js +212 -0
- package/dist/abilities/effects/moves.js.map +1 -0
- package/dist/abilities/effects/passives.d.ts +19 -9
- package/dist/abilities/effects/passives.js +131 -0
- package/dist/abilities/effects/passives.js.map +1 -0
- package/dist/abilities/effects/proxy.d.ts +5 -0
- package/dist/abilities/effects/proxy.js +60 -0
- package/dist/abilities/effects/proxy.js.map +1 -0
- package/dist/abilities/effects/sight.d.ts +2 -2
- package/dist/abilities/effects/sight.js +39 -0
- package/dist/abilities/effects/sight.js.map +1 -0
- package/dist/abilities/effects/spawn.d.ts +5 -2
- package/dist/abilities/effects/spawn.js +40 -0
- package/dist/abilities/effects/spawn.js.map +1 -0
- package/dist/abilities/effects/timed.d.ts +2 -2
- package/dist/abilities/effects/timed.js +96 -0
- package/dist/abilities/effects/timed.js.map +1 -0
- package/dist/abilities/effects/trade.d.ts +1 -1
- package/dist/abilities/effects/trade.js +25 -0
- package/dist/abilities/effects/trade.js.map +1 -0
- package/dist/abilities/effects.d.ts +97 -23
- package/dist/abilities/effects.js +860 -0
- package/dist/abilities/effects.js.map +1 -0
- package/dist/abilities/land.d.ts +38 -4
- package/dist/abilities/land.js +189 -0
- package/dist/abilities/land.js.map +1 -0
- package/dist/abilities/recast.d.ts +45 -0
- package/dist/abilities/recast.js +118 -0
- package/dist/abilities/recast.js.map +1 -0
- package/dist/abilities/scaled.js +40 -0
- package/dist/abilities/scaled.js.map +1 -0
- package/dist/abilities/screen.d.ts +6 -0
- package/dist/abilities/screen.js +83 -0
- package/dist/abilities/screen.js.map +1 -0
- package/dist/abilities/shapes.d.ts +66 -0
- package/dist/abilities/shapes.js +122 -0
- package/dist/abilities/shapes.js.map +1 -0
- package/dist/abilities/text.d.ts +14 -2
- package/dist/abilities/text.js +204 -0
- package/dist/abilities/text.js.map +1 -0
- package/dist/abilities/triggers.d.ts +98 -0
- package/dist/abilities/triggers.js +351 -0
- package/dist/abilities/triggers.js.map +1 -0
- package/dist/abilityChanges.d.ts +131 -0
- package/dist/abilityChanges.js +345 -0
- package/dist/abilityChanges.js.map +1 -0
- package/dist/ai/area.d.ts +4 -1
- package/dist/ai/brain.d.ts +4 -1
- package/dist/ai/brain.js +844 -0
- package/dist/ai/brain.js.map +1 -0
- package/dist/ai/budget.js +74 -0
- package/dist/ai/budget.js.map +1 -0
- package/dist/ai/checks.d.ts +9 -1
- package/dist/ai/checks.js +242 -0
- package/dist/ai/checks.js.map +1 -0
- package/dist/ai/computer.d.ts +11 -4
- package/dist/ai/computer.js +251 -0
- package/dist/ai/computer.js.map +1 -0
- package/dist/ai/defence.d.ts +4 -0
- package/dist/ai/defence.js +430 -0
- package/dist/ai/defence.js.map +1 -0
- package/dist/ai/define.d.ts +3 -2
- package/dist/ai/define.js +31 -0
- package/dist/ai/define.js.map +1 -0
- package/dist/ai/economy.d.ts +10 -7
- package/dist/ai/economy.js +780 -0
- package/dist/ai/economy.js.map +1 -0
- package/dist/ai/geometry.js +38 -0
- package/dist/ai/geometry.js.map +1 -0
- package/dist/ai/goals.d.ts +1 -0
- package/dist/ai/goals.js +560 -0
- package/dist/ai/goals.js.map +1 -0
- package/dist/ai/knowledge.d.ts +72 -7
- package/dist/ai/knowledge.js +804 -0
- package/dist/ai/knowledge.js.map +1 -0
- package/dist/ai/lanes.d.ts +10 -2
- package/dist/ai/lanes.js +715 -0
- package/dist/ai/lanes.js.map +1 -0
- package/dist/ai/melee/build.js +264 -0
- package/dist/ai/melee/build.js.map +1 -0
- package/dist/ai/melee/goals.d.ts +7 -0
- package/dist/ai/melee/goals.js +720 -0
- package/dist/ai/melee/goals.js.map +1 -0
- package/dist/ai/melee/heroes.js +68 -0
- package/dist/ai/melee/heroes.js.map +1 -0
- package/dist/ai/melee/index.d.ts +1 -1
- package/dist/ai/melee/index.js +51 -0
- package/dist/ai/melee/index.js.map +1 -0
- package/dist/ai/melee/production.js +29 -0
- package/dist/ai/melee/production.js.map +1 -0
- package/dist/ai/melee/surrender.js +64 -0
- package/dist/ai/melee/surrender.js.map +1 -0
- package/dist/ai/micro.d.ts +9 -0
- package/dist/ai/micro.js +1316 -0
- package/dist/ai/micro.js.map +1 -0
- package/dist/ai/mission.d.ts +9 -2
- package/dist/ai/mission.js +538 -0
- package/dist/ai/mission.js.map +1 -0
- package/dist/ai/missionRules.d.ts +1 -1
- package/dist/ai/missionRules.js +26 -0
- package/dist/ai/missionRules.js.map +1 -0
- package/dist/ai/module.d.ts +6 -2
- package/dist/ai/module.js +37 -0
- package/dist/ai/module.js.map +1 -0
- package/dist/ai/options.d.ts +3 -3
- package/dist/ai/plans/build.d.ts +20 -1
- package/dist/ai/plans/build.js +608 -0
- package/dist/ai/plans/build.js.map +1 -0
- package/dist/ai/plans/placement.d.ts +4 -1
- package/dist/ai/plans/placement.js +295 -0
- package/dist/ai/plans/placement.js.map +1 -0
- package/dist/ai/plans/plans.d.ts +9 -0
- package/dist/ai/plans/plans.js +110 -0
- package/dist/ai/plans/plans.js.map +1 -0
- package/dist/ai/plans/production.d.ts +14 -2
- package/dist/ai/plans/production.js +434 -0
- package/dist/ai/plans/production.js.map +1 -0
- package/dist/ai/plans/purse.d.ts +6 -3
- package/dist/ai/plans/purse.js +139 -0
- package/dist/ai/plans/purse.js.map +1 -0
- package/dist/ai/plans/tech.d.ts +6 -0
- package/dist/ai/plans/tech.js +122 -0
- package/dist/ai/plans/tech.js.map +1 -0
- package/dist/ai/profiles.d.ts +4 -4
- package/dist/{profiles-B3NS9jwk.js → ai/profiles.js} +3 -98
- package/dist/ai/profiles.js.map +1 -0
- package/dist/ai/reach.js +54 -0
- package/dist/ai/reach.js.map +1 -0
- package/dist/ai/report.d.ts +8 -0
- package/dist/ai/report.js +87 -0
- package/dist/ai/report.js.map +1 -0
- package/dist/ai/roles.d.ts +4 -0
- package/dist/ai/roles.js +207 -0
- package/dist/ai/roles.js.map +1 -0
- package/dist/ai/rules.d.ts +8 -2
- package/dist/ai/rules.js +416 -0
- package/dist/ai/rules.js.map +1 -0
- package/dist/ai/scouting.d.ts +6 -0
- package/dist/ai/scouting.js +324 -0
- package/dist/ai/scouting.js.map +1 -0
- package/dist/ai/settings.js +99 -0
- package/dist/ai/settings.js.map +1 -0
- package/dist/ai/squads.d.ts +21 -2
- package/dist/ai/squads.js +916 -0
- package/dist/ai/squads.js.map +1 -0
- package/dist/ai/strength.js +320 -0
- package/dist/ai/strength.js.map +1 -0
- package/dist/ai/task.d.ts +3 -1
- package/dist/ai/task.js +17 -0
- package/dist/ai/task.js.map +1 -0
- package/dist/ai/tasks/attack.js +24 -0
- package/dist/ai/tasks/attack.js.map +1 -0
- package/dist/ai/tasks/capture.d.ts +3 -3
- package/dist/ai/tasks/capture.js +37 -0
- package/dist/ai/tasks/capture.js.map +1 -0
- package/dist/ai/tasks/creep.js +29 -0
- package/dist/ai/tasks/creep.js.map +1 -0
- package/dist/ai/tasks/defend.js +61 -0
- package/dist/ai/tasks/defend.js.map +1 -0
- package/dist/ai/tasks/drop.js +81 -0
- package/dist/ai/tasks/drop.js.map +1 -0
- package/dist/ai/tasks/escort.js +59 -0
- package/dist/ai/tasks/escort.js.map +1 -0
- package/dist/ai/tasks/gather.js +48 -0
- package/dist/ai/tasks/gather.js.map +1 -0
- package/dist/ai/tasks/harass.js +39 -0
- package/dist/ai/tasks/harass.js.map +1 -0
- package/dist/ai/tasks/hold.js +32 -0
- package/dist/ai/tasks/hold.js.map +1 -0
- package/dist/ai/tasks/index.js +34 -0
- package/dist/ai/tasks/index.js.map +1 -0
- package/dist/ai/tasks/move.js +26 -0
- package/dist/ai/tasks/move.js.map +1 -0
- package/dist/ai/tasks/patrol.js +59 -0
- package/dist/ai/tasks/patrol.js.map +1 -0
- package/dist/ai/tasks/retreat.js +28 -0
- package/dist/ai/tasks/retreat.js.map +1 -0
- package/dist/ai/tasks/scout.js +73 -0
- package/dist/ai/tasks/scout.js.map +1 -0
- package/dist/ai/tasks/shared.d.ts +1 -1
- package/dist/ai/tasks/shared.js +137 -0
- package/dist/ai/tasks/shared.js.map +1 -0
- package/dist/ai/team.d.ts +18 -1
- package/dist/ai/team.js +492 -0
- package/dist/ai/team.js.map +1 -0
- package/dist/ai/threat.d.ts +6 -0
- package/dist/ai/threat.js +206 -0
- package/dist/ai/threat.js.map +1 -0
- package/dist/ai/view.d.ts +21 -7
- package/dist/ai/view.js +677 -0
- package/dist/ai/view.js.map +1 -0
- package/dist/ai/waves.d.ts +6 -0
- package/dist/ai/waves.js +410 -0
- package/dist/ai/waves.js.map +1 -0
- package/dist/ai.js +54 -6239
- package/dist/aiTesting.d.ts +6 -3
- package/dist/aiTesting.js +229 -0
- package/dist/aiTesting.js.map +1 -0
- package/dist/areas.d.ts +4 -1
- package/dist/areas.js +295 -0
- package/dist/areas.js.map +1 -0
- package/dist/attacks.d.ts +3 -3
- package/dist/attacks.js +127 -0
- package/dist/attacks.js.map +1 -0
- package/dist/burning.d.ts +267 -0
- package/dist/burning.js +795 -0
- package/dist/burning.js.map +1 -0
- package/dist/bytes.js +21 -0
- package/dist/bytes.js.map +1 -0
- package/dist/callings.d.ts +71 -0
- package/dist/callings.js +157 -0
- package/dist/callings.js.map +1 -0
- package/dist/cameraOrders.d.ts +78 -0
- package/dist/cameraOrders.js +114 -0
- package/dist/cameraOrders.js.map +1 -0
- package/dist/camps.d.ts +70 -4
- package/dist/camps.js +501 -0
- package/dist/camps.js.map +1 -0
- package/dist/capture.d.ts +15 -3
- package/dist/capture.js +304 -0
- package/dist/capture.js.map +1 -0
- package/dist/cellLayers.d.ts +78 -13
- package/dist/cellLayers.js +275 -0
- package/dist/cellLayers.js.map +1 -0
- package/dist/cellPatches.d.ts +24 -0
- package/dist/cellPatches.js +73 -0
- package/dist/cellPatches.js.map +1 -0
- package/dist/cinematics.d.ts +10 -5
- package/dist/cinematics.js +161 -0
- package/dist/cinematics.js.map +1 -0
- package/dist/clock.d.ts +2 -2
- package/dist/clock.js +78 -0
- package/dist/clock.js.map +1 -0
- package/dist/commands.d.ts +36 -4
- package/dist/commands.js +636 -0
- package/dist/commands.js.map +1 -0
- package/dist/components.d.ts +31 -10
- package/dist/components.js +74 -0
- package/dist/components.js.map +1 -0
- package/dist/computers.d.ts +4 -4
- package/dist/computers.js +194 -0
- package/dist/computers.js.map +1 -0
- package/dist/concealment.d.ts +25 -2
- package/dist/concealment.js +409 -0
- package/dist/concealment.js.map +1 -0
- package/dist/coreComponents.js +130 -0
- package/dist/coreComponents.js.map +1 -0
- package/dist/createGame.d.ts +306 -0
- package/dist/createGame.js +405 -0
- package/dist/createGame.js.map +1 -0
- package/dist/dashing.d.ts +18 -2
- package/dist/dashing.js +41 -0
- package/dist/dashing.js.map +1 -0
- package/dist/debug.d.ts +8 -0
- package/dist/debug.js +5 -3
- package/dist/debug2.js +76 -0
- package/dist/debug2.js.map +1 -0
- package/dist/debugCommands.d.ts +6 -6
- package/dist/debugCommands.js +537 -0
- package/dist/debugCommands.js.map +1 -0
- package/dist/debugging.d.ts +1 -0
- package/dist/defaultSets.d.ts +183 -0
- package/dist/defaultSets.js +216 -0
- package/dist/defaultSets.js.map +1 -0
- package/dist/definitions.d.ts +6 -0
- package/dist/definitions.js +78 -0
- package/dist/definitions.js.map +1 -0
- package/dist/defs.d.ts +1895 -165
- package/dist/defs.js +380 -0
- package/dist/defs.js.map +1 -0
- package/dist/denying.d.ts +4 -4
- package/dist/denying.js +106 -0
- package/dist/denying.js.map +1 -0
- package/dist/destructibles.d.ts +2 -2
- package/dist/destructibles.js +36 -0
- package/dist/destructibles.js.map +1 -0
- package/dist/determinism.d.ts +4 -4
- package/dist/determinism.js +247 -0
- package/dist/determinism.js.map +1 -0
- package/dist/dialog.d.ts +17 -2
- package/dist/dialog.js +108 -0
- package/dist/dialog.js.map +1 -0
- package/dist/effectRefs.js +28 -0
- package/dist/effectRefs.js.map +1 -0
- package/dist/effects.d.ts +27 -11
- package/dist/effects.js +110 -0
- package/dist/effects.js.map +1 -0
- package/dist/endings.d.ts +1 -1
- package/dist/endings.js +78 -0
- package/dist/endings.js.map +1 -0
- package/dist/engagement.d.ts +40 -6
- package/dist/engagement.js +530 -0
- package/dist/engagement.js.map +1 -0
- package/dist/engineEvents.d.ts +72 -9
- package/dist/engineEvents.js +520 -0
- package/dist/engineEvents.js.map +1 -0
- package/dist/entity.d.ts +275 -26
- package/dist/entity.js +441 -0
- package/dist/entity.js.map +1 -0
- package/dist/entityIndex.d.ts +10 -3
- package/dist/entityIndex.js +149 -0
- package/dist/entityIndex.js.map +1 -0
- package/dist/errors.d.ts +6 -2
- package/dist/errors.js +59 -0
- package/dist/errors.js.map +1 -0
- package/dist/events.d.ts +11 -5
- package/dist/events.js +158 -0
- package/dist/events.js.map +1 -0
- package/dist/exactMath.js +273 -0
- package/dist/exactMath.js.map +1 -0
- package/dist/features.d.ts +1 -1
- package/dist/features.js +127 -0
- package/dist/features.js.map +1 -0
- package/dist/fields.d.ts +25 -5
- package/dist/fields.js +140 -0
- package/dist/fields.js.map +1 -0
- package/dist/fixture.d.ts +3 -3
- package/dist/fixture.js +512 -0
- package/dist/fixture.js.map +1 -0
- package/dist/fog.d.ts +26 -3
- package/dist/fog.js +333 -0
- package/dist/fog.js.map +1 -0
- package/dist/foliage.d.ts +476 -0
- package/dist/foliage.js +1478 -0
- package/dist/foliage.js.map +1 -0
- package/dist/foliageDebug.d.ts +57 -0
- package/dist/foliageDebug.js +172 -0
- package/dist/foliageDebug.js.map +1 -0
- package/dist/foliageRegrowth.d.ts +20 -0
- package/dist/foliageRegrowth.js +332 -0
- package/dist/foliageRegrowth.js.map +1 -0
- package/dist/formState.d.ts +67 -0
- package/dist/formState.js +65 -0
- package/dist/formState.js.map +1 -0
- package/dist/formation.d.ts +46 -8
- package/dist/formation.js +297 -0
- package/dist/formation.js.map +1 -0
- package/dist/forms.d.ts +58 -0
- package/dist/forms.js +146 -0
- package/dist/forms.js.map +1 -0
- package/dist/friendlyFire.d.ts +2 -2
- package/dist/friendlyFire.js +37 -0
- package/dist/friendlyFire.js.map +1 -0
- package/dist/game.d.ts +141 -48
- package/dist/game.js +834 -0
- package/dist/game.js.map +1 -0
- package/dist/gameData.d.ts +96 -22
- package/dist/gameData.js +1690 -0
- package/dist/gameData.js.map +1 -0
- package/dist/gameFiles.d.ts +3 -3
- package/dist/gameFiles.js +14 -0
- package/dist/gameFiles.js.map +1 -0
- package/dist/gates.js +92 -0
- package/dist/gates.js.map +1 -0
- package/dist/generate.d.ts +28 -1
- package/dist/generate.js +1062 -0
- package/dist/generate.js.map +1 -0
- package/dist/generateWorker.d.ts +7 -3
- package/dist/generateWorker.js +86 -0
- package/dist/generateWorker.js.map +1 -0
- package/dist/grid.d.ts +9 -0
- package/dist/grid.js +102 -0
- package/dist/grid.js.map +1 -0
- package/dist/ground.d.ts +17 -1
- package/dist/ground.js +375 -0
- package/dist/ground.js.map +1 -0
- package/dist/groundObjects.d.ts +70 -0
- package/dist/groundObjects.js +371 -0
- package/dist/groundObjects.js.map +1 -0
- package/dist/groundSpeed.d.ts +20 -3
- package/dist/groundSpeed.js +117 -0
- package/dist/groundSpeed.js.map +1 -0
- package/dist/hero.d.ts +126 -10
- package/dist/hero.js +432 -0
- package/dist/hero.js.map +1 -0
- package/dist/holds.d.ts +94 -0
- package/dist/holds.js +305 -0
- package/dist/holds.js.map +1 -0
- package/dist/home.d.ts +1 -1
- package/dist/home.js +30 -0
- package/dist/home.js.map +1 -0
- package/dist/hooks.d.ts +339 -57
- package/dist/hooks.js +105 -0
- package/dist/hooks.js.map +1 -0
- package/dist/hotReload.d.ts +6 -5
- package/dist/hotReload.js +145 -0
- package/dist/hotReload.js.map +1 -0
- package/dist/ids.d.ts +3 -3
- package/dist/ids.js +30 -0
- package/dist/ids.js.map +1 -0
- package/dist/idsFile.d.ts +36 -0
- package/dist/idsFile.js +134 -0
- package/dist/idsFile.js.map +1 -0
- package/dist/index.d.ts +105 -68
- package/dist/index.js +194 -4701
- package/dist/inspect.d.ts +29 -2
- package/dist/{inspect-D9dWHmZ0.js → inspect.js} +21 -12
- package/dist/inspect.js.map +1 -0
- package/dist/inventory.d.ts +14 -1
- package/dist/inventory.js +84 -0
- package/dist/inventory.js.map +1 -0
- package/dist/items.d.ts +136 -8
- package/dist/items.js +585 -0
- package/dist/items.js.map +1 -0
- package/dist/lanes.d.ts +12 -3
- package/dist/lanes.js +496 -0
- package/dist/lanes.js.map +1 -0
- package/dist/life.d.ts +6 -2
- package/dist/life.js +287 -0
- package/dist/life.js.map +1 -0
- package/dist/log.d.ts +26 -3
- package/dist/log.js +192 -0
- package/dist/log.js.map +1 -0
- package/dist/manaBurn.d.ts +2 -2
- package/dist/manaBurn.js +75 -0
- package/dist/manaBurn.js.map +1 -0
- package/dist/map/file.d.ts +56 -3
- package/dist/map/file.js +264 -0
- package/dist/map/file.js.map +1 -0
- package/dist/map/images.js +61 -0
- package/dist/map/images.js.map +1 -0
- package/dist/map/look.d.ts +1 -1
- package/dist/map/look.js +30 -0
- package/dist/map/look.js.map +1 -0
- package/dist/map/pathProfile.js +183 -0
- package/dist/map/pathProfile.js.map +1 -0
- package/dist/map/resize.d.ts +4 -0
- package/dist/map/resize.js +136 -0
- package/dist/map/resize.js.map +1 -0
- package/dist/map/schema.js +257 -0
- package/dist/map/schema.js.map +1 -0
- package/dist/map/terrain.js +214 -0
- package/dist/map/terrain.js.map +1 -0
- package/dist/map/types.d.ts +92 -13
- package/dist/map/types.js +251 -0
- package/dist/map/types.js.map +1 -0
- package/dist/mapCheck/cells.js +94 -0
- package/dist/mapCheck/cells.js.map +1 -0
- package/dist/mapCheck/rules/foliage.d.ts +9 -0
- package/dist/mapCheck/rules/foliage.js +83 -0
- package/dist/mapCheck/rules/foliage.js.map +1 -0
- package/dist/mapCheck/rules/names.js +39 -0
- package/dist/mapCheck/rules/names.js.map +1 -0
- package/dist/mapCheck/rules/objects.d.ts +1 -1
- package/dist/mapCheck/rules/objects.js +56 -0
- package/dist/mapCheck/rules/objects.js.map +1 -0
- package/dist/mapCheck/rules/paths.js +32 -0
- package/dist/mapCheck/rules/paths.js.map +1 -0
- package/dist/mapCheck/rules/players.js +20 -0
- package/dist/mapCheck/rules/players.js.map +1 -0
- package/dist/mapCheck/rules/races.js +56 -0
- package/dist/mapCheck/rules/races.js.map +1 -0
- package/dist/mapCheck/rules/random.js +47 -0
- package/dist/mapCheck/rules/random.js.map +1 -0
- package/dist/mapCheck/rules/regions.js +30 -0
- package/dist/mapCheck/rules/regions.js.map +1 -0
- package/dist/mapCheck/rules/targets.js +31 -0
- package/dist/mapCheck/rules/targets.js.map +1 -0
- package/dist/mapCheck/rules/walking.js +45 -0
- package/dist/mapCheck/rules/walking.js.map +1 -0
- package/dist/mapCheck.d.ts +2 -2
- package/dist/mapCheck.js +63 -0
- package/dist/mapCheck.js.map +1 -0
- package/dist/mapFields.d.ts +25 -2
- package/dist/mapFields.js +134 -0
- package/dist/mapFields.js.map +1 -0
- package/dist/mapFile.js +176 -0
- package/dist/mapFile.js.map +1 -0
- package/dist/mapMeasure.d.ts +8 -0
- package/dist/mapMeasure.js +283 -0
- package/dist/mapMeasure.js.map +1 -0
- package/dist/mapMerge.d.ts +1 -0
- package/dist/mapMerge.js +172 -0
- package/dist/mapMerge.js.map +1 -0
- package/dist/mapObjectives.js +138 -0
- package/dist/mapObjectives.js.map +1 -0
- package/dist/mapObjects.js +80 -0
- package/dist/mapObjects.js.map +1 -0
- package/dist/math.d.ts +37 -7
- package/dist/math.js +155 -0
- package/dist/math.js.map +1 -0
- package/dist/messages.d.ts +71 -4
- package/dist/messages.js +29 -0
- package/dist/messages.js.map +1 -0
- package/dist/missionRules.d.ts +10 -2
- package/dist/{missionRules-C-bGxm0Q.js → missionRules.js} +30 -150
- package/dist/missionRules.js.map +1 -0
- package/dist/mods.d.ts +39 -20
- package/dist/mods.js +271 -0
- package/dist/mods.js.map +1 -0
- package/dist/moves.d.ts +87 -0
- package/dist/moves.js +539 -0
- package/dist/moves.js.map +1 -0
- package/dist/names.d.ts +7 -0
- package/dist/names.js +122 -0
- package/dist/names.js.map +1 -0
- package/dist/navigation/agentParams.js +14 -0
- package/dist/navigation/agentParams.js.map +1 -0
- package/dist/navigation/air.d.ts +7 -3
- package/dist/navigation/air.js +401 -0
- package/dist/navigation/air.js.map +1 -0
- package/dist/navigation/builds.d.ts +34 -2
- package/dist/navigation/builds.js +287 -0
- package/dist/navigation/builds.js.map +1 -0
- package/dist/navigation/groundAreas.d.ts +59 -1
- package/dist/navigation/groundAreas.js +407 -0
- package/dist/navigation/groundAreas.js.map +1 -0
- package/dist/navigation/navigation.d.ts +98 -9
- package/dist/navigation/recast.d.ts +194 -18
- package/dist/navigation/recast.js +1379 -0
- package/dist/navigation/recast.js.map +1 -0
- package/dist/navigation/sidePaths.d.ts +8 -3
- package/dist/navigation/sidePaths.js +241 -0
- package/dist/navigation/sidePaths.js.map +1 -0
- package/dist/navigation/sized.js +243 -0
- package/dist/navigation/sized.js.map +1 -0
- package/dist/nearest.js +32 -0
- package/dist/nearest.js.map +1 -0
- package/dist/noise.js +59 -0
- package/dist/noise.js.map +1 -0
- package/dist/objectives.d.ts +12 -3
- package/dist/objectives.js +144 -0
- package/dist/objectives.js.map +1 -0
- package/dist/orders/basic.d.ts +5 -5
- package/dist/orders/basic.js +417 -0
- package/dist/orders/basic.js.map +1 -0
- package/dist/orders/build.js +278 -0
- package/dist/orders/build.js.map +1 -0
- package/dist/orders/cast.d.ts +13 -3
- package/dist/orders/cast.js +558 -0
- package/dist/orders/cast.js.map +1 -0
- package/dist/orders/facts.js +16 -0
- package/dist/orders/facts.js.map +1 -0
- package/dist/orders/harvest.d.ts +21 -5
- package/dist/orders/harvest.js +540 -0
- package/dist/orders/harvest.js.map +1 -0
- package/dist/orders/idle.d.ts +3 -1
- package/dist/orders/idle.js +234 -0
- package/dist/orders/idle.js.map +1 -0
- package/dist/orders/items.js +92 -0
- package/dist/orders/items.js.map +1 -0
- package/dist/orders/queue.js +108 -0
- package/dist/orders/queue.js.map +1 -0
- package/dist/orders/waiting.d.ts +39 -0
- package/dist/orders/waiting.js +149 -0
- package/dist/orders/waiting.js.map +1 -0
- package/dist/pack.schema.js +13 -0
- package/dist/pack.schema.js.map +1 -0
- package/dist/pack.schema.json +7622 -841
- package/dist/packs/director/index.d.ts +13 -5
- package/dist/packs/director/index.js +204 -0
- package/dist/packs/director/index.js.map +1 -0
- package/dist/packs/heroes/campaign.d.ts +3 -2
- package/dist/packs/heroes/campaign.js +241 -0
- package/dist/packs/heroes/campaign.js.map +1 -0
- package/dist/packs/heroes/carry.d.ts +6 -0
- package/dist/packs/heroes/carry.js +112 -0
- package/dist/packs/heroes/carry.js.map +1 -0
- package/dist/packs/heroes/commands.js +115 -0
- package/dist/packs/heroes/commands.js.map +1 -0
- package/dist/packs/heroes/fallen.d.ts +43 -0
- package/dist/packs/heroes/fallen.js +61 -0
- package/dist/packs/heroes/fallen.js.map +1 -0
- package/dist/packs/heroes/hire.js +60 -0
- package/dist/packs/heroes/hire.js.map +1 -0
- package/dist/packs/heroes/index.d.ts +7 -6
- package/dist/packs/heroes/index.js +130 -0
- package/dist/packs/heroes/index.js.map +1 -0
- package/dist/packs/heroes/loop.d.ts +95 -0
- package/dist/packs/heroes/loop.js +250 -0
- package/dist/packs/heroes/loop.js.map +1 -0
- package/dist/packs/heroes/making.d.ts +6 -3
- package/dist/packs/heroes/making.js +55 -0
- package/dist/packs/heroes/making.js.map +1 -0
- package/dist/packs/heroes/respawn.d.ts +3 -3
- package/dist/packs/heroes/respawn.js +87 -0
- package/dist/packs/heroes/respawn.js.map +1 -0
- package/dist/packs/heroes/sets.d.ts +32 -0
- package/dist/packs/heroes/sets.js +51 -0
- package/dist/packs/heroes/sets.js.map +1 -0
- package/dist/packs/heroes/spells.d.ts +16 -0
- package/dist/packs/heroes/spells.js +269 -0
- package/dist/packs/heroes/spells.js.map +1 -0
- package/dist/packs/items/defaults.d.ts +43 -0
- package/dist/packs/items/defaults.js +1504 -0
- package/dist/packs/items/defaults.js.map +1 -0
- package/dist/packs/items/index.d.ts +27 -0
- package/dist/packs/items/index.js +214 -0
- package/dist/packs/items/index.js.map +1 -0
- package/dist/packs/moba/index.d.ts +3 -3
- package/dist/packs/moba/index.js +174 -0
- package/dist/packs/moba/index.js.map +1 -0
- package/dist/packs/pack.d.ts +15 -15
- package/dist/packs/pack.js +14 -0
- package/dist/packs/pack.js.map +1 -0
- package/dist/packs.d.ts +15 -7
- package/dist/packs.js +222 -0
- package/dist/packs.js.map +1 -0
- package/dist/paths.d.ts +2 -0
- package/dist/paths.js +109 -0
- package/dist/paths.js.map +1 -0
- package/dist/plain.js +57 -0
- package/dist/plain.js.map +1 -0
- package/dist/player.d.ts +33 -10
- package/dist/player.js +159 -0
- package/dist/player.js.map +1 -0
- package/dist/portals.d.ts +1 -1
- package/dist/portals.js +194 -0
- package/dist/portals.js.map +1 -0
- package/dist/prefabs.d.ts +25 -2
- package/dist/prefabs.js +239 -0
- package/dist/prefabs.js.map +1 -0
- package/dist/presetBuildings.js +58 -0
- package/dist/presetBuildings.js.map +1 -0
- package/dist/presetFoliage.d.ts +27 -0
- package/dist/presetFoliage.js +98 -0
- package/dist/presetFoliage.js.map +1 -0
- package/dist/presetGround.js +65 -0
- package/dist/presetGround.js.map +1 -0
- package/dist/proxies.d.ts +12 -0
- package/dist/proxies.js +79 -0
- package/dist/proxies.js.map +1 -0
- package/dist/query.d.ts +56 -0
- package/dist/query.js +88 -0
- package/dist/query.js.map +1 -0
- package/dist/races.d.ts +15 -14
- package/dist/races.js +172 -0
- package/dist/races.js.map +1 -0
- package/dist/randomGroups.js +91 -0
- package/dist/randomGroups.js.map +1 -0
- package/dist/registry.d.ts +117 -53
- package/dist/registry.js +323 -0
- package/dist/registry.js.map +1 -0
- package/dist/remains.d.ts +11 -9
- package/dist/remains.js +188 -0
- package/dist/remains.js.map +1 -0
- package/dist/replication.d.ts +12 -7
- package/dist/replication.js +100 -0
- package/dist/replication.js.map +1 -0
- package/dist/rng.d.ts +2 -0
- package/dist/rng.js +40 -0
- package/dist/rng.js.map +1 -0
- package/dist/rules.d.ts +186 -99
- package/dist/rules.js +179 -0
- package/dist/rules.js.map +1 -0
- package/dist/rulesCheck.d.ts +5 -4
- package/dist/rulesCheck.js +693 -0
- package/dist/rulesCheck.js.map +1 -0
- package/dist/runes.d.ts +2 -2
- package/dist/runes.js +80 -0
- package/dist/runes.js.map +1 -0
- package/dist/save.d.ts +37 -12
- package/dist/save.js +532 -0
- package/dist/save.js.map +1 -0
- package/dist/scenario.d.ts +2 -2
- package/dist/scenario.js +99 -0
- package/dist/scenario.js.map +1 -0
- package/dist/scheduler.d.ts +3 -0
- package/dist/scheduler.js +156 -0
- package/dist/scheduler.js.map +1 -0
- package/dist/score.d.ts +19 -19
- package/dist/score.js +709 -0
- package/dist/score.js.map +1 -0
- package/dist/sequences.d.ts +10 -6
- package/dist/sequences.js +206 -0
- package/dist/sequences.js.map +1 -0
- package/dist/server/doorman.js +154 -0
- package/dist/server/doorman.js.map +1 -0
- package/dist/server/gameServer.d.ts +16 -1
- package/dist/server/gameServer.js +643 -0
- package/dist/server/gameServer.js.map +1 -0
- package/dist/server/index.d.ts +1 -1
- package/dist/server/lobby.js +199 -0
- package/dist/server/lobby.js.map +1 -0
- package/dist/server/log.js +18 -0
- package/dist/server/log.js.map +1 -0
- package/dist/server/match.js +267 -0
- package/dist/server/match.js.map +1 -0
- package/dist/server/mode.d.ts +18 -9
- package/dist/server/mode.js +220 -0
- package/dist/server/mode.js.map +1 -0
- package/dist/{navigation-worker.js → server/navigation-worker.js} +1 -1
- package/dist/server/navigation-worker.js.map +1 -0
- package/dist/server/navigation.js +39 -0
- package/dist/server/navigation.js.map +1 -0
- package/dist/server/ops.d.ts +4 -0
- package/dist/server/ops.js +137 -0
- package/dist/server/ops.js.map +1 -0
- package/dist/server/packs.d.ts +3 -3
- package/dist/server/packs.js +32 -0
- package/dist/server/packs.js.map +1 -0
- package/dist/server/ratings.d.ts +5 -0
- package/dist/server/ratings.js +104 -0
- package/dist/server/ratings.js.map +1 -0
- package/dist/server/relay.d.ts +12 -2
- package/dist/server/relay.js +144 -0
- package/dist/server/relay.js.map +1 -0
- package/dist/server/rooms.d.ts +9 -2
- package/dist/server/rooms.js +442 -0
- package/dist/server/rooms.js.map +1 -0
- package/dist/server/seat.js +116 -0
- package/dist/server/seat.js.map +1 -0
- package/dist/server/seatSettings.d.ts +3 -3
- package/dist/server/seatSettings.js +63 -0
- package/dist/server/seatSettings.js.map +1 -0
- package/dist/server/secret.js +13 -0
- package/dist/server/secret.js.map +1 -0
- package/dist/server/start.d.ts +13 -6
- package/dist/server/start.js +76 -0
- package/dist/server/start.js.map +1 -0
- package/dist/server/websocket.d.ts +9 -1
- package/dist/server/websocket.js +306 -0
- package/dist/server/websocket.js.map +1 -0
- package/dist/server.js +15 -2861
- package/dist/session/can.js +26 -0
- package/dist/session/can.js.map +1 -0
- package/dist/session/commandReplay.d.ts +8 -2
- package/dist/session/commandReplay.js +293 -0
- package/dist/session/commandReplay.js.map +1 -0
- package/dist/session/debug.js +151 -0
- package/dist/session/debug.js.map +1 -0
- package/dist/session/delay.js +62 -0
- package/dist/session/delay.js.map +1 -0
- package/dist/session/delta.d.ts +14 -1
- package/dist/session/delta.js +407 -0
- package/dist/session/delta.js.map +1 -0
- package/dist/session/entityState.js +415 -0
- package/dist/session/entityState.js.map +1 -0
- package/dist/session/local.d.ts +47 -5
- package/dist/session/local.js +670 -0
- package/dist/session/local.js.map +1 -0
- package/dist/session/memory.d.ts +20 -2
- package/dist/session/memory.js +131 -0
- package/dist/session/memory.js.map +1 -0
- package/dist/session/protocol.d.ts +325 -31
- package/dist/session/protocol.js +55 -0
- package/dist/session/protocol.js.map +1 -0
- package/dist/session/remote.d.ts +74 -12
- package/dist/session/remote.js +1394 -0
- package/dist/session/remote.js.map +1 -0
- package/dist/session/replay.d.ts +11 -2
- package/dist/session/replay.js +160 -0
- package/dist/session/replay.js.map +1 -0
- package/dist/session/seed.js +12 -0
- package/dist/session/seed.js.map +1 -0
- package/dist/session/share.d.ts +5 -1
- package/dist/session/share.js +94 -0
- package/dist/session/share.js.map +1 -0
- package/dist/session/socket.d.ts +1 -1
- package/dist/session/socket.js +29 -0
- package/dist/session/socket.js.map +1 -0
- package/dist/session/wire.d.ts +5 -0
- package/dist/session/wire.js +84 -0
- package/dist/session/wire.js.map +1 -0
- package/dist/session/worker.d.ts +77 -12
- package/dist/session/worker.js +499 -0
- package/dist/session/worker.js.map +1 -0
- package/dist/shared.d.ts +31 -5
- package/dist/shared.js +166 -0
- package/dist/shared.js.map +1 -0
- package/dist/sides.d.ts +9 -3
- package/dist/sides.js +149 -0
- package/dist/sides.js.map +1 -0
- package/dist/sight.js +85 -0
- package/dist/sight.js.map +1 -0
- package/dist/simulate-worker.js +1 -1
- package/dist/simulate.d.ts +12 -8
- package/dist/{simulate-oXBiw1Ff.js → simulate.js} +10 -11
- package/dist/simulate.js.map +1 -0
- package/dist/smart.js +77 -0
- package/dist/smart.js.map +1 -0
- package/dist/spatial.d.ts +32 -16
- package/dist/spatial.js +234 -0
- package/dist/spatial.js.map +1 -0
- package/dist/spawning.d.ts +1 -0
- package/dist/spawning.js +224 -0
- package/dist/spawning.js.map +1 -0
- package/dist/stances.d.ts +6 -3
- package/dist/stances.js +169 -0
- package/dist/stances.js.map +1 -0
- package/dist/start.d.ts +10 -10
- package/dist/start.js +75 -0
- package/dist/start.js.map +1 -0
- package/dist/stats.d.ts +42 -16
- package/dist/stats.js +290 -0
- package/dist/stats.js.map +1 -0
- package/dist/summoned.d.ts +52 -0
- package/dist/summoned.js +38 -0
- package/dist/summoned.js.map +1 -0
- package/dist/summons.d.ts +10 -13
- package/dist/summons.js +271 -0
- package/dist/summons.js.map +1 -0
- package/dist/systems/abilities.js +224 -0
- package/dist/systems/abilities.js.map +1 -0
- package/dist/systems/combat.d.ts +35 -1
- package/dist/systems/combat.js +677 -0
- package/dist/systems/combat.js.map +1 -0
- package/dist/systems/combatTold.d.ts +3 -1
- package/dist/systems/combatTold.js +85 -0
- package/dist/systems/combatTold.js.map +1 -0
- package/dist/systems/construction.js +80 -0
- package/dist/systems/construction.js.map +1 -0
- package/dist/systems/economy.d.ts +0 -6
- package/dist/systems/economy.js +128 -0
- package/dist/systems/economy.js.map +1 -0
- package/dist/systems/fog.d.ts +1 -1
- package/dist/systems/fog.js +120 -0
- package/dist/systems/fog.js.map +1 -0
- package/dist/systems/life.js +32 -0
- package/dist/systems/life.js.map +1 -0
- package/dist/systems/movement.d.ts +24 -12
- package/dist/systems/movement.js +1247 -0
- package/dist/systems/movement.js.map +1 -0
- package/dist/systems/orders.js +64 -0
- package/dist/systems/orders.js.map +1 -0
- package/dist/systems/production.js +322 -0
- package/dist/systems/production.js.map +1 -0
- package/dist/systems/productionQueue.js +120 -0
- package/dist/systems/productionQueue.js.map +1 -0
- package/dist/systems/victory.d.ts +1 -1
- package/dist/systems/victory.js +56 -0
- package/dist/systems/victory.js.map +1 -0
- package/dist/talk.d.ts +6 -6
- package/dist/talk.js +153 -0
- package/dist/talk.js.map +1 -0
- package/dist/targeting.d.ts +142 -0
- package/dist/targeting.js +49 -0
- package/dist/targeting.js.map +1 -0
- package/dist/tech.d.ts +20 -3
- package/dist/tech.js +239 -0
- package/dist/tech.js.map +1 -0
- package/dist/techTree.d.ts +7 -0
- package/dist/techTree.js +90 -0
- package/dist/techTree.js.map +1 -0
- package/dist/terrain.d.ts +59 -7
- package/dist/terrain.js +389 -0
- package/dist/terrain.js.map +1 -0
- package/dist/terrainSave.d.ts +6 -0
- package/dist/terrainSave.js +74 -0
- package/dist/terrainSave.js.map +1 -0
- package/dist/testing.d.ts +8 -7
- package/dist/testing.js +13 -739
- package/dist/testing.js.map +1 -1
- package/dist/tiles.d.ts +1 -1
- package/dist/tiles.js +43 -0
- package/dist/tiles.js.map +1 -0
- package/dist/timers.d.ts +29 -4
- package/dist/timers.js +242 -0
- package/dist/timers.js.map +1 -0
- package/dist/tomes.d.ts +4 -4
- package/dist/tomes.js +94 -0
- package/dist/tomes.js.map +1 -0
- package/dist/trade.js +103 -0
- package/dist/trade.js.map +1 -0
- package/dist/transport.d.ts +6 -1
- package/dist/transport.js +281 -0
- package/dist/transport.js.map +1 -0
- package/dist/tunables.d.ts +10 -3
- package/dist/tunables.js +56 -0
- package/dist/tunables.js.map +1 -0
- package/dist/unitResources.d.ts +67 -0
- package/dist/unitResources.js +266 -0
- package/dist/unitResources.js.map +1 -0
- package/dist/upkeep.d.ts +6 -1
- package/dist/upkeep.js +26 -0
- package/dist/upkeep.js.map +1 -0
- package/dist/veterancy.d.ts +8 -3
- package/dist/veterancy.js +131 -0
- package/dist/veterancy.js.map +1 -0
- package/dist/vision.d.ts +36 -0
- package/dist/vision.js +133 -0
- package/dist/vision.js.map +1 -0
- package/dist/walls.d.ts +1 -1
- package/dist/walls.js +278 -0
- package/dist/walls.js.map +1 -0
- package/dist/world.d.ts +606 -88
- package/dist/world.js +1263 -0
- package/dist/world.js.map +1 -0
- package/package.json +2 -2
- package/dist/ai.js.map +0 -1
- package/dist/attributes.d.ts +0 -66
- package/dist/brain-BvVdUhX8.js +0 -7659
- package/dist/brain-BvVdUhX8.js.map +0 -1
- package/dist/builds-C6LfgvEU.js +0 -460
- package/dist/builds-C6LfgvEU.js.map +0 -1
- package/dist/coreComponents-syuh2fPG.js +0 -5149
- package/dist/coreComponents-syuh2fPG.js.map +0 -1
- package/dist/debugCommands-CzjrSm66.js +0 -14739
- package/dist/debugCommands-CzjrSm66.js.map +0 -1
- package/dist/determinism-BCymQwiE.js +0 -518
- package/dist/determinism-BCymQwiE.js.map +0 -1
- package/dist/game-DiJEN-Ks.js +0 -5800
- package/dist/game-DiJEN-Ks.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/inspect-D9dWHmZ0.js.map +0 -1
- package/dist/local-Dkovq42k.js +0 -1379
- package/dist/local-Dkovq42k.js.map +0 -1
- package/dist/missionRules-C-bGxm0Q.js.map +0 -1
- package/dist/navigation-worker.js.map +0 -1
- package/dist/packs-g5thvmGn.js +0 -3199
- package/dist/packs-g5thvmGn.js.map +0 -1
- package/dist/profiles-B3NS9jwk.js.map +0 -1
- package/dist/server.js.map +0 -1
- package/dist/simulate-oXBiw1Ff.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defaults.js","names":[],"sources":["../../../src/packs/items/defaults.ts"],"sourcesContent":["/**\n * The engine's default items (items-and-spells plan, phase 5): a whole tree of about fifty, from the draughts to the\n * twelve legendaries and the relics, with the abilities, buffs, unit types and tags they use. A game takes them with\n * `useDefaults(rules, [defaultItemSet])`, all, some, changed, or none (`SetChoice`). Their passives name general\n * things (a hero, a creep, a structure, an ally, a kill), never lanes, minions or towers, so that they hold in a melee\n * game, a campaign and a game of lanes alike. Prices: basic 250 to 1,000, intermediate 900 to 1,600, legendary 2,500\n * to 3,500, each price for all of it (`ItemDef.from`)\n */\nimport type { AbilityDef, BuffDef, ItemDef, TagDef, UnitTypeDef } from '#engine/defs'\n\n/** A creep, in what a passive asks of its target: a unit that is neither a hero nor a structure */\nconst CREEP = { hero: false, structure: false }\n\n/** The stock of a shop of what is used up: a few at a time, one more every so many seconds */\nconst few = (max: number, restock: number) => ({ max, restock })\n\n/** Move speed, in cells a second, of what the words call 25 (a hero arena game's units of move speed are 80 to a cell) */\nconst speed = (points: number) => points / 80\n\n/**\n * The default tags of items, named and coloured: the shop's filters (`TagDef.filter`) and its words. A game adds to\n * them or puts its own in their place (`Rules.tags`)\n *\n * @beta\n */\nexport const defaultItemTags: TagDef[] = [\n\t{ id: 'attack', name: 'Attack', description: 'Attack damage', color: '#e07a4f', filter: true },\n\t{ id: 'attack-speed', name: 'Attack speed', description: 'Attacks more often', color: '#e0b04f', filter: true },\n\t{ id: 'crit', name: 'Critical strike', description: 'Critical strikes, and how hard they land', color: '#e04f4f', filter: true },\n\t{ id: 'defence', name: 'Defence', description: 'Armor, against attacks', color: '#9aa3ad', filter: true },\n\t{ id: 'magic', name: 'Magic', description: 'Ability power and magic penetration', color: '#8f6fe0', filter: true },\n\t{ id: 'magic-resist', name: 'Magic resist', description: 'Against spells', color: '#5fa0d8', filter: true },\n\t{ id: 'health', name: 'Health', color: '#4fbf6a', filter: true },\n\t{ id: 'mana', name: 'Mana', description: 'Mana, and mana coming back', color: '#4f7fe0', filter: true },\n\t{ id: 'sustain', name: 'Sustain', description: 'Health coming back: life steal, omnivamp, regeneration', color: '#3fae8f', filter: true },\n\t{ id: 'anti-heal', name: 'Anti-heal', description: 'Less healing for the enemies it hurts', color: '#a04060', filter: true },\n\t{ id: 'movement', name: 'Movement', description: 'Moving faster, or through units', color: '#d8d06a', filter: true },\n\t{ id: 'vision', name: 'Vision', description: 'Wards, and finding what hides', color: '#c9b8f0', filter: true },\n\t{ id: 'support', name: 'Support', description: 'Heals, shields and help for allies', color: '#f0d890', filter: true },\n\t{ id: 'jungle', name: 'Jungle', description: 'Clearing creeps’ camps', color: '#6f9f3f', filter: true },\n\t{ id: 'consumable', name: 'Consumable', description: 'Used up', color: '#c8a070' },\n\t{ id: 'early', name: 'Early', description: 'For the first minutes', color: '#b0b0b0' },\n\t{ id: 'late', name: 'Late', description: 'For a long game', color: '#707070' }\n]\n\n/**\n * The unit types the default items bring into the world: the Sight Ward's ward and the Wolfhide Charm's wolf. A game's\n * own of the same id comes in their place\n *\n * @beta\n */\nexport const defaultItemUnits: UnitTypeDef[] = [\n\t{\n\t\tid: 'ward',\n\t\tname: 'Sight Ward',\n\t\tkind: 'unit',\n\t\tradius: 0.3,\n\t\tstats: { health: 3 },\n\t\tsight: 12,\n\t\tsightNight: 12,\n\t\tlifetime: 60,\n\t\tinvisible: { after: 2 },\n\t\tbounty: [15, 15],\n\t\txp: 15\n\t},\n\t{\n\t\tid: 'spiritWolf',\n\t\tname: 'Spirit Wolf',\n\t\tkind: 'unit',\n\t\tradius: 0.45,\n\t\tstats: { health: 420, attackDamage: 18, attackSpeed: 1.1, attackRange: 1, moveSpeed: 5, armor: 2 },\n\t\tsight: 10,\n\t\tattacks: [{ damagePoint: 0.35, acquisitionRange: 7 }],\n\t\tcorpse: false,\n\t\tbounty: [10, 10],\n\t\txp: 20\n\t}\n]\n\n/**\n * The buffs of the default items: what their abilities and passives put on, and what their passives keep on the\n * carrier\n *\n * @beta\n */\nexport const defaultItemBuffs: BuffDef[] = [\n\t{\n\t\tid: 'healingDraught',\n\t\tname: 'Healing Draught',\n\t\tdescription: 'Regaining 20 health a second',\n\t\tduration: 12,\n\t\ttags: ['heal'],\n\t\tonTick: { every: 1, effects: [{ type: 'heal', amount: 20 }] }\n\t},\n\t{\n\t\tid: 'elixirOfMight',\n\t\tname: 'Elixir of Might',\n\t\tdescription: '+20 attack damage, +30 ability power, +200 health',\n\t\tduration: 180,\n\t\ttags: ['elixir'],\n\t\tstats: { attackDamage: 20, abilityPower: 30, health: 200 }\n\t},\n\t{\n\t\tid: 'stoneheartWound',\n\t\tname: 'Thornhide',\n\t\tdescription: 'Heals 40% less',\n\t\tduration: 3,\n\t\tharmful: true,\n\t\ttags: ['anti-heal'],\n\t\tstats: { incomingHealing: -0.4 }\n\t},\n\t{\n\t\tid: 'oathhornRallied',\n\t\tname: 'Rallied',\n\t\tdescription: 'Runs 30% faster and takes 15% less damage',\n\t\tduration: 3,\n\t\ttags: ['haste'],\n\t\tstats: { incomingDamage: -0.15 },\n\t\tpercent: { moveSpeed: 0.3 }\n\t},\n\t{\n\t\tid: 'dawnStasis',\n\t\tname: 'Stasis',\n\t\tdescription: 'Held out of time: nothing reaches it, and it does nothing',\n\t\tduration: 2,\n\t\ttags: ['stasis'],\n\t\tstun: true,\n\t\tinvulnerable: true,\n\t\tuntargetable: true,\n\t\tdispellable: false\n\t},\n\t{\n\t\tid: 'secondDawnWard',\n\t\tname: 'Second Dawn',\n\t\tdescription: 'About to die, it is held in stasis instead',\n\t\ttags: ['save'],\n\t\tdispellable: false,\n\t\tpassive: [\n\t\t\t{\n\t\t\t\ttype: 'onFatal',\n\t\t\t\thealth: 0.05,\n\t\t\t\teffects: [\n\t\t\t\t\t{ type: 'buff', buff: 'dawnStasis', on: 'caster' },\n\t\t\t\t\t{ type: 'wardSpent', buff: 'secondDawnWard', spent: 'secondDawnSpent', duration: 120 }\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t{\n\t\tid: 'secondDawnSpent',\n\t\tname: 'Second Dawn spent',\n\t\tdescription: 'Its Second Dawn comes back when this ends',\n\t\tduration: 120,\n\t\ttags: ['cooldown'],\n\t\tdispellable: false\n\t},\n\t{\n\t\tid: 'rimeChill',\n\t\tname: 'Rime',\n\t\tdescription: 'Moves 20% slower',\n\t\tduration: 1.5,\n\t\tharmful: true,\n\t\ttags: ['slow'],\n\t\tpercent: { moveSpeed: -0.2 }\n\t},\n\t{\n\t\tid: 'bloodreaverFrenzy',\n\t\tname: 'Frenzy',\n\t\tdescription: 'The lower its health, the faster it attacks: up to 60% faster near death',\n\t\ttags: ['attack-speed'],\n\t\tdispellable: false,\n\t\t// asked as the stats are added up, which the tick below has done every quarter of a second\n\t\tchange: (_world, carrier) => ({ percent: { attackSpeed: 0.6 * Math.max(0, 1 - carrier.health / Math.max(carrier.maxHealth, 1)) } }),\n\t\tonTick: { every: 0.25, run: (_world, carrier) => (carrier.statsCache = null) }\n\t},\n\t{\n\t\tid: 'shadowveilVeiled',\n\t\tname: 'Shadowveil',\n\t\tdescription: 'Unseen, and walks through units. Attacking or casting ends it',\n\t\tduration: 2,\n\t\ttags: ['invisible'],\n\t\tinvisible: true,\n\t\tphasing: true,\n\t\tbreaksOn: ['attack', 'cast']\n\t},\n\t{\n\t\tid: 'emberBurn',\n\t\tname: 'Embers',\n\t\tdescription: 'Heals 40% less',\n\t\tduration: 3,\n\t\tharmful: true,\n\t\ttags: ['fire', 'anti-heal'],\n\t\tstats: { incomingHealing: -0.4 }\n\t},\n\t{\n\t\tid: 'voidglassSundered',\n\t\tname: 'Sundered',\n\t\tdescription: 'Takes 10% more magic damage',\n\t\tduration: 4,\n\t\tharmful: true,\n\t\ttags: ['sunder'],\n\t\tstats: { incomingMagicDamage: 0.1 }\n\t},\n\t{\n\t\tid: 'brambleBurn',\n\t\tname: 'Bramble',\n\t\tdescription: 'Burning: 8 damage a second',\n\t\tduration: 3,\n\t\tharmful: true,\n\t\ttags: ['fire'],\n\t\tonTick: { every: 1, effects: [{ type: 'damage', amount: 8, damageType: 'magic' }] }\n\t},\n\t{\n\t\tid: 'wanderersStride',\n\t\tname: 'Wandering',\n\t\tdescription: 'Out of fights: runs 25% faster',\n\t\ttags: ['haste'],\n\t\tpercent: { moveSpeed: 0.25 }\n\t},\n\t{\n\t\tid: 'shadowCowlShroud',\n\t\tname: 'Shroud',\n\t\tdescription: 'Out of fights: runs 15% faster',\n\t\ttags: ['haste'],\n\t\tpercent: { moveSpeed: 0.15 }\n\t},\n\t{\n\t\tid: 'kingsTithe',\n\t\tname: 'Old King’s Tithe',\n\t\tdescription: 'Dying near the Ring of the Old King pays its carrier 25 gold',\n\t\tharmful: true,\n\t\ttags: ['mark'],\n\t\tdispellable: false,\n\t\tonCarrierDeath: [{ type: 'reward', amount: 25 }]\n\t},\n\t{\n\t\tid: 'emberIdolBurst',\n\t\tname: 'Ember Idol',\n\t\tdescription: 'On death, a burst of fire hurts the enemies around for 250',\n\t\ttags: ['fire'],\n\t\tdispellable: false,\n\t\tonCarrierDeath: [{ type: 'damage', amount: 250, damageType: 'magic', radius: 5, affects: 'enemies' }]\n\t}\n]\n\n/**\n * The abilities of the default items: what using one does (`ItemDef.ability`), and their passives (`ItemDef.passive`)\n *\n * @beta\n */\nexport const defaultItemAbilities: AbilityDef[] = [\n\t// ---- used\n\t{\n\t\tid: 'drinkHealingDraught',\n\t\tname: 'Drink',\n\t\tdescription: 'Regains 240 health over 12 seconds',\n\t\ttarget: 'none',\n\t\tcooldown: 1,\n\t\teffects: [{ type: 'buff', buff: 'healingDraught', on: 'caster' }]\n\t},\n\t{ id: 'drinkManaDraught', name: 'Drink', description: 'Regains 150 mana', target: 'none', cooldown: 1, effects: [{ type: 'mana', amount: 150, on: 'caster' }] },\n\t{\n\t\tid: 'drinkElixirOfMight',\n\t\tname: 'Drink',\n\t\tdescription: '+20 attack damage, +30 ability power and +200 health for 3 minutes',\n\t\ttarget: 'none',\n\t\tcooldown: 1,\n\t\teffects: [{ type: 'buff', buff: 'elixirOfMight', on: 'caster' }]\n\t},\n\t{\n\t\tid: 'plantSightWard',\n\t\tname: 'Plant',\n\t\tdescription: 'Puts down a ward that sees around it for 60 seconds',\n\t\ttarget: 'point',\n\t\trange: 6,\n\t\tcooldown: 1,\n\t\teffects: [{ type: 'spawn', unit: 'ward' }]\n\t},\n\t{\n\t\tid: 'scatterSeersDust',\n\t\tname: 'Scatter',\n\t\tdescription: 'Finds what is invisible around the hero: it can be seen, and struck, for 8 seconds',\n\t\ttarget: 'none',\n\t\tcooldown: 4,\n\t\teffects: [{ type: 'detect', radius: 10, duration: 8 }]\n\t},\n\t{\n\t\tid: 'readReturnScroll',\n\t\tname: 'Read',\n\t\tdescription: 'After 4 seconds standing, the hero is home. Being hurt breaks it',\n\t\ttarget: 'none',\n\t\tcooldown: 10,\n\t\teffects: [],\n\t\tchannel: { duration: 4, breaksOnDamage: true, finished: [{ type: 'teleport', to: 'home' }] }\n\t},\n\t{\n\t\tid: 'rallyingHorn',\n\t\tname: 'Rallying Horn',\n\t\tdescription: 'Allies near run 30% faster and take 15% less damage for 3 seconds',\n\t\ttarget: 'none',\n\t\tcooldown: 60,\n\t\teffects: [{ type: 'buff', buff: 'oathhornRallied', radius: 8, affects: 'allies' }]\n\t},\n\t{\n\t\tid: 'shadowveilVeil',\n\t\tname: 'Shadowveil',\n\t\tdescription: 'Unseen for 2 seconds, walking through units. Attacking or casting ends it',\n\t\ttarget: 'none',\n\t\tcooldown: 45,\n\t\teffects: [{ type: 'buff', buff: 'shadowveilVeiled', on: 'caster' }]\n\t},\n\n\t// ---- passives\n\t{\n\t\tid: 'huntersKnifePassive',\n\t\tname: 'Hunter',\n\t\tdescription: 'Attacks on creeps heal for 8% of their damage more',\n\t\ttarget: 'passive',\n\t\teffects: [{ type: 'onHit', slot: 'creeps', priority: 1, effects: [{ type: 'if', target: CREEP, effects: [{ type: 'heal', byDamage: 0.08, on: 'caster' }] }] }]\n\t},\n\t{\n\t\tid: 'brambleCharmPassive',\n\t\tname: 'Bramble',\n\t\tdescription: 'Attacks on creeps burn them for 24 over 3 seconds and heal for 8',\n\t\ttarget: 'passive',\n\t\teffects: [\n\t\t\t{\n\t\t\t\ttype: 'onHit',\n\t\t\t\tslot: 'creeps',\n\t\t\t\tpriority: 2,\n\t\t\t\teffects: [{ type: 'if', target: CREEP, effects: [{ type: 'buff', buff: 'brambleBurn' }, { type: 'heal', amount: 8, on: 'caster' }] }]\n\t\t\t}\n\t\t]\n\t},\n\t{\n\t\tid: 'shadowCowlShroud',\n\t\tname: 'Shroud',\n\t\tdescription: 'Out of fights for 5 seconds: runs 15% faster',\n\t\ttarget: 'passive',\n\t\teffects: [{ type: 'outOfFights', buff: 'shadowCowlShroud', after: 5 }]\n\t},\n\t{\n\t\tid: 'wanderersBootsStride',\n\t\tname: 'Wanderer',\n\t\tdescription: 'Out of fights for 5 seconds: runs 25% faster',\n\t\ttarget: 'passive',\n\t\teffects: [{ type: 'outOfFights', buff: 'wanderersStride', after: 5 }]\n\t},\n\t{\n\t\tid: 'stoneheartThornhide',\n\t\tname: 'Thornhide',\n\t\tdescription: 'Who strikes it takes 30 magic damage (more with its armor) and heals 40% less for 3 seconds',\n\t\ttarget: 'passive',\n\t\teffects: [\n\t\t\t{\n\t\t\t\ttype: 'onDamaged',\n\t\t\t\tattack: true,\n\t\t\t\teffects: [\n\t\t\t\t\t{ type: 'damage', amount: 30, scaling: { armor: 0.25 }, damageType: 'magic' },\n\t\t\t\t\t{ type: 'buff', buff: 'stoneheartWound' }\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t{\n\t\tid: 'dawnmenderSecondDawn',\n\t\tname: 'Second Dawn',\n\t\tdescription: 'An ally near about to die is held in stasis for 2 seconds instead. Once every 120 seconds',\n\t\ttarget: 'passive',\n\t\teffects: [{ type: 'allyWard', buff: 'secondDawnWard', spent: 'secondDawnSpent', radius: 8 }]\n\t},\n\t{\n\t\tid: 'rimecallerRime',\n\t\tname: 'Rime',\n\t\tdescription: 'Harmful spells slow by 20% for 1.5 seconds',\n\t\ttarget: 'passive',\n\t\teffects: [{ type: 'onAbilityHit', effects: [{ type: 'buff', buff: 'rimeChill' }] }]\n\t},\n\t{\n\t\tid: 'bloodreaverFrenzy',\n\t\tname: 'Frenzy',\n\t\tdescription: 'The lower its health, the faster it attacks: up to 60% faster near death',\n\t\ttarget: 'passive',\n\t\teffects: [{ type: 'buff', buff: 'bloodreaverFrenzy' }]\n\t},\n\t{\n\t\tid: 'nightfangHunt',\n\t\tname: 'Nightfang',\n\t\tdescription: 'Killing a hero makes its abilities ready again, but its ultimate',\n\t\ttarget: 'passive',\n\t\teffects: [{ type: 'onKill', only: 'heroes', effects: [{ type: 'refreshAbilities' }] }]\n\t},\n\t{\n\t\tid: 'kingsedgeExecution',\n\t\tname: 'Execution',\n\t\tdescription: 'Attacks finish a unit left under 10% of its health',\n\t\ttarget: 'passive',\n\t\teffects: [\n\t\t\t{\n\t\t\t\ttype: 'onHit',\n\t\t\t\teffects: [{ type: 'if', target: { healthBelow: 0.1, structure: false }, effects: [{ type: 'damage', amount: 0, byCurrentHealth: 1, damageType: 'true' }] }]\n\t\t\t}\n\t\t]\n\t},\n\t{\n\t\tid: 'galeshotVolley',\n\t\tname: 'Galeshot',\n\t\tdescription: 'Every third attack strikes again',\n\t\ttarget: 'passive',\n\t\teffects: [{ type: 'onHit', every: 3, effects: [{ type: 'damage', amount: 0, scaling: { attackDamage: 1 }, damageType: 'physical' }] }]\n\t},\n\t{\n\t\tid: 'embercrownEmbers',\n\t\tname: 'Embers',\n\t\tdescription: 'Spells burn for 20 more magic damage, and who they burn heals 40% less for 3 seconds',\n\t\ttarget: 'passive',\n\t\teffects: [\n\t\t\t{\n\t\t\t\ttype: 'onAbilityHit',\n\t\t\t\teffects: [\n\t\t\t\t\t{ type: 'damage', amount: 20, scaling: { abilityPower: 0.05 }, damageType: 'magic' },\n\t\t\t\t\t{ type: 'buff', buff: 'emberBurn' }\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t{\n\t\tid: 'voidglassSunder',\n\t\tname: 'Sunder',\n\t\tdescription: 'Spells sunder: who they hit takes 10% more magic damage for 4 seconds',\n\t\ttarget: 'passive',\n\t\teffects: [{ type: 'onAbilityHit', effects: [{ type: 'buff', buff: 'voidglassSundered' }] }]\n\t},\n\t{\n\t\tid: 'wildheartPassive',\n\t\tname: 'Wildheart',\n\t\tdescription: 'Attacks deal 40% more to creeps; Reap cools down half again as fast',\n\t\ttarget: 'passive',\n\t\teffects: [\n\t\t\t{\n\t\t\t\ttype: 'onHit',\n\t\t\t\tslot: 'creeps',\n\t\t\t\tpriority: 3,\n\t\t\t\teffects: [{ type: 'if', target: CREEP, effects: [{ type: 'damage', amount: 0, scaling: { attackDamage: 0.4 }, damageType: 'physical' }] }]\n\t\t\t},\n\t\t\t{ type: 'quicken', spell: 'reap', part: 0.5 }\n\t\t]\n\t},\n\t{\n\t\tid: 'oldKingsTithe',\n\t\tname: 'Old King’s Tithe',\n\t\tdescription: 'Each enemy unit that dies near pays 25 gold',\n\t\ttarget: 'passive',\n\t\teffects: [{ type: 'aura', buff: 'kingsTithe', radius: 9, affects: 'enemies' }]\n\t},\n\t{\n\t\tid: 'emberIdolBurst',\n\t\tname: 'Ember Idol',\n\t\tdescription: 'On death, a burst of fire hurts the enemies around for 250',\n\t\ttarget: 'passive',\n\t\teffects: [{ type: 'buff', buff: 'emberIdolBurst' }]\n\t},\n\t{\n\t\tid: 'wolfhideCompanion',\n\t\tname: 'Wolfhide',\n\t\tdescription: 'At night a spirit wolf walks at its side',\n\t\ttarget: 'passive',\n\t\teffects: [{ type: 'nightCompanion', unit: 'spiritWolf' }]\n\t}\n]\n\n/**\n * The engine's default items: six consumables, three to start with, ten basic, twelve intermediate and four pairs of\n * boots built of them, twelve legendaries, and three relics, found and never sold\n *\n * @beta\n */\nexport const defaultItems: ItemDef[] = [\n\t// ---- used up\n\t{\n\t\tid: 'healingDraught',\n\t\tname: 'Healing Draught',\n\t\tdescription: 'Regains 240 health over 12 seconds. Five go in a slot',\n\t\ttier: 'consumable',\n\t\tcost: { gold: 50 },\n\t\tcharges: 1,\n\t\tstack: 5,\n\t\tability: 'drinkHealingDraught',\n\t\tstock: few(5, 30),\n\t\ttags: ['consumable', 'health', 'sustain', 'early']\n\t},\n\t{\n\t\tid: 'manaDraught',\n\t\tname: 'Mana Draught',\n\t\tdescription: 'Regains 150 mana. Five go in a slot',\n\t\ttier: 'consumable',\n\t\tcost: { gold: 75 },\n\t\tcharges: 1,\n\t\tstack: 5,\n\t\tability: 'drinkManaDraught',\n\t\tstock: few(5, 30),\n\t\ttags: ['consumable', 'mana', 'early']\n\t},\n\t{\n\t\tid: 'elixirOfMight',\n\t\tname: 'Elixir of Might',\n\t\tdescription: '+20 attack damage, +30 ability power and +200 health for 3 minutes',\n\t\ttier: 'consumable',\n\t\tcost: { gold: 500 },\n\t\tcharges: 1,\n\t\tability: 'drinkElixirOfMight',\n\t\tstock: few(2, 120),\n\t\ttags: ['consumable', 'attack', 'magic', 'health', 'late']\n\t},\n\t{\n\t\tid: 'sightWard',\n\t\tname: 'Sight Ward',\n\t\tdescription: 'Puts down a ward that sees around it for 60 seconds. Its enemies see it put down, then only what finds it does. Three go in a slot',\n\t\ttier: 'consumable',\n\t\tcost: { gold: 75 },\n\t\tcharges: 1,\n\t\tstack: 3,\n\t\tability: 'plantSightWard',\n\t\tstock: few(3, 60),\n\t\ttags: ['consumable', 'vision', 'support']\n\t},\n\t{\n\t\tid: 'seersDust',\n\t\tname: 'Seer’s Dust',\n\t\tdescription: 'Finds what is invisible around the hero for 8 seconds. Two uses',\n\t\ttier: 'consumable',\n\t\tcost: { gold: 100 },\n\t\tcharges: 2,\n\t\tability: 'scatterSeersDust',\n\t\tstock: few(2, 60),\n\t\ttags: ['consumable', 'vision']\n\t},\n\t{\n\t\tid: 'returnScroll',\n\t\tname: 'Return Scroll',\n\t\tdescription: 'After 4 seconds standing still, the hero is home. Being hurt breaks it. Three go in a slot',\n\t\ttier: 'consumable',\n\t\tcost: { gold: 100 },\n\t\tcharges: 1,\n\t\tstack: 3,\n\t\tability: 'readReturnScroll',\n\t\tstock: few(3, 60),\n\t\ttags: ['consumable', 'movement']\n\t},\n\n\t// ---- to start with\n\t{\n\t\tid: 'squiresBlade',\n\t\tname: 'Squire’s Blade',\n\t\tdescription: '+10 attack damage, +80 health; 2.5% of all damage dealt comes back as health',\n\t\ttier: 'starter',\n\t\tcost: { gold: 400 },\n\t\tbonus: { stats: { attackDamage: 10, health: 80, omnivamp: 0.025 } },\n\t\ttags: ['attack', 'health', 'sustain', 'early'],\n\t\tsuits: ['reaver', 'stalker', 'ranger', 'roamer']\n\t},\n\t{\n\t\tid: 'squiresShield',\n\t\tname: 'Squire’s Shield',\n\t\tdescription: '+110 health, +6 armor, 1 health back a second',\n\t\ttier: 'starter',\n\t\tcost: { gold: 400 },\n\t\tbonus: { stats: { health: 110, armor: 6, healthRegen: 1 } },\n\t\ttags: ['health', 'defence', 'sustain', 'early'],\n\t\tsuits: ['vanguard', 'keeper']\n\t},\n\t{\n\t\tid: 'squiresRing',\n\t\tname: 'Squire’s Ring',\n\t\tdescription: '+18 ability power, +90 health, 1 mana back a second',\n\t\ttier: 'starter',\n\t\tcost: { gold: 400 },\n\t\tbonus: { stats: { abilityPower: 18, health: 90, manaRegen: 1 } },\n\t\ttags: ['magic', 'health', 'mana', 'early'],\n\t\tsuits: ['arcanist', 'binder', 'keeper']\n\t},\n\n\t// ---- basic\n\t{ id: 'ironSword', name: 'Iron Sword', description: '+10 attack damage', tier: 'basic', cost: { gold: 350 }, bonus: { stats: { attackDamage: 10 } }, tags: ['attack'] },\n\t{\n\t\tid: 'quickDagger',\n\t\tname: 'Quick Dagger',\n\t\tdescription: 'Attacks 12% faster',\n\t\ttier: 'basic',\n\t\tcost: { gold: 300 },\n\t\tbonus: { percent: { attackSpeed: 0.12 } },\n\t\ttags: ['attack-speed']\n\t},\n\t{ id: 'paddedCoat', name: 'Padded Coat', description: '+15 armor', tier: 'basic', cost: { gold: 300 }, bonus: { stats: { armor: 15 } }, tags: ['defence'] },\n\t{\n\t\tid: 'wardingCloak',\n\t\tname: 'Warding Cloak',\n\t\tdescription: '+25 magic resist',\n\t\ttier: 'basic',\n\t\tcost: { gold: 450 },\n\t\tbonus: { stats: { magicResist: 25 } },\n\t\ttags: ['magic-resist']\n\t},\n\t{ id: 'rubyShard', name: 'Ruby Shard', description: '+150 health', tier: 'basic', cost: { gold: 400 }, bonus: { stats: { health: 150 } }, tags: ['health'] },\n\t{ id: 'spellTome', name: 'Spell Tome', description: '+20 ability power', tier: 'basic', cost: { gold: 435 }, bonus: { stats: { abilityPower: 20 } }, tags: ['magic'] },\n\t{ id: 'sapphire', name: 'Sapphire', description: '+250 mana', tier: 'basic', cost: { gold: 350 }, bonus: { stats: { mana: 250 } }, tags: ['mana'] },\n\t{\n\t\tid: 'keenGlass',\n\t\tname: 'Keen Glass',\n\t\tdescription: '15% chance to strike critically',\n\t\ttier: 'basic',\n\t\tcost: { gold: 600 },\n\t\tbonus: { stats: { critChance: 0.15 } },\n\t\ttags: ['crit']\n\t},\n\t{\n\t\tid: 'faithCharm',\n\t\tname: 'Faith Charm',\n\t\tdescription: 'Mana comes back 50% faster; heals and shields 5% stronger',\n\t\ttier: 'basic',\n\t\tcost: { gold: 250 },\n\t\tbonus: { stats: { healShieldPower: 0.05 }, percent: { manaRegen: 0.5 } },\n\t\ttags: ['mana', 'support']\n\t},\n\t{\n\t\tid: 'boots',\n\t\tname: 'Boots',\n\t\tdescription: '+25 move speed. One pair at a time',\n\t\ttier: 'basic',\n\t\tcost: { gold: 300 },\n\t\tgroup: 'boots',\n\t\tbonus: { stats: { moveSpeed: speed(25) } },\n\t\ttags: ['movement', 'early']\n\t},\n\n\t// ---- intermediate\n\t{\n\t\tid: 'huntersKnife',\n\t\tname: 'Hunter’s Knife',\n\t\tdescription: '+15 attack damage, 8% life steal; on creeps, life steal twice over',\n\t\ttier: 'intermediate',\n\t\tcost: { gold: 1000 },\n\t\tfrom: ['ironSword', 'ironSword'],\n\t\tbonus: { stats: { attackDamage: 15, lifeSteal: 0.08 } },\n\t\tpassive: 'huntersKnifePassive',\n\t\tunique: 'hunter',\n\t\ttags: ['attack', 'sustain', 'jungle'],\n\t\tsuits: ['reaver', 'roamer']\n\t},\n\t{\n\t\tid: 'serratedEdge',\n\t\tname: 'Serrated Edge',\n\t\tdescription: '+20 attack damage, ignores 10 armor',\n\t\ttier: 'intermediate',\n\t\tcost: { gold: 1100 },\n\t\tfrom: ['ironSword', 'ironSword'],\n\t\tbonus: { stats: { attackDamage: 20, lethality: 10 } },\n\t\ttags: ['attack'],\n\t\tsuits: ['stalker']\n\t},\n\t{\n\t\tid: 'recurveBow',\n\t\tname: 'Recurve Bow',\n\t\tdescription: 'Attacks 25% faster, +10 attack damage',\n\t\ttier: 'intermediate',\n\t\tcost: { gold: 1000 },\n\t\tfrom: ['quickDagger', 'quickDagger'],\n\t\tbonus: { stats: { attackDamage: 10 }, percent: { attackSpeed: 0.25 } },\n\t\ttags: ['attack-speed', 'attack'],\n\t\tsuits: ['ranger']\n\t},\n\t{\n\t\tid: 'chainVest',\n\t\tname: 'Chain Vest',\n\t\tdescription: '+40 armor',\n\t\ttier: 'intermediate',\n\t\tcost: { gold: 900 },\n\t\tfrom: ['paddedCoat'],\n\t\tbonus: { stats: { armor: 40 } },\n\t\ttags: ['defence'],\n\t\tsuits: ['vanguard']\n\t},\n\t{\n\t\tid: 'spellwardMantle',\n\t\tname: 'Spellward Mantle',\n\t\tdescription: '+40 magic resist, +200 health',\n\t\ttier: 'intermediate',\n\t\tcost: { gold: 1250 },\n\t\tfrom: ['wardingCloak', 'rubyShard'],\n\t\tbonus: { stats: { magicResist: 40, health: 200 } },\n\t\ttags: ['magic-resist', 'health'],\n\t\tsuits: ['vanguard', 'keeper']\n\t},\n\t{\n\t\tid: 'giantsBelt',\n\t\tname: 'Giant’s Belt',\n\t\tdescription: '+350 health',\n\t\ttier: 'intermediate',\n\t\tcost: { gold: 900 },\n\t\tfrom: ['rubyShard'],\n\t\tbonus: { stats: { health: 350 } },\n\t\ttags: ['health'],\n\t\tsuits: ['vanguard', 'reaver']\n\t},\n\t{\n\t\tid: 'brutalAxe',\n\t\tname: 'Brutal Axe',\n\t\tdescription: '+20 attack damage, +200 health',\n\t\ttier: 'intermediate',\n\t\tcost: { gold: 1100 },\n\t\tfrom: ['ironSword', 'rubyShard'],\n\t\tbonus: { stats: { attackDamage: 20, health: 200 } },\n\t\ttags: ['attack', 'health'],\n\t\tsuits: ['reaver', 'roamer']\n\t},\n\t{\n\t\tid: 'arcaneLens',\n\t\tname: 'Arcane Lens',\n\t\tdescription: '+25 ability power, ignores 13% of magic resist',\n\t\ttier: 'intermediate',\n\t\tcost: { gold: 1100 },\n\t\tfrom: ['spellTome'],\n\t\tbonus: { stats: { abilityPower: 25, magicPenetrationPercent: 0.13 } },\n\t\ttags: ['magic'],\n\t\tsuits: ['arcanist', 'binder']\n\t},\n\t{\n\t\tid: 'runeCodex',\n\t\tname: 'Rune Codex',\n\t\tdescription: '+30 ability power, 10 ability haste',\n\t\ttier: 'intermediate',\n\t\tcost: { gold: 1000 },\n\t\tfrom: ['spellTome'],\n\t\tbonus: { stats: { abilityPower: 30, abilityHaste: 10 } },\n\t\ttags: ['magic'],\n\t\tsuits: ['arcanist', 'keeper']\n\t},\n\t{\n\t\tid: 'mendersIdol',\n\t\tname: 'Mender’s Idol',\n\t\tdescription: 'Heals and shields 10% stronger, mana back twice as fast, 10 ability haste',\n\t\ttier: 'intermediate',\n\t\tcost: { gold: 900 },\n\t\tfrom: ['faithCharm'],\n\t\tbonus: { stats: { healShieldPower: 0.1, abilityHaste: 10 }, percent: { manaRegen: 1 } },\n\t\ttags: ['support', 'mana'],\n\t\tsuits: ['keeper']\n\t},\n\t{\n\t\tid: 'brambleCharm',\n\t\tname: 'Bramble Charm',\n\t\tdescription: '+10 attack damage; attacks on creeps burn them for 24 over 3 seconds and heal for 8',\n\t\ttier: 'intermediate',\n\t\tcost: { gold: 950 },\n\t\tfrom: ['ironSword'],\n\t\tbonus: { stats: { attackDamage: 10 } },\n\t\tpassive: 'brambleCharmPassive',\n\t\tunique: 'bramble',\n\t\ttags: ['jungle', 'sustain', 'attack'],\n\t\tsuits: ['roamer']\n\t},\n\t{\n\t\tid: 'shadowCowl',\n\t\tname: 'Shadow Cowl',\n\t\tdescription: '+18 attack damage, ignores 6 armor; out of fights for 5 seconds, runs 15% faster',\n\t\ttier: 'intermediate',\n\t\tcost: { gold: 1000 },\n\t\tfrom: ['ironSword'],\n\t\tbonus: { stats: { attackDamage: 18, lethality: 6 } },\n\t\tpassive: 'shadowCowlShroud',\n\t\tunique: 'shroud',\n\t\ttags: ['attack', 'movement'],\n\t\tsuits: ['stalker', 'roamer']\n\t},\n\n\t// ---- boots: one pair at a time\n\t{\n\t\tid: 'greavesOfHaste',\n\t\tname: 'Greaves of Haste',\n\t\tdescription: '+45 move speed, attacks 30% faster',\n\t\ttier: 'intermediate',\n\t\tcost: { gold: 1100 },\n\t\tfrom: ['boots', 'quickDagger'],\n\t\tgroup: 'boots',\n\t\tbonus: { stats: { moveSpeed: speed(45) }, percent: { attackSpeed: 0.3 } },\n\t\ttags: ['movement', 'attack-speed'],\n\t\tsuits: ['ranger', 'stalker']\n\t},\n\t{\n\t\tid: 'ironTreads',\n\t\tname: 'Iron Treads',\n\t\tdescription: '+45 move speed, +20 armor, stuns and slows 30% shorter',\n\t\ttier: 'intermediate',\n\t\tcost: { gold: 1100 },\n\t\tfrom: ['boots', 'paddedCoat'],\n\t\tgroup: 'boots',\n\t\tbonus: { stats: { moveSpeed: speed(45), armor: 20, tenacity: 0.3 } },\n\t\ttags: ['movement', 'defence'],\n\t\tsuits: ['vanguard', 'reaver', 'binder']\n\t},\n\t{\n\t\tid: 'sorcerersSandals',\n\t\tname: 'Sorcerer’s Sandals',\n\t\tdescription: '+45 move speed, ignores 18 magic resist',\n\t\ttier: 'intermediate',\n\t\tcost: { gold: 1100 },\n\t\tfrom: ['boots'],\n\t\tgroup: 'boots',\n\t\tbonus: { stats: { moveSpeed: speed(45), magicPenetration: 18 } },\n\t\ttags: ['movement', 'magic'],\n\t\tsuits: ['arcanist', 'binder']\n\t},\n\t{\n\t\tid: 'wanderersBoots',\n\t\tname: 'Wanderer’s Boots',\n\t\tdescription: '+45 move speed; out of fights for 5 seconds, runs 25% faster',\n\t\ttier: 'intermediate',\n\t\tcost: { gold: 900 },\n\t\tfrom: ['boots'],\n\t\tgroup: 'boots',\n\t\tbonus: { stats: { moveSpeed: speed(45) } },\n\t\tpassive: 'wanderersBootsStride',\n\t\ttags: ['movement'],\n\t\tsuits: ['roamer', 'keeper']\n\t},\n\n\t// ---- legendary: each a way of playing\n\t{\n\t\tid: 'stoneheart',\n\t\tname: 'Stoneheart',\n\t\tdescription: '+400 health, +60 armor. Thornhide: who strikes it takes magic damage and heals 40% less for 3 seconds',\n\t\ttier: 'legendary',\n\t\tcost: { gold: 2700 },\n\t\tfrom: ['chainVest', 'giantsBelt', 'paddedCoat'],\n\t\tbonus: { stats: { health: 400, armor: 60 } },\n\t\tpassive: 'stoneheartThornhide',\n\t\tunique: 'thornhide',\n\t\ttags: ['defence', 'health', 'anti-heal'],\n\t\tsuits: ['vanguard']\n\t},\n\t{\n\t\tid: 'oathhorn',\n\t\tname: 'Oathhorn',\n\t\tdescription: '+450 health, +50 magic resist. Used: allies near run 30% faster and take 15% less damage for 3 seconds. Every 60 seconds',\n\t\ttier: 'legendary',\n\t\tcost: { gold: 2600 },\n\t\tfrom: ['spellwardMantle', 'giantsBelt'],\n\t\tbonus: { stats: { health: 450, magicResist: 50 } },\n\t\tability: 'rallyingHorn',\n\t\ttags: ['health', 'magic-resist', 'support'],\n\t\tsuits: ['vanguard', 'keeper']\n\t},\n\t{\n\t\tid: 'dawnmender',\n\t\tname: 'Dawnmender',\n\t\tdescription: '+40 ability power, 20 ability haste, heals and shields 12% stronger. Second Dawn: an ally near about to die is held in stasis for 2 seconds instead, once every 120 seconds',\n\t\ttier: 'legendary',\n\t\tcost: { gold: 2700 },\n\t\tfrom: ['mendersIdol', 'runeCodex'],\n\t\tbonus: { stats: { abilityPower: 40, abilityHaste: 20, healShieldPower: 0.12 } },\n\t\tpassive: 'dawnmenderSecondDawn',\n\t\tunique: 'secondDawn',\n\t\ttags: ['magic', 'support'],\n\t\tsuits: ['keeper']\n\t},\n\t{\n\t\tid: 'rimecaller',\n\t\tname: 'Rimecaller',\n\t\tdescription: '+60 ability power, +300 health. Rime: harmful spells slow by 20%',\n\t\ttier: 'legendary',\n\t\tcost: { gold: 2600 },\n\t\tfrom: ['arcaneLens', 'rubyShard'],\n\t\tbonus: { stats: { abilityPower: 60, health: 300 } },\n\t\tpassive: 'rimecallerRime',\n\t\tunique: 'rime',\n\t\ttags: ['magic', 'health'],\n\t\tsuits: ['binder', 'arcanist']\n\t},\n\t{\n\t\tid: 'bloodreaver',\n\t\tname: 'Bloodreaver',\n\t\tdescription: '+45 attack damage, +300 health, 10% of all damage back as health. Frenzy: the lower its health, the faster it attacks',\n\t\ttier: 'legendary',\n\t\tcost: { gold: 3100 },\n\t\tfrom: ['brutalAxe', 'huntersKnife'],\n\t\tbonus: { stats: { attackDamage: 45, health: 300, omnivamp: 0.1 } },\n\t\tpassive: 'bloodreaverFrenzy',\n\t\tunique: 'frenzy',\n\t\ttags: ['attack', 'health', 'sustain'],\n\t\tsuits: ['reaver']\n\t},\n\t{\n\t\tid: 'nightfang',\n\t\tname: 'Nightfang',\n\t\tdescription: '+55 attack damage, ignores 18 armor. A hero killed makes its abilities ready again, but its ultimate',\n\t\ttier: 'legendary',\n\t\tcost: { gold: 2900 },\n\t\tfrom: ['serratedEdge', 'ironSword'],\n\t\tbonus: { stats: { attackDamage: 55, lethality: 18 } },\n\t\tpassive: 'nightfangHunt',\n\t\tunique: 'nightfang',\n\t\ttags: ['attack'],\n\t\tsuits: ['stalker']\n\t},\n\t{\n\t\tid: 'shadowveil',\n\t\tname: 'Shadowveil',\n\t\tdescription: '+50 attack damage, ignores 15 armor; out of fights, runs 15% faster. Used: unseen for 2 seconds, walking through units. Every 45 seconds',\n\t\ttier: 'legendary',\n\t\tcost: { gold: 3000 },\n\t\tfrom: ['shadowCowl', 'serratedEdge'],\n\t\tbonus: { stats: { attackDamage: 50, lethality: 15 } },\n\t\tability: 'shadowveilVeil',\n\t\tpassive: 'shadowCowlShroud',\n\t\tunique: 'shroud',\n\t\ttags: ['attack', 'movement'],\n\t\tsuits: ['stalker', 'roamer']\n\t},\n\t{\n\t\tid: 'kingsedge',\n\t\tname: 'Kingsedge',\n\t\tdescription: '+55 attack damage, 25% critical chance, critical strikes deal 30% more. Execution: attacks finish a unit left under 10% of its health',\n\t\ttier: 'legendary',\n\t\tcost: { gold: 3400 },\n\t\tfrom: ['recurveBow', 'ironSword', 'keenGlass'],\n\t\tbonus: { stats: { attackDamage: 55, critChance: 0.25, critDamage: 0.3 } },\n\t\tpassive: 'kingsedgeExecution',\n\t\tunique: 'execution',\n\t\ttags: ['attack', 'crit', 'late'],\n\t\tsuits: ['ranger']\n\t},\n\t{\n\t\tid: 'galeshot',\n\t\tname: 'Galeshot',\n\t\tdescription: 'Attacks 40% faster, 20% critical chance, runs 7% faster. Every third attack strikes again',\n\t\ttier: 'legendary',\n\t\tcost: { gold: 2800 },\n\t\tfrom: ['recurveBow', 'quickDagger'],\n\t\tbonus: { stats: { critChance: 0.2 }, percent: { attackSpeed: 0.4, moveSpeed: 0.07 } },\n\t\tpassive: 'galeshotVolley',\n\t\tunique: 'galeshot',\n\t\ttags: ['attack-speed', 'crit', 'movement'],\n\t\tsuits: ['ranger']\n\t},\n\t{\n\t\tid: 'embercrown',\n\t\tname: 'Embercrown',\n\t\tdescription: '+70 ability power, +400 mana. Embers: spells burn, and who they burn heals 40% less for 3 seconds',\n\t\ttier: 'legendary',\n\t\tcost: { gold: 2900 },\n\t\tfrom: ['runeCodex', 'sapphire'],\n\t\tbonus: { stats: { abilityPower: 70, mana: 400 } },\n\t\tpassive: 'embercrownEmbers',\n\t\tunique: 'embers',\n\t\ttags: ['magic', 'mana', 'anti-heal'],\n\t\tsuits: ['arcanist']\n\t},\n\t{\n\t\tid: 'voidglass',\n\t\tname: 'Voidglass',\n\t\tdescription: '+65 ability power, ignores 20% of magic resist. Sunder: who spells hit takes 10% more magic damage for 4 seconds',\n\t\ttier: 'legendary',\n\t\tcost: { gold: 2800 },\n\t\tfrom: ['arcaneLens', 'spellTome'],\n\t\tbonus: { stats: { abilityPower: 65, magicPenetrationPercent: 0.2 } },\n\t\tpassive: 'voidglassSunder',\n\t\tunique: 'sunder',\n\t\ttags: ['magic', 'late'],\n\t\tsuits: ['arcanist', 'stalker']\n\t},\n\t{\n\t\tid: 'wildheart',\n\t\tname: 'Wildheart',\n\t\tdescription: '+35 attack damage, +350 health. Attacks deal 40% more to creeps; Reap cools down half again as fast',\n\t\ttier: 'legendary',\n\t\tcost: { gold: 2700 },\n\t\tfrom: ['brambleCharm', 'brutalAxe'],\n\t\tbonus: { stats: { attackDamage: 35, health: 350 } },\n\t\tpassive: 'wildheartPassive',\n\t\tunique: 'bramble',\n\t\ttags: ['attack', 'health', 'jungle'],\n\t\tsuits: ['roamer']\n\t},\n\n\t// ---- relics: found, never sold\n\t{\n\t\tid: 'emberIdol',\n\t\tname: 'Ember Idol',\n\t\tdescription: '+30 ability power. On death, a burst of fire hurts the enemies around for 250',\n\t\ttier: 'relic',\n\t\tcost: { gold: 800 },\n\t\tbonus: { stats: { abilityPower: 30 } },\n\t\tpassive: 'emberIdolBurst',\n\t\tunique: 'emberIdol',\n\t\ttags: ['magic']\n\t},\n\t{\n\t\tid: 'ringOfTheOldKing',\n\t\tname: 'Ring of the Old King',\n\t\tdescription: '+5 armor. Each enemy unit that dies near pays 25 gold',\n\t\ttier: 'relic',\n\t\tcost: { gold: 1000 },\n\t\tbonus: { stats: { armor: 5 } },\n\t\tpassive: 'oldKingsTithe',\n\t\tunique: 'oldKingsTithe',\n\t\ttags: ['defence']\n\t},\n\t{\n\t\tid: 'wolfhideCharm',\n\t\tname: 'Wolfhide Charm',\n\t\tdescription: '+150 health. At night a spirit wolf walks at its side',\n\t\ttier: 'relic',\n\t\tcost: { gold: 900 },\n\t\tbonus: { stats: { health: 150 } },\n\t\tpassive: 'wolfhideCompanion',\n\t\tunique: 'wolfhide',\n\t\ttags: ['health', 'jungle']\n\t}\n]\n"],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { DefaultSet } from '#engine/defaultSets';
|
|
2
|
+
import type { ItemDef } from '#engine/defs';
|
|
3
|
+
import type { GamePack } from '#engine/packs/pack';
|
|
4
|
+
export { defaultItemAbilities, defaultItemBuffs, defaultItems, defaultItemTags, defaultItemUnits } from './defaults';
|
|
5
|
+
/**
|
|
6
|
+
* The id of the pack of the default items' effects (`defaultItemsPack`), as `GamePack.id` has it
|
|
7
|
+
*
|
|
8
|
+
* @beta
|
|
9
|
+
*/
|
|
10
|
+
export declare const DEFAULT_ITEMS = "core.defaultItems";
|
|
11
|
+
/**
|
|
12
|
+
* The pack of the default items' effects (`allyWard`, `wardSpent`, `refreshAbilities`, `quicken`, `outOfFights`,
|
|
13
|
+
* `reward`, `nightCompanion`): what the default set brings to a game that takes it (`defaultItemSet`), and what a game
|
|
14
|
+
* whose own items use them turns on
|
|
15
|
+
*
|
|
16
|
+
* @beta
|
|
17
|
+
*/
|
|
18
|
+
export declare function defaultItemsPack(): GamePack;
|
|
19
|
+
/**
|
|
20
|
+
* The engine's default items as a default set (`useDefaults`): its items, with the abilities, buffs, unit types and tags
|
|
21
|
+
* they use, the pack of their effects (`defaultItemsPack`) and the hero arena stats (`mobaStatsPack`) where the game
|
|
22
|
+
* has neither. `useDefaults(rules, [defaultItemSet], { items: { except: ['sightWard'] } })`; in a `data.json`,
|
|
23
|
+
* `"defaults": { "items": "none" }`
|
|
24
|
+
*
|
|
25
|
+
* @beta
|
|
26
|
+
*/
|
|
27
|
+
export declare const defaultItemSet: DefaultSet<ItemDef>;
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import { defineComponent } from "../../components.js";
|
|
2
|
+
import { fighting } from "../../entity.js";
|
|
3
|
+
import { earn } from "../../player.js";
|
|
4
|
+
import { learnsOf } from "../../formState.js";
|
|
5
|
+
import { AURA_LINGER, applyBuff, removeBuff } from "../../abilities/buffs.js";
|
|
6
|
+
import { summoned, summonsOf } from "../../summoned.js";
|
|
7
|
+
import { defineEffect } from "../../abilities/effects.js";
|
|
8
|
+
import { mobaStatsPack } from "../moba/index.js";
|
|
9
|
+
import { defaultItemAbilities, defaultItemBuffs, defaultItemTags, defaultItemUnits, defaultItems } from "./defaults.js";
|
|
10
|
+
//#region src/packs/items/index.ts
|
|
11
|
+
/**
|
|
12
|
+
* The default items (items-and-spells plan, phase 5) as a set a game takes (`defaultItemSet`, with `useDefaults`), and
|
|
13
|
+
* the pack of the effects their passives need beside the engine's (`defaultItemsPack`): a ward kept on allies near,
|
|
14
|
+
* abilities made ready again, a hero spell that cools faster, speed out of fights, gold for a kill near, a wolf at
|
|
15
|
+
* night. The set brings the pack, and the hero arena stats its items give (`mobaStatsPack`), to a game that has neither
|
|
16
|
+
*/
|
|
17
|
+
/**
|
|
18
|
+
* The id of the pack of the default items' effects (`defaultItemsPack`), as `GamePack.id` has it
|
|
19
|
+
*
|
|
20
|
+
* @beta
|
|
21
|
+
*/
|
|
22
|
+
var DEFAULT_ITEMS = "core.defaultItems";
|
|
23
|
+
/** When a unit was last in a fight, in seconds of the game: hurt, or swinging at something (`outOfFights`) */
|
|
24
|
+
var foughtAt = defineComponent({ id: "core.defaultItems.foughtAt" });
|
|
25
|
+
/** Every living unit within `radius` of `of`, itself too */
|
|
26
|
+
function around(world, of, radius) {
|
|
27
|
+
return world.spatial.query(of.pos.x, of.pos.z, radius).filter((other) => other.alive && !other.hidden && other.isUnit);
|
|
28
|
+
}
|
|
29
|
+
/** The effects of the default items' passives, beside the engine's */
|
|
30
|
+
var effects = [
|
|
31
|
+
defineEffect({
|
|
32
|
+
type: "allyWard",
|
|
33
|
+
run: (context, effect) => {
|
|
34
|
+
const { world, caster } = context;
|
|
35
|
+
if (!effect.buff || caster.buffs.some((instance) => instance.id === effect.spent)) return;
|
|
36
|
+
const radius = typeof effect.radius === "number" ? effect.radius : 8;
|
|
37
|
+
for (const ally of around(world, caster, radius)) if (ally === caster || world.areAllies(caster.owner, ally.owner)) applyBuff(world, ally, effect.buff, AURA_LINGER, caster);
|
|
38
|
+
},
|
|
39
|
+
fields: [
|
|
40
|
+
{
|
|
41
|
+
path: "buff",
|
|
42
|
+
kind: "id",
|
|
43
|
+
of: "buffs",
|
|
44
|
+
hint: "The ward kept on the allies near: a buff whose trigger spends it (wardSpent)"
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
path: "spent",
|
|
48
|
+
kind: "id",
|
|
49
|
+
of: "buffs",
|
|
50
|
+
hint: "While the carrier carries this buff, no ward is given"
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
path: "radius",
|
|
54
|
+
kind: "number",
|
|
55
|
+
min: 0,
|
|
56
|
+
hint: "How near the allies are: 8 when left out"
|
|
57
|
+
}
|
|
58
|
+
]
|
|
59
|
+
}),
|
|
60
|
+
defineEffect({
|
|
61
|
+
type: "wardSpent",
|
|
62
|
+
run: (context, effect) => {
|
|
63
|
+
const { world, caster } = context;
|
|
64
|
+
const ward = caster.buffs.find((instance) => instance.id === effect.buff);
|
|
65
|
+
const giver = ward && world.get(ward.source);
|
|
66
|
+
if (!giver) return;
|
|
67
|
+
const seconds = typeof effect.duration === "number" ? effect.duration : void 0;
|
|
68
|
+
applyBuff(world, giver, effect.spent, seconds, giver);
|
|
69
|
+
for (const other of world.spatial.query(giver.pos.x, giver.pos.z, 40)) if (other.buffs.some((instance) => instance.id === effect.buff && instance.source === giver.id)) removeBuff(world, other, effect.buff, giver);
|
|
70
|
+
},
|
|
71
|
+
fields: [
|
|
72
|
+
{
|
|
73
|
+
path: "buff",
|
|
74
|
+
kind: "id",
|
|
75
|
+
of: "buffs",
|
|
76
|
+
hint: "The ward that was spent"
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
path: "spent",
|
|
80
|
+
kind: "id",
|
|
81
|
+
of: "buffs",
|
|
82
|
+
hint: "Put on whoever gave the ward: no ward while it lasts"
|
|
83
|
+
},
|
|
84
|
+
"duration"
|
|
85
|
+
]
|
|
86
|
+
}),
|
|
87
|
+
defineEffect({
|
|
88
|
+
type: "refreshAbilities",
|
|
89
|
+
run: ({ world, caster }, effect) => {
|
|
90
|
+
const learned = learnsOf(caster);
|
|
91
|
+
for (const state of caster.abilities) {
|
|
92
|
+
if (!learned.includes(state.id) || !world.registry.abilities.has(state.id)) continue;
|
|
93
|
+
if (!effect.ultimate && world.registry.ability(state.id).ultimate) continue;
|
|
94
|
+
state.cooldown = 0;
|
|
95
|
+
}
|
|
96
|
+
},
|
|
97
|
+
fields: [{
|
|
98
|
+
path: "ultimate",
|
|
99
|
+
kind: "boolean",
|
|
100
|
+
hint: "The ultimate too"
|
|
101
|
+
}]
|
|
102
|
+
}),
|
|
103
|
+
defineEffect({
|
|
104
|
+
type: "quicken",
|
|
105
|
+
run: ({ caster, interval = 0 }, effect) => {
|
|
106
|
+
const state = caster.abilities.find((each) => each.id === effect.spell);
|
|
107
|
+
if (state && state.cooldown > 0) state.cooldown = Math.max(state.cooldown - interval * effect.part, 0);
|
|
108
|
+
},
|
|
109
|
+
fields: [{
|
|
110
|
+
path: "spell",
|
|
111
|
+
kind: "text",
|
|
112
|
+
hint: "The ability, by id, that cools down faster (a hero spell: reap)"
|
|
113
|
+
}, {
|
|
114
|
+
path: "part",
|
|
115
|
+
kind: "number",
|
|
116
|
+
min: 0,
|
|
117
|
+
hint: "How much faster: 0.5, half again"
|
|
118
|
+
}]
|
|
119
|
+
}),
|
|
120
|
+
defineEffect({
|
|
121
|
+
type: "outOfFights",
|
|
122
|
+
run: ({ world, caster }, effect) => {
|
|
123
|
+
const combat = caster.get(fighting);
|
|
124
|
+
const now = world.time;
|
|
125
|
+
if (combat && (combat.swing > 0 || combat.cooldown > 0)) caster.set(foughtAt, now);
|
|
126
|
+
if (now - Math.max(caster.hurtAt, caster.get(foughtAt) ?? -Infinity) >= (effect.after ?? 5)) applyBuff(world, caster, effect.buff, AURA_LINGER, caster);
|
|
127
|
+
else if (caster.buffs.some((instance) => instance.id === effect.buff)) removeBuff(world, caster, effect.buff);
|
|
128
|
+
},
|
|
129
|
+
fields: [{
|
|
130
|
+
path: "buff",
|
|
131
|
+
kind: "id",
|
|
132
|
+
of: "buffs",
|
|
133
|
+
hint: "Kept on the carrier while it is out of fights"
|
|
134
|
+
}, {
|
|
135
|
+
path: "after",
|
|
136
|
+
kind: "number",
|
|
137
|
+
min: 0,
|
|
138
|
+
hint: "Seconds without being hurt or attacking: 5 when left out"
|
|
139
|
+
}]
|
|
140
|
+
}),
|
|
141
|
+
defineEffect({
|
|
142
|
+
type: "reward",
|
|
143
|
+
run: ({ world, caster }, effect) => {
|
|
144
|
+
const currency = world.registry.currency;
|
|
145
|
+
const amount = typeof effect.amount === "number" ? effect.amount : 0;
|
|
146
|
+
if (currency && amount > 0) earn(world.player(caster.owner).resources, currency, amount);
|
|
147
|
+
},
|
|
148
|
+
fields: ["amount"]
|
|
149
|
+
}),
|
|
150
|
+
defineEffect({
|
|
151
|
+
type: "nightCompanion",
|
|
152
|
+
run: (context, effect) => {
|
|
153
|
+
const { world, caster } = context;
|
|
154
|
+
const mine = summonsOf(world, caster).filter((each) => each.def.id === effect.unit);
|
|
155
|
+
if (world.night && caster.alive && !mine.length && world.registry.units.has(effect.unit)) world.spawn(effect.unit, caster.owner, {
|
|
156
|
+
x: caster.pos.x + 1,
|
|
157
|
+
z: caster.pos.z
|
|
158
|
+
}, { facing: caster.facing }).set(summoned, {
|
|
159
|
+
by: caster.id,
|
|
160
|
+
follow: true,
|
|
161
|
+
aggro: "mastersAttacker",
|
|
162
|
+
diesWithMaster: true,
|
|
163
|
+
at: world.time
|
|
164
|
+
});
|
|
165
|
+
else if (!world.night) for (const wolf of mine) world.kill(wolf);
|
|
166
|
+
},
|
|
167
|
+
fields: [{
|
|
168
|
+
path: "unit",
|
|
169
|
+
kind: "id",
|
|
170
|
+
of: "units",
|
|
171
|
+
hint: "The unit type at its side at night"
|
|
172
|
+
}]
|
|
173
|
+
})
|
|
174
|
+
];
|
|
175
|
+
/**
|
|
176
|
+
* The pack of the default items' effects (`allyWard`, `wardSpent`, `refreshAbilities`, `quicken`, `outOfFights`,
|
|
177
|
+
* `reward`, `nightCompanion`): what the default set brings to a game that takes it (`defaultItemSet`), and what a game
|
|
178
|
+
* whose own items use them turns on
|
|
179
|
+
*
|
|
180
|
+
* @beta
|
|
181
|
+
*/
|
|
182
|
+
function defaultItemsPack() {
|
|
183
|
+
return {
|
|
184
|
+
id: DEFAULT_ITEMS,
|
|
185
|
+
effects: [...effects],
|
|
186
|
+
components: [foughtAt]
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* The engine's default items as a default set (`useDefaults`): its items, with the abilities, buffs, unit types and tags
|
|
191
|
+
* they use, the pack of their effects (`defaultItemsPack`) and the hero arena stats (`mobaStatsPack`) where the game
|
|
192
|
+
* has neither. `useDefaults(rules, [defaultItemSet], { items: { except: ['sightWard'] } })`; in a `data.json`,
|
|
193
|
+
* `"defaults": { "items": "none" }`
|
|
194
|
+
*
|
|
195
|
+
* @beta
|
|
196
|
+
*/
|
|
197
|
+
var defaultItemSet = {
|
|
198
|
+
id: "items",
|
|
199
|
+
name: "Items",
|
|
200
|
+
description: "The engine’s item tree: consumables, starters, basic and intermediate items, boots, twelve legendaries and three relics",
|
|
201
|
+
kind: "items",
|
|
202
|
+
defs: defaultItems,
|
|
203
|
+
uses: {
|
|
204
|
+
abilities: defaultItemAbilities,
|
|
205
|
+
buffs: defaultItemBuffs,
|
|
206
|
+
units: defaultItemUnits,
|
|
207
|
+
tags: defaultItemTags
|
|
208
|
+
},
|
|
209
|
+
packs: () => [mobaStatsPack(), defaultItemsPack()]
|
|
210
|
+
};
|
|
211
|
+
//#endregion
|
|
212
|
+
export { DEFAULT_ITEMS, defaultItemAbilities, defaultItemBuffs, defaultItemSet, defaultItemTags, defaultItemUnits, defaultItems, defaultItemsPack };
|
|
213
|
+
|
|
214
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../src/packs/items/index.ts"],"sourcesContent":["/**\n * The default items (items-and-spells plan, phase 5) as a set a game takes (`defaultItemSet`, with `useDefaults`), and\n * the pack of the effects their passives need beside the engine's (`defaultItemsPack`): a ward kept on allies near,\n * abilities made ready again, a hero spell that cools faster, speed out of fights, gold for a kill near, a wolf at\n * night. The set brings the pack, and the hero arena stats its items give (`mobaStatsPack`), to a game that has neither\n */\nimport { AURA_LINGER, applyBuff, removeBuff } from '#engine/abilities/buffs'\nimport { defineEffect } from '#engine/abilities/effects'\nimport { defineComponent } from '#engine/components'\nimport type { DefaultSet } from '#engine/defaultSets'\nimport type { ItemDef } from '#engine/defs'\nimport { type Entity, fighting } from '#engine/entity'\nimport type { World } from '#engine/world'\nimport { learnsOf } from '#engine/formState'\nimport type { GamePack } from '#engine/packs/pack'\nimport { earn } from '#engine/player'\nimport { summoned, summonsOf } from '#engine/summoned'\nimport { mobaStatsPack } from '../moba'\nimport { defaultItemAbilities, defaultItemBuffs, defaultItems, defaultItemTags, defaultItemUnits } from './defaults'\n\nexport { defaultItemAbilities, defaultItemBuffs, defaultItems, defaultItemTags, defaultItemUnits } from './defaults'\n\n/**\n * The id of the pack of the default items' effects (`defaultItemsPack`), as `GamePack.id` has it\n *\n * @beta\n */\nexport const DEFAULT_ITEMS = 'core.defaultItems'\n\n/** When a unit was last in a fight, in seconds of the game: hurt, or swinging at something (`outOfFights`) */\nconst foughtAt = defineComponent<number>({ id: 'core.defaultItems.foughtAt' })\n\n/** Every living unit within `radius` of `of`, itself too */\nfunction around(world: World, of: Entity, radius: number): Entity[] {\n\treturn world.spatial.query(of.pos.x, of.pos.z, radius).filter((other) => other.alive && !other.hidden && other.isUnit)\n}\n\n/** The effects of the default items' passives, beside the engine's */\nconst effects = [\n\tdefineEffect({\n\t\ttype: 'allyWard',\n\t\trun: (context, effect) => {\n\t\t\tconst { world, caster } = context\n\t\t\tif (!effect.buff || caster.buffs.some((instance) => instance.id === effect.spent)) return\n\t\t\tconst radius = typeof effect.radius === 'number' ? effect.radius : 8\n\t\t\tfor (const ally of around(world, caster, radius)) {\n\t\t\t\tif (ally === caster || world.areAllies(caster.owner, ally.owner)) applyBuff(world, ally, effect.buff, AURA_LINGER, caster)\n\t\t\t}\n\t\t},\n\t\tfields: [\n\t\t\t{ path: 'buff', kind: 'id', of: 'buffs', hint: 'The ward kept on the allies near: a buff whose trigger spends it (wardSpent)' },\n\t\t\t{ path: 'spent', kind: 'id', of: 'buffs', hint: 'While the carrier carries this buff, no ward is given' },\n\t\t\t{ path: 'radius', kind: 'number', min: 0, hint: 'How near the allies are: 8 when left out' }\n\t\t]\n\t}),\n\tdefineEffect({\n\t\ttype: 'wardSpent',\n\t\trun: (context, effect) => {\n\t\t\tconst { world, caster } = context\n\t\t\tconst ward = caster.buffs.find((instance) => instance.id === effect.buff)\n\t\t\tconst giver = ward && world.get(ward.source)\n\t\t\tif (!giver) return\n\t\t\tconst seconds = typeof effect.duration === 'number' ? effect.duration : undefined\n\t\t\tapplyBuff(world, giver, effect.spent, seconds, giver)\n\t\t\t// one save for all: the ward comes off everyone it was given to\n\t\t\tfor (const other of world.spatial.query(giver.pos.x, giver.pos.z, 40))\n\t\t\t\tif (other.buffs.some((instance) => instance.id === effect.buff && instance.source === giver.id)) removeBuff(world, other, effect.buff, giver)\n\t\t},\n\t\tfields: [\n\t\t\t{ path: 'buff', kind: 'id', of: 'buffs', hint: 'The ward that was spent' },\n\t\t\t{ path: 'spent', kind: 'id', of: 'buffs', hint: 'Put on whoever gave the ward: no ward while it lasts' },\n\t\t\t'duration'\n\t\t]\n\t}),\n\tdefineEffect({\n\t\ttype: 'refreshAbilities',\n\t\trun: ({ world, caster }, effect) => {\n\t\t\tconst learned = learnsOf(caster)\n\t\t\tfor (const state of caster.abilities) {\n\t\t\t\tif (!learned.includes(state.id) || !world.registry.abilities.has(state.id)) continue\n\t\t\t\tif (!effect.ultimate && world.registry.ability(state.id).ultimate) continue\n\t\t\t\tstate.cooldown = 0\n\t\t\t}\n\t\t},\n\t\tfields: [{ path: 'ultimate', kind: 'boolean', hint: 'The ultimate too' }]\n\t}),\n\tdefineEffect({\n\t\ttype: 'quicken',\n\t\trun: ({ caster, interval = 0 }, effect) => {\n\t\t\tconst state = caster.abilities.find((each) => each.id === effect.spell)\n\t\t\tif (state && state.cooldown > 0) state.cooldown = Math.max(state.cooldown - interval * effect.part, 0)\n\t\t},\n\t\tfields: [\n\t\t\t{ path: 'spell', kind: 'text', hint: 'The ability, by id, that cools down faster (a hero spell: reap)' },\n\t\t\t{ path: 'part', kind: 'number', min: 0, hint: 'How much faster: 0.5, half again' }\n\t\t]\n\t}),\n\tdefineEffect({\n\t\ttype: 'outOfFights',\n\t\trun: ({ world, caster }, effect) => {\n\t\t\tconst combat = caster.get(fighting)\n\t\t\tconst now = world.time\n\t\t\tif (combat && (combat.swing > 0 || combat.cooldown > 0)) caster.set(foughtAt, now)\n\t\t\tconst last = Math.max(caster.hurtAt, caster.get(foughtAt) ?? -Infinity)\n\t\t\tif (now - last >= (effect.after ?? 5)) applyBuff(world, caster, effect.buff, AURA_LINGER, caster)\n\t\t\telse if (caster.buffs.some((instance) => instance.id === effect.buff)) removeBuff(world, caster, effect.buff)\n\t\t},\n\t\tfields: [\n\t\t\t{ path: 'buff', kind: 'id', of: 'buffs', hint: 'Kept on the carrier while it is out of fights' },\n\t\t\t{ path: 'after', kind: 'number', min: 0, hint: 'Seconds without being hurt or attacking: 5 when left out' }\n\t\t]\n\t}),\n\tdefineEffect({\n\t\ttype: 'reward',\n\t\trun: ({ world, caster }, effect) => {\n\t\t\tconst currency = world.registry.currency\n\t\t\tconst amount = typeof effect.amount === 'number' ? effect.amount : 0\n\t\t\tif (currency && amount > 0) earn(world.player(caster.owner).resources, currency, amount)\n\t\t},\n\t\tfields: ['amount']\n\t}),\n\tdefineEffect({\n\t\ttype: 'nightCompanion',\n\t\trun: (context, effect) => {\n\t\t\tconst { world, caster } = context\n\t\t\tconst mine = summonsOf(world, caster).filter((each) => each.def.id === effect.unit)\n\t\t\tif (world.night && caster.alive && !mine.length && world.registry.units.has(effect.unit)) {\n\t\t\t\tconst wolf = world.spawn(effect.unit, caster.owner, { x: caster.pos.x + 1, z: caster.pos.z }, { facing: caster.facing })\n\t\t\t\twolf.set(summoned, { by: caster.id, follow: true, aggro: 'mastersAttacker', diesWithMaster: true, at: world.time })\n\t\t\t} else if (!world.night) for (const wolf of mine) world.kill(wolf)\n\t\t},\n\t\tfields: [{ path: 'unit', kind: 'id', of: 'units', hint: 'The unit type at its side at night' }]\n\t})\n]\n\n/**\n * The pack of the default items' effects (`allyWard`, `wardSpent`, `refreshAbilities`, `quicken`, `outOfFights`,\n * `reward`, `nightCompanion`): what the default set brings to a game that takes it (`defaultItemSet`), and what a game\n * whose own items use them turns on\n *\n * @beta\n */\nexport function defaultItemsPack(): GamePack {\n\treturn { id: DEFAULT_ITEMS, effects: [...effects], components: [foughtAt] }\n}\n\n/**\n * The engine's default items as a default set (`useDefaults`): its items, with the abilities, buffs, unit types and tags\n * they use, the pack of their effects (`defaultItemsPack`) and the hero arena stats (`mobaStatsPack`) where the game\n * has neither. `useDefaults(rules, [defaultItemSet], { items: { except: ['sightWard'] } })`; in a `data.json`,\n * `\"defaults\": { \"items\": \"none\" }`\n *\n * @beta\n */\nexport const defaultItemSet: DefaultSet<ItemDef> = {\n\tid: 'items',\n\tname: 'Items',\n\tdescription: 'The engine’s item tree: consumables, starters, basic and intermediate items, boots, twelve legendaries and three relics',\n\tkind: 'items',\n\tdefs: defaultItems,\n\tuses: { abilities: defaultItemAbilities, buffs: defaultItemBuffs, units: defaultItemUnits, tags: defaultItemTags },\n\tpacks: () => [mobaStatsPack(), defaultItemsPack()]\n}\n"],"mappings":"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"}
|
|
@@ -7,7 +7,7 @@ import type { GamePack } from '#engine/packs/pack';
|
|
|
7
7
|
*/
|
|
8
8
|
export declare const MOBA_STATS = "core.mobaStats";
|
|
9
9
|
/**
|
|
10
|
-
* What the MOBA stats pack is made with (`
|
|
10
|
+
* What the MOBA stats pack is made with (`mobaStatsPack`)
|
|
11
11
|
*
|
|
12
12
|
* @beta
|
|
13
13
|
*/
|
|
@@ -19,7 +19,7 @@ export interface MobaStatsOptions {
|
|
|
19
19
|
}
|
|
20
20
|
/**
|
|
21
21
|
* What is left of damage once the target's armor or magic resist, less what the source's penetration ignores, had its
|
|
22
|
-
* say: the pack's `
|
|
22
|
+
* say: the pack's `settings.combat.mitigation`
|
|
23
23
|
*
|
|
24
24
|
* @beta
|
|
25
25
|
*/
|
|
@@ -31,4 +31,4 @@ export declare function penetratingMitigation(type: DamageType, target: Readonly
|
|
|
31
31
|
*
|
|
32
32
|
* @beta
|
|
33
33
|
*/
|
|
34
|
-
export declare function
|
|
34
|
+
export declare function mobaStatsPack(options?: MobaStatsOptions): GamePack;
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import { clamp } from "../../math.js";
|
|
2
|
+
import { resisted, statsOf } from "../../stats.js";
|
|
3
|
+
import { isCrowdControl } from "../../abilities/buffs.js";
|
|
4
|
+
import { defineHook } from "../../hooks.js";
|
|
5
|
+
import { defaultSettings } from "../../rules.js";
|
|
6
|
+
//#region src/packs/moba/index.ts
|
|
7
|
+
/**
|
|
8
|
+
* The stats of a MOBA (`mobaStatsPack`): ability power, critical strikes, armor and magic penetration, life steal and
|
|
9
|
+
* omnivamp, tenacity, slow resistance, heal and shield power, ability haste. The hero arena games' vocabulary and their
|
|
10
|
+
* formulas, a pack a game opts into: one without it has none of these stats, and the engine's rules are the plainer
|
|
11
|
+
* ones (no crits, mitigation by armor and magic resist alone, cooldowns as they are)
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* The MOBA stats pack's id
|
|
15
|
+
*
|
|
16
|
+
* @beta
|
|
17
|
+
*/
|
|
18
|
+
var MOBA_STATS = "core.mobaStats";
|
|
19
|
+
/** The stats the pack brings, in the order a stat sheet shows them; `critDamage`'s default is the pack's option */
|
|
20
|
+
var mobaStatDefs = (critDamage) => [
|
|
21
|
+
{
|
|
22
|
+
id: "abilityPower",
|
|
23
|
+
name: "Ability power",
|
|
24
|
+
description: "Makes abilities stronger, as far as they scale with it"
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
id: "critChance",
|
|
28
|
+
name: "Critical chance",
|
|
29
|
+
description: "Chance of a basic attack to strike critically, 0..1",
|
|
30
|
+
format: "percent"
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
id: "critDamage",
|
|
34
|
+
name: "Critical damage",
|
|
35
|
+
description: "What a critical strike multiplies the damage with",
|
|
36
|
+
default: critDamage,
|
|
37
|
+
format: "percent"
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
id: "armorPenetration",
|
|
41
|
+
name: "Armor penetration",
|
|
42
|
+
description: "Part of the target's armor that is ignored, 0..1",
|
|
43
|
+
format: "percent"
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
id: "lethality",
|
|
47
|
+
name: "Lethality",
|
|
48
|
+
description: "Armor of the target that is ignored, taken off after the part above"
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
id: "magicPenetrationPercent",
|
|
52
|
+
name: "Magic penetration %",
|
|
53
|
+
description: "Part of the target's magic resist that is ignored, 0..1",
|
|
54
|
+
format: "percent"
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
id: "magicPenetration",
|
|
58
|
+
name: "Magic penetration",
|
|
59
|
+
description: "Magic resist of the target that is ignored, taken off after the part above"
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
id: "lifeSteal",
|
|
63
|
+
name: "Life steal",
|
|
64
|
+
description: "Part of the damage of basic attacks that comes back as health",
|
|
65
|
+
format: "percent"
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
id: "omnivamp",
|
|
69
|
+
name: "Omnivamp",
|
|
70
|
+
description: "Part of all damage dealt that comes back as health",
|
|
71
|
+
format: "percent"
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
id: "tenacity",
|
|
75
|
+
name: "Tenacity",
|
|
76
|
+
description: "Part by which stuns, slows and the like are cut short, 0..1",
|
|
77
|
+
format: "percent"
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
id: "slowResist",
|
|
81
|
+
name: "Slow resist",
|
|
82
|
+
description: "Part by which slows are weakened, 0..1",
|
|
83
|
+
format: "percent"
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
id: "healShieldPower",
|
|
87
|
+
name: "Heal and shield power",
|
|
88
|
+
description: "Part by which the heals and shields this unit gives are stronger",
|
|
89
|
+
format: "percent"
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
id: "abilityHaste",
|
|
93
|
+
name: "Ability haste",
|
|
94
|
+
description: "Shortens cooldowns: 100 of it halve them"
|
|
95
|
+
}
|
|
96
|
+
];
|
|
97
|
+
/**
|
|
98
|
+
* What is left of damage once the target's armor or magic resist, less what the source's penetration ignores, had its
|
|
99
|
+
* say: the pack's `settings.combat.mitigation`
|
|
100
|
+
*
|
|
101
|
+
* @beta
|
|
102
|
+
*/
|
|
103
|
+
function penetratingMitigation(type, target, source) {
|
|
104
|
+
if (type === "true") return 1;
|
|
105
|
+
let resist = type === "physical" ? target.armor : target.magicResist;
|
|
106
|
+
if (source && resist > 0) {
|
|
107
|
+
const part = type === "physical" ? source.armorPenetration : source.magicPenetrationPercent;
|
|
108
|
+
const flat = type === "physical" ? source.lethality : source.magicPenetration;
|
|
109
|
+
resist = Math.max(resist * (1 - part) - flat, 0);
|
|
110
|
+
}
|
|
111
|
+
return resisted(resist);
|
|
112
|
+
}
|
|
113
|
+
/** Health back for damage dealt: omnivamp of everything, life steal of basic attacks. Before the engine's own handlers */
|
|
114
|
+
var lifeSteal = defineHook({
|
|
115
|
+
hook: "afterDamage",
|
|
116
|
+
id: "mobaStats.lifeSteal",
|
|
117
|
+
priority: -1,
|
|
118
|
+
run(world, { target, source, taken, attack }) {
|
|
119
|
+
if (!source?.alive || taken <= 0 || source === target) return;
|
|
120
|
+
const stats = statsOf(world, source);
|
|
121
|
+
const back = taken * (stats.omnivamp + (attack ? stats.lifeSteal : 0));
|
|
122
|
+
if (back > 0) world.heal(source, back);
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
/** Stuns, slows and the like cut short by the target's tenacity: before what the game decides of a buff */
|
|
126
|
+
var tenacity = defineHook({
|
|
127
|
+
hook: "beforeBuff",
|
|
128
|
+
id: "mobaStats.tenacity",
|
|
129
|
+
priority: -1,
|
|
130
|
+
run(world, event) {
|
|
131
|
+
if (event.duration !== Infinity && isCrowdControl(event.buff)) event.duration *= 1 - statsOf(world, event.target).tenacity;
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
/**
|
|
135
|
+
* The stats of a MOBA, for a game that has them: ability power (what `scaling: { abilityPower }` reads), critical
|
|
136
|
+
* strikes, armor and magic penetration, life steal and omnivamp, tenacity, slow resistance, heal and shield power,
|
|
137
|
+
* ability haste, with the hero arena games' formulas for each. A game without it has none of these stats
|
|
138
|
+
*
|
|
139
|
+
* @beta
|
|
140
|
+
*/
|
|
141
|
+
function mobaStatsPack(options = {}) {
|
|
142
|
+
const { critDamage = 1.75, maxTenacity = .9 } = options;
|
|
143
|
+
return {
|
|
144
|
+
id: MOBA_STATS,
|
|
145
|
+
options,
|
|
146
|
+
stats: mobaStatDefs(critDamage),
|
|
147
|
+
hooks: [lifeSteal, tenacity],
|
|
148
|
+
settings: (settings) => {
|
|
149
|
+
const { combat } = settings;
|
|
150
|
+
const engine = defaultSettings.combat;
|
|
151
|
+
const own = (key, pack) => combat[key] === engine[key] ? pack : combat[key];
|
|
152
|
+
const keep = combat.clampStats;
|
|
153
|
+
return { combat: {
|
|
154
|
+
critical: own("critical", (world, _attacker, stats) => stats.critChance > 0 && world.rng.next() < stats.critChance ? stats.critDamage : void 0),
|
|
155
|
+
mitigation: own("mitigation", penetratingMitigation),
|
|
156
|
+
clampStats(stats, all) {
|
|
157
|
+
stats.critChance = clamp(stats.critChance, 0, 1);
|
|
158
|
+
stats.tenacity = clamp(stats.tenacity, 0, maxTenacity);
|
|
159
|
+
stats.slowResist = clamp(stats.slowResist, 0, 1);
|
|
160
|
+
stats.armorPenetration = clamp(stats.armorPenetration, 0, 1);
|
|
161
|
+
stats.magicPenetrationPercent = clamp(stats.magicPenetrationPercent, 0, 1);
|
|
162
|
+
keep(stats, all);
|
|
163
|
+
},
|
|
164
|
+
cooldown: own("cooldown", (seconds, stats) => stats.abilityHaste > 0 ? seconds * 100 / (100 + stats.abilityHaste) : seconds),
|
|
165
|
+
slowTaken: own("slowTaken", (stats, slow) => slow * (1 - stats.slowResist)),
|
|
166
|
+
healPower: own("healPower", (world, source) => 1 + statsOf(world, source).healShieldPower)
|
|
167
|
+
} };
|
|
168
|
+
}
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
//#endregion
|
|
172
|
+
export { MOBA_STATS, mobaStatsPack, penetratingMitigation };
|
|
173
|
+
|
|
174
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../src/packs/moba/index.ts"],"sourcesContent":["/**\n * The stats of a MOBA (`mobaStatsPack`): ability power, critical strikes, armor and magic penetration, life steal and\n * omnivamp, tenacity, slow resistance, heal and shield power, ability haste. The hero arena games' vocabulary and their\n * formulas, a pack a game opts into: one without it has none of these stats, and the engine's rules are the plainer\n * ones (no crits, mitigation by armor and magic resist alone, cooldowns as they are)\n */\nimport { isCrowdControl } from '#engine/abilities/buffs'\nimport type { DamageType, StatDef, Stats } from '#engine/defs'\nimport { clamp } from '#engine/math'\nimport { defineHook } from '#engine/hooks'\nimport type { GamePack } from '#engine/packs/pack'\nimport { type CombatSettings, defaultSettings, type RuleSettings } from '#engine/rules'\nimport { resisted, statsOf } from '#engine/stats'\n\n/**\n * The MOBA stats pack's id\n *\n * @beta\n */\nexport const MOBA_STATS = 'core.mobaStats'\n\n/**\n * What the MOBA stats pack is made with (`mobaStatsPack`)\n *\n * @beta\n */\nexport interface MobaStatsOptions {\n\t/** What a critical strike multiplies the damage by, for units that do not say: 1.75 when left out */\n\tcritDamage?: number\n\t/** Tenacity no unit goes past: what is left of a stun or a slow at the very least. 0.9 when left out */\n\tmaxTenacity?: number\n}\n\n/** The stats the pack brings, in the order a stat sheet shows them; `critDamage`'s default is the pack's option */\nconst mobaStatDefs = (critDamage: number): StatDef[] => [\n\t{ id: 'abilityPower', name: 'Ability power', description: 'Makes abilities stronger, as far as they scale with it' },\n\t{ id: 'critChance', name: 'Critical chance', description: 'Chance of a basic attack to strike critically, 0..1', format: 'percent' },\n\t{\n\t\tid: 'critDamage',\n\t\tname: 'Critical damage',\n\t\tdescription: 'What a critical strike multiplies the damage with',\n\t\tdefault: critDamage,\n\t\tformat: 'percent'\n\t},\n\t{ id: 'armorPenetration', name: 'Armor penetration', description: \"Part of the target's armor that is ignored, 0..1\", format: 'percent' },\n\t{ id: 'lethality', name: 'Lethality', description: 'Armor of the target that is ignored, taken off after the part above' },\n\t{\n\t\tid: 'magicPenetrationPercent',\n\t\tname: 'Magic penetration %',\n\t\tdescription: \"Part of the target's magic resist that is ignored, 0..1\",\n\t\tformat: 'percent'\n\t},\n\t{ id: 'magicPenetration', name: 'Magic penetration', description: 'Magic resist of the target that is ignored, taken off after the part above' },\n\t{ id: 'lifeSteal', name: 'Life steal', description: 'Part of the damage of basic attacks that comes back as health', format: 'percent' },\n\t{ id: 'omnivamp', name: 'Omnivamp', description: 'Part of all damage dealt that comes back as health', format: 'percent' },\n\t{ id: 'tenacity', name: 'Tenacity', description: 'Part by which stuns, slows and the like are cut short, 0..1', format: 'percent' },\n\t{ id: 'slowResist', name: 'Slow resist', description: 'Part by which slows are weakened, 0..1', format: 'percent' },\n\t{\n\t\tid: 'healShieldPower',\n\t\tname: 'Heal and shield power',\n\t\tdescription: 'Part by which the heals and shields this unit gives are stronger',\n\t\tformat: 'percent'\n\t},\n\t{ id: 'abilityHaste', name: 'Ability haste', description: 'Shortens cooldowns: 100 of it halve them' }\n]\n\n/**\n * What is left of damage once the target's armor or magic resist, less what the source's penetration ignores, had its\n * say: the pack's `settings.combat.mitigation`\n *\n * @beta\n */\nexport function penetratingMitigation(type: DamageType, target: Readonly<Stats>, source?: Readonly<Stats>): number {\n\tif (type === 'true') return 1\n\tlet resist = type === 'physical' ? target.armor : target.magicResist\n\tif (source && resist > 0) {\n\t\tconst part = type === 'physical' ? source.armorPenetration : source.magicPenetrationPercent\n\t\tconst flat = type === 'physical' ? source.lethality : source.magicPenetration\n\t\t// what is ignored can take the resistance away, not turn it into a weakness\n\t\tresist = Math.max(resist * (1 - part) - flat, 0)\n\t}\n\treturn resisted(resist)\n}\n\n/** Health back for damage dealt: omnivamp of everything, life steal of basic attacks. Before the engine's own handlers */\nconst lifeSteal = defineHook({\n\thook: 'afterDamage',\n\tid: 'mobaStats.lifeSteal',\n\tpriority: -1,\n\trun(world, { target, source, taken, attack }) {\n\t\tif (!source?.alive || taken <= 0 || source === target) return\n\t\tconst stats = statsOf(world, source)\n\t\t// omnivamp works on everything, life steal on basic attacks only\n\t\tconst back = taken * (stats.omnivamp + (attack ? stats.lifeSteal : 0))\n\t\tif (back > 0) world.heal(source, back)\n\t}\n})\n\n/** Stuns, slows and the like cut short by the target's tenacity: before what the game decides of a buff */\nconst tenacity = defineHook({\n\thook: 'beforeBuff',\n\tid: 'mobaStats.tenacity',\n\tpriority: -1,\n\trun(world, event) {\n\t\tif (event.duration !== Infinity && isCrowdControl(event.buff)) event.duration *= 1 - statsOf(world, event.target).tenacity\n\t}\n})\n\n/**\n * The stats of a MOBA, for a game that has them: ability power (what `scaling: { abilityPower }` reads), critical\n * strikes, armor and magic penetration, life steal and omnivamp, tenacity, slow resistance, heal and shield power,\n * ability haste, with the hero arena games' formulas for each. A game without it has none of these stats\n *\n * @beta\n */\nexport function mobaStatsPack(options: MobaStatsOptions = {}): GamePack {\n\tconst { critDamage = 1.75, maxTenacity = 0.9 } = options\n\treturn {\n\t\tid: MOBA_STATS,\n\t\toptions,\n\t\tstats: mobaStatDefs(critDamage),\n\t\thooks: [lifeSteal, tenacity],\n\t\t// what the game says of its own wins: the pack's formulas go where the engine's would be\n\t\tsettings: (settings: Readonly<RuleSettings>) => {\n\t\t\tconst { combat } = settings\n\t\t\tconst engine = defaultSettings.combat\n\t\t\tconst own = <K extends keyof CombatSettings>(key: K, pack: CombatSettings[K]): CombatSettings[K] => (combat[key] === engine[key] ? pack : combat[key])\n\t\t\tconst keep = combat.clampStats\n\t\t\treturn {\n\t\t\t\tcombat: {\n\t\t\t\t\t// the dice are only rolled for those who have a chance\n\t\t\t\t\tcritical: own('critical', (world, _attacker, stats) =>\n\t\t\t\t\t\tstats.critChance > 0 && world.rng.next() < stats.critChance ? stats.critDamage : undefined\n\t\t\t\t\t),\n\t\t\t\t\tmitigation: own('mitigation', penetratingMitigation),\n\t\t\t\t\t// the game's own limits kept, the pack's put on them\n\t\t\t\t\tclampStats(stats, all) {\n\t\t\t\t\t\tstats.critChance = clamp(stats.critChance, 0, 1)\n\t\t\t\t\t\tstats.tenacity = clamp(stats.tenacity, 0, maxTenacity)\n\t\t\t\t\t\tstats.slowResist = clamp(stats.slowResist, 0, 1)\n\t\t\t\t\t\tstats.armorPenetration = clamp(stats.armorPenetration, 0, 1)\n\t\t\t\t\t\tstats.magicPenetrationPercent = clamp(stats.magicPenetrationPercent, 0, 1)\n\t\t\t\t\t\tkeep(stats, all)\n\t\t\t\t\t},\n\t\t\t\t\tcooldown: own('cooldown', (seconds, stats) => (stats.abilityHaste > 0 ? (seconds * 100) / (100 + stats.abilityHaste) : seconds)),\n\t\t\t\t\tslowTaken: own('slowTaken', (stats, slow) => slow * (1 - stats.slowResist)),\n\t\t\t\t\thealPower: own('healPower', (world, source) => 1 + statsOf(world, source).healShieldPower)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n"],"mappings":"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"}
|