@v12-engine/engine 0.1.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/abilities/amounts.d.ts +28 -0
- package/dist/abilities/amounts.js +74 -0
- package/dist/abilities/amounts.js.map +1 -0
- package/dist/abilities/buffs.d.ts +106 -6
- package/dist/abilities/buffs.js +443 -0
- package/dist/abilities/buffs.js.map +1 -0
- package/dist/abilities/castTold.d.ts +2 -0
- package/dist/abilities/castTold.js +66 -0
- package/dist/abilities/castTold.js.map +1 -0
- package/dist/abilities/chance.d.ts +38 -0
- package/dist/abilities/chance.js +77 -0
- package/dist/abilities/chance.js.map +1 -0
- package/dist/abilities/charges.d.ts +18 -0
- package/dist/abilities/charges.js +101 -0
- package/dist/abilities/charges.js.map +1 -0
- package/dist/abilities/control.d.ts +28 -0
- package/dist/abilities/control.js +113 -0
- package/dist/abilities/control.js.map +1 -0
- package/dist/abilities/dispel.js +51 -0
- package/dist/abilities/dispel.js.map +1 -0
- package/dist/abilities/effectFields.d.ts +1 -1
- package/dist/abilities/effectFields.js +676 -0
- package/dist/abilities/effectFields.js.map +1 -0
- package/dist/abilities/effectIndex.d.ts +27 -0
- package/dist/abilities/effectIndex.js +64 -0
- package/dist/abilities/effectIndex.js.map +1 -0
- package/dist/abilities/effects/buff.d.ts +9 -3
- package/dist/abilities/effects/buff.js +84 -0
- package/dist/abilities/effects/buff.js.map +1 -0
- package/dist/abilities/effects/conditions.d.ts +2 -0
- package/dist/abilities/effects/conditions.js +41 -0
- package/dist/abilities/effects/conditions.js.map +1 -0
- package/dist/abilities/effects/core.js +54 -0
- package/dist/abilities/effects/core.js.map +1 -0
- package/dist/abilities/effects/damage.d.ts +1 -1
- package/dist/abilities/effects/damage.js +43 -0
- package/dist/abilities/effects/damage.js.map +1 -0
- package/dist/abilities/effects/heal.d.ts +2 -2
- package/dist/abilities/effects/heal.js +51 -0
- package/dist/abilities/effects/heal.js.map +1 -0
- package/dist/abilities/effects/missile.d.ts +13 -1
- package/dist/abilities/effects/missile.js +104 -0
- package/dist/abilities/effects/missile.js.map +1 -0
- package/dist/abilities/effects/morph.d.ts +5 -0
- package/dist/abilities/effects/morph.js +43 -0
- package/dist/abilities/effects/morph.js.map +1 -0
- package/dist/abilities/effects/moves.d.ts +16 -4
- package/dist/abilities/effects/moves.js +212 -0
- package/dist/abilities/effects/moves.js.map +1 -0
- package/dist/abilities/effects/passives.d.ts +19 -9
- package/dist/abilities/effects/passives.js +131 -0
- package/dist/abilities/effects/passives.js.map +1 -0
- package/dist/abilities/effects/proxy.d.ts +5 -0
- package/dist/abilities/effects/proxy.js +60 -0
- package/dist/abilities/effects/proxy.js.map +1 -0
- package/dist/abilities/effects/sight.d.ts +2 -2
- package/dist/abilities/effects/sight.js +39 -0
- package/dist/abilities/effects/sight.js.map +1 -0
- package/dist/abilities/effects/spawn.d.ts +5 -2
- package/dist/abilities/effects/spawn.js +40 -0
- package/dist/abilities/effects/spawn.js.map +1 -0
- package/dist/abilities/effects/timed.d.ts +2 -2
- package/dist/abilities/effects/timed.js +96 -0
- package/dist/abilities/effects/timed.js.map +1 -0
- package/dist/abilities/effects/trade.d.ts +1 -1
- package/dist/abilities/effects/trade.js +25 -0
- package/dist/abilities/effects/trade.js.map +1 -0
- package/dist/abilities/effects.d.ts +97 -23
- package/dist/abilities/effects.js +860 -0
- package/dist/abilities/effects.js.map +1 -0
- package/dist/abilities/land.d.ts +38 -4
- package/dist/abilities/land.js +189 -0
- package/dist/abilities/land.js.map +1 -0
- package/dist/abilities/recast.d.ts +45 -0
- package/dist/abilities/recast.js +118 -0
- package/dist/abilities/recast.js.map +1 -0
- package/dist/abilities/scaled.js +40 -0
- package/dist/abilities/scaled.js.map +1 -0
- package/dist/abilities/screen.d.ts +6 -0
- package/dist/abilities/screen.js +83 -0
- package/dist/abilities/screen.js.map +1 -0
- package/dist/abilities/shapes.d.ts +66 -0
- package/dist/abilities/shapes.js +122 -0
- package/dist/abilities/shapes.js.map +1 -0
- package/dist/abilities/text.d.ts +14 -2
- package/dist/abilities/text.js +204 -0
- package/dist/abilities/text.js.map +1 -0
- package/dist/abilities/triggers.d.ts +98 -0
- package/dist/abilities/triggers.js +351 -0
- package/dist/abilities/triggers.js.map +1 -0
- package/dist/abilityChanges.d.ts +131 -0
- package/dist/abilityChanges.js +345 -0
- package/dist/abilityChanges.js.map +1 -0
- package/dist/ai/area.d.ts +4 -1
- package/dist/ai/brain.d.ts +4 -1
- package/dist/ai/brain.js +844 -0
- package/dist/ai/brain.js.map +1 -0
- package/dist/ai/budget.js +74 -0
- package/dist/ai/budget.js.map +1 -0
- package/dist/ai/checks.d.ts +9 -1
- package/dist/ai/checks.js +242 -0
- package/dist/ai/checks.js.map +1 -0
- package/dist/ai/computer.d.ts +11 -4
- package/dist/ai/computer.js +251 -0
- package/dist/ai/computer.js.map +1 -0
- package/dist/ai/defence.d.ts +4 -0
- package/dist/ai/defence.js +430 -0
- package/dist/ai/defence.js.map +1 -0
- package/dist/ai/define.d.ts +3 -2
- package/dist/ai/define.js +31 -0
- package/dist/ai/define.js.map +1 -0
- package/dist/ai/economy.d.ts +10 -7
- package/dist/ai/economy.js +780 -0
- package/dist/ai/economy.js.map +1 -0
- package/dist/ai/geometry.js +38 -0
- package/dist/ai/geometry.js.map +1 -0
- package/dist/ai/goals.d.ts +1 -0
- package/dist/ai/goals.js +560 -0
- package/dist/ai/goals.js.map +1 -0
- package/dist/ai/knowledge.d.ts +72 -7
- package/dist/ai/knowledge.js +804 -0
- package/dist/ai/knowledge.js.map +1 -0
- package/dist/ai/lanes.d.ts +10 -2
- package/dist/ai/lanes.js +715 -0
- package/dist/ai/lanes.js.map +1 -0
- package/dist/ai/melee/build.js +264 -0
- package/dist/ai/melee/build.js.map +1 -0
- package/dist/ai/melee/goals.d.ts +7 -0
- package/dist/ai/melee/goals.js +720 -0
- package/dist/ai/melee/goals.js.map +1 -0
- package/dist/ai/melee/heroes.js +68 -0
- package/dist/ai/melee/heroes.js.map +1 -0
- package/dist/ai/melee/index.d.ts +1 -1
- package/dist/ai/melee/index.js +51 -0
- package/dist/ai/melee/index.js.map +1 -0
- package/dist/ai/melee/production.js +29 -0
- package/dist/ai/melee/production.js.map +1 -0
- package/dist/ai/melee/surrender.js +64 -0
- package/dist/ai/melee/surrender.js.map +1 -0
- package/dist/ai/micro.d.ts +9 -0
- package/dist/ai/micro.js +1316 -0
- package/dist/ai/micro.js.map +1 -0
- package/dist/ai/mission.d.ts +9 -2
- package/dist/ai/mission.js +538 -0
- package/dist/ai/mission.js.map +1 -0
- package/dist/ai/missionRules.d.ts +1 -1
- package/dist/ai/missionRules.js +26 -0
- package/dist/ai/missionRules.js.map +1 -0
- package/dist/ai/module.d.ts +6 -2
- package/dist/ai/module.js +37 -0
- package/dist/ai/module.js.map +1 -0
- package/dist/ai/options.d.ts +3 -3
- package/dist/ai/plans/build.d.ts +20 -1
- package/dist/ai/plans/build.js +608 -0
- package/dist/ai/plans/build.js.map +1 -0
- package/dist/ai/plans/placement.d.ts +4 -1
- package/dist/ai/plans/placement.js +295 -0
- package/dist/ai/plans/placement.js.map +1 -0
- package/dist/ai/plans/plans.d.ts +9 -0
- package/dist/ai/plans/plans.js +110 -0
- package/dist/ai/plans/plans.js.map +1 -0
- package/dist/ai/plans/production.d.ts +14 -2
- package/dist/ai/plans/production.js +434 -0
- package/dist/ai/plans/production.js.map +1 -0
- package/dist/ai/plans/purse.d.ts +6 -3
- package/dist/ai/plans/purse.js +139 -0
- package/dist/ai/plans/purse.js.map +1 -0
- package/dist/ai/plans/tech.d.ts +6 -0
- package/dist/ai/plans/tech.js +122 -0
- package/dist/ai/plans/tech.js.map +1 -0
- package/dist/ai/profiles.d.ts +4 -4
- package/dist/{profiles-B3NS9jwk.js → ai/profiles.js} +3 -98
- package/dist/ai/profiles.js.map +1 -0
- package/dist/ai/reach.js +54 -0
- package/dist/ai/reach.js.map +1 -0
- package/dist/ai/report.d.ts +8 -0
- package/dist/ai/report.js +87 -0
- package/dist/ai/report.js.map +1 -0
- package/dist/ai/roles.d.ts +4 -0
- package/dist/ai/roles.js +207 -0
- package/dist/ai/roles.js.map +1 -0
- package/dist/ai/rules.d.ts +8 -2
- package/dist/ai/rules.js +416 -0
- package/dist/ai/rules.js.map +1 -0
- package/dist/ai/scouting.d.ts +6 -0
- package/dist/ai/scouting.js +324 -0
- package/dist/ai/scouting.js.map +1 -0
- package/dist/ai/settings.js +99 -0
- package/dist/ai/settings.js.map +1 -0
- package/dist/ai/squads.d.ts +21 -2
- package/dist/ai/squads.js +916 -0
- package/dist/ai/squads.js.map +1 -0
- package/dist/ai/strength.js +320 -0
- package/dist/ai/strength.js.map +1 -0
- package/dist/ai/task.d.ts +3 -1
- package/dist/ai/task.js +17 -0
- package/dist/ai/task.js.map +1 -0
- package/dist/ai/tasks/attack.js +24 -0
- package/dist/ai/tasks/attack.js.map +1 -0
- package/dist/ai/tasks/capture.d.ts +3 -3
- package/dist/ai/tasks/capture.js +37 -0
- package/dist/ai/tasks/capture.js.map +1 -0
- package/dist/ai/tasks/creep.js +29 -0
- package/dist/ai/tasks/creep.js.map +1 -0
- package/dist/ai/tasks/defend.js +61 -0
- package/dist/ai/tasks/defend.js.map +1 -0
- package/dist/ai/tasks/drop.js +81 -0
- package/dist/ai/tasks/drop.js.map +1 -0
- package/dist/ai/tasks/escort.js +59 -0
- package/dist/ai/tasks/escort.js.map +1 -0
- package/dist/ai/tasks/gather.js +48 -0
- package/dist/ai/tasks/gather.js.map +1 -0
- package/dist/ai/tasks/harass.js +39 -0
- package/dist/ai/tasks/harass.js.map +1 -0
- package/dist/ai/tasks/hold.js +32 -0
- package/dist/ai/tasks/hold.js.map +1 -0
- package/dist/ai/tasks/index.js +34 -0
- package/dist/ai/tasks/index.js.map +1 -0
- package/dist/ai/tasks/move.js +26 -0
- package/dist/ai/tasks/move.js.map +1 -0
- package/dist/ai/tasks/patrol.js +59 -0
- package/dist/ai/tasks/patrol.js.map +1 -0
- package/dist/ai/tasks/retreat.js +28 -0
- package/dist/ai/tasks/retreat.js.map +1 -0
- package/dist/ai/tasks/scout.js +73 -0
- package/dist/ai/tasks/scout.js.map +1 -0
- package/dist/ai/tasks/shared.d.ts +1 -1
- package/dist/ai/tasks/shared.js +137 -0
- package/dist/ai/tasks/shared.js.map +1 -0
- package/dist/ai/team.d.ts +18 -1
- package/dist/ai/team.js +492 -0
- package/dist/ai/team.js.map +1 -0
- package/dist/ai/threat.d.ts +6 -0
- package/dist/ai/threat.js +206 -0
- package/dist/ai/threat.js.map +1 -0
- package/dist/ai/view.d.ts +21 -7
- package/dist/ai/view.js +677 -0
- package/dist/ai/view.js.map +1 -0
- package/dist/ai/waves.d.ts +6 -0
- package/dist/ai/waves.js +410 -0
- package/dist/ai/waves.js.map +1 -0
- package/dist/ai.js +54 -6239
- package/dist/aiTesting.d.ts +6 -3
- package/dist/aiTesting.js +229 -0
- package/dist/aiTesting.js.map +1 -0
- package/dist/areas.d.ts +4 -1
- package/dist/areas.js +295 -0
- package/dist/areas.js.map +1 -0
- package/dist/attacks.d.ts +3 -3
- package/dist/attacks.js +127 -0
- package/dist/attacks.js.map +1 -0
- package/dist/burning.d.ts +267 -0
- package/dist/burning.js +795 -0
- package/dist/burning.js.map +1 -0
- package/dist/bytes.js +21 -0
- package/dist/bytes.js.map +1 -0
- package/dist/callings.d.ts +71 -0
- package/dist/callings.js +157 -0
- package/dist/callings.js.map +1 -0
- package/dist/cameraOrders.d.ts +78 -0
- package/dist/cameraOrders.js +114 -0
- package/dist/cameraOrders.js.map +1 -0
- package/dist/camps.d.ts +70 -4
- package/dist/camps.js +501 -0
- package/dist/camps.js.map +1 -0
- package/dist/capture.d.ts +15 -3
- package/dist/capture.js +304 -0
- package/dist/capture.js.map +1 -0
- package/dist/cellLayers.d.ts +78 -13
- package/dist/cellLayers.js +275 -0
- package/dist/cellLayers.js.map +1 -0
- package/dist/cellPatches.d.ts +24 -0
- package/dist/cellPatches.js +73 -0
- package/dist/cellPatches.js.map +1 -0
- package/dist/cinematics.d.ts +10 -5
- package/dist/cinematics.js +161 -0
- package/dist/cinematics.js.map +1 -0
- package/dist/clock.d.ts +2 -2
- package/dist/clock.js +78 -0
- package/dist/clock.js.map +1 -0
- package/dist/commands.d.ts +36 -4
- package/dist/commands.js +636 -0
- package/dist/commands.js.map +1 -0
- package/dist/components.d.ts +31 -10
- package/dist/components.js +74 -0
- package/dist/components.js.map +1 -0
- package/dist/computers.d.ts +4 -4
- package/dist/computers.js +194 -0
- package/dist/computers.js.map +1 -0
- package/dist/concealment.d.ts +25 -2
- package/dist/concealment.js +409 -0
- package/dist/concealment.js.map +1 -0
- package/dist/coreComponents.js +130 -0
- package/dist/coreComponents.js.map +1 -0
- package/dist/createGame.d.ts +306 -0
- package/dist/createGame.js +405 -0
- package/dist/createGame.js.map +1 -0
- package/dist/dashing.d.ts +18 -2
- package/dist/dashing.js +41 -0
- package/dist/dashing.js.map +1 -0
- package/dist/debug.d.ts +8 -0
- package/dist/debug.js +5 -3
- package/dist/debug2.js +76 -0
- package/dist/debug2.js.map +1 -0
- package/dist/debugCommands.d.ts +6 -6
- package/dist/debugCommands.js +537 -0
- package/dist/debugCommands.js.map +1 -0
- package/dist/debugging.d.ts +1 -0
- package/dist/defaultSets.d.ts +183 -0
- package/dist/defaultSets.js +216 -0
- package/dist/defaultSets.js.map +1 -0
- package/dist/definitions.d.ts +6 -0
- package/dist/definitions.js +78 -0
- package/dist/definitions.js.map +1 -0
- package/dist/defs.d.ts +1895 -165
- package/dist/defs.js +380 -0
- package/dist/defs.js.map +1 -0
- package/dist/denying.d.ts +4 -4
- package/dist/denying.js +106 -0
- package/dist/denying.js.map +1 -0
- package/dist/destructibles.d.ts +2 -2
- package/dist/destructibles.js +36 -0
- package/dist/destructibles.js.map +1 -0
- package/dist/determinism.d.ts +4 -4
- package/dist/determinism.js +247 -0
- package/dist/determinism.js.map +1 -0
- package/dist/dialog.d.ts +17 -2
- package/dist/dialog.js +108 -0
- package/dist/dialog.js.map +1 -0
- package/dist/effectRefs.js +28 -0
- package/dist/effectRefs.js.map +1 -0
- package/dist/effects.d.ts +27 -11
- package/dist/effects.js +110 -0
- package/dist/effects.js.map +1 -0
- package/dist/endings.d.ts +1 -1
- package/dist/endings.js +78 -0
- package/dist/endings.js.map +1 -0
- package/dist/engagement.d.ts +40 -6
- package/dist/engagement.js +530 -0
- package/dist/engagement.js.map +1 -0
- package/dist/engineEvents.d.ts +72 -9
- package/dist/engineEvents.js +520 -0
- package/dist/engineEvents.js.map +1 -0
- package/dist/entity.d.ts +275 -26
- package/dist/entity.js +441 -0
- package/dist/entity.js.map +1 -0
- package/dist/entityIndex.d.ts +10 -3
- package/dist/entityIndex.js +149 -0
- package/dist/entityIndex.js.map +1 -0
- package/dist/errors.d.ts +6 -2
- package/dist/errors.js +59 -0
- package/dist/errors.js.map +1 -0
- package/dist/events.d.ts +11 -5
- package/dist/events.js +158 -0
- package/dist/events.js.map +1 -0
- package/dist/exactMath.js +273 -0
- package/dist/exactMath.js.map +1 -0
- package/dist/features.d.ts +1 -1
- package/dist/features.js +127 -0
- package/dist/features.js.map +1 -0
- package/dist/fields.d.ts +25 -5
- package/dist/fields.js +140 -0
- package/dist/fields.js.map +1 -0
- package/dist/fixture.d.ts +3 -3
- package/dist/fixture.js +512 -0
- package/dist/fixture.js.map +1 -0
- package/dist/fog.d.ts +26 -3
- package/dist/fog.js +333 -0
- package/dist/fog.js.map +1 -0
- package/dist/foliage.d.ts +476 -0
- package/dist/foliage.js +1478 -0
- package/dist/foliage.js.map +1 -0
- package/dist/foliageDebug.d.ts +57 -0
- package/dist/foliageDebug.js +172 -0
- package/dist/foliageDebug.js.map +1 -0
- package/dist/foliageRegrowth.d.ts +20 -0
- package/dist/foliageRegrowth.js +332 -0
- package/dist/foliageRegrowth.js.map +1 -0
- package/dist/formState.d.ts +67 -0
- package/dist/formState.js +65 -0
- package/dist/formState.js.map +1 -0
- package/dist/formation.d.ts +46 -8
- package/dist/formation.js +297 -0
- package/dist/formation.js.map +1 -0
- package/dist/forms.d.ts +58 -0
- package/dist/forms.js +146 -0
- package/dist/forms.js.map +1 -0
- package/dist/friendlyFire.d.ts +2 -2
- package/dist/friendlyFire.js +37 -0
- package/dist/friendlyFire.js.map +1 -0
- package/dist/game.d.ts +141 -48
- package/dist/game.js +834 -0
- package/dist/game.js.map +1 -0
- package/dist/gameData.d.ts +96 -22
- package/dist/gameData.js +1690 -0
- package/dist/gameData.js.map +1 -0
- package/dist/gameFiles.d.ts +3 -3
- package/dist/gameFiles.js +14 -0
- package/dist/gameFiles.js.map +1 -0
- package/dist/gates.js +92 -0
- package/dist/gates.js.map +1 -0
- package/dist/generate.d.ts +28 -1
- package/dist/generate.js +1062 -0
- package/dist/generate.js.map +1 -0
- package/dist/generateWorker.d.ts +7 -3
- package/dist/generateWorker.js +86 -0
- package/dist/generateWorker.js.map +1 -0
- package/dist/grid.d.ts +9 -0
- package/dist/grid.js +102 -0
- package/dist/grid.js.map +1 -0
- package/dist/ground.d.ts +17 -1
- package/dist/ground.js +375 -0
- package/dist/ground.js.map +1 -0
- package/dist/groundObjects.d.ts +70 -0
- package/dist/groundObjects.js +371 -0
- package/dist/groundObjects.js.map +1 -0
- package/dist/groundSpeed.d.ts +20 -3
- package/dist/groundSpeed.js +117 -0
- package/dist/groundSpeed.js.map +1 -0
- package/dist/hero.d.ts +126 -10
- package/dist/hero.js +432 -0
- package/dist/hero.js.map +1 -0
- package/dist/holds.d.ts +94 -0
- package/dist/holds.js +305 -0
- package/dist/holds.js.map +1 -0
- package/dist/home.d.ts +1 -1
- package/dist/home.js +30 -0
- package/dist/home.js.map +1 -0
- package/dist/hooks.d.ts +339 -57
- package/dist/hooks.js +105 -0
- package/dist/hooks.js.map +1 -0
- package/dist/hotReload.d.ts +6 -5
- package/dist/hotReload.js +145 -0
- package/dist/hotReload.js.map +1 -0
- package/dist/ids.d.ts +3 -3
- package/dist/ids.js +30 -0
- package/dist/ids.js.map +1 -0
- package/dist/idsFile.d.ts +36 -0
- package/dist/idsFile.js +134 -0
- package/dist/idsFile.js.map +1 -0
- package/dist/index.d.ts +105 -68
- package/dist/index.js +194 -4701
- package/dist/inspect.d.ts +29 -2
- package/dist/{inspect-D9dWHmZ0.js → inspect.js} +21 -12
- package/dist/inspect.js.map +1 -0
- package/dist/inventory.d.ts +14 -1
- package/dist/inventory.js +84 -0
- package/dist/inventory.js.map +1 -0
- package/dist/items.d.ts +136 -8
- package/dist/items.js +585 -0
- package/dist/items.js.map +1 -0
- package/dist/lanes.d.ts +12 -3
- package/dist/lanes.js +496 -0
- package/dist/lanes.js.map +1 -0
- package/dist/life.d.ts +6 -2
- package/dist/life.js +287 -0
- package/dist/life.js.map +1 -0
- package/dist/log.d.ts +26 -3
- package/dist/log.js +192 -0
- package/dist/log.js.map +1 -0
- package/dist/manaBurn.d.ts +2 -2
- package/dist/manaBurn.js +75 -0
- package/dist/manaBurn.js.map +1 -0
- package/dist/map/file.d.ts +56 -3
- package/dist/map/file.js +264 -0
- package/dist/map/file.js.map +1 -0
- package/dist/map/images.js +61 -0
- package/dist/map/images.js.map +1 -0
- package/dist/map/look.d.ts +1 -1
- package/dist/map/look.js +30 -0
- package/dist/map/look.js.map +1 -0
- package/dist/map/pathProfile.js +183 -0
- package/dist/map/pathProfile.js.map +1 -0
- package/dist/map/resize.d.ts +4 -0
- package/dist/map/resize.js +136 -0
- package/dist/map/resize.js.map +1 -0
- package/dist/map/schema.js +257 -0
- package/dist/map/schema.js.map +1 -0
- package/dist/map/terrain.js +214 -0
- package/dist/map/terrain.js.map +1 -0
- package/dist/map/types.d.ts +92 -13
- package/dist/map/types.js +251 -0
- package/dist/map/types.js.map +1 -0
- package/dist/mapCheck/cells.js +94 -0
- package/dist/mapCheck/cells.js.map +1 -0
- package/dist/mapCheck/rules/foliage.d.ts +9 -0
- package/dist/mapCheck/rules/foliage.js +83 -0
- package/dist/mapCheck/rules/foliage.js.map +1 -0
- package/dist/mapCheck/rules/names.js +39 -0
- package/dist/mapCheck/rules/names.js.map +1 -0
- package/dist/mapCheck/rules/objects.d.ts +1 -1
- package/dist/mapCheck/rules/objects.js +56 -0
- package/dist/mapCheck/rules/objects.js.map +1 -0
- package/dist/mapCheck/rules/paths.js +32 -0
- package/dist/mapCheck/rules/paths.js.map +1 -0
- package/dist/mapCheck/rules/players.js +20 -0
- package/dist/mapCheck/rules/players.js.map +1 -0
- package/dist/mapCheck/rules/races.js +56 -0
- package/dist/mapCheck/rules/races.js.map +1 -0
- package/dist/mapCheck/rules/random.js +47 -0
- package/dist/mapCheck/rules/random.js.map +1 -0
- package/dist/mapCheck/rules/regions.js +30 -0
- package/dist/mapCheck/rules/regions.js.map +1 -0
- package/dist/mapCheck/rules/targets.js +31 -0
- package/dist/mapCheck/rules/targets.js.map +1 -0
- package/dist/mapCheck/rules/walking.js +45 -0
- package/dist/mapCheck/rules/walking.js.map +1 -0
- package/dist/mapCheck.d.ts +2 -2
- package/dist/mapCheck.js +63 -0
- package/dist/mapCheck.js.map +1 -0
- package/dist/mapFields.d.ts +25 -2
- package/dist/mapFields.js +134 -0
- package/dist/mapFields.js.map +1 -0
- package/dist/mapFile.js +176 -0
- package/dist/mapFile.js.map +1 -0
- package/dist/mapMeasure.d.ts +8 -0
- package/dist/mapMeasure.js +283 -0
- package/dist/mapMeasure.js.map +1 -0
- package/dist/mapMerge.d.ts +1 -0
- package/dist/mapMerge.js +172 -0
- package/dist/mapMerge.js.map +1 -0
- package/dist/mapObjectives.js +138 -0
- package/dist/mapObjectives.js.map +1 -0
- package/dist/mapObjects.js +80 -0
- package/dist/mapObjects.js.map +1 -0
- package/dist/math.d.ts +37 -7
- package/dist/math.js +155 -0
- package/dist/math.js.map +1 -0
- package/dist/messages.d.ts +71 -4
- package/dist/messages.js +29 -0
- package/dist/messages.js.map +1 -0
- package/dist/missionRules.d.ts +10 -2
- package/dist/{missionRules-C-bGxm0Q.js → missionRules.js} +30 -150
- package/dist/missionRules.js.map +1 -0
- package/dist/mods.d.ts +39 -20
- package/dist/mods.js +271 -0
- package/dist/mods.js.map +1 -0
- package/dist/moves.d.ts +87 -0
- package/dist/moves.js +539 -0
- package/dist/moves.js.map +1 -0
- package/dist/names.d.ts +7 -0
- package/dist/names.js +122 -0
- package/dist/names.js.map +1 -0
- package/dist/navigation/agentParams.js +14 -0
- package/dist/navigation/agentParams.js.map +1 -0
- package/dist/navigation/air.d.ts +7 -3
- package/dist/navigation/air.js +401 -0
- package/dist/navigation/air.js.map +1 -0
- package/dist/navigation/builds.d.ts +34 -2
- package/dist/navigation/builds.js +287 -0
- package/dist/navigation/builds.js.map +1 -0
- package/dist/navigation/groundAreas.d.ts +59 -1
- package/dist/navigation/groundAreas.js +407 -0
- package/dist/navigation/groundAreas.js.map +1 -0
- package/dist/navigation/navigation.d.ts +98 -9
- package/dist/navigation/recast.d.ts +194 -18
- package/dist/navigation/recast.js +1379 -0
- package/dist/navigation/recast.js.map +1 -0
- package/dist/navigation/sidePaths.d.ts +8 -3
- package/dist/navigation/sidePaths.js +241 -0
- package/dist/navigation/sidePaths.js.map +1 -0
- package/dist/navigation/sized.js +243 -0
- package/dist/navigation/sized.js.map +1 -0
- package/dist/nearest.js +32 -0
- package/dist/nearest.js.map +1 -0
- package/dist/noise.js +59 -0
- package/dist/noise.js.map +1 -0
- package/dist/objectives.d.ts +12 -3
- package/dist/objectives.js +144 -0
- package/dist/objectives.js.map +1 -0
- package/dist/orders/basic.d.ts +5 -5
- package/dist/orders/basic.js +417 -0
- package/dist/orders/basic.js.map +1 -0
- package/dist/orders/build.js +278 -0
- package/dist/orders/build.js.map +1 -0
- package/dist/orders/cast.d.ts +13 -3
- package/dist/orders/cast.js +558 -0
- package/dist/orders/cast.js.map +1 -0
- package/dist/orders/facts.js +16 -0
- package/dist/orders/facts.js.map +1 -0
- package/dist/orders/harvest.d.ts +21 -5
- package/dist/orders/harvest.js +540 -0
- package/dist/orders/harvest.js.map +1 -0
- package/dist/orders/idle.d.ts +3 -1
- package/dist/orders/idle.js +234 -0
- package/dist/orders/idle.js.map +1 -0
- package/dist/orders/items.js +92 -0
- package/dist/orders/items.js.map +1 -0
- package/dist/orders/queue.js +108 -0
- package/dist/orders/queue.js.map +1 -0
- package/dist/orders/waiting.d.ts +39 -0
- package/dist/orders/waiting.js +149 -0
- package/dist/orders/waiting.js.map +1 -0
- package/dist/pack.schema.js +13 -0
- package/dist/pack.schema.js.map +1 -0
- package/dist/pack.schema.json +7622 -841
- package/dist/packs/director/index.d.ts +13 -5
- package/dist/packs/director/index.js +204 -0
- package/dist/packs/director/index.js.map +1 -0
- package/dist/packs/heroes/campaign.d.ts +3 -2
- package/dist/packs/heroes/campaign.js +241 -0
- package/dist/packs/heroes/campaign.js.map +1 -0
- package/dist/packs/heroes/carry.d.ts +6 -0
- package/dist/packs/heroes/carry.js +112 -0
- package/dist/packs/heroes/carry.js.map +1 -0
- package/dist/packs/heroes/commands.js +115 -0
- package/dist/packs/heroes/commands.js.map +1 -0
- package/dist/packs/heroes/fallen.d.ts +43 -0
- package/dist/packs/heroes/fallen.js +61 -0
- package/dist/packs/heroes/fallen.js.map +1 -0
- package/dist/packs/heroes/hire.js +60 -0
- package/dist/packs/heroes/hire.js.map +1 -0
- package/dist/packs/heroes/index.d.ts +7 -6
- package/dist/packs/heroes/index.js +130 -0
- package/dist/packs/heroes/index.js.map +1 -0
- package/dist/packs/heroes/loop.d.ts +95 -0
- package/dist/packs/heroes/loop.js +250 -0
- package/dist/packs/heroes/loop.js.map +1 -0
- package/dist/packs/heroes/making.d.ts +6 -3
- package/dist/packs/heroes/making.js +55 -0
- package/dist/packs/heroes/making.js.map +1 -0
- package/dist/packs/heroes/respawn.d.ts +3 -3
- package/dist/packs/heroes/respawn.js +87 -0
- package/dist/packs/heroes/respawn.js.map +1 -0
- package/dist/packs/heroes/sets.d.ts +32 -0
- package/dist/packs/heroes/sets.js +51 -0
- package/dist/packs/heroes/sets.js.map +1 -0
- package/dist/packs/heroes/spells.d.ts +16 -0
- package/dist/packs/heroes/spells.js +269 -0
- package/dist/packs/heroes/spells.js.map +1 -0
- package/dist/packs/items/defaults.d.ts +43 -0
- package/dist/packs/items/defaults.js +1504 -0
- package/dist/packs/items/defaults.js.map +1 -0
- package/dist/packs/items/index.d.ts +27 -0
- package/dist/packs/items/index.js +214 -0
- package/dist/packs/items/index.js.map +1 -0
- package/dist/packs/moba/index.d.ts +3 -3
- package/dist/packs/moba/index.js +174 -0
- package/dist/packs/moba/index.js.map +1 -0
- package/dist/packs/pack.d.ts +15 -15
- package/dist/packs/pack.js +14 -0
- package/dist/packs/pack.js.map +1 -0
- package/dist/packs.d.ts +15 -7
- package/dist/packs.js +222 -0
- package/dist/packs.js.map +1 -0
- package/dist/paths.d.ts +2 -0
- package/dist/paths.js +109 -0
- package/dist/paths.js.map +1 -0
- package/dist/plain.js +57 -0
- package/dist/plain.js.map +1 -0
- package/dist/player.d.ts +33 -10
- package/dist/player.js +159 -0
- package/dist/player.js.map +1 -0
- package/dist/portals.d.ts +1 -1
- package/dist/portals.js +194 -0
- package/dist/portals.js.map +1 -0
- package/dist/prefabs.d.ts +25 -2
- package/dist/prefabs.js +239 -0
- package/dist/prefabs.js.map +1 -0
- package/dist/presetBuildings.js +58 -0
- package/dist/presetBuildings.js.map +1 -0
- package/dist/presetFoliage.d.ts +27 -0
- package/dist/presetFoliage.js +98 -0
- package/dist/presetFoliage.js.map +1 -0
- package/dist/presetGround.js +65 -0
- package/dist/presetGround.js.map +1 -0
- package/dist/proxies.d.ts +12 -0
- package/dist/proxies.js +79 -0
- package/dist/proxies.js.map +1 -0
- package/dist/query.d.ts +56 -0
- package/dist/query.js +88 -0
- package/dist/query.js.map +1 -0
- package/dist/races.d.ts +15 -14
- package/dist/races.js +172 -0
- package/dist/races.js.map +1 -0
- package/dist/randomGroups.js +91 -0
- package/dist/randomGroups.js.map +1 -0
- package/dist/registry.d.ts +117 -53
- package/dist/registry.js +323 -0
- package/dist/registry.js.map +1 -0
- package/dist/remains.d.ts +11 -9
- package/dist/remains.js +188 -0
- package/dist/remains.js.map +1 -0
- package/dist/replication.d.ts +12 -7
- package/dist/replication.js +100 -0
- package/dist/replication.js.map +1 -0
- package/dist/rng.d.ts +2 -0
- package/dist/rng.js +40 -0
- package/dist/rng.js.map +1 -0
- package/dist/rules.d.ts +186 -99
- package/dist/rules.js +179 -0
- package/dist/rules.js.map +1 -0
- package/dist/rulesCheck.d.ts +5 -4
- package/dist/rulesCheck.js +693 -0
- package/dist/rulesCheck.js.map +1 -0
- package/dist/runes.d.ts +2 -2
- package/dist/runes.js +80 -0
- package/dist/runes.js.map +1 -0
- package/dist/save.d.ts +37 -12
- package/dist/save.js +532 -0
- package/dist/save.js.map +1 -0
- package/dist/scenario.d.ts +2 -2
- package/dist/scenario.js +99 -0
- package/dist/scenario.js.map +1 -0
- package/dist/scheduler.d.ts +3 -0
- package/dist/scheduler.js +156 -0
- package/dist/scheduler.js.map +1 -0
- package/dist/score.d.ts +19 -19
- package/dist/score.js +709 -0
- package/dist/score.js.map +1 -0
- package/dist/sequences.d.ts +10 -6
- package/dist/sequences.js +206 -0
- package/dist/sequences.js.map +1 -0
- package/dist/server/doorman.js +154 -0
- package/dist/server/doorman.js.map +1 -0
- package/dist/server/gameServer.d.ts +16 -1
- package/dist/server/gameServer.js +643 -0
- package/dist/server/gameServer.js.map +1 -0
- package/dist/server/index.d.ts +1 -1
- package/dist/server/lobby.js +199 -0
- package/dist/server/lobby.js.map +1 -0
- package/dist/server/log.js +18 -0
- package/dist/server/log.js.map +1 -0
- package/dist/server/match.js +267 -0
- package/dist/server/match.js.map +1 -0
- package/dist/server/mode.d.ts +18 -9
- package/dist/server/mode.js +220 -0
- package/dist/server/mode.js.map +1 -0
- package/dist/{navigation-worker.js → server/navigation-worker.js} +1 -1
- package/dist/server/navigation-worker.js.map +1 -0
- package/dist/server/navigation.js +39 -0
- package/dist/server/navigation.js.map +1 -0
- package/dist/server/ops.d.ts +4 -0
- package/dist/server/ops.js +137 -0
- package/dist/server/ops.js.map +1 -0
- package/dist/server/packs.d.ts +3 -3
- package/dist/server/packs.js +32 -0
- package/dist/server/packs.js.map +1 -0
- package/dist/server/ratings.d.ts +5 -0
- package/dist/server/ratings.js +104 -0
- package/dist/server/ratings.js.map +1 -0
- package/dist/server/relay.d.ts +12 -2
- package/dist/server/relay.js +144 -0
- package/dist/server/relay.js.map +1 -0
- package/dist/server/rooms.d.ts +9 -2
- package/dist/server/rooms.js +442 -0
- package/dist/server/rooms.js.map +1 -0
- package/dist/server/seat.js +116 -0
- package/dist/server/seat.js.map +1 -0
- package/dist/server/seatSettings.d.ts +3 -3
- package/dist/server/seatSettings.js +63 -0
- package/dist/server/seatSettings.js.map +1 -0
- package/dist/server/secret.js +13 -0
- package/dist/server/secret.js.map +1 -0
- package/dist/server/start.d.ts +13 -6
- package/dist/server/start.js +76 -0
- package/dist/server/start.js.map +1 -0
- package/dist/server/websocket.d.ts +9 -1
- package/dist/server/websocket.js +306 -0
- package/dist/server/websocket.js.map +1 -0
- package/dist/server.js +15 -2861
- package/dist/session/can.js +26 -0
- package/dist/session/can.js.map +1 -0
- package/dist/session/commandReplay.d.ts +8 -2
- package/dist/session/commandReplay.js +293 -0
- package/dist/session/commandReplay.js.map +1 -0
- package/dist/session/debug.js +151 -0
- package/dist/session/debug.js.map +1 -0
- package/dist/session/delay.js +62 -0
- package/dist/session/delay.js.map +1 -0
- package/dist/session/delta.d.ts +14 -1
- package/dist/session/delta.js +407 -0
- package/dist/session/delta.js.map +1 -0
- package/dist/session/entityState.js +415 -0
- package/dist/session/entityState.js.map +1 -0
- package/dist/session/local.d.ts +47 -5
- package/dist/session/local.js +670 -0
- package/dist/session/local.js.map +1 -0
- package/dist/session/memory.d.ts +20 -2
- package/dist/session/memory.js +131 -0
- package/dist/session/memory.js.map +1 -0
- package/dist/session/protocol.d.ts +325 -31
- package/dist/session/protocol.js +55 -0
- package/dist/session/protocol.js.map +1 -0
- package/dist/session/remote.d.ts +74 -12
- package/dist/session/remote.js +1394 -0
- package/dist/session/remote.js.map +1 -0
- package/dist/session/replay.d.ts +11 -2
- package/dist/session/replay.js +160 -0
- package/dist/session/replay.js.map +1 -0
- package/dist/session/seed.js +12 -0
- package/dist/session/seed.js.map +1 -0
- package/dist/session/share.d.ts +5 -1
- package/dist/session/share.js +94 -0
- package/dist/session/share.js.map +1 -0
- package/dist/session/socket.d.ts +1 -1
- package/dist/session/socket.js +29 -0
- package/dist/session/socket.js.map +1 -0
- package/dist/session/wire.d.ts +5 -0
- package/dist/session/wire.js +84 -0
- package/dist/session/wire.js.map +1 -0
- package/dist/session/worker.d.ts +77 -12
- package/dist/session/worker.js +499 -0
- package/dist/session/worker.js.map +1 -0
- package/dist/shared.d.ts +31 -5
- package/dist/shared.js +166 -0
- package/dist/shared.js.map +1 -0
- package/dist/sides.d.ts +9 -3
- package/dist/sides.js +149 -0
- package/dist/sides.js.map +1 -0
- package/dist/sight.js +85 -0
- package/dist/sight.js.map +1 -0
- package/dist/simulate-worker.js +1 -1
- package/dist/simulate.d.ts +12 -8
- package/dist/{simulate-oXBiw1Ff.js → simulate.js} +10 -11
- package/dist/simulate.js.map +1 -0
- package/dist/smart.js +77 -0
- package/dist/smart.js.map +1 -0
- package/dist/spatial.d.ts +32 -16
- package/dist/spatial.js +234 -0
- package/dist/spatial.js.map +1 -0
- package/dist/spawning.d.ts +1 -0
- package/dist/spawning.js +224 -0
- package/dist/spawning.js.map +1 -0
- package/dist/stances.d.ts +6 -3
- package/dist/stances.js +169 -0
- package/dist/stances.js.map +1 -0
- package/dist/start.d.ts +10 -10
- package/dist/start.js +75 -0
- package/dist/start.js.map +1 -0
- package/dist/stats.d.ts +42 -16
- package/dist/stats.js +290 -0
- package/dist/stats.js.map +1 -0
- package/dist/summoned.d.ts +52 -0
- package/dist/summoned.js +38 -0
- package/dist/summoned.js.map +1 -0
- package/dist/summons.d.ts +10 -13
- package/dist/summons.js +271 -0
- package/dist/summons.js.map +1 -0
- package/dist/systems/abilities.js +224 -0
- package/dist/systems/abilities.js.map +1 -0
- package/dist/systems/combat.d.ts +35 -1
- package/dist/systems/combat.js +677 -0
- package/dist/systems/combat.js.map +1 -0
- package/dist/systems/combatTold.d.ts +3 -1
- package/dist/systems/combatTold.js +85 -0
- package/dist/systems/combatTold.js.map +1 -0
- package/dist/systems/construction.js +80 -0
- package/dist/systems/construction.js.map +1 -0
- package/dist/systems/economy.d.ts +0 -6
- package/dist/systems/economy.js +128 -0
- package/dist/systems/economy.js.map +1 -0
- package/dist/systems/fog.d.ts +1 -1
- package/dist/systems/fog.js +120 -0
- package/dist/systems/fog.js.map +1 -0
- package/dist/systems/life.js +32 -0
- package/dist/systems/life.js.map +1 -0
- package/dist/systems/movement.d.ts +24 -12
- package/dist/systems/movement.js +1247 -0
- package/dist/systems/movement.js.map +1 -0
- package/dist/systems/orders.js +64 -0
- package/dist/systems/orders.js.map +1 -0
- package/dist/systems/production.js +322 -0
- package/dist/systems/production.js.map +1 -0
- package/dist/systems/productionQueue.js +120 -0
- package/dist/systems/productionQueue.js.map +1 -0
- package/dist/systems/victory.d.ts +1 -1
- package/dist/systems/victory.js +56 -0
- package/dist/systems/victory.js.map +1 -0
- package/dist/talk.d.ts +6 -6
- package/dist/talk.js +153 -0
- package/dist/talk.js.map +1 -0
- package/dist/targeting.d.ts +142 -0
- package/dist/targeting.js +49 -0
- package/dist/targeting.js.map +1 -0
- package/dist/tech.d.ts +20 -3
- package/dist/tech.js +239 -0
- package/dist/tech.js.map +1 -0
- package/dist/techTree.d.ts +7 -0
- package/dist/techTree.js +90 -0
- package/dist/techTree.js.map +1 -0
- package/dist/terrain.d.ts +59 -7
- package/dist/terrain.js +389 -0
- package/dist/terrain.js.map +1 -0
- package/dist/terrainSave.d.ts +6 -0
- package/dist/terrainSave.js +74 -0
- package/dist/terrainSave.js.map +1 -0
- package/dist/testing.d.ts +8 -7
- package/dist/testing.js +13 -739
- package/dist/testing.js.map +1 -1
- package/dist/tiles.d.ts +1 -1
- package/dist/tiles.js +43 -0
- package/dist/tiles.js.map +1 -0
- package/dist/timers.d.ts +29 -4
- package/dist/timers.js +242 -0
- package/dist/timers.js.map +1 -0
- package/dist/tomes.d.ts +4 -4
- package/dist/tomes.js +94 -0
- package/dist/tomes.js.map +1 -0
- package/dist/trade.js +103 -0
- package/dist/trade.js.map +1 -0
- package/dist/transport.d.ts +6 -1
- package/dist/transport.js +281 -0
- package/dist/transport.js.map +1 -0
- package/dist/tunables.d.ts +10 -3
- package/dist/tunables.js +56 -0
- package/dist/tunables.js.map +1 -0
- package/dist/unitResources.d.ts +67 -0
- package/dist/unitResources.js +266 -0
- package/dist/unitResources.js.map +1 -0
- package/dist/upkeep.d.ts +6 -1
- package/dist/upkeep.js +26 -0
- package/dist/upkeep.js.map +1 -0
- package/dist/veterancy.d.ts +8 -3
- package/dist/veterancy.js +131 -0
- package/dist/veterancy.js.map +1 -0
- package/dist/vision.d.ts +36 -0
- package/dist/vision.js +133 -0
- package/dist/vision.js.map +1 -0
- package/dist/walls.d.ts +1 -1
- package/dist/walls.js +278 -0
- package/dist/walls.js.map +1 -0
- package/dist/world.d.ts +606 -88
- package/dist/world.js +1263 -0
- package/dist/world.js.map +1 -0
- package/package.json +2 -2
- package/dist/ai.js.map +0 -1
- package/dist/attributes.d.ts +0 -66
- package/dist/brain-BvVdUhX8.js +0 -7659
- package/dist/brain-BvVdUhX8.js.map +0 -1
- package/dist/builds-C6LfgvEU.js +0 -460
- package/dist/builds-C6LfgvEU.js.map +0 -1
- package/dist/coreComponents-syuh2fPG.js +0 -5149
- package/dist/coreComponents-syuh2fPG.js.map +0 -1
- package/dist/debugCommands-CzjrSm66.js +0 -14739
- package/dist/debugCommands-CzjrSm66.js.map +0 -1
- package/dist/determinism-BCymQwiE.js +0 -518
- package/dist/determinism-BCymQwiE.js.map +0 -1
- package/dist/game-DiJEN-Ks.js +0 -5800
- package/dist/game-DiJEN-Ks.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/inspect-D9dWHmZ0.js.map +0 -1
- package/dist/local-Dkovq42k.js +0 -1379
- package/dist/local-Dkovq42k.js.map +0 -1
- package/dist/missionRules-C-bGxm0Q.js.map +0 -1
- package/dist/navigation-worker.js.map +0 -1
- package/dist/packs-g5thvmGn.js +0 -3199
- package/dist/packs-g5thvmGn.js.map +0 -1
- package/dist/profiles-B3NS9jwk.js.map +0 -1
- package/dist/server.js.map +0 -1
- package/dist/simulate-oXBiw1Ff.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tomes.js","names":[],"sources":["../src/tomes.ts"],"sourcesContent":["import { defineEffect, effectTargets } from './abilities/effects'\nimport { defineComponent } from './components'\nimport type { StatChange } from './defs'\nimport type { Entity } from './entity'\nimport { grantXp, heroOf, maxLevelOf } from './hero'\nimport type { GamePack } from './packs/pack'\nimport { invalidateStats, refreshVitals, type StatField } from './stats'\nimport type { World } from './world'\n\n/*\n * Tomes, an opt-in pack (review RV95): what a unit gains for good, a point of strength a book, kept with it and in a\n * save, and the `tome` effect that gives it (an item's ability, used from the inventory or as it is picked up with the\n * runes pack). A hero's experience and levels from a book are the heroes' own (`grantXp`)\n */\n\n/**\n * The tomes pack's id\n *\n * @beta\n */\nexport const TOMES = 'core.tomes'\n\n/**\n * What a unit gained for good (`gainStats`): the stats added and the parts, everything it gained added up, and how many\n * times it gained\n *\n * @beta\n */\nexport interface GainedStats {\n\t/** What was added to each stat */\n\tstats: Record<string, number>\n\t/** The parts each stat was made bigger or smaller by */\n\tpercent: Record<string, number>\n\t/** How many times it gained: what tells the stats to be added up again */\n\ttimes: number\n}\n\n/**\n * What a unit gained for good from tomes or the game's own rules (`gainStats`): saved with it\n *\n * @beta\n */\nexport const gainedStats = defineComponent<GainedStats>({ id: 'core.gainedStats' })\n\n/**\n * Gives a unit stats for good, as a tome does: added to what it gained before, kept with it in a save, its health and\n * mana raised with them. For the tomes pack's `tome` effect and a game's own rules (a shrine that makes a unit\n * stronger); it works in a game with the tomes pack (`tomesPack`), which adds what was gained to the stats\n *\n * @beta\n */\nexport function gainStats(world: World, entity: Entity, change: StatChange): void {\n\tconst had = entity.get(gainedStats)\n\tconst next: GainedStats = { stats: { ...had?.stats }, percent: { ...had?.percent }, times: (had?.times ?? 0) + 1 }\n\tfor (const key in change.stats) next.stats[key] = (next.stats[key] ?? 0) + change.stats[key]!\n\tfor (const key in change.percent) next.percent[key] = (next.percent[key] ?? 0) + change.percent[key]!\n\tentity.set(gainedStats, next)\n\tinvalidateStats(world, entity)\n\trefreshVitals(world, entity)\n}\n\n/** A tome read: what it gives for good, the experience and the levels it gives a hero */\nconst tomeEffect = defineEffect({ type: 'tome', run: (context, effect) => {\n\t\tconst { world } = context\n\t\tfor (const entity of effectTargets(context, effect, 'allies')) {\n\t\t\tif (effect.gain) gainStats(world, entity, effect.gain)\n\t\t\tif (effect.xp) grantXp(world, entity, effect.xp)\n\t\t\tfor (let i = 0; i < (effect.levels ?? 0); i++) {\n\t\t\t\tconst hero = heroOf(entity)\n\t\t\t\tif (!hero || hero.level >= maxLevelOf(world, entity)) break\n\t\t\t\tgrantXp(world, entity, world.settings.heroes.xpForLevel(hero.level + 1) - hero.xp)\n\t\t\t}\n\t\t}\n\t}, fields: [\n\t\t\t{ path: 'xp', kind: 'integer', min: 0, hint: 'Experience a hero gains' },\n\t\t\t{ path: 'levels', kind: 'integer', min: 0, hint: 'Levels a hero gains' }\n\t\t] })\n\n/** What was gained, added to the stats: worked out again each time something is gained */\nconst gained: StatField = {\n\tid: 'tomes',\n\tstamp: (entity) => entity.get(gainedStats)?.times ?? 0,\n\tadd(_world, entity, sum) {\n\t\tconst had = entity.get(gainedStats)\n\t\tif (had) sum.add(had)\n\t}\n}\n\n/**\n * Tomes, as in classic RTS games: the `tome` effect (`EffectTypes.tome`) gives what it reaches stats for good (`gain`: a\n * point of a stat of the game's own), a hero experience (`xp`) and levels (`levels`). A tome is an item whose\n * ability has the effect, with a charge, used from the inventory, or as it is picked up with the runes pack\n * (`runesPack`). What a unit gained is kept with it and in a save (`gainedStats`), and a game gives it from its own\n * rules with `gainStats`\n *\n * @beta\n */\nexport function tomesPack(): GamePack {\n\treturn { id: TOMES, components: [gainedStats], effects: [tomeEffect], statFields: [gained] }\n}\n"],"mappings":";;;;;;;;;;AAoBA,IAAa,QAAQ;;;;;;AAsBrB,IAAa,cAAc,gBAA6B,EAAE,IAAI,mBAAmB,CAAC;;;;;;;;AASlF,SAAgB,UAAU,OAAc,QAAgB,QAA0B;CACjF,MAAM,MAAM,OAAO,IAAI,WAAW;CAClC,MAAM,OAAoB;EAAE,OAAO,EAAE,GAAG,KAAK,MAAM;EAAG,SAAS,EAAE,GAAG,KAAK,QAAQ;EAAG,QAAQ,KAAK,SAAS,KAAK;CAAE;CACjH,KAAK,MAAM,OAAO,OAAO,OAAO,KAAK,MAAM,QAAQ,KAAK,MAAM,QAAQ,KAAK,OAAO,MAAM;CACxF,KAAK,MAAM,OAAO,OAAO,SAAS,KAAK,QAAQ,QAAQ,KAAK,QAAQ,QAAQ,KAAK,OAAO,QAAQ;CAChG,OAAO,IAAI,aAAa,IAAI;CAC5B,gBAAgB,OAAO,MAAM;CAC7B,cAAc,OAAO,MAAM;AAC5B;;AAGA,IAAM,aAAa,aAAa;CAAE,MAAM;CAAQ,MAAM,SAAS,WAAW;EACxE,MAAM,EAAE,UAAU;EAClB,KAAK,MAAM,UAAU,cAAc,SAAS,QAAQ,QAAQ,GAAG;GAC9D,IAAI,OAAO,MAAM,UAAU,OAAO,QAAQ,OAAO,IAAI;GACrD,IAAI,OAAO,IAAI,QAAQ,OAAO,QAAQ,OAAO,EAAE;GAC/C,KAAK,IAAI,IAAI,GAAG,KAAK,OAAO,UAAU,IAAI,KAAK;IAC9C,MAAM,OAAO,OAAO,MAAM;IAC1B,IAAI,CAAC,QAAQ,KAAK,SAAS,WAAW,OAAO,MAAM,GAAG;IACtD,QAAQ,OAAO,QAAQ,MAAM,SAAS,OAAO,WAAW,KAAK,QAAQ,CAAC,IAAI,KAAK,EAAE;GAClF;EACD;CACD;CAAG,QAAQ,CACT;EAAE,MAAM;EAAM,MAAM;EAAW,KAAK;EAAG,MAAM;CAA0B,GACvE;EAAE,MAAM;EAAU,MAAM;EAAW,KAAK;EAAG,MAAM;CAAsB,CACxE;AAAE,CAAC;;AAGL,IAAM,SAAoB;CACzB,IAAI;CACJ,QAAQ,WAAW,OAAO,IAAI,WAAW,CAAC,EAAE,SAAS;CACrD,IAAI,QAAQ,QAAQ,KAAK;EACxB,MAAM,MAAM,OAAO,IAAI,WAAW;EAClC,IAAI,KAAK,IAAI,IAAI,GAAG;CACrB;AACD;;;;;;;;;;AAWA,SAAgB,YAAsB;CACrC,OAAO;EAAE,IAAI;EAAO,YAAY,CAAC,WAAW;EAAG,SAAS,CAAC,UAAU;EAAG,YAAY,CAAC,MAAM;CAAE;AAC5F"}
|
package/dist/trade.js
ADDED
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { exchanged, traded } from "./engineEvents.js";
|
|
2
|
+
import { earn, spend } from "./player.js";
|
|
3
|
+
import { engineMessage } from "./messages.js";
|
|
4
|
+
//#region src/trade.ts
|
|
5
|
+
/**
|
|
6
|
+
* Gives `amount` of a resource from one player to an ally (`traded`), both told. Nothing to who is not an ally, more
|
|
7
|
+
* than the giver has, or a resource the game does not have; and as the `beforeTrade` hook says: how much arrives, or not
|
|
8
|
+
*
|
|
9
|
+
* @beta
|
|
10
|
+
*/
|
|
11
|
+
function give(world, from, to, resource, amount) {
|
|
12
|
+
if (from === to || !world.players.has(to) || !world.registry.resource(resource)) return;
|
|
13
|
+
const receiver = world.player(to);
|
|
14
|
+
if (receiver.neutral || !world.areAllies(from, to)) return world.message(from, engineMessage("notAnAlly"));
|
|
15
|
+
const sent = Math.floor(amount);
|
|
16
|
+
if (sent <= 0) return;
|
|
17
|
+
const purse = world.player(from).resources;
|
|
18
|
+
if ((purse[resource] ?? 0) < sent) return world.message(from, engineMessage("notEnough", { resource }));
|
|
19
|
+
const trade = {
|
|
20
|
+
from,
|
|
21
|
+
to,
|
|
22
|
+
resource,
|
|
23
|
+
sent,
|
|
24
|
+
received: Math.floor(sent * (1 - (world.settings.economy.tradeTax ?? 0))),
|
|
25
|
+
cancelled: false
|
|
26
|
+
};
|
|
27
|
+
if (world.hooks.has("beforeTrade")) world.hooks.run("beforeTrade", trade);
|
|
28
|
+
if (trade.cancelled) return world.message(from, trade.reason ?? engineMessage("cannotDoThat"));
|
|
29
|
+
const received = Math.max(Math.floor(trade.received), 0);
|
|
30
|
+
purse[resource] = (purse[resource] ?? 0) - sent;
|
|
31
|
+
earn(receiver.resources, resource, received);
|
|
32
|
+
world.events.emit(traded, {
|
|
33
|
+
from,
|
|
34
|
+
to,
|
|
35
|
+
resource,
|
|
36
|
+
sent,
|
|
37
|
+
received
|
|
38
|
+
});
|
|
39
|
+
world.message(from, engineMessage("sent", {
|
|
40
|
+
amount: sent,
|
|
41
|
+
resource,
|
|
42
|
+
player: receiver.name
|
|
43
|
+
}), "info");
|
|
44
|
+
world.message(to, engineMessage("received", {
|
|
45
|
+
amount: received,
|
|
46
|
+
resource,
|
|
47
|
+
player: world.player(from).name
|
|
48
|
+
}), "info");
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Shares with an ally, or no longer: control of the player's units (`shareControl`), and what the player's team sees
|
|
52
|
+
* (`shareVision`, when the ally is of another team: a team sees as one already). Nothing for who is not an ally
|
|
53
|
+
*
|
|
54
|
+
* @beta
|
|
55
|
+
*/
|
|
56
|
+
function shareWith(world, player, ally, what) {
|
|
57
|
+
if (player === ally || !world.players.has(ally)) return;
|
|
58
|
+
if (world.player(ally).neutral || !world.areAllies(player, ally)) return world.message(player, engineMessage("notAnAlly"));
|
|
59
|
+
const sameTeam = world.player(player).team === world.player(ally).team;
|
|
60
|
+
world.sides.share(player, ally, {
|
|
61
|
+
control: what.control,
|
|
62
|
+
vision: sameTeam ? void 0 : what.vision
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Trades `amount` of one resource of a player's (`sold`) for another (`bought`) at a rate: `rate` of it for each one
|
|
67
|
+
* sold, rounded down (`exchanged`), the player told. What the `exchange` effect does (a marketplace's ability,
|
|
68
|
+
* `presetMarket`), for a game's own rules. Nothing of a resource the game does not have, of one for itself, or more
|
|
69
|
+
* than the player has. Gives back how much came
|
|
70
|
+
*
|
|
71
|
+
* @beta
|
|
72
|
+
*/
|
|
73
|
+
function exchange(world, player, sold, bought, amount, rate) {
|
|
74
|
+
if (sold === bought || !world.players.has(player) || !world.registry.resource(sold) || !world.registry.resource(bought)) return 0;
|
|
75
|
+
const sent = Math.floor(amount);
|
|
76
|
+
if (sent <= 0 || !(rate > 0)) return 0;
|
|
77
|
+
const purse = world.player(player).resources;
|
|
78
|
+
if ((purse[sold] ?? 0) < sent) {
|
|
79
|
+
world.message(player, engineMessage("notEnough", { resource: sold }));
|
|
80
|
+
return 0;
|
|
81
|
+
}
|
|
82
|
+
const received = Math.floor(sent * rate + 1e-9);
|
|
83
|
+
spend(world, player, { [sold]: sent }, "trade", bought);
|
|
84
|
+
earn(purse, bought, received);
|
|
85
|
+
world.events.emit(exchanged, {
|
|
86
|
+
player,
|
|
87
|
+
sold,
|
|
88
|
+
sent,
|
|
89
|
+
bought,
|
|
90
|
+
received
|
|
91
|
+
});
|
|
92
|
+
world.message(player, engineMessage("exchanged", {
|
|
93
|
+
amount: sent,
|
|
94
|
+
resource: sold,
|
|
95
|
+
received,
|
|
96
|
+
for: bought
|
|
97
|
+
}), "info");
|
|
98
|
+
return received;
|
|
99
|
+
}
|
|
100
|
+
//#endregion
|
|
101
|
+
export { exchange, give, shareWith };
|
|
102
|
+
|
|
103
|
+
//# sourceMappingURL=trade.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trade.js","names":["tradedEvent","exchangedEvent"],"sources":["../src/trade.ts"],"sourcesContent":["import { exchanged as exchangedEvent, traded as tradedEvent } from '#engine/engineEvents'\nimport type { PlayerId } from './entity'\nimport { engineMessage } from './messages'\nimport { earn, spend } from './player'\nimport type { BeforeTrade } from './hooks'\nimport type { World } from './world'\n\n/*\n * Allies helping each other: a player gives some of what they have to an ally, less what the game's rules take\n * (`RuleSettings.economy.tradeTax`), as the classic allies menu does. A command like any other. And a market: a player\n * trades one resource of theirs for another at a rate (`exchange`, the `exchange` effect, `presetMarket`)\n */\n\n/**\n * Gives `amount` of a resource from one player to an ally (`traded`), both told. Nothing to who is not an ally, more\n * than the giver has, or a resource the game does not have; and as the `beforeTrade` hook says: how much arrives, or not\n *\n * @beta\n */\nexport function give(world: World, from: PlayerId, to: PlayerId, resource: string, amount: number): void {\n\tif (from === to || !world.players.has(to) || !world.registry.resource(resource)) return\n\tconst receiver = world.player(to)\n\tif (receiver.neutral || !world.areAllies(from, to)) return world.message(from, engineMessage('notAnAlly'))\n\tconst sent = Math.floor(amount)\n\tif (sent <= 0) return\n\tconst purse = world.player(from).resources\n\tif ((purse[resource] ?? 0) < sent) return world.message(from, engineMessage('notEnough', { resource }))\n\t// the game's say: how much arrives, or none of it\n\tconst trade = { from, to, resource, sent, received: Math.floor(sent * (1 - (world.settings.economy.tradeTax ?? 0))), cancelled: false } as BeforeTrade\n\tif (world.hooks.has('beforeTrade')) world.hooks.run('beforeTrade', trade)\n\tif (trade.cancelled) return world.message(from, trade.reason ?? engineMessage('cannotDoThat'))\n\tconst received = Math.max(Math.floor(trade.received), 0)\n\tpurse[resource] = (purse[resource] ?? 0) - sent\n\tearn(receiver.resources, resource, received)\n\tworld.events.emit(tradedEvent, { from, to, resource, sent, received })\n\tworld.message(from, engineMessage('sent', { amount: sent, resource, player: receiver.name }), 'info')\n\tworld.message(to, engineMessage('received', { amount: received, resource, player: world.player(from).name }), 'info')\n}\n\n/**\n * Shares with an ally, or no longer: control of the player's units (`shareControl`), and what the player's team sees\n * (`shareVision`, when the ally is of another team: a team sees as one already). Nothing for who is not an ally\n *\n * @beta\n */\nexport function shareWith(world: World, player: PlayerId, ally: PlayerId, what: { vision?: boolean; control?: boolean }): void {\n\tif (player === ally || !world.players.has(ally)) return\n\tif (world.player(ally).neutral || !world.areAllies(player, ally)) return world.message(player, engineMessage('notAnAlly'))\n\tconst sameTeam = world.player(player).team === world.player(ally).team\n\tworld.sides.share(player, ally, { control: what.control, vision: sameTeam ? undefined : what.vision })\n}\n\n/**\n * Trades `amount` of one resource of a player's (`sold`) for another (`bought`) at a rate: `rate` of it for each one\n * sold, rounded down (`exchanged`), the player told. What the `exchange` effect does (a marketplace's ability,\n * `presetMarket`), for a game's own rules. Nothing of a resource the game does not have, of one for itself, or more\n * than the player has. Gives back how much came\n *\n * @beta\n */\nexport function exchange(world: World, player: PlayerId, sold: string, bought: string, amount: number, rate: number): number {\n\tif (sold === bought || !world.players.has(player) || !world.registry.resource(sold) || !world.registry.resource(bought)) return 0\n\tconst sent = Math.floor(amount)\n\tif (sent <= 0 || !(rate > 0)) return 0\n\tconst purse = world.player(player).resources\n\tif ((purse[sold] ?? 0) < sent) {\n\t\tworld.message(player, engineMessage('notEnough', { resource: sold }))\n\t\treturn 0\n\t}\n\t// a hair over, so that a rate written as a decimal (100 at 0.29) comes to what it says and not one under\n\tconst received = Math.floor(sent * rate + 1e-9)\n\t// what was sold counts as spent, as the score has it\n\tspend(world, player, { [sold]: sent }, 'trade', bought)\n\tearn(purse, bought, received)\n\tworld.events.emit(exchangedEvent, { player, sold, sent, bought, received })\n\tworld.message(player, engineMessage('exchanged', { amount: sent, resource: sold, received, for: bought }), 'info')\n\treturn received\n}\n"],"mappings":"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"}
|
package/dist/transport.d.ts
CHANGED
|
@@ -9,11 +9,16 @@ import type { World } from './world';
|
|
|
9
9
|
* @beta
|
|
10
10
|
*/
|
|
11
11
|
export interface Cargo {
|
|
12
|
+
/** Ids of the units inside the transport */
|
|
12
13
|
passengers: number[];
|
|
13
14
|
/** There is land within reach to let them out on */
|
|
14
15
|
ashore: boolean;
|
|
15
16
|
}
|
|
16
|
-
/**
|
|
17
|
+
/**
|
|
18
|
+
* The component holding a transport's passengers, replicated to allies; set on spawn for types with `transport`
|
|
19
|
+
*
|
|
20
|
+
* @beta
|
|
21
|
+
*/
|
|
17
22
|
export declare const cargo: import("./components").Component<Cargo, Cargo>;
|
|
18
23
|
/**
|
|
19
24
|
* How many more a transport has room for
|
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
import { cos, hypot, sin } from "./exactMath.js";
|
|
2
|
+
import { defineComponent } from "./components.js";
|
|
3
|
+
import { invalidateStats } from "./stats.js";
|
|
4
|
+
import { defineListener } from "./events.js";
|
|
5
|
+
import { boarded, entityDied, unloaded } from "./engineEvents.js";
|
|
6
|
+
import { edgeDistance, moving } from "./entity.js";
|
|
7
|
+
import { defineHook } from "./hooks.js";
|
|
8
|
+
import { halt, moveTo, moveToEntity } from "./systems/movement.js";
|
|
9
|
+
import { createOrder, giveOrder } from "./orders/queue.js";
|
|
10
|
+
//#region src/transport.ts
|
|
11
|
+
/**
|
|
12
|
+
* The component holding a transport's passengers, replicated to allies; set on spawn for types with `transport`
|
|
13
|
+
*
|
|
14
|
+
* @beta
|
|
15
|
+
*/
|
|
16
|
+
var cargo = defineComponent({
|
|
17
|
+
id: "core.cargo",
|
|
18
|
+
replicate: "allies",
|
|
19
|
+
onSpawn: (entity) => {
|
|
20
|
+
if (entity.def.transport) entity.set(cargo, {
|
|
21
|
+
passengers: [],
|
|
22
|
+
ashore: false
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
/**
|
|
27
|
+
* How far from its edge a transport reaches to take someone in, and to let them out on the land
|
|
28
|
+
*
|
|
29
|
+
* @internal
|
|
30
|
+
*/
|
|
31
|
+
var BOARD_REACH = 1.5;
|
|
32
|
+
/**
|
|
33
|
+
* How far from its edge a transport reaches to let passengers out onto land, in world units
|
|
34
|
+
*
|
|
35
|
+
* @internal
|
|
36
|
+
*/
|
|
37
|
+
var UNLOAD_REACH = 3.5;
|
|
38
|
+
/** How much further a boat reaches: the walkable bank stops short of the deep water it floats on */
|
|
39
|
+
var SHORE_GAP = 2.5;
|
|
40
|
+
/** How far from its edge a transport takes someone in */
|
|
41
|
+
var boardReach = (transport) => BOARD_REACH + (transport.def.naval ? SHORE_GAP : 0);
|
|
42
|
+
var passengersOf = (transport) => transport.get(cargo)?.passengers ?? [];
|
|
43
|
+
/**
|
|
44
|
+
* How many more a transport has room for
|
|
45
|
+
*
|
|
46
|
+
* @beta
|
|
47
|
+
*/
|
|
48
|
+
function roomIn(transport) {
|
|
49
|
+
const capacity = transport.def.transport?.capacity ?? 0;
|
|
50
|
+
return Math.max(capacity - passengersOf(transport).length, 0);
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Whether a unit can get into a transport: one of its side's that has room, and a unit that walks. What flies, what
|
|
54
|
+
* sails and what carries others do not get in
|
|
55
|
+
*
|
|
56
|
+
* @beta
|
|
57
|
+
*/
|
|
58
|
+
function canBoard(world, passenger, transport) {
|
|
59
|
+
if (passenger === transport || !transport.def.transport || !transport.alive || passenger.hidden) return false;
|
|
60
|
+
if (passenger.def.kind !== "unit" || !passenger.get(moving) || passenger.flying || passenger.def.naval || passenger.def.transport) return false;
|
|
61
|
+
if (!world.areAllies(passenger.owner, transport.owner)) return false;
|
|
62
|
+
const takes = transport.def.transport.takes;
|
|
63
|
+
if (takes && !takes(passenger.def)) return false;
|
|
64
|
+
return roomIn(transport) > 0;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Puts a unit into a transport at once, wherever the two are. False when it cannot get in
|
|
68
|
+
*
|
|
69
|
+
* @beta
|
|
70
|
+
*/
|
|
71
|
+
function board(world, passenger, transport) {
|
|
72
|
+
if (!canBoard(world, passenger, transport)) return false;
|
|
73
|
+
halt(world, passenger);
|
|
74
|
+
world.setHidden(passenger, true);
|
|
75
|
+
transport.set(cargo, {
|
|
76
|
+
passengers: [...passengersOf(transport), passenger.id],
|
|
77
|
+
ashore: transport.get(cargo)?.ashore ?? false
|
|
78
|
+
});
|
|
79
|
+
invalidateStats(world, transport);
|
|
80
|
+
world.events.emit(boarded, {
|
|
81
|
+
passenger,
|
|
82
|
+
transport
|
|
83
|
+
});
|
|
84
|
+
return true;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* The land nearest a point, within reach of it: where what is carried gets out. Nothing out on open water
|
|
88
|
+
*
|
|
89
|
+
* @internal
|
|
90
|
+
*/
|
|
91
|
+
function shoreNear(world, at, reach = UNLOAD_REACH) {
|
|
92
|
+
return world.nav.closestPoint(at, reach);
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Lets out what a transport carries, on the land nearest it (or nearest `near`, within reach of the transport), spread
|
|
96
|
+
* around it. How many got out: none when there is no land in reach
|
|
97
|
+
*
|
|
98
|
+
* @beta
|
|
99
|
+
*/
|
|
100
|
+
function unload(world, transport, near) {
|
|
101
|
+
const passengers = passengersOf(transport);
|
|
102
|
+
if (!passengers.length) return 0;
|
|
103
|
+
const reach = UNLOAD_REACH + transport.def.radius;
|
|
104
|
+
const land = (near && hypot(near.x - transport.pos.x, near.z - transport.pos.z) <= reach ? shoreNear(world, near, 2) : null) ?? shoreNear(world, transport.pos, reach);
|
|
105
|
+
if (!land) return 0;
|
|
106
|
+
let out = 0;
|
|
107
|
+
passengers.forEach((id, i) => {
|
|
108
|
+
const passenger = world.entities.get(id);
|
|
109
|
+
if (!passenger) return;
|
|
110
|
+
const turn = i / Math.max(passengers.length, 1) * Math.PI * 2;
|
|
111
|
+
const spread = i === 0 ? 0 : .9 + Math.floor(i / 6) * .8;
|
|
112
|
+
world.setHidden(passenger, false, {
|
|
113
|
+
x: land.x + cos(turn) * spread,
|
|
114
|
+
z: land.z + sin(turn) * spread
|
|
115
|
+
});
|
|
116
|
+
world.events.emit(unloaded, {
|
|
117
|
+
passenger,
|
|
118
|
+
transport
|
|
119
|
+
});
|
|
120
|
+
out++;
|
|
121
|
+
});
|
|
122
|
+
transport.set(cargo, {
|
|
123
|
+
passengers: [],
|
|
124
|
+
ashore: true
|
|
125
|
+
});
|
|
126
|
+
invalidateStats(world, transport);
|
|
127
|
+
return out;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Getting into a transport: the unit walks to it, as near as the land goes when it is on the water, and gets in once
|
|
131
|
+
* it is within reach. Done when it is in; failed when there is no room, or no way to it
|
|
132
|
+
*
|
|
133
|
+
* @internal
|
|
134
|
+
*/
|
|
135
|
+
var boardOrder = {
|
|
136
|
+
type: "board",
|
|
137
|
+
accepts(world, entity, init) {
|
|
138
|
+
const transport = world.get(init.target);
|
|
139
|
+
return !!transport && canBoard(world, entity, transport);
|
|
140
|
+
},
|
|
141
|
+
update(world, entity, order) {
|
|
142
|
+
const transport = world.get(order.init.target);
|
|
143
|
+
if (!transport || !canBoard(world, entity, transport)) return "failed";
|
|
144
|
+
if (edgeDistance(entity, transport) <= boardReach(transport)) return board(world, entity, transport) ? "done" : "failed";
|
|
145
|
+
const m = entity.get(moving);
|
|
146
|
+
if (m.status === "moving") return "running";
|
|
147
|
+
if (m.status === "failed" && order.state.tried === world.tick - 1) return "failed";
|
|
148
|
+
order.state.tried = world.tick;
|
|
149
|
+
if (transport.def.naval) {
|
|
150
|
+
const shore = shoreNear(world, transport.pos, transport.def.radius + boardReach(transport) + 4);
|
|
151
|
+
if (!shore) return "failed";
|
|
152
|
+
if (hypot(shore.x - entity.pos.x, shore.z - entity.pos.z) < .5) return "failed";
|
|
153
|
+
moveTo(world, entity, shore);
|
|
154
|
+
} else moveToEntity(world, entity, transport, BOARD_REACH * .5);
|
|
155
|
+
return "running";
|
|
156
|
+
}
|
|
157
|
+
};
|
|
158
|
+
/**
|
|
159
|
+
* Taking a unit in, from the transport's side: it goes to the unit and takes it in once it is within reach. A boat
|
|
160
|
+
* goes as near as the water does; when it can get no nearer, a passenger of its own side is told to come aboard
|
|
161
|
+
* (`board`), and that is done. Failed when there is no room, or the unit cannot get in
|
|
162
|
+
*
|
|
163
|
+
* @internal
|
|
164
|
+
*/
|
|
165
|
+
var loadOrder = {
|
|
166
|
+
type: "load",
|
|
167
|
+
accepts(world, entity, init) {
|
|
168
|
+
const passenger = world.get(init.target);
|
|
169
|
+
return !!passenger && canBoard(world, passenger, entity);
|
|
170
|
+
},
|
|
171
|
+
update(world, entity, order) {
|
|
172
|
+
const passenger = world.get(order.init.target);
|
|
173
|
+
if (!passenger || !canBoard(world, passenger, entity)) return "failed";
|
|
174
|
+
if (edgeDistance(entity, passenger) <= boardReach(entity)) return board(world, passenger, entity) ? "done" : "failed";
|
|
175
|
+
const m = entity.get(moving);
|
|
176
|
+
if (!m) return "failed";
|
|
177
|
+
if (m.status === "moving") return "running";
|
|
178
|
+
const from = order.state.from;
|
|
179
|
+
if (order.state.tried !== void 0 && from && hypot(from.x - entity.pos.x, from.z - entity.pos.z) < .5) {
|
|
180
|
+
if (!entity.def.naval || passenger.owner !== entity.owner) return "failed";
|
|
181
|
+
giveOrder(world, passenger, createOrder(world, {
|
|
182
|
+
type: "board",
|
|
183
|
+
target: entity.id
|
|
184
|
+
}));
|
|
185
|
+
return "done";
|
|
186
|
+
}
|
|
187
|
+
order.state.tried = world.tick;
|
|
188
|
+
order.state.from = {
|
|
189
|
+
x: entity.pos.x,
|
|
190
|
+
z: entity.pos.z
|
|
191
|
+
};
|
|
192
|
+
moveToEntity(world, entity, passenger, BOARD_REACH * .5);
|
|
193
|
+
return "running";
|
|
194
|
+
}
|
|
195
|
+
};
|
|
196
|
+
/**
|
|
197
|
+
* Letting out what a transport carries: where it is, when there is land in reach; or at a point, sailing (or driving)
|
|
198
|
+
* as near it as it goes first, and letting them out on the land nearest it. Failed when there is no land to let them
|
|
199
|
+
* out on
|
|
200
|
+
*
|
|
201
|
+
* @internal
|
|
202
|
+
*/
|
|
203
|
+
var unloadOrder = {
|
|
204
|
+
type: "unload",
|
|
205
|
+
accepts(_world, entity) {
|
|
206
|
+
return !!entity.def.transport && passengersOf(entity).length > 0;
|
|
207
|
+
},
|
|
208
|
+
update(world, entity, order) {
|
|
209
|
+
if (!passengersOf(entity).length) return "done";
|
|
210
|
+
const point = order.init.point;
|
|
211
|
+
if (!point || !entity.get(moving)) return unload(world, entity) ? "done" : "failed";
|
|
212
|
+
if (hypot(point.x - entity.pos.x, point.z - entity.pos.z) <= 3.5 + entity.def.radius) return unload(world, entity, point) ? "done" : "failed";
|
|
213
|
+
if (entity.get(moving).status === "moving") return "running";
|
|
214
|
+
if (order.state.sent) return unload(world, entity, point) ? "done" : "failed";
|
|
215
|
+
order.state.sent = true;
|
|
216
|
+
moveTo(world, entity, point);
|
|
217
|
+
return "running";
|
|
218
|
+
}
|
|
219
|
+
};
|
|
220
|
+
/** Keeps each transport's word of whether it is near the land, for its card. A few times a second */
|
|
221
|
+
var transportSystem = {
|
|
222
|
+
name: "transports",
|
|
223
|
+
phase: "cleanup",
|
|
224
|
+
every: 6,
|
|
225
|
+
over: cargo,
|
|
226
|
+
each(world, entity) {
|
|
227
|
+
if (!entity.def.transport || !entity.alive || entity.scenery) return;
|
|
228
|
+
const held = entity.get(cargo);
|
|
229
|
+
const ashore = !!shoreNear(world, entity.pos, UNLOAD_REACH + entity.def.radius);
|
|
230
|
+
if (held.ashore !== ashore) entity.set(cargo, {
|
|
231
|
+
passengers: held.passengers,
|
|
232
|
+
ashore
|
|
233
|
+
});
|
|
234
|
+
if (held.passengers.some((id) => !world.entities.get(id)?.hidden)) entity.set(cargo, {
|
|
235
|
+
passengers: held.passengers.filter((id) => world.entities.get(id)?.hidden),
|
|
236
|
+
ashore
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
};
|
|
240
|
+
/** A transport that dies takes down what it carries with it: a boat. A building that falls lets them out */
|
|
241
|
+
var transportSank = defineListener({
|
|
242
|
+
id: "core.transportSank",
|
|
243
|
+
event: entityDied,
|
|
244
|
+
run(world, { entity, killer }) {
|
|
245
|
+
if (entity.isStructure) {
|
|
246
|
+
unload(world, entity);
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
for (const id of passengersOf(entity)) {
|
|
250
|
+
const passenger = world.entities.get(id);
|
|
251
|
+
if (passenger?.alive) world.kill(passenger, killer);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
});
|
|
255
|
+
/**
|
|
256
|
+
* An armed garrison (`transport.armed`): it attacks only while someone is inside, and each one inside adds to its attack
|
|
257
|
+
* damage
|
|
258
|
+
*
|
|
259
|
+
* @internal
|
|
260
|
+
*/
|
|
261
|
+
var garrisonHooks = [defineHook({
|
|
262
|
+
hook: "canAttack",
|
|
263
|
+
id: "emptyGarrison",
|
|
264
|
+
run(_world, event) {
|
|
265
|
+
if (!event.cancelled && event.attacker.def.transport?.armed !== void 0 && !passengersOf(event.attacker).length) event.cancelled = true;
|
|
266
|
+
}
|
|
267
|
+
}), defineHook({
|
|
268
|
+
hook: "stats",
|
|
269
|
+
id: "garrisonDamage",
|
|
270
|
+
run(world, { entity, add }) {
|
|
271
|
+
const armed = entity.def.transport?.armed;
|
|
272
|
+
const inside = armed === void 0 ? [] : passengersOf(entity);
|
|
273
|
+
if (!inside.length) return;
|
|
274
|
+
if (typeof armed === "function") add({ stats: { attackDamage: armed(world, entity, inside.map((id) => world.entities.get(id)).filter((passenger) => !!passenger)) } });
|
|
275
|
+
else if (armed) add({ stats: { attackDamage: armed } }, inside.length);
|
|
276
|
+
}
|
|
277
|
+
})];
|
|
278
|
+
//#endregion
|
|
279
|
+
export { BOARD_REACH, UNLOAD_REACH, board, boardOrder, canBoard, cargo, garrisonHooks, loadOrder, roomIn, shoreNear, transportSank, transportSystem, unload, unloadOrder };
|
|
280
|
+
|
|
281
|
+
//# sourceMappingURL=transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.js","names":[],"sources":["../src/transport.ts"],"sourcesContent":["import { boarded, entityDied, unloaded } from '#engine/engineEvents'\nimport { defineComponent } from './components'\nimport { defineListener } from './events'\nimport { edgeDistance, type Entity, moving } from './entity'\nimport type { Vec2 } from './math'\nimport type { OrderBehavior, OrderInits, System } from './registry'\nimport { defineHook, type HookDef } from './hooks'\nimport { invalidateStats } from './stats'\nimport { halt, moveTo, moveToEntity } from './systems/movement'\nimport type { World } from './world'\nimport { cos, hypot, sin } from './exactMath'\nimport { createOrder, giveOrder } from './orders/queue'\n\n/**\n * What a transport carries, and whether it is near enough the land to let them out: kept for its side to see, the\n * card's unload button reads it (see `UnitTypeDef.transport`)\n *\n * @beta\n */\nexport interface Cargo {\n\t/** Ids of the units inside the transport */\n\tpassengers: number[]\n\t/** There is land within reach to let them out on */\n\tashore: boolean\n}\n\n/**\n * The component holding a transport's passengers, replicated to allies; set on spawn for types with `transport`\n *\n * @beta\n */\nexport const cargo = defineComponent<Cargo>({ id: 'core.cargo', replicate: 'allies',\n\t// a hold, empty, for what carries: what the transports' system goes through (OB5)\n\tonSpawn: (entity) => {\n\t\tif (entity.def.transport) entity.set(cargo, { passengers: [], ashore: false })\n\t} })\n\n/**\n * How far from its edge a transport reaches to take someone in, and to let them out on the land\n *\n * @internal\n */\nexport const BOARD_REACH = 1.5\n/**\n * How far from its edge a transport reaches to let passengers out onto land, in world units\n *\n * @internal\n */\nexport const UNLOAD_REACH = 3.5\n/** How much further a boat reaches: the walkable bank stops short of the deep water it floats on */\nconst SHORE_GAP = 2.5\n\n/** How far from its edge a transport takes someone in */\nconst boardReach = (transport: Entity) => BOARD_REACH + (transport.def.naval ? SHORE_GAP : 0)\n\nconst passengersOf = (transport: Entity): number[] => transport.get(cargo)?.passengers ?? []\n\n/**\n * How many more a transport has room for\n *\n * @beta\n */\nexport function roomIn(transport: Entity): number {\n\tconst capacity = transport.def.transport?.capacity ?? 0\n\treturn Math.max(capacity - passengersOf(transport).length, 0)\n}\n\n/**\n * Whether a unit can get into a transport: one of its side's that has room, and a unit that walks. What flies, what\n * sails and what carries others do not get in\n *\n * @beta\n */\nexport function canBoard(world: World, passenger: Entity, transport: Entity): boolean {\n\tif (passenger === transport || !transport.def.transport || !transport.alive || passenger.hidden) return false\n\tif (passenger.def.kind !== 'unit' || !passenger.get(moving) || passenger.flying || passenger.def.naval || passenger.def.transport) return false\n\tif (!world.areAllies(passenger.owner, transport.owner)) return false\n\tconst takes = transport.def.transport.takes\n\tif (takes && !takes(passenger.def)) return false\n\treturn roomIn(transport) > 0\n}\n\n/**\n * Puts a unit into a transport at once, wherever the two are. False when it cannot get in\n *\n * @beta\n */\nexport function board(world: World, passenger: Entity, transport: Entity): boolean {\n\tif (!canBoard(world, passenger, transport)) return false\n\thalt(world, passenger)\n\tworld.setHidden(passenger, true)\n\ttransport.set(cargo, { passengers: [...passengersOf(transport), passenger.id], ashore: transport.get(cargo)?.ashore ?? false })\n\t// one more inside: an armed garrison hits harder\n\tinvalidateStats(world, transport)\n\tworld.events.emit(boarded, { passenger, transport })\n\treturn true\n}\n\n/**\n * The land nearest a point, within reach of it: where what is carried gets out. Nothing out on open water\n *\n * @internal\n */\nexport function shoreNear(world: World, at: Vec2, reach = UNLOAD_REACH): Vec2 | null {\n\treturn world.nav.closestPoint(at, reach)\n}\n\n/**\n * Lets out what a transport carries, on the land nearest it (or nearest `near`, within reach of the transport), spread\n * around it. How many got out: none when there is no land in reach\n *\n * @beta\n */\nexport function unload(world: World, transport: Entity, near?: Vec2): number {\n\tconst passengers = passengersOf(transport)\n\tif (!passengers.length) return 0\n\tconst reach = UNLOAD_REACH + transport.def.radius\n\tconst land =\n\t\t(near && hypot(near.x - transport.pos.x, near.z - transport.pos.z) <= reach ? shoreNear(world, near, 2) : null) ??\n\t\tshoreNear(world, transport.pos, reach)\n\tif (!land) return 0\n\tlet out = 0\n\tpassengers.forEach((id, i) => {\n\t\tconst passenger = world.entities.get(id)\n\t\tif (!passenger) return\n\t\t// a ring around where they come ashore, so they do not all stand on one spot\n\t\tconst turn = (i / Math.max(passengers.length, 1)) * Math.PI * 2\n\t\tconst spread = i === 0 ? 0 : 0.9 + Math.floor(i / 6) * 0.8\n\t\tworld.setHidden(passenger, false, { x: land.x + cos(turn) * spread, z: land.z + sin(turn) * spread })\n\t\tworld.events.emit(unloaded, { passenger, transport })\n\t\tout++\n\t})\n\ttransport.set(cargo, { passengers: [], ashore: true })\n\tinvalidateStats(world, transport)\n\treturn out\n}\n\n/**\n * What `board` keeps: the tick it last set out for its transport\n *\n * @beta\n */\nexport interface BoardState {\n\t/** The tick it last set out for its transport */\n\ttried?: number\n}\n\n/**\n * What `unload` keeps: whether it set its passengers down already\n *\n * @beta\n */\nexport interface UnloadState {\n\t/** It set them down already */\n\tsent?: boolean\n}\n\n/**\n * Getting into a transport: the unit walks to it, as near as the land goes when it is on the water, and gets in once\n * it is within reach. Done when it is in; failed when there is no room, or no way to it\n *\n * @internal\n */\nexport const boardOrder: OrderBehavior<BoardState, OrderInits['board']> = {\n\ttype: 'board',\n\taccepts(world, entity, init) {\n\t\tconst transport = world.get(init.target)\n\t\treturn !!transport && canBoard(world, entity, transport)\n\t},\n\tupdate(world, entity, order) {\n\t\tconst transport = world.get(order.init.target)\n\t\tif (!transport || !canBoard(world, entity, transport)) return 'failed'\n\t\tif (edgeDistance(entity, transport) <= boardReach(transport)) return board(world, entity, transport) ? 'done' : 'failed'\n\t\tconst m = entity.get(moving)!\n\t\tif (m.status === 'moving') return 'running'\n\t\tif (m.status === 'failed' && order.state.tried === world.tick - 1) return 'failed'\n\t\torder.state.tried = world.tick\n\t\t// a boat out on the water: to the shore nearest it\n\t\tif (transport.def.naval) {\n\t\t\tconst shore = shoreNear(world, transport.pos, transport.def.radius + boardReach(transport) + 4)\n\t\t\tif (!shore) return 'failed'\n\t\t\tif (hypot(shore.x - entity.pos.x, shore.z - entity.pos.z) < 0.5) return 'failed'\n\t\t\tmoveTo(world, entity, shore)\n\t\t} else moveToEntity(world, entity, transport, BOARD_REACH * 0.5)\n\t\treturn 'running'\n\t}\n}\n\n/**\n * What `load` keeps: the tick it last set out for its passenger, and where it was then\n *\n * @beta\n */\nexport interface LoadState {\n\t/** The tick it last set out for its passenger */\n\ttried?: number\n\t/** Where it was when it last set out */\n\tfrom?: Vec2\n}\n\n/**\n * Taking a unit in, from the transport's side: it goes to the unit and takes it in once it is within reach. A boat\n * goes as near as the water does; when it can get no nearer, a passenger of its own side is told to come aboard\n * (`board`), and that is done. Failed when there is no room, or the unit cannot get in\n *\n * @internal\n */\nexport const loadOrder: OrderBehavior<LoadState, OrderInits['load']> = {\n\ttype: 'load',\n\taccepts(world, entity, init) {\n\t\tconst passenger = world.get(init.target)\n\t\treturn !!passenger && canBoard(world, passenger, entity)\n\t},\n\tupdate(world, entity, order) {\n\t\tconst passenger = world.get(order.init.target)\n\t\tif (!passenger || !canBoard(world, passenger, entity)) return 'failed'\n\t\tif (edgeDistance(entity, passenger) <= boardReach(entity)) return board(world, passenger, entity) ? 'done' : 'failed'\n\t\tconst m = entity.get(moving)\n\t\tif (!m) return 'failed'\n\t\tif (m.status === 'moving') return 'running'\n\t\tconst from = order.state.from\n\t\t// stopped where it stopped last time: it gets no nearer\n\t\tif (order.state.tried !== undefined && from && hypot(from.x - entity.pos.x, from.z - entity.pos.z) < 0.5) {\n\t\t\tif (!entity.def.naval || passenger.owner !== entity.owner) return 'failed'\n\t\t\tgiveOrder(world, passenger, createOrder(world, { type: 'board', target: entity.id }))\n\t\t\treturn 'done'\n\t\t}\n\t\torder.state.tried = world.tick\n\t\torder.state.from = { x: entity.pos.x, z: entity.pos.z }\n\t\tmoveToEntity(world, entity, passenger, BOARD_REACH * 0.5)\n\t\treturn 'running'\n\t}\n}\n\n/**\n * Letting out what a transport carries: where it is, when there is land in reach; or at a point, sailing (or driving)\n * as near it as it goes first, and letting them out on the land nearest it. Failed when there is no land to let them\n * out on\n *\n * @internal\n */\nexport const unloadOrder: OrderBehavior<UnloadState, OrderInits['unload']> = {\n\ttype: 'unload',\n\taccepts(_world, entity) {\n\t\treturn !!entity.def.transport && passengersOf(entity).length > 0\n\t},\n\tupdate(world, entity, order) {\n\t\tif (!passengersOf(entity).length) return 'done'\n\t\tconst point = order.init.point\n\t\tif (!point || !entity.get(moving)) return unload(world, entity) ? 'done' : 'failed'\n\t\tif (hypot(point.x - entity.pos.x, point.z - entity.pos.z) <= UNLOAD_REACH + entity.def.radius)\n\t\t\treturn unload(world, entity, point) ? 'done' : 'failed'\n\t\tconst m = entity.get(moving)!\n\t\tif (m.status === 'moving') return 'running'\n\t\tif (order.state.sent) return unload(world, entity, point) ? 'done' : 'failed'\n\t\torder.state.sent = true\n\t\tmoveTo(world, entity, point)\n\t\treturn 'running'\n\t}\n}\n\n/** Keeps each transport's word of whether it is near the land, for its card. A few times a second */\nexport const transportSystem: System = {\n\tname: 'transports',\n\tphase: 'cleanup',\n\tevery: 6,\n\t// only what carries (given its hold as it is made: `World.spawn`, `morph`), not every unit and tree (OB5)\n\tover: cargo,\n\teach(world, entity) {\n\t\tif (!entity.def.transport || !entity.alive || entity.scenery) return\n\t\tconst held = entity.get(cargo)!\n\t\tconst ashore = !!shoreNear(world, entity.pos, UNLOAD_REACH + entity.def.radius)\n\t\tif (held.ashore !== ashore) entity.set(cargo, { passengers: held.passengers, ashore })\n\t\t// what got out some other way, or is gone\n\t\tif (held.passengers.some((id) => !world.entities.get(id)?.hidden)) {\n\t\t\tentity.set(cargo, { passengers: held.passengers.filter((id) => world.entities.get(id)?.hidden), ashore })\n\t\t}\n\t}\n}\n\n/** A transport that dies takes down what it carries with it: a boat. A building that falls lets them out */\nexport const transportSank = defineListener({\n\tid: 'core.transportSank',\n\tevent: entityDied,\n\trun(world, { entity, killer }) {\n\t\tif (entity.isStructure) {\n\t\t\tunload(world, entity)\n\t\t\treturn\n\t\t}\n\t\tfor (const id of passengersOf(entity)) {\n\t\t\tconst passenger = world.entities.get(id)\n\t\t\tif (passenger?.alive) world.kill(passenger, killer)\n\t\t}\n\t}\n})\n\n/**\n * An armed garrison (`transport.armed`): it attacks only while someone is inside, and each one inside adds to its attack\n * damage\n *\n * @internal\n */\nexport const garrisonHooks: HookDef[] = [\n\tdefineHook({\n\t\thook: 'canAttack',\n\t\tid: 'emptyGarrison',\n\t\trun(_world, event) {\n\t\t\tif (!event.cancelled && event.attacker.def.transport?.armed !== undefined && !passengersOf(event.attacker).length) event.cancelled = true\n\t\t}\n\t}),\n\tdefineHook({\n\t\thook: 'stats',\n\t\tid: 'garrisonDamage',\n\t\trun(world, { entity, add }) {\n\t\t\tconst armed = entity.def.transport?.armed\n\t\t\tconst inside = armed === undefined ? [] : passengersOf(entity)\n\t\t\tif (!inside.length) return\n\t\t\t// as declared, so much for each; or as the game works it out, from who is inside\n\t\t\tif (typeof armed === 'function') {\n\t\t\t\tconst passengers = inside.map((id) => world.entities.get(id)).filter((passenger): passenger is Entity => !!passenger)\n\t\t\t\tadd({ stats: { attackDamage: armed(world, entity, passengers) } })\n\t\t\t} else if (armed) add({ stats: { attackDamage: armed } }, inside.length)\n\t\t}\n\t})\n]\n"],"mappings":";;;;;;;;;;;;;;;AA+BA,IAAa,QAAQ,gBAAuB;CAAE,IAAI;CAAc,WAAW;CAE1E,UAAU,WAAW;EACpB,IAAI,OAAO,IAAI,WAAW,OAAO,IAAI,OAAO;GAAE,YAAY,CAAC;GAAG,QAAQ;EAAM,CAAC;CAC9E;AAAE,CAAC;;;;;;AAOJ,IAAa,cAAc;;;;;;AAM3B,IAAa,eAAe;;AAE5B,IAAM,YAAY;;AAGlB,IAAM,cAAc,cAAsB,eAAe,UAAU,IAAI,QAAQ,YAAY;AAE3F,IAAM,gBAAgB,cAAgC,UAAU,IAAI,KAAK,CAAC,EAAE,cAAc,CAAC;;;;;;AAO3F,SAAgB,OAAO,WAA2B;CACjD,MAAM,WAAW,UAAU,IAAI,WAAW,YAAY;CACtD,OAAO,KAAK,IAAI,WAAW,aAAa,SAAS,CAAC,CAAC,QAAQ,CAAC;AAC7D;;;;;;;AAQA,SAAgB,SAAS,OAAc,WAAmB,WAA4B;CACrF,IAAI,cAAc,aAAa,CAAC,UAAU,IAAI,aAAa,CAAC,UAAU,SAAS,UAAU,QAAQ,OAAO;CACxG,IAAI,UAAU,IAAI,SAAS,UAAU,CAAC,UAAU,IAAI,MAAM,KAAK,UAAU,UAAU,UAAU,IAAI,SAAS,UAAU,IAAI,WAAW,OAAO;CAC1I,IAAI,CAAC,MAAM,UAAU,UAAU,OAAO,UAAU,KAAK,GAAG,OAAO;CAC/D,MAAM,QAAQ,UAAU,IAAI,UAAU;CACtC,IAAI,SAAS,CAAC,MAAM,UAAU,GAAG,GAAG,OAAO;CAC3C,OAAO,OAAO,SAAS,IAAI;AAC5B;;;;;;AAOA,SAAgB,MAAM,OAAc,WAAmB,WAA4B;CAClF,IAAI,CAAC,SAAS,OAAO,WAAW,SAAS,GAAG,OAAO;CACnD,KAAK,OAAO,SAAS;CACrB,MAAM,UAAU,WAAW,IAAI;CAC/B,UAAU,IAAI,OAAO;EAAE,YAAY,CAAC,GAAG,aAAa,SAAS,GAAG,UAAU,EAAE;EAAG,QAAQ,UAAU,IAAI,KAAK,CAAC,EAAE,UAAU;CAAM,CAAC;CAE9H,gBAAgB,OAAO,SAAS;CAChC,MAAM,OAAO,KAAK,SAAS;EAAE;EAAW;CAAU,CAAC;CACnD,OAAO;AACR;;;;;;AAOA,SAAgB,UAAU,OAAc,IAAU,QAAQ,cAA2B;CACpF,OAAO,MAAM,IAAI,aAAa,IAAI,KAAK;AACxC;;;;;;;AAQA,SAAgB,OAAO,OAAc,WAAmB,MAAqB;CAC5E,MAAM,aAAa,aAAa,SAAS;CACzC,IAAI,CAAC,WAAW,QAAQ,OAAO;CAC/B,MAAM,QAAQ,eAAe,UAAU,IAAI;CAC3C,MAAM,QACJ,QAAQ,MAAM,KAAK,IAAI,UAAU,IAAI,GAAG,KAAK,IAAI,UAAU,IAAI,CAAC,KAAK,QAAQ,UAAU,OAAO,MAAM,CAAC,IAAI,SAC1G,UAAU,OAAO,UAAU,KAAK,KAAK;CACtC,IAAI,CAAC,MAAM,OAAO;CAClB,IAAI,MAAM;CACV,WAAW,SAAS,IAAI,MAAM;EAC7B,MAAM,YAAY,MAAM,SAAS,IAAI,EAAE;EACvC,IAAI,CAAC,WAAW;EAEhB,MAAM,OAAQ,IAAI,KAAK,IAAI,WAAW,QAAQ,CAAC,IAAK,KAAK,KAAK;EAC9D,MAAM,SAAS,MAAM,IAAI,IAAI,KAAM,KAAK,MAAM,IAAI,CAAC,IAAI;EACvD,MAAM,UAAU,WAAW,OAAO;GAAE,GAAG,KAAK,IAAI,IAAI,IAAI,IAAI;GAAQ,GAAG,KAAK,IAAI,IAAI,IAAI,IAAI;EAAO,CAAC;EACpG,MAAM,OAAO,KAAK,UAAU;GAAE;GAAW;EAAU,CAAC;EACpD;CACD,CAAC;CACD,UAAU,IAAI,OAAO;EAAE,YAAY,CAAC;EAAG,QAAQ;CAAK,CAAC;CACrD,gBAAgB,OAAO,SAAS;CAChC,OAAO;AACR;;;;;;;AA4BA,IAAa,aAA6D;CACzE,MAAM;CACN,QAAQ,OAAO,QAAQ,MAAM;EAC5B,MAAM,YAAY,MAAM,IAAI,KAAK,MAAM;EACvC,OAAO,CAAC,CAAC,aAAa,SAAS,OAAO,QAAQ,SAAS;CACxD;CACA,OAAO,OAAO,QAAQ,OAAO;EAC5B,MAAM,YAAY,MAAM,IAAI,MAAM,KAAK,MAAM;EAC7C,IAAI,CAAC,aAAa,CAAC,SAAS,OAAO,QAAQ,SAAS,GAAG,OAAO;EAC9D,IAAI,aAAa,QAAQ,SAAS,KAAK,WAAW,SAAS,GAAG,OAAO,MAAM,OAAO,QAAQ,SAAS,IAAI,SAAS;EAChH,MAAM,IAAI,OAAO,IAAI,MAAM;EAC3B,IAAI,EAAE,WAAW,UAAU,OAAO;EAClC,IAAI,EAAE,WAAW,YAAY,MAAM,MAAM,UAAU,MAAM,OAAO,GAAG,OAAO;EAC1E,MAAM,MAAM,QAAQ,MAAM;EAE1B,IAAI,UAAU,IAAI,OAAO;GACxB,MAAM,QAAQ,UAAU,OAAO,UAAU,KAAK,UAAU,IAAI,SAAS,WAAW,SAAS,IAAI,CAAC;GAC9F,IAAI,CAAC,OAAO,OAAO;GACnB,IAAI,MAAM,MAAM,IAAI,OAAO,IAAI,GAAG,MAAM,IAAI,OAAO,IAAI,CAAC,IAAI,IAAK,OAAO;GACxE,OAAO,OAAO,QAAQ,KAAK;EAC5B,OAAO,aAAa,OAAO,QAAQ,WAAW,cAAc,EAAG;EAC/D,OAAO;CACR;AACD;;;;;;;;AAqBA,IAAa,YAA0D;CACtE,MAAM;CACN,QAAQ,OAAO,QAAQ,MAAM;EAC5B,MAAM,YAAY,MAAM,IAAI,KAAK,MAAM;EACvC,OAAO,CAAC,CAAC,aAAa,SAAS,OAAO,WAAW,MAAM;CACxD;CACA,OAAO,OAAO,QAAQ,OAAO;EAC5B,MAAM,YAAY,MAAM,IAAI,MAAM,KAAK,MAAM;EAC7C,IAAI,CAAC,aAAa,CAAC,SAAS,OAAO,WAAW,MAAM,GAAG,OAAO;EAC9D,IAAI,aAAa,QAAQ,SAAS,KAAK,WAAW,MAAM,GAAG,OAAO,MAAM,OAAO,WAAW,MAAM,IAAI,SAAS;EAC7G,MAAM,IAAI,OAAO,IAAI,MAAM;EAC3B,IAAI,CAAC,GAAG,OAAO;EACf,IAAI,EAAE,WAAW,UAAU,OAAO;EAClC,MAAM,OAAO,MAAM,MAAM;EAEzB,IAAI,MAAM,MAAM,UAAU,KAAA,KAAa,QAAQ,MAAM,KAAK,IAAI,OAAO,IAAI,GAAG,KAAK,IAAI,OAAO,IAAI,CAAC,IAAI,IAAK;GACzG,IAAI,CAAC,OAAO,IAAI,SAAS,UAAU,UAAU,OAAO,OAAO,OAAO;GAClE,UAAU,OAAO,WAAW,YAAY,OAAO;IAAE,MAAM;IAAS,QAAQ,OAAO;GAAG,CAAC,CAAC;GACpF,OAAO;EACR;EACA,MAAM,MAAM,QAAQ,MAAM;EAC1B,MAAM,MAAM,OAAO;GAAE,GAAG,OAAO,IAAI;GAAG,GAAG,OAAO,IAAI;EAAE;EACtD,aAAa,OAAO,QAAQ,WAAW,cAAc,EAAG;EACxD,OAAO;CACR;AACD;;;;;;;;AASA,IAAa,cAAgE;CAC5E,MAAM;CACN,QAAQ,QAAQ,QAAQ;EACvB,OAAO,CAAC,CAAC,OAAO,IAAI,aAAa,aAAa,MAAM,CAAC,CAAC,SAAS;CAChE;CACA,OAAO,OAAO,QAAQ,OAAO;EAC5B,IAAI,CAAC,aAAa,MAAM,CAAC,CAAC,QAAQ,OAAO;EACzC,MAAM,QAAQ,MAAM,KAAK;EACzB,IAAI,CAAC,SAAS,CAAC,OAAO,IAAI,MAAM,GAAG,OAAO,OAAO,OAAO,MAAM,IAAI,SAAS;EAC3E,IAAI,MAAM,MAAM,IAAI,OAAO,IAAI,GAAG,MAAM,IAAI,OAAO,IAAI,CAAC,KAAA,MAAoB,OAAO,IAAI,QACtF,OAAO,OAAO,OAAO,QAAQ,KAAK,IAAI,SAAS;EAEhD,IADU,OAAO,IAAI,MACjB,CAAA,CAAE,WAAW,UAAU,OAAO;EAClC,IAAI,MAAM,MAAM,MAAM,OAAO,OAAO,OAAO,QAAQ,KAAK,IAAI,SAAS;EACrE,MAAM,MAAM,OAAO;EACnB,OAAO,OAAO,QAAQ,KAAK;EAC3B,OAAO;CACR;AACD;;AAGA,IAAa,kBAA0B;CACtC,MAAM;CACN,OAAO;CACP,OAAO;CAEP,MAAM;CACN,KAAK,OAAO,QAAQ;EACnB,IAAI,CAAC,OAAO,IAAI,aAAa,CAAC,OAAO,SAAS,OAAO,SAAS;EAC9D,MAAM,OAAO,OAAO,IAAI,KAAK;EAC7B,MAAM,SAAS,CAAC,CAAC,UAAU,OAAO,OAAO,KAAK,eAAe,OAAO,IAAI,MAAM;EAC9E,IAAI,KAAK,WAAW,QAAQ,OAAO,IAAI,OAAO;GAAE,YAAY,KAAK;GAAY;EAAO,CAAC;EAErF,IAAI,KAAK,WAAW,MAAM,OAAO,CAAC,MAAM,SAAS,IAAI,EAAE,CAAC,EAAE,MAAM,GAC/D,OAAO,IAAI,OAAO;GAAE,YAAY,KAAK,WAAW,QAAQ,OAAO,MAAM,SAAS,IAAI,EAAE,CAAC,EAAE,MAAM;GAAG;EAAO,CAAC;CAE1G;AACD;;AAGA,IAAa,gBAAgB,eAAe;CAC3C,IAAI;CACJ,OAAO;CACP,IAAI,OAAO,EAAE,QAAQ,UAAU;EAC9B,IAAI,OAAO,aAAa;GACvB,OAAO,OAAO,MAAM;GACpB;EACD;EACA,KAAK,MAAM,MAAM,aAAa,MAAM,GAAG;GACtC,MAAM,YAAY,MAAM,SAAS,IAAI,EAAE;GACvC,IAAI,WAAW,OAAO,MAAM,KAAK,WAAW,MAAM;EACnD;CACD;AACD,CAAC;;;;;;;AAQD,IAAa,gBAA2B,CACvC,WAAW;CACV,MAAM;CACN,IAAI;CACJ,IAAI,QAAQ,OAAO;EAClB,IAAI,CAAC,MAAM,aAAa,MAAM,SAAS,IAAI,WAAW,UAAU,KAAA,KAAa,CAAC,aAAa,MAAM,QAAQ,CAAC,CAAC,QAAQ,MAAM,YAAY;CACtI;AACD,CAAC,GACD,WAAW;CACV,MAAM;CACN,IAAI;CACJ,IAAI,OAAO,EAAE,QAAQ,OAAO;EAC3B,MAAM,QAAQ,OAAO,IAAI,WAAW;EACpC,MAAM,SAAS,UAAU,KAAA,IAAY,CAAC,IAAI,aAAa,MAAM;EAC7D,IAAI,CAAC,OAAO,QAAQ;EAEpB,IAAI,OAAO,UAAU,YAEpB,IAAI,EAAE,OAAO,EAAE,cAAc,MAAM,OAAO,QADvB,OAAO,KAAK,OAAO,MAAM,SAAS,IAAI,EAAE,CAAC,CAAC,CAAC,QAAQ,cAAmC,CAAC,CAAC,SACzD,CAAU,EAAE,EAAE,CAAC;OAC3D,IAAI,OAAO,IAAI,EAAE,OAAO,EAAE,cAAc,MAAM,EAAE,GAAG,OAAO,MAAM;CACxE;AACD,CAAC,CACF"}
|
package/dist/tunables.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* A number of a game's rules to be tuned while it plays: the seconds between waves, how much a kill pays. Read in the
|
|
3
3
|
* rules with `world.tunable(id)`, and changed while the game runs from the editor's play mode (`debug.tune`), in the
|
|
4
|
-
* world itself, so that a save and a screen over a wire have the same. Given in `
|
|
4
|
+
* world itself, so that a save and a screen over a wire have the same. Given in `Rules.tunables`
|
|
5
5
|
*
|
|
6
6
|
* @beta
|
|
7
7
|
*/
|
|
@@ -10,13 +10,20 @@ export interface TunableDef {
|
|
|
10
10
|
id: string;
|
|
11
11
|
/** What the tuning panel calls it */
|
|
12
12
|
name?: string;
|
|
13
|
+
/** The value the tunable starts with */
|
|
13
14
|
default: number;
|
|
15
|
+
/** The lowest value the tuning panel offers */
|
|
14
16
|
min: number;
|
|
17
|
+
/** The highest value the tuning panel offers */
|
|
15
18
|
max: number;
|
|
16
19
|
/** What the slider steps by. A hundredth of the way from min to max when left out */
|
|
17
20
|
step?: number;
|
|
18
21
|
}
|
|
19
|
-
/**
|
|
22
|
+
/**
|
|
23
|
+
* Typed help for writing a tunable: returns the definition as given
|
|
24
|
+
*
|
|
25
|
+
* @beta
|
|
26
|
+
*/
|
|
20
27
|
export declare const defineTunable: (def: TunableDef) => TunableDef;
|
|
21
28
|
/**
|
|
22
29
|
* The tunables of a game with what a file says over their defaults: the values kept from the tuning panel, in the
|
|
@@ -24,7 +31,7 @@ export declare const defineTunable: (def: TunableDef) => TunableDef;
|
|
|
24
31
|
*
|
|
25
32
|
* @beta
|
|
26
33
|
*/
|
|
27
|
-
export declare function
|
|
34
|
+
export declare function layTuning(defs: readonly TunableDef[], file?: Readonly<Record<string, unknown>>): TunableDef[];
|
|
28
35
|
/**
|
|
29
36
|
* A tunable changed while the game runs: for what has to be worked out again from it
|
|
30
37
|
*
|
package/dist/tunables.js
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { defineComponent } from "./components.js";
|
|
2
|
+
import { defineEngineEvent } from "./events.js";
|
|
3
|
+
import { number, string } from "./fields.js";
|
|
4
|
+
import { defineDebugCommand } from "./debugCommands.js";
|
|
5
|
+
//#region src/tunables.ts
|
|
6
|
+
/**
|
|
7
|
+
* Typed help for writing a tunable: returns the definition as given
|
|
8
|
+
*
|
|
9
|
+
* @beta
|
|
10
|
+
*/
|
|
11
|
+
var defineTunable = (def) => def;
|
|
12
|
+
/**
|
|
13
|
+
* The tunables of a game with what a file says over their defaults: the values kept from the tuning panel, in the
|
|
14
|
+
* game's `tuning.json` (`{ "td.betweenWaves": 12 }`). Code can still set any of them as it likes
|
|
15
|
+
*
|
|
16
|
+
* @beta
|
|
17
|
+
*/
|
|
18
|
+
function layTuning(defs, file = {}) {
|
|
19
|
+
return defs.map((def) => {
|
|
20
|
+
const value = file[def.id];
|
|
21
|
+
return typeof value === "number" && Number.isFinite(value) ? {
|
|
22
|
+
...def,
|
|
23
|
+
default: Math.min(Math.max(value, def.min), def.max)
|
|
24
|
+
} : def;
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* The values the tunables of a world were set to, where they are not their defaults: kept with the world and in its save
|
|
29
|
+
*
|
|
30
|
+
* @internal
|
|
31
|
+
*/
|
|
32
|
+
var tunings = defineComponent({
|
|
33
|
+
id: "core.tunings",
|
|
34
|
+
default: () => ({})
|
|
35
|
+
});
|
|
36
|
+
/**
|
|
37
|
+
* A tunable changed while the game runs: for what has to be worked out again from it
|
|
38
|
+
*
|
|
39
|
+
* @beta
|
|
40
|
+
*/
|
|
41
|
+
var tunableChanged = defineEngineEvent({ id: "core.tunableChanged" });
|
|
42
|
+
/**
|
|
43
|
+
* Sets a tunable while the game runs: for players allowed the debug tools
|
|
44
|
+
*
|
|
45
|
+
* @beta
|
|
46
|
+
*/
|
|
47
|
+
var tuneCommand = defineDebugCommand("debug.tune", {
|
|
48
|
+
id: string,
|
|
49
|
+
value: number
|
|
50
|
+
}, (world, _player, command) => {
|
|
51
|
+
world.setTunable(command.id, command.value);
|
|
52
|
+
});
|
|
53
|
+
//#endregion
|
|
54
|
+
export { defineTunable, layTuning, tunableChanged, tuneCommand, tunings };
|
|
55
|
+
|
|
56
|
+
//# sourceMappingURL=tunables.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tunables.js","names":[],"sources":["../src/tunables.ts"],"sourcesContent":["import { defineComponent } from './components'\nimport { defineDebugCommand } from './debugCommands'\nimport { defineEngineEvent } from './events'\nimport { number, string } from './fields'\n\n/**\n * A number of a game's rules to be tuned while it plays: the seconds between waves, how much a kill pays. Read in the\n * rules with `world.tunable(id)`, and changed while the game runs from the editor's play mode (`debug.tune`), in the\n * world itself, so that a save and a screen over a wire have the same. Given in `Rules.tunables`\n *\n * @beta\n */\nexport interface TunableDef {\n\t/** Shared by every game: give it a prefix of the game's */\n\tid: string\n\t/** What the tuning panel calls it */\n\tname?: string\n\t/** The value the tunable starts with */\n\tdefault: number\n\t/** The lowest value the tuning panel offers */\n\tmin: number\n\t/** The highest value the tuning panel offers */\n\tmax: number\n\t/** What the slider steps by. A hundredth of the way from min to max when left out */\n\tstep?: number\n}\n\n/**\n * Typed help for writing a tunable: returns the definition as given\n *\n * @beta\n */\nexport const defineTunable = (def: TunableDef): TunableDef => def\n\n/**\n * The tunables of a game with what a file says over their defaults: the values kept from the tuning panel, in the\n * game's `tuning.json` (`{ \"td.betweenWaves\": 12 }`). Code can still set any of them as it likes\n *\n * @beta\n */\nexport function layTuning(defs: readonly TunableDef[], file: Readonly<Record<string, unknown>> = {}): TunableDef[] {\n\treturn defs.map((def) => {\n\t\tconst value = file[def.id]\n\t\treturn typeof value === 'number' && Number.isFinite(value) ? { ...def, default: Math.min(Math.max(value, def.min), def.max) } : def\n\t})\n}\n\n/**\n * The values the tunables of a world were set to, where they are not their defaults: kept with the world and in its save\n *\n * @internal\n */\nexport const tunings = defineComponent<Record<string, number>>({ id: 'core.tunings', default: () => ({}) })\n\n/**\n * A tunable changed while the game runs: for what has to be worked out again from it\n *\n * @beta\n */\nexport const tunableChanged = defineEngineEvent<{ id: string; value: number }>({ id: 'core.tunableChanged' })\n\n/**\n * Sets a tunable while the game runs: for players allowed the debug tools\n *\n * @beta\n */\nexport const tuneCommand = defineDebugCommand('debug.tune', { id: string, value: number }, (world, _player, command) => {\n\tworld.setTunable(command.id, command.value)\n})\n"],"mappings":";;;;;;;;;;AAgCA,IAAa,iBAAiB,QAAgC;;;;;;;AAQ9D,SAAgB,UAAU,MAA6B,OAA0C,CAAC,GAAiB;CAClH,OAAO,KAAK,KAAK,QAAQ;EACxB,MAAM,QAAQ,KAAK,IAAI;EACvB,OAAO,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,IAAI;GAAE,GAAG;GAAK,SAAS,KAAK,IAAI,KAAK,IAAI,OAAO,IAAI,GAAG,GAAG,IAAI,GAAG;EAAE,IAAI;CACjI,CAAC;AACF;;;;;;AAOA,IAAa,UAAU,gBAAwC;CAAE,IAAI;CAAgB,gBAAgB,CAAC;AAAG,CAAC;;;;;;AAO1G,IAAa,iBAAiB,kBAAiD,EAAE,IAAI,sBAAsB,CAAC;;;;;;AAO5G,IAAa,cAAc,mBAAmB,cAAc;CAAE,IAAI;CAAQ,OAAO;AAAO,IAAI,OAAO,SAAS,YAAY;CACvH,MAAM,WAAW,QAAQ,IAAI,QAAQ,KAAK;AAC3C,CAAC"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { type AbilityDef } from './defs';
|
|
2
|
+
import type { Entity } from './entity';
|
|
3
|
+
import type { Vec2 } from './math';
|
|
4
|
+
import type { GamePack } from './packs/pack';
|
|
5
|
+
import type { World } from './world';
|
|
6
|
+
/**
|
|
7
|
+
* The resources pack's id
|
|
8
|
+
*
|
|
9
|
+
* @beta
|
|
10
|
+
*/
|
|
11
|
+
export declare const RESOURCES = "core.resources";
|
|
12
|
+
/**
|
|
13
|
+
* What a unit holds of its pools (`UnitTypeDef.pools`): how much of each (`values`), the seconds since each was last
|
|
14
|
+
* spent or given (`quiet`, for its `decay`), the seconds each has been empty (`empty`, for its `reload`) and where the
|
|
15
|
+
* unit stood a tick ago (`at`, for what fills by walking)
|
|
16
|
+
*
|
|
17
|
+
* @beta
|
|
18
|
+
*/
|
|
19
|
+
export interface UnitPools {
|
|
20
|
+
/** How much it holds of each, by pool */
|
|
21
|
+
values: Record<string, number>;
|
|
22
|
+
/** Seconds since each was last spent or given, by pool */
|
|
23
|
+
quiet?: Record<string, number>;
|
|
24
|
+
/** Seconds each has been empty, for one that reloads */
|
|
25
|
+
empty?: Record<string, number>;
|
|
26
|
+
/** Where it stood a tick ago, for a pool that fills by walking */
|
|
27
|
+
at?: Vec2;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* What a unit holds of its pools (`UnitPools`): on every unit whose type has `pools`, from the moment it is made. Its
|
|
31
|
+
* players are told how much of each it holds (`values`, whole numbers), as they are of its mana
|
|
32
|
+
*
|
|
33
|
+
* @beta
|
|
34
|
+
*/
|
|
35
|
+
export declare const pools: import("./components").Component<UnitPools, Record<string, number>>;
|
|
36
|
+
/**
|
|
37
|
+
* How much a unit holds of one of its pools (`UnitTypeDef.pools`): 0 where it has none
|
|
38
|
+
*
|
|
39
|
+
* @beta
|
|
40
|
+
*/
|
|
41
|
+
export declare const poolOf: (entity: Entity, pool: string) => number;
|
|
42
|
+
/**
|
|
43
|
+
* Fills a pool of a unit by `amount` (empties it, under 0), as far as its bounds go, its thresholds' buffs put on and
|
|
44
|
+
* taken off, the time it decays after started over: what the `gain` effect does, and an ability's `cost` and `gain`.
|
|
45
|
+
* Nothing while a threshold's buff that `empties` it holds it still. How much it changed
|
|
46
|
+
*
|
|
47
|
+
* @beta
|
|
48
|
+
*/
|
|
49
|
+
export declare function changePool(world: World, entity: Entity, pool: string, amount: number): number;
|
|
50
|
+
/**
|
|
51
|
+
* What an ability costs a caster of its pools now (`AbilityDef.cost`, grown by `costGrowth`), by pool: none for an ability
|
|
52
|
+
* that costs nothing of them
|
|
53
|
+
*
|
|
54
|
+
* @beta
|
|
55
|
+
*/
|
|
56
|
+
export declare function poolCosts(caster: Entity, ability: AbilityDef, level: number): Record<string, number> | undefined;
|
|
57
|
+
/**
|
|
58
|
+
* Unit resources: what a game with it (`Rules.packs`) gets for pools beside mana. A unit type's `pools` (`PoolDef`: energy
|
|
59
|
+
* back each second, fury that decays when unused, heat that overheats at a threshold, flow filled by walking, ammo that
|
|
60
|
+
* reloads), an ability's `cost` of them (not ready with less, paid as it goes off) and `gain` (given as it goes off), costs
|
|
61
|
+
* that grow by a buff's stacks (`costGrowth`, mana too), an attack's cost (`attackCost`: no attack with less), buffs
|
|
62
|
+
* that drain a pool or mana each second while they last (`BuffDef.drain`), and the `gain` effect. `changePool`, `poolOf`
|
|
63
|
+
* and `poolCosts` in code
|
|
64
|
+
*
|
|
65
|
+
* @beta
|
|
66
|
+
*/
|
|
67
|
+
export declare function resourcesPack(): GamePack;
|