@v12-engine/engine 0.1.1 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/abilities/amounts.d.ts +28 -0
- package/dist/abilities/amounts.js +74 -0
- package/dist/abilities/amounts.js.map +1 -0
- package/dist/abilities/buffs.d.ts +106 -6
- package/dist/abilities/buffs.js +443 -0
- package/dist/abilities/buffs.js.map +1 -0
- package/dist/abilities/castTold.d.ts +2 -0
- package/dist/abilities/castTold.js +66 -0
- package/dist/abilities/castTold.js.map +1 -0
- package/dist/abilities/chance.d.ts +38 -0
- package/dist/abilities/chance.js +77 -0
- package/dist/abilities/chance.js.map +1 -0
- package/dist/abilities/charges.d.ts +18 -0
- package/dist/abilities/charges.js +101 -0
- package/dist/abilities/charges.js.map +1 -0
- package/dist/abilities/control.d.ts +28 -0
- package/dist/abilities/control.js +113 -0
- package/dist/abilities/control.js.map +1 -0
- package/dist/abilities/dispel.js +51 -0
- package/dist/abilities/dispel.js.map +1 -0
- package/dist/abilities/effectFields.d.ts +1 -1
- package/dist/abilities/effectFields.js +676 -0
- package/dist/abilities/effectFields.js.map +1 -0
- package/dist/abilities/effectIndex.d.ts +27 -0
- package/dist/abilities/effectIndex.js +64 -0
- package/dist/abilities/effectIndex.js.map +1 -0
- package/dist/abilities/effects/buff.d.ts +9 -3
- package/dist/abilities/effects/buff.js +84 -0
- package/dist/abilities/effects/buff.js.map +1 -0
- package/dist/abilities/effects/conditions.d.ts +2 -0
- package/dist/abilities/effects/conditions.js +41 -0
- package/dist/abilities/effects/conditions.js.map +1 -0
- package/dist/abilities/effects/core.js +54 -0
- package/dist/abilities/effects/core.js.map +1 -0
- package/dist/abilities/effects/damage.d.ts +1 -1
- package/dist/abilities/effects/damage.js +43 -0
- package/dist/abilities/effects/damage.js.map +1 -0
- package/dist/abilities/effects/heal.d.ts +2 -2
- package/dist/abilities/effects/heal.js +51 -0
- package/dist/abilities/effects/heal.js.map +1 -0
- package/dist/abilities/effects/missile.d.ts +13 -1
- package/dist/abilities/effects/missile.js +104 -0
- package/dist/abilities/effects/missile.js.map +1 -0
- package/dist/abilities/effects/morph.d.ts +5 -0
- package/dist/abilities/effects/morph.js +43 -0
- package/dist/abilities/effects/morph.js.map +1 -0
- package/dist/abilities/effects/moves.d.ts +16 -4
- package/dist/abilities/effects/moves.js +212 -0
- package/dist/abilities/effects/moves.js.map +1 -0
- package/dist/abilities/effects/passives.d.ts +19 -9
- package/dist/abilities/effects/passives.js +131 -0
- package/dist/abilities/effects/passives.js.map +1 -0
- package/dist/abilities/effects/proxy.d.ts +5 -0
- package/dist/abilities/effects/proxy.js +60 -0
- package/dist/abilities/effects/proxy.js.map +1 -0
- package/dist/abilities/effects/sight.d.ts +2 -2
- package/dist/abilities/effects/sight.js +39 -0
- package/dist/abilities/effects/sight.js.map +1 -0
- package/dist/abilities/effects/spawn.d.ts +5 -2
- package/dist/abilities/effects/spawn.js +40 -0
- package/dist/abilities/effects/spawn.js.map +1 -0
- package/dist/abilities/effects/timed.d.ts +2 -2
- package/dist/abilities/effects/timed.js +96 -0
- package/dist/abilities/effects/timed.js.map +1 -0
- package/dist/abilities/effects/trade.d.ts +1 -1
- package/dist/abilities/effects/trade.js +25 -0
- package/dist/abilities/effects/trade.js.map +1 -0
- package/dist/abilities/effects.d.ts +97 -23
- package/dist/abilities/effects.js +860 -0
- package/dist/abilities/effects.js.map +1 -0
- package/dist/abilities/land.d.ts +38 -4
- package/dist/abilities/land.js +189 -0
- package/dist/abilities/land.js.map +1 -0
- package/dist/abilities/recast.d.ts +45 -0
- package/dist/abilities/recast.js +118 -0
- package/dist/abilities/recast.js.map +1 -0
- package/dist/abilities/scaled.js +40 -0
- package/dist/abilities/scaled.js.map +1 -0
- package/dist/abilities/screen.d.ts +6 -0
- package/dist/abilities/screen.js +83 -0
- package/dist/abilities/screen.js.map +1 -0
- package/dist/abilities/shapes.d.ts +66 -0
- package/dist/abilities/shapes.js +122 -0
- package/dist/abilities/shapes.js.map +1 -0
- package/dist/abilities/text.d.ts +14 -2
- package/dist/abilities/text.js +204 -0
- package/dist/abilities/text.js.map +1 -0
- package/dist/abilities/triggers.d.ts +98 -0
- package/dist/abilities/triggers.js +351 -0
- package/dist/abilities/triggers.js.map +1 -0
- package/dist/abilityChanges.d.ts +131 -0
- package/dist/abilityChanges.js +345 -0
- package/dist/abilityChanges.js.map +1 -0
- package/dist/ai/area.d.ts +4 -1
- package/dist/ai/brain.d.ts +4 -1
- package/dist/ai/brain.js +844 -0
- package/dist/ai/brain.js.map +1 -0
- package/dist/ai/budget.js +74 -0
- package/dist/ai/budget.js.map +1 -0
- package/dist/ai/checks.d.ts +9 -1
- package/dist/ai/checks.js +242 -0
- package/dist/ai/checks.js.map +1 -0
- package/dist/ai/computer.d.ts +11 -4
- package/dist/ai/computer.js +251 -0
- package/dist/ai/computer.js.map +1 -0
- package/dist/ai/defence.d.ts +4 -0
- package/dist/ai/defence.js +430 -0
- package/dist/ai/defence.js.map +1 -0
- package/dist/ai/define.d.ts +3 -2
- package/dist/ai/define.js +31 -0
- package/dist/ai/define.js.map +1 -0
- package/dist/ai/economy.d.ts +10 -7
- package/dist/ai/economy.js +780 -0
- package/dist/ai/economy.js.map +1 -0
- package/dist/ai/geometry.js +38 -0
- package/dist/ai/geometry.js.map +1 -0
- package/dist/ai/goals.d.ts +1 -0
- package/dist/ai/goals.js +560 -0
- package/dist/ai/goals.js.map +1 -0
- package/dist/ai/knowledge.d.ts +72 -7
- package/dist/ai/knowledge.js +804 -0
- package/dist/ai/knowledge.js.map +1 -0
- package/dist/ai/lanes.d.ts +10 -2
- package/dist/ai/lanes.js +715 -0
- package/dist/ai/lanes.js.map +1 -0
- package/dist/ai/melee/build.js +264 -0
- package/dist/ai/melee/build.js.map +1 -0
- package/dist/ai/melee/goals.d.ts +7 -0
- package/dist/ai/melee/goals.js +720 -0
- package/dist/ai/melee/goals.js.map +1 -0
- package/dist/ai/melee/heroes.js +68 -0
- package/dist/ai/melee/heroes.js.map +1 -0
- package/dist/ai/melee/index.d.ts +1 -1
- package/dist/ai/melee/index.js +51 -0
- package/dist/ai/melee/index.js.map +1 -0
- package/dist/ai/melee/production.js +29 -0
- package/dist/ai/melee/production.js.map +1 -0
- package/dist/ai/melee/surrender.js +64 -0
- package/dist/ai/melee/surrender.js.map +1 -0
- package/dist/ai/micro.d.ts +9 -0
- package/dist/ai/micro.js +1316 -0
- package/dist/ai/micro.js.map +1 -0
- package/dist/ai/mission.d.ts +9 -2
- package/dist/ai/mission.js +538 -0
- package/dist/ai/mission.js.map +1 -0
- package/dist/ai/missionRules.d.ts +1 -1
- package/dist/ai/missionRules.js +26 -0
- package/dist/ai/missionRules.js.map +1 -0
- package/dist/ai/module.d.ts +6 -2
- package/dist/ai/module.js +37 -0
- package/dist/ai/module.js.map +1 -0
- package/dist/ai/options.d.ts +3 -3
- package/dist/ai/plans/build.d.ts +20 -1
- package/dist/ai/plans/build.js +608 -0
- package/dist/ai/plans/build.js.map +1 -0
- package/dist/ai/plans/placement.d.ts +4 -1
- package/dist/ai/plans/placement.js +295 -0
- package/dist/ai/plans/placement.js.map +1 -0
- package/dist/ai/plans/plans.d.ts +9 -0
- package/dist/ai/plans/plans.js +110 -0
- package/dist/ai/plans/plans.js.map +1 -0
- package/dist/ai/plans/production.d.ts +14 -2
- package/dist/ai/plans/production.js +434 -0
- package/dist/ai/plans/production.js.map +1 -0
- package/dist/ai/plans/purse.d.ts +6 -3
- package/dist/ai/plans/purse.js +139 -0
- package/dist/ai/plans/purse.js.map +1 -0
- package/dist/ai/plans/tech.d.ts +6 -0
- package/dist/ai/plans/tech.js +122 -0
- package/dist/ai/plans/tech.js.map +1 -0
- package/dist/ai/profiles.d.ts +4 -4
- package/dist/{profiles-B3NS9jwk.js → ai/profiles.js} +3 -98
- package/dist/ai/profiles.js.map +1 -0
- package/dist/ai/reach.js +54 -0
- package/dist/ai/reach.js.map +1 -0
- package/dist/ai/report.d.ts +8 -0
- package/dist/ai/report.js +87 -0
- package/dist/ai/report.js.map +1 -0
- package/dist/ai/roles.d.ts +4 -0
- package/dist/ai/roles.js +207 -0
- package/dist/ai/roles.js.map +1 -0
- package/dist/ai/rules.d.ts +8 -2
- package/dist/ai/rules.js +416 -0
- package/dist/ai/rules.js.map +1 -0
- package/dist/ai/scouting.d.ts +6 -0
- package/dist/ai/scouting.js +324 -0
- package/dist/ai/scouting.js.map +1 -0
- package/dist/ai/settings.js +99 -0
- package/dist/ai/settings.js.map +1 -0
- package/dist/ai/squads.d.ts +21 -2
- package/dist/ai/squads.js +916 -0
- package/dist/ai/squads.js.map +1 -0
- package/dist/ai/strength.js +320 -0
- package/dist/ai/strength.js.map +1 -0
- package/dist/ai/task.d.ts +3 -1
- package/dist/ai/task.js +17 -0
- package/dist/ai/task.js.map +1 -0
- package/dist/ai/tasks/attack.js +24 -0
- package/dist/ai/tasks/attack.js.map +1 -0
- package/dist/ai/tasks/capture.d.ts +3 -3
- package/dist/ai/tasks/capture.js +37 -0
- package/dist/ai/tasks/capture.js.map +1 -0
- package/dist/ai/tasks/creep.js +29 -0
- package/dist/ai/tasks/creep.js.map +1 -0
- package/dist/ai/tasks/defend.js +61 -0
- package/dist/ai/tasks/defend.js.map +1 -0
- package/dist/ai/tasks/drop.js +81 -0
- package/dist/ai/tasks/drop.js.map +1 -0
- package/dist/ai/tasks/escort.js +59 -0
- package/dist/ai/tasks/escort.js.map +1 -0
- package/dist/ai/tasks/gather.js +48 -0
- package/dist/ai/tasks/gather.js.map +1 -0
- package/dist/ai/tasks/harass.js +39 -0
- package/dist/ai/tasks/harass.js.map +1 -0
- package/dist/ai/tasks/hold.js +32 -0
- package/dist/ai/tasks/hold.js.map +1 -0
- package/dist/ai/tasks/index.js +34 -0
- package/dist/ai/tasks/index.js.map +1 -0
- package/dist/ai/tasks/move.js +26 -0
- package/dist/ai/tasks/move.js.map +1 -0
- package/dist/ai/tasks/patrol.js +59 -0
- package/dist/ai/tasks/patrol.js.map +1 -0
- package/dist/ai/tasks/retreat.js +28 -0
- package/dist/ai/tasks/retreat.js.map +1 -0
- package/dist/ai/tasks/scout.js +73 -0
- package/dist/ai/tasks/scout.js.map +1 -0
- package/dist/ai/tasks/shared.d.ts +1 -1
- package/dist/ai/tasks/shared.js +137 -0
- package/dist/ai/tasks/shared.js.map +1 -0
- package/dist/ai/team.d.ts +18 -1
- package/dist/ai/team.js +492 -0
- package/dist/ai/team.js.map +1 -0
- package/dist/ai/threat.d.ts +6 -0
- package/dist/ai/threat.js +206 -0
- package/dist/ai/threat.js.map +1 -0
- package/dist/ai/view.d.ts +21 -7
- package/dist/ai/view.js +677 -0
- package/dist/ai/view.js.map +1 -0
- package/dist/ai/waves.d.ts +6 -0
- package/dist/ai/waves.js +410 -0
- package/dist/ai/waves.js.map +1 -0
- package/dist/ai.js +54 -6239
- package/dist/aiTesting.d.ts +6 -3
- package/dist/aiTesting.js +229 -0
- package/dist/aiTesting.js.map +1 -0
- package/dist/areas.d.ts +4 -1
- package/dist/areas.js +295 -0
- package/dist/areas.js.map +1 -0
- package/dist/attacks.d.ts +3 -3
- package/dist/attacks.js +127 -0
- package/dist/attacks.js.map +1 -0
- package/dist/burning.d.ts +267 -0
- package/dist/burning.js +795 -0
- package/dist/burning.js.map +1 -0
- package/dist/bytes.js +21 -0
- package/dist/bytes.js.map +1 -0
- package/dist/callings.d.ts +71 -0
- package/dist/callings.js +157 -0
- package/dist/callings.js.map +1 -0
- package/dist/cameraOrders.d.ts +78 -0
- package/dist/cameraOrders.js +114 -0
- package/dist/cameraOrders.js.map +1 -0
- package/dist/camps.d.ts +70 -4
- package/dist/camps.js +501 -0
- package/dist/camps.js.map +1 -0
- package/dist/capture.d.ts +15 -3
- package/dist/capture.js +304 -0
- package/dist/capture.js.map +1 -0
- package/dist/cellLayers.d.ts +78 -13
- package/dist/cellLayers.js +275 -0
- package/dist/cellLayers.js.map +1 -0
- package/dist/cellPatches.d.ts +24 -0
- package/dist/cellPatches.js +73 -0
- package/dist/cellPatches.js.map +1 -0
- package/dist/cinematics.d.ts +10 -5
- package/dist/cinematics.js +161 -0
- package/dist/cinematics.js.map +1 -0
- package/dist/clock.d.ts +2 -2
- package/dist/clock.js +78 -0
- package/dist/clock.js.map +1 -0
- package/dist/commands.d.ts +36 -4
- package/dist/commands.js +636 -0
- package/dist/commands.js.map +1 -0
- package/dist/components.d.ts +31 -10
- package/dist/components.js +74 -0
- package/dist/components.js.map +1 -0
- package/dist/computers.d.ts +4 -4
- package/dist/computers.js +194 -0
- package/dist/computers.js.map +1 -0
- package/dist/concealment.d.ts +25 -2
- package/dist/concealment.js +409 -0
- package/dist/concealment.js.map +1 -0
- package/dist/coreComponents.js +130 -0
- package/dist/coreComponents.js.map +1 -0
- package/dist/createGame.d.ts +306 -0
- package/dist/createGame.js +405 -0
- package/dist/createGame.js.map +1 -0
- package/dist/dashing.d.ts +18 -2
- package/dist/dashing.js +41 -0
- package/dist/dashing.js.map +1 -0
- package/dist/debug.d.ts +8 -0
- package/dist/debug.js +5 -3
- package/dist/debug2.js +76 -0
- package/dist/debug2.js.map +1 -0
- package/dist/debugCommands.d.ts +6 -6
- package/dist/debugCommands.js +537 -0
- package/dist/debugCommands.js.map +1 -0
- package/dist/debugging.d.ts +1 -0
- package/dist/defaultSets.d.ts +183 -0
- package/dist/defaultSets.js +216 -0
- package/dist/defaultSets.js.map +1 -0
- package/dist/definitions.d.ts +6 -0
- package/dist/definitions.js +78 -0
- package/dist/definitions.js.map +1 -0
- package/dist/defs.d.ts +1895 -165
- package/dist/defs.js +380 -0
- package/dist/defs.js.map +1 -0
- package/dist/denying.d.ts +4 -4
- package/dist/denying.js +106 -0
- package/dist/denying.js.map +1 -0
- package/dist/destructibles.d.ts +2 -2
- package/dist/destructibles.js +36 -0
- package/dist/destructibles.js.map +1 -0
- package/dist/determinism.d.ts +4 -4
- package/dist/determinism.js +247 -0
- package/dist/determinism.js.map +1 -0
- package/dist/dialog.d.ts +17 -2
- package/dist/dialog.js +108 -0
- package/dist/dialog.js.map +1 -0
- package/dist/effectRefs.js +28 -0
- package/dist/effectRefs.js.map +1 -0
- package/dist/effects.d.ts +27 -11
- package/dist/effects.js +110 -0
- package/dist/effects.js.map +1 -0
- package/dist/endings.d.ts +1 -1
- package/dist/endings.js +78 -0
- package/dist/endings.js.map +1 -0
- package/dist/engagement.d.ts +40 -6
- package/dist/engagement.js +530 -0
- package/dist/engagement.js.map +1 -0
- package/dist/engineEvents.d.ts +72 -9
- package/dist/engineEvents.js +520 -0
- package/dist/engineEvents.js.map +1 -0
- package/dist/entity.d.ts +275 -26
- package/dist/entity.js +441 -0
- package/dist/entity.js.map +1 -0
- package/dist/entityIndex.d.ts +10 -3
- package/dist/entityIndex.js +149 -0
- package/dist/entityIndex.js.map +1 -0
- package/dist/errors.d.ts +6 -2
- package/dist/errors.js +59 -0
- package/dist/errors.js.map +1 -0
- package/dist/events.d.ts +11 -5
- package/dist/events.js +158 -0
- package/dist/events.js.map +1 -0
- package/dist/exactMath.js +273 -0
- package/dist/exactMath.js.map +1 -0
- package/dist/features.d.ts +1 -1
- package/dist/features.js +127 -0
- package/dist/features.js.map +1 -0
- package/dist/fields.d.ts +25 -5
- package/dist/fields.js +140 -0
- package/dist/fields.js.map +1 -0
- package/dist/fixture.d.ts +3 -3
- package/dist/fixture.js +512 -0
- package/dist/fixture.js.map +1 -0
- package/dist/fog.d.ts +26 -3
- package/dist/fog.js +333 -0
- package/dist/fog.js.map +1 -0
- package/dist/foliage.d.ts +476 -0
- package/dist/foliage.js +1478 -0
- package/dist/foliage.js.map +1 -0
- package/dist/foliageDebug.d.ts +57 -0
- package/dist/foliageDebug.js +172 -0
- package/dist/foliageDebug.js.map +1 -0
- package/dist/foliageRegrowth.d.ts +20 -0
- package/dist/foliageRegrowth.js +332 -0
- package/dist/foliageRegrowth.js.map +1 -0
- package/dist/formState.d.ts +67 -0
- package/dist/formState.js +65 -0
- package/dist/formState.js.map +1 -0
- package/dist/formation.d.ts +46 -8
- package/dist/formation.js +297 -0
- package/dist/formation.js.map +1 -0
- package/dist/forms.d.ts +58 -0
- package/dist/forms.js +146 -0
- package/dist/forms.js.map +1 -0
- package/dist/friendlyFire.d.ts +2 -2
- package/dist/friendlyFire.js +37 -0
- package/dist/friendlyFire.js.map +1 -0
- package/dist/game.d.ts +141 -48
- package/dist/game.js +834 -0
- package/dist/game.js.map +1 -0
- package/dist/gameData.d.ts +96 -22
- package/dist/gameData.js +1690 -0
- package/dist/gameData.js.map +1 -0
- package/dist/gameFiles.d.ts +3 -3
- package/dist/gameFiles.js +14 -0
- package/dist/gameFiles.js.map +1 -0
- package/dist/gates.js +92 -0
- package/dist/gates.js.map +1 -0
- package/dist/generate.d.ts +28 -1
- package/dist/generate.js +1062 -0
- package/dist/generate.js.map +1 -0
- package/dist/generateWorker.d.ts +7 -3
- package/dist/generateWorker.js +86 -0
- package/dist/generateWorker.js.map +1 -0
- package/dist/grid.d.ts +9 -0
- package/dist/grid.js +102 -0
- package/dist/grid.js.map +1 -0
- package/dist/ground.d.ts +17 -1
- package/dist/ground.js +375 -0
- package/dist/ground.js.map +1 -0
- package/dist/groundObjects.d.ts +70 -0
- package/dist/groundObjects.js +371 -0
- package/dist/groundObjects.js.map +1 -0
- package/dist/groundSpeed.d.ts +20 -3
- package/dist/groundSpeed.js +117 -0
- package/dist/groundSpeed.js.map +1 -0
- package/dist/hero.d.ts +126 -10
- package/dist/hero.js +432 -0
- package/dist/hero.js.map +1 -0
- package/dist/holds.d.ts +94 -0
- package/dist/holds.js +305 -0
- package/dist/holds.js.map +1 -0
- package/dist/home.d.ts +1 -1
- package/dist/home.js +30 -0
- package/dist/home.js.map +1 -0
- package/dist/hooks.d.ts +339 -57
- package/dist/hooks.js +105 -0
- package/dist/hooks.js.map +1 -0
- package/dist/hotReload.d.ts +6 -5
- package/dist/hotReload.js +145 -0
- package/dist/hotReload.js.map +1 -0
- package/dist/ids.d.ts +3 -3
- package/dist/ids.js +30 -0
- package/dist/ids.js.map +1 -0
- package/dist/idsFile.d.ts +36 -0
- package/dist/idsFile.js +134 -0
- package/dist/idsFile.js.map +1 -0
- package/dist/index.d.ts +105 -68
- package/dist/index.js +194 -4701
- package/dist/inspect.d.ts +29 -2
- package/dist/{inspect-D9dWHmZ0.js → inspect.js} +21 -12
- package/dist/inspect.js.map +1 -0
- package/dist/inventory.d.ts +14 -1
- package/dist/inventory.js +84 -0
- package/dist/inventory.js.map +1 -0
- package/dist/items.d.ts +136 -8
- package/dist/items.js +585 -0
- package/dist/items.js.map +1 -0
- package/dist/lanes.d.ts +12 -3
- package/dist/lanes.js +496 -0
- package/dist/lanes.js.map +1 -0
- package/dist/life.d.ts +6 -2
- package/dist/life.js +287 -0
- package/dist/life.js.map +1 -0
- package/dist/log.d.ts +26 -3
- package/dist/log.js +192 -0
- package/dist/log.js.map +1 -0
- package/dist/manaBurn.d.ts +2 -2
- package/dist/manaBurn.js +75 -0
- package/dist/manaBurn.js.map +1 -0
- package/dist/map/file.d.ts +56 -3
- package/dist/map/file.js +264 -0
- package/dist/map/file.js.map +1 -0
- package/dist/map/images.js +61 -0
- package/dist/map/images.js.map +1 -0
- package/dist/map/look.d.ts +1 -1
- package/dist/map/look.js +30 -0
- package/dist/map/look.js.map +1 -0
- package/dist/map/pathProfile.js +183 -0
- package/dist/map/pathProfile.js.map +1 -0
- package/dist/map/resize.d.ts +4 -0
- package/dist/map/resize.js +136 -0
- package/dist/map/resize.js.map +1 -0
- package/dist/map/schema.js +257 -0
- package/dist/map/schema.js.map +1 -0
- package/dist/map/terrain.js +214 -0
- package/dist/map/terrain.js.map +1 -0
- package/dist/map/types.d.ts +92 -13
- package/dist/map/types.js +251 -0
- package/dist/map/types.js.map +1 -0
- package/dist/mapCheck/cells.js +94 -0
- package/dist/mapCheck/cells.js.map +1 -0
- package/dist/mapCheck/rules/foliage.d.ts +9 -0
- package/dist/mapCheck/rules/foliage.js +83 -0
- package/dist/mapCheck/rules/foliage.js.map +1 -0
- package/dist/mapCheck/rules/names.js +39 -0
- package/dist/mapCheck/rules/names.js.map +1 -0
- package/dist/mapCheck/rules/objects.d.ts +1 -1
- package/dist/mapCheck/rules/objects.js +56 -0
- package/dist/mapCheck/rules/objects.js.map +1 -0
- package/dist/mapCheck/rules/paths.js +32 -0
- package/dist/mapCheck/rules/paths.js.map +1 -0
- package/dist/mapCheck/rules/players.js +20 -0
- package/dist/mapCheck/rules/players.js.map +1 -0
- package/dist/mapCheck/rules/races.js +56 -0
- package/dist/mapCheck/rules/races.js.map +1 -0
- package/dist/mapCheck/rules/random.js +47 -0
- package/dist/mapCheck/rules/random.js.map +1 -0
- package/dist/mapCheck/rules/regions.js +30 -0
- package/dist/mapCheck/rules/regions.js.map +1 -0
- package/dist/mapCheck/rules/targets.js +31 -0
- package/dist/mapCheck/rules/targets.js.map +1 -0
- package/dist/mapCheck/rules/walking.js +45 -0
- package/dist/mapCheck/rules/walking.js.map +1 -0
- package/dist/mapCheck.d.ts +2 -2
- package/dist/mapCheck.js +63 -0
- package/dist/mapCheck.js.map +1 -0
- package/dist/mapFields.d.ts +25 -2
- package/dist/mapFields.js +134 -0
- package/dist/mapFields.js.map +1 -0
- package/dist/mapFile.js +176 -0
- package/dist/mapFile.js.map +1 -0
- package/dist/mapMeasure.d.ts +8 -0
- package/dist/mapMeasure.js +283 -0
- package/dist/mapMeasure.js.map +1 -0
- package/dist/mapMerge.d.ts +1 -0
- package/dist/mapMerge.js +172 -0
- package/dist/mapMerge.js.map +1 -0
- package/dist/mapObjectives.js +138 -0
- package/dist/mapObjectives.js.map +1 -0
- package/dist/mapObjects.js +80 -0
- package/dist/mapObjects.js.map +1 -0
- package/dist/math.d.ts +37 -7
- package/dist/math.js +155 -0
- package/dist/math.js.map +1 -0
- package/dist/messages.d.ts +71 -4
- package/dist/messages.js +29 -0
- package/dist/messages.js.map +1 -0
- package/dist/missionRules.d.ts +10 -2
- package/dist/{missionRules-C-bGxm0Q.js → missionRules.js} +30 -150
- package/dist/missionRules.js.map +1 -0
- package/dist/mods.d.ts +39 -20
- package/dist/mods.js +271 -0
- package/dist/mods.js.map +1 -0
- package/dist/moves.d.ts +87 -0
- package/dist/moves.js +539 -0
- package/dist/moves.js.map +1 -0
- package/dist/names.d.ts +7 -0
- package/dist/names.js +122 -0
- package/dist/names.js.map +1 -0
- package/dist/navigation/agentParams.js +14 -0
- package/dist/navigation/agentParams.js.map +1 -0
- package/dist/navigation/air.d.ts +7 -3
- package/dist/navigation/air.js +401 -0
- package/dist/navigation/air.js.map +1 -0
- package/dist/navigation/builds.d.ts +34 -2
- package/dist/navigation/builds.js +287 -0
- package/dist/navigation/builds.js.map +1 -0
- package/dist/navigation/groundAreas.d.ts +59 -1
- package/dist/navigation/groundAreas.js +407 -0
- package/dist/navigation/groundAreas.js.map +1 -0
- package/dist/navigation/navigation.d.ts +98 -9
- package/dist/navigation/recast.d.ts +194 -18
- package/dist/navigation/recast.js +1379 -0
- package/dist/navigation/recast.js.map +1 -0
- package/dist/navigation/sidePaths.d.ts +8 -3
- package/dist/navigation/sidePaths.js +241 -0
- package/dist/navigation/sidePaths.js.map +1 -0
- package/dist/navigation/sized.js +243 -0
- package/dist/navigation/sized.js.map +1 -0
- package/dist/nearest.js +32 -0
- package/dist/nearest.js.map +1 -0
- package/dist/noise.js +59 -0
- package/dist/noise.js.map +1 -0
- package/dist/objectives.d.ts +12 -3
- package/dist/objectives.js +144 -0
- package/dist/objectives.js.map +1 -0
- package/dist/orders/basic.d.ts +5 -5
- package/dist/orders/basic.js +417 -0
- package/dist/orders/basic.js.map +1 -0
- package/dist/orders/build.js +278 -0
- package/dist/orders/build.js.map +1 -0
- package/dist/orders/cast.d.ts +13 -3
- package/dist/orders/cast.js +558 -0
- package/dist/orders/cast.js.map +1 -0
- package/dist/orders/facts.js +16 -0
- package/dist/orders/facts.js.map +1 -0
- package/dist/orders/harvest.d.ts +21 -5
- package/dist/orders/harvest.js +540 -0
- package/dist/orders/harvest.js.map +1 -0
- package/dist/orders/idle.d.ts +3 -1
- package/dist/orders/idle.js +234 -0
- package/dist/orders/idle.js.map +1 -0
- package/dist/orders/items.js +92 -0
- package/dist/orders/items.js.map +1 -0
- package/dist/orders/queue.js +108 -0
- package/dist/orders/queue.js.map +1 -0
- package/dist/orders/waiting.d.ts +39 -0
- package/dist/orders/waiting.js +149 -0
- package/dist/orders/waiting.js.map +1 -0
- package/dist/pack.schema.js +13 -0
- package/dist/pack.schema.js.map +1 -0
- package/dist/pack.schema.json +7622 -841
- package/dist/packs/director/index.d.ts +13 -5
- package/dist/packs/director/index.js +204 -0
- package/dist/packs/director/index.js.map +1 -0
- package/dist/packs/heroes/campaign.d.ts +3 -2
- package/dist/packs/heroes/campaign.js +241 -0
- package/dist/packs/heroes/campaign.js.map +1 -0
- package/dist/packs/heroes/carry.d.ts +6 -0
- package/dist/packs/heroes/carry.js +112 -0
- package/dist/packs/heroes/carry.js.map +1 -0
- package/dist/packs/heroes/commands.js +115 -0
- package/dist/packs/heroes/commands.js.map +1 -0
- package/dist/packs/heroes/fallen.d.ts +43 -0
- package/dist/packs/heroes/fallen.js +61 -0
- package/dist/packs/heroes/fallen.js.map +1 -0
- package/dist/packs/heroes/hire.js +60 -0
- package/dist/packs/heroes/hire.js.map +1 -0
- package/dist/packs/heroes/index.d.ts +7 -6
- package/dist/packs/heroes/index.js +130 -0
- package/dist/packs/heroes/index.js.map +1 -0
- package/dist/packs/heroes/loop.d.ts +95 -0
- package/dist/packs/heroes/loop.js +250 -0
- package/dist/packs/heroes/loop.js.map +1 -0
- package/dist/packs/heroes/making.d.ts +6 -3
- package/dist/packs/heroes/making.js +55 -0
- package/dist/packs/heroes/making.js.map +1 -0
- package/dist/packs/heroes/respawn.d.ts +3 -3
- package/dist/packs/heroes/respawn.js +87 -0
- package/dist/packs/heroes/respawn.js.map +1 -0
- package/dist/packs/heroes/sets.d.ts +32 -0
- package/dist/packs/heroes/sets.js +51 -0
- package/dist/packs/heroes/sets.js.map +1 -0
- package/dist/packs/heroes/spells.d.ts +16 -0
- package/dist/packs/heroes/spells.js +269 -0
- package/dist/packs/heroes/spells.js.map +1 -0
- package/dist/packs/items/defaults.d.ts +43 -0
- package/dist/packs/items/defaults.js +1504 -0
- package/dist/packs/items/defaults.js.map +1 -0
- package/dist/packs/items/index.d.ts +27 -0
- package/dist/packs/items/index.js +214 -0
- package/dist/packs/items/index.js.map +1 -0
- package/dist/packs/moba/index.d.ts +3 -3
- package/dist/packs/moba/index.js +174 -0
- package/dist/packs/moba/index.js.map +1 -0
- package/dist/packs/pack.d.ts +15 -15
- package/dist/packs/pack.js +14 -0
- package/dist/packs/pack.js.map +1 -0
- package/dist/packs.d.ts +15 -7
- package/dist/packs.js +222 -0
- package/dist/packs.js.map +1 -0
- package/dist/paths.d.ts +2 -0
- package/dist/paths.js +109 -0
- package/dist/paths.js.map +1 -0
- package/dist/plain.js +57 -0
- package/dist/plain.js.map +1 -0
- package/dist/player.d.ts +33 -10
- package/dist/player.js +159 -0
- package/dist/player.js.map +1 -0
- package/dist/portals.d.ts +1 -1
- package/dist/portals.js +194 -0
- package/dist/portals.js.map +1 -0
- package/dist/prefabs.d.ts +25 -2
- package/dist/prefabs.js +239 -0
- package/dist/prefabs.js.map +1 -0
- package/dist/presetBuildings.js +58 -0
- package/dist/presetBuildings.js.map +1 -0
- package/dist/presetFoliage.d.ts +27 -0
- package/dist/presetFoliage.js +98 -0
- package/dist/presetFoliage.js.map +1 -0
- package/dist/presetGround.js +65 -0
- package/dist/presetGround.js.map +1 -0
- package/dist/proxies.d.ts +12 -0
- package/dist/proxies.js +79 -0
- package/dist/proxies.js.map +1 -0
- package/dist/query.d.ts +56 -0
- package/dist/query.js +88 -0
- package/dist/query.js.map +1 -0
- package/dist/races.d.ts +15 -14
- package/dist/races.js +172 -0
- package/dist/races.js.map +1 -0
- package/dist/randomGroups.js +91 -0
- package/dist/randomGroups.js.map +1 -0
- package/dist/registry.d.ts +117 -53
- package/dist/registry.js +323 -0
- package/dist/registry.js.map +1 -0
- package/dist/remains.d.ts +11 -9
- package/dist/remains.js +188 -0
- package/dist/remains.js.map +1 -0
- package/dist/replication.d.ts +12 -7
- package/dist/replication.js +100 -0
- package/dist/replication.js.map +1 -0
- package/dist/rng.d.ts +2 -0
- package/dist/rng.js +40 -0
- package/dist/rng.js.map +1 -0
- package/dist/rules.d.ts +186 -99
- package/dist/rules.js +179 -0
- package/dist/rules.js.map +1 -0
- package/dist/rulesCheck.d.ts +5 -4
- package/dist/rulesCheck.js +693 -0
- package/dist/rulesCheck.js.map +1 -0
- package/dist/runes.d.ts +2 -2
- package/dist/runes.js +80 -0
- package/dist/runes.js.map +1 -0
- package/dist/save.d.ts +37 -12
- package/dist/save.js +532 -0
- package/dist/save.js.map +1 -0
- package/dist/scenario.d.ts +2 -2
- package/dist/scenario.js +99 -0
- package/dist/scenario.js.map +1 -0
- package/dist/scheduler.d.ts +3 -0
- package/dist/scheduler.js +156 -0
- package/dist/scheduler.js.map +1 -0
- package/dist/score.d.ts +19 -19
- package/dist/score.js +709 -0
- package/dist/score.js.map +1 -0
- package/dist/sequences.d.ts +10 -6
- package/dist/sequences.js +206 -0
- package/dist/sequences.js.map +1 -0
- package/dist/server/doorman.js +154 -0
- package/dist/server/doorman.js.map +1 -0
- package/dist/server/gameServer.d.ts +16 -1
- package/dist/server/gameServer.js +643 -0
- package/dist/server/gameServer.js.map +1 -0
- package/dist/server/index.d.ts +1 -1
- package/dist/server/lobby.js +199 -0
- package/dist/server/lobby.js.map +1 -0
- package/dist/server/log.js +18 -0
- package/dist/server/log.js.map +1 -0
- package/dist/server/match.js +267 -0
- package/dist/server/match.js.map +1 -0
- package/dist/server/mode.d.ts +18 -9
- package/dist/server/mode.js +220 -0
- package/dist/server/mode.js.map +1 -0
- package/dist/{navigation-worker.js → server/navigation-worker.js} +1 -1
- package/dist/server/navigation-worker.js.map +1 -0
- package/dist/server/navigation.js +39 -0
- package/dist/server/navigation.js.map +1 -0
- package/dist/server/ops.d.ts +4 -0
- package/dist/server/ops.js +137 -0
- package/dist/server/ops.js.map +1 -0
- package/dist/server/packs.d.ts +3 -3
- package/dist/server/packs.js +32 -0
- package/dist/server/packs.js.map +1 -0
- package/dist/server/ratings.d.ts +5 -0
- package/dist/server/ratings.js +104 -0
- package/dist/server/ratings.js.map +1 -0
- package/dist/server/relay.d.ts +12 -2
- package/dist/server/relay.js +144 -0
- package/dist/server/relay.js.map +1 -0
- package/dist/server/rooms.d.ts +9 -2
- package/dist/server/rooms.js +442 -0
- package/dist/server/rooms.js.map +1 -0
- package/dist/server/seat.js +116 -0
- package/dist/server/seat.js.map +1 -0
- package/dist/server/seatSettings.d.ts +3 -3
- package/dist/server/seatSettings.js +63 -0
- package/dist/server/seatSettings.js.map +1 -0
- package/dist/server/secret.js +13 -0
- package/dist/server/secret.js.map +1 -0
- package/dist/server/start.d.ts +13 -6
- package/dist/server/start.js +76 -0
- package/dist/server/start.js.map +1 -0
- package/dist/server/websocket.d.ts +9 -1
- package/dist/server/websocket.js +306 -0
- package/dist/server/websocket.js.map +1 -0
- package/dist/server.js +15 -2861
- package/dist/session/can.js +26 -0
- package/dist/session/can.js.map +1 -0
- package/dist/session/commandReplay.d.ts +8 -2
- package/dist/session/commandReplay.js +293 -0
- package/dist/session/commandReplay.js.map +1 -0
- package/dist/session/debug.js +151 -0
- package/dist/session/debug.js.map +1 -0
- package/dist/session/delay.js +62 -0
- package/dist/session/delay.js.map +1 -0
- package/dist/session/delta.d.ts +14 -1
- package/dist/session/delta.js +407 -0
- package/dist/session/delta.js.map +1 -0
- package/dist/session/entityState.js +415 -0
- package/dist/session/entityState.js.map +1 -0
- package/dist/session/local.d.ts +47 -5
- package/dist/session/local.js +670 -0
- package/dist/session/local.js.map +1 -0
- package/dist/session/memory.d.ts +20 -2
- package/dist/session/memory.js +131 -0
- package/dist/session/memory.js.map +1 -0
- package/dist/session/protocol.d.ts +325 -31
- package/dist/session/protocol.js +55 -0
- package/dist/session/protocol.js.map +1 -0
- package/dist/session/remote.d.ts +74 -12
- package/dist/session/remote.js +1394 -0
- package/dist/session/remote.js.map +1 -0
- package/dist/session/replay.d.ts +11 -2
- package/dist/session/replay.js +160 -0
- package/dist/session/replay.js.map +1 -0
- package/dist/session/seed.js +12 -0
- package/dist/session/seed.js.map +1 -0
- package/dist/session/share.d.ts +5 -1
- package/dist/session/share.js +94 -0
- package/dist/session/share.js.map +1 -0
- package/dist/session/socket.d.ts +1 -1
- package/dist/session/socket.js +29 -0
- package/dist/session/socket.js.map +1 -0
- package/dist/session/wire.d.ts +5 -0
- package/dist/session/wire.js +84 -0
- package/dist/session/wire.js.map +1 -0
- package/dist/session/worker.d.ts +77 -12
- package/dist/session/worker.js +499 -0
- package/dist/session/worker.js.map +1 -0
- package/dist/shared.d.ts +31 -5
- package/dist/shared.js +166 -0
- package/dist/shared.js.map +1 -0
- package/dist/sides.d.ts +9 -3
- package/dist/sides.js +149 -0
- package/dist/sides.js.map +1 -0
- package/dist/sight.js +85 -0
- package/dist/sight.js.map +1 -0
- package/dist/simulate-worker.js +1 -1
- package/dist/simulate.d.ts +12 -8
- package/dist/{simulate-oXBiw1Ff.js → simulate.js} +10 -11
- package/dist/simulate.js.map +1 -0
- package/dist/smart.js +77 -0
- package/dist/smart.js.map +1 -0
- package/dist/spatial.d.ts +32 -16
- package/dist/spatial.js +234 -0
- package/dist/spatial.js.map +1 -0
- package/dist/spawning.d.ts +1 -0
- package/dist/spawning.js +224 -0
- package/dist/spawning.js.map +1 -0
- package/dist/stances.d.ts +6 -3
- package/dist/stances.js +169 -0
- package/dist/stances.js.map +1 -0
- package/dist/start.d.ts +10 -10
- package/dist/start.js +75 -0
- package/dist/start.js.map +1 -0
- package/dist/stats.d.ts +42 -16
- package/dist/stats.js +290 -0
- package/dist/stats.js.map +1 -0
- package/dist/summoned.d.ts +52 -0
- package/dist/summoned.js +38 -0
- package/dist/summoned.js.map +1 -0
- package/dist/summons.d.ts +10 -13
- package/dist/summons.js +271 -0
- package/dist/summons.js.map +1 -0
- package/dist/systems/abilities.js +224 -0
- package/dist/systems/abilities.js.map +1 -0
- package/dist/systems/combat.d.ts +35 -1
- package/dist/systems/combat.js +677 -0
- package/dist/systems/combat.js.map +1 -0
- package/dist/systems/combatTold.d.ts +3 -1
- package/dist/systems/combatTold.js +85 -0
- package/dist/systems/combatTold.js.map +1 -0
- package/dist/systems/construction.js +80 -0
- package/dist/systems/construction.js.map +1 -0
- package/dist/systems/economy.d.ts +0 -6
- package/dist/systems/economy.js +128 -0
- package/dist/systems/economy.js.map +1 -0
- package/dist/systems/fog.d.ts +1 -1
- package/dist/systems/fog.js +120 -0
- package/dist/systems/fog.js.map +1 -0
- package/dist/systems/life.js +32 -0
- package/dist/systems/life.js.map +1 -0
- package/dist/systems/movement.d.ts +24 -12
- package/dist/systems/movement.js +1247 -0
- package/dist/systems/movement.js.map +1 -0
- package/dist/systems/orders.js +64 -0
- package/dist/systems/orders.js.map +1 -0
- package/dist/systems/production.js +322 -0
- package/dist/systems/production.js.map +1 -0
- package/dist/systems/productionQueue.js +120 -0
- package/dist/systems/productionQueue.js.map +1 -0
- package/dist/systems/victory.d.ts +1 -1
- package/dist/systems/victory.js +56 -0
- package/dist/systems/victory.js.map +1 -0
- package/dist/talk.d.ts +6 -6
- package/dist/talk.js +153 -0
- package/dist/talk.js.map +1 -0
- package/dist/targeting.d.ts +142 -0
- package/dist/targeting.js +49 -0
- package/dist/targeting.js.map +1 -0
- package/dist/tech.d.ts +20 -3
- package/dist/tech.js +239 -0
- package/dist/tech.js.map +1 -0
- package/dist/techTree.d.ts +7 -0
- package/dist/techTree.js +90 -0
- package/dist/techTree.js.map +1 -0
- package/dist/terrain.d.ts +59 -7
- package/dist/terrain.js +389 -0
- package/dist/terrain.js.map +1 -0
- package/dist/terrainSave.d.ts +6 -0
- package/dist/terrainSave.js +74 -0
- package/dist/terrainSave.js.map +1 -0
- package/dist/testing.d.ts +8 -7
- package/dist/testing.js +13 -739
- package/dist/testing.js.map +1 -1
- package/dist/tiles.d.ts +1 -1
- package/dist/tiles.js +43 -0
- package/dist/tiles.js.map +1 -0
- package/dist/timers.d.ts +29 -4
- package/dist/timers.js +242 -0
- package/dist/timers.js.map +1 -0
- package/dist/tomes.d.ts +4 -4
- package/dist/tomes.js +94 -0
- package/dist/tomes.js.map +1 -0
- package/dist/trade.js +103 -0
- package/dist/trade.js.map +1 -0
- package/dist/transport.d.ts +6 -1
- package/dist/transport.js +281 -0
- package/dist/transport.js.map +1 -0
- package/dist/tunables.d.ts +10 -3
- package/dist/tunables.js +56 -0
- package/dist/tunables.js.map +1 -0
- package/dist/unitResources.d.ts +67 -0
- package/dist/unitResources.js +266 -0
- package/dist/unitResources.js.map +1 -0
- package/dist/upkeep.d.ts +6 -1
- package/dist/upkeep.js +26 -0
- package/dist/upkeep.js.map +1 -0
- package/dist/veterancy.d.ts +8 -3
- package/dist/veterancy.js +131 -0
- package/dist/veterancy.js.map +1 -0
- package/dist/vision.d.ts +36 -0
- package/dist/vision.js +133 -0
- package/dist/vision.js.map +1 -0
- package/dist/walls.d.ts +1 -1
- package/dist/walls.js +278 -0
- package/dist/walls.js.map +1 -0
- package/dist/world.d.ts +606 -88
- package/dist/world.js +1263 -0
- package/dist/world.js.map +1 -0
- package/package.json +2 -2
- package/dist/ai.js.map +0 -1
- package/dist/attributes.d.ts +0 -66
- package/dist/brain-BvVdUhX8.js +0 -7659
- package/dist/brain-BvVdUhX8.js.map +0 -1
- package/dist/builds-C6LfgvEU.js +0 -460
- package/dist/builds-C6LfgvEU.js.map +0 -1
- package/dist/coreComponents-syuh2fPG.js +0 -5149
- package/dist/coreComponents-syuh2fPG.js.map +0 -1
- package/dist/debugCommands-CzjrSm66.js +0 -14739
- package/dist/debugCommands-CzjrSm66.js.map +0 -1
- package/dist/determinism-BCymQwiE.js +0 -518
- package/dist/determinism-BCymQwiE.js.map +0 -1
- package/dist/game-DiJEN-Ks.js +0 -5800
- package/dist/game-DiJEN-Ks.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/inspect-D9dWHmZ0.js.map +0 -1
- package/dist/local-Dkovq42k.js +0 -1379
- package/dist/local-Dkovq42k.js.map +0 -1
- package/dist/missionRules-C-bGxm0Q.js.map +0 -1
- package/dist/navigation-worker.js.map +0 -1
- package/dist/packs-g5thvmGn.js +0 -3199
- package/dist/packs-g5thvmGn.js.map +0 -1
- package/dist/profiles-B3NS9jwk.js.map +0 -1
- package/dist/server.js.map +0 -1
- package/dist/simulate-oXBiw1Ff.js.map +0 -1
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
//#region src/exactMath.ts
|
|
2
|
+
/**
|
|
3
|
+
* The maths the simulation does, the same to the last bit in every engine (determinism D3). JavaScript says exactly
|
|
4
|
+
* what `+`, `-`, `*`, `/` and `Math.sqrt` give, but not `Math.sin`, `Math.cos`, `Math.atan`, `Math.atan2` or
|
|
5
|
+
* `Math.hypot`: V8, SpiderMonkey and JavaScriptCore each have their own, and two versions of one can differ (Node 22's
|
|
6
|
+
* `atan2` and Chromium's do, in the last bit). These are fdlibm's (FreeBSD's msun), written with what is exact
|
|
7
|
+
* everywhere, so a world run in a page, in a worker, on a server or in a replay comes out the same.
|
|
8
|
+
*
|
|
9
|
+
* Within a unit in the last place of `Math`'s; they are not faster. What only draws (a view, an effect) has no need of
|
|
10
|
+
* them: what decides does
|
|
11
|
+
*/
|
|
12
|
+
/** The high 32 bits of a number as a double: its sign, its exponent and the top of its fraction */
|
|
13
|
+
var view = /* @__PURE__ */ new DataView(/* @__PURE__ */ new ArrayBuffer(8));
|
|
14
|
+
function highWord(x) {
|
|
15
|
+
view.setFloat64(0, x);
|
|
16
|
+
return view.getInt32(0);
|
|
17
|
+
}
|
|
18
|
+
var S1 = -.16666666666666632;
|
|
19
|
+
var S2 = .00833333333332249;
|
|
20
|
+
var S3 = -.0001984126982985795;
|
|
21
|
+
var S4 = 27557313707070068e-22;
|
|
22
|
+
var S5 = -2.5050760253406863e-8;
|
|
23
|
+
var S6 = 158969099521155e-24;
|
|
24
|
+
/** sin on [-π/4, π/4], of `x + y` where `y` is the tail of a reduced argument (`tail` false when there is none) */
|
|
25
|
+
function kernelSin(x, y, tail) {
|
|
26
|
+
const z = x * x;
|
|
27
|
+
const w = z * z;
|
|
28
|
+
const r = S2 + z * (S3 + z * S4) + z * w * (S5 + z * S6);
|
|
29
|
+
const v = z * x;
|
|
30
|
+
if (!tail) return x + v * (S1 + z * r);
|
|
31
|
+
return x - (z * (.5 * y - v * r) - y - v * S1);
|
|
32
|
+
}
|
|
33
|
+
var C1 = .0416666666666666;
|
|
34
|
+
var C2 = -.001388888888887411;
|
|
35
|
+
var C3 = 2480158728947673e-20;
|
|
36
|
+
var C4 = -2.7557314351390663e-7;
|
|
37
|
+
var C5 = 2.087572321298175e-9;
|
|
38
|
+
var C6 = -11359647557788195e-27;
|
|
39
|
+
/** cos on [-π/4, π/4], of `x + y` */
|
|
40
|
+
function kernelCos(x, y) {
|
|
41
|
+
const z = x * x;
|
|
42
|
+
let w = z * z;
|
|
43
|
+
const r = z * (C1 + z * (C2 + z * C3)) + w * w * (C4 + z * (C5 + z * C6));
|
|
44
|
+
const hz = .5 * z;
|
|
45
|
+
w = 1 - hz;
|
|
46
|
+
return w + (1 - w - hz + (z * r - x * y));
|
|
47
|
+
}
|
|
48
|
+
var INV_PIO2 = .6366197723675814;
|
|
49
|
+
var PIO2_1 = 1.5707963267341256;
|
|
50
|
+
var PIO2_1T = 6077100506506192e-26;
|
|
51
|
+
var PIO2_2 = 6077100506303966e-26;
|
|
52
|
+
var PIO2_2T = 20222662487959506e-37;
|
|
53
|
+
var PIO2_3 = 20222662487111665e-37;
|
|
54
|
+
var PIO2_3T = 84784276603689e-45;
|
|
55
|
+
var TWO_PI = 6.283185307179586;
|
|
56
|
+
/** 1.5 × 2⁵²: added and taken away, it rounds a number to the nearest integer, ties to even, in every engine */
|
|
57
|
+
var ROUNDER = 6755399441055744;
|
|
58
|
+
/** `x` less the nearest multiple of π/2: which multiple (`n`), and the rest as a head and a tail (`y0 + y1`) */
|
|
59
|
+
var reduced = {
|
|
60
|
+
n: 0,
|
|
61
|
+
y0: 0,
|
|
62
|
+
y1: 0
|
|
63
|
+
};
|
|
64
|
+
function reduce(x) {
|
|
65
|
+
if (Math.abs(x) > 1647099.3291652855) x -= TWO_PI * (x / TWO_PI + ROUNDER - ROUNDER);
|
|
66
|
+
const fn = x * INV_PIO2 + ROUNDER - ROUNDER;
|
|
67
|
+
let r = x - fn * PIO2_1;
|
|
68
|
+
let w = fn * PIO2_1T;
|
|
69
|
+
let y0 = r - w;
|
|
70
|
+
const j = highWord(x) >> 20 & 2047;
|
|
71
|
+
let i = j - (highWord(y0) >> 20 & 2047);
|
|
72
|
+
if (i > 16) {
|
|
73
|
+
let t = r;
|
|
74
|
+
w = fn * PIO2_2;
|
|
75
|
+
r = t - w;
|
|
76
|
+
w = fn * PIO2_2T - (t - r - w);
|
|
77
|
+
y0 = r - w;
|
|
78
|
+
i = j - (highWord(y0) >> 20 & 2047);
|
|
79
|
+
if (i > 49) {
|
|
80
|
+
t = r;
|
|
81
|
+
w = fn * PIO2_3;
|
|
82
|
+
r = t - w;
|
|
83
|
+
w = fn * PIO2_3T - (t - r - w);
|
|
84
|
+
y0 = r - w;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
reduced.n = fn;
|
|
88
|
+
reduced.y0 = y0;
|
|
89
|
+
reduced.y1 = r - y0 - w;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* The sine, the same in every engine (fdlibm's)
|
|
93
|
+
*
|
|
94
|
+
* @beta
|
|
95
|
+
*/
|
|
96
|
+
function sin(x) {
|
|
97
|
+
const ax = Math.abs(x);
|
|
98
|
+
if (ax <= .7853981633974483) return ax < 7.450580596923828e-9 ? x : kernelSin(x, 0, false);
|
|
99
|
+
if (!Number.isFinite(x)) return NaN;
|
|
100
|
+
reduce(x);
|
|
101
|
+
const { y0, y1 } = reduced;
|
|
102
|
+
switch (reduced.n & 3) {
|
|
103
|
+
case 0: return kernelSin(y0, y1, true);
|
|
104
|
+
case 1: return kernelCos(y0, y1);
|
|
105
|
+
case 2: return -kernelSin(y0, y1, true);
|
|
106
|
+
default: return -kernelCos(y0, y1);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* The cosine, the same in every engine (fdlibm's)
|
|
111
|
+
*
|
|
112
|
+
* @beta
|
|
113
|
+
*/
|
|
114
|
+
function cos(x) {
|
|
115
|
+
const ax = Math.abs(x);
|
|
116
|
+
if (ax <= .7853981633974483) return ax < 7.450580596923828e-9 ? 1 : kernelCos(x, 0);
|
|
117
|
+
if (!Number.isFinite(x)) return NaN;
|
|
118
|
+
reduce(x);
|
|
119
|
+
const { y0, y1 } = reduced;
|
|
120
|
+
switch (reduced.n & 3) {
|
|
121
|
+
case 0: return kernelCos(y0, y1);
|
|
122
|
+
case 1: return -kernelSin(y0, y1, true);
|
|
123
|
+
case 2: return -kernelCos(y0, y1);
|
|
124
|
+
default: return kernelSin(y0, y1, true);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
var ATAN_HI = [
|
|
128
|
+
.4636476090008061,
|
|
129
|
+
.7853981633974483,
|
|
130
|
+
.982793723247329,
|
|
131
|
+
1.5707963267948966
|
|
132
|
+
];
|
|
133
|
+
var ATAN_LO = [
|
|
134
|
+
22698777452961687e-33,
|
|
135
|
+
3061616997868383e-32,
|
|
136
|
+
13903311031230998e-33,
|
|
137
|
+
6123233995736766e-32
|
|
138
|
+
];
|
|
139
|
+
var AT = [
|
|
140
|
+
.3333333333333293,
|
|
141
|
+
-.19999999999876483,
|
|
142
|
+
.14285714272503466,
|
|
143
|
+
-.11111110405462356,
|
|
144
|
+
.09090887133436507,
|
|
145
|
+
-.0769187620504483,
|
|
146
|
+
.06661073137387531,
|
|
147
|
+
-.058335701337905735,
|
|
148
|
+
.049768779946159324,
|
|
149
|
+
-.036531572744216916,
|
|
150
|
+
.016285820115365782
|
|
151
|
+
];
|
|
152
|
+
/**
|
|
153
|
+
* The arctangent, the same in every engine (fdlibm's)
|
|
154
|
+
*
|
|
155
|
+
* @beta
|
|
156
|
+
*/
|
|
157
|
+
function atan(x) {
|
|
158
|
+
if (Number.isNaN(x)) return NaN;
|
|
159
|
+
const negative = x < 0 || Object.is(x, -0);
|
|
160
|
+
let ax = Math.abs(x);
|
|
161
|
+
if (ax >= 0x40000000000000000) return negative ? -(ATAN_HI[3] + ATAN_LO[3]) : ATAN_HI[3] + ATAN_LO[3];
|
|
162
|
+
let id;
|
|
163
|
+
if (ax < .4375) {
|
|
164
|
+
if (ax < 7.450580596923828e-9) return x;
|
|
165
|
+
id = -1;
|
|
166
|
+
ax = x;
|
|
167
|
+
} else if (ax < 1.1875) {
|
|
168
|
+
if (ax < .6875) {
|
|
169
|
+
id = 0;
|
|
170
|
+
ax = (2 * ax - 1) / (2 + ax);
|
|
171
|
+
} else {
|
|
172
|
+
id = 1;
|
|
173
|
+
ax = (ax - 1) / (ax + 1);
|
|
174
|
+
}
|
|
175
|
+
} else if (ax < 2.4375) {
|
|
176
|
+
id = 2;
|
|
177
|
+
ax = (ax - 1.5) / (1 + 1.5 * ax);
|
|
178
|
+
} else {
|
|
179
|
+
id = 3;
|
|
180
|
+
ax = -1 / ax;
|
|
181
|
+
}
|
|
182
|
+
const z = ax * ax;
|
|
183
|
+
const w = z * z;
|
|
184
|
+
const s1 = z * (AT[0] + w * (AT[2] + w * (AT[4] + w * (AT[6] + w * (AT[8] + w * AT[10])))));
|
|
185
|
+
const s2 = w * (AT[1] + w * (AT[3] + w * (AT[5] + w * (AT[7] + w * AT[9]))));
|
|
186
|
+
if (id < 0) return ax - ax * (s1 + s2);
|
|
187
|
+
const result = ATAN_HI[id] - (ax * (s1 + s2) - ATAN_LO[id] - ax);
|
|
188
|
+
return negative ? -result : result;
|
|
189
|
+
}
|
|
190
|
+
var PI = 3.141592653589793;
|
|
191
|
+
var PI_LO = 12246467991473532e-32;
|
|
192
|
+
var PI_O_2 = 1.5707963267948966;
|
|
193
|
+
var PI_O_4 = .7853981633974483;
|
|
194
|
+
/**
|
|
195
|
+
* The angle of a point from the x axis, `atan2(y, x)`, the same in every engine (fdlibm's)
|
|
196
|
+
*
|
|
197
|
+
* @beta
|
|
198
|
+
*/
|
|
199
|
+
function atan2(y, x) {
|
|
200
|
+
if (Number.isNaN(x) || Number.isNaN(y)) return NaN;
|
|
201
|
+
if (x === 1) return atan(y);
|
|
202
|
+
const yNegative = y < 0 || Object.is(y, -0);
|
|
203
|
+
const xNegative = x < 0 || Object.is(x, -0);
|
|
204
|
+
if (y === 0) return xNegative ? yNegative ? -3.141592653589793 : PI : y;
|
|
205
|
+
if (x === 0) return yNegative ? -1.5707963267948966 : PI_O_2;
|
|
206
|
+
if (!Number.isFinite(x)) {
|
|
207
|
+
if (!Number.isFinite(y)) {
|
|
208
|
+
const angle = xNegative ? 3 * PI_O_4 : PI_O_4;
|
|
209
|
+
return yNegative ? -angle : angle;
|
|
210
|
+
}
|
|
211
|
+
const angle = xNegative ? PI : 0;
|
|
212
|
+
return yNegative ? -angle : angle;
|
|
213
|
+
}
|
|
214
|
+
if (!Number.isFinite(y)) return yNegative ? -1.5707963267948966 : PI_O_2;
|
|
215
|
+
const ratio = Math.abs(y / x);
|
|
216
|
+
let z;
|
|
217
|
+
if (ratio > 0x1000000000000000) z = 1.5707963267948966;
|
|
218
|
+
else if (xNegative && ratio < 8673617379884035e-34) z = 0;
|
|
219
|
+
else z = atan(ratio);
|
|
220
|
+
if (!xNegative) return yNegative ? -z : z;
|
|
221
|
+
return yNegative ? z - PI_LO - PI : PI - (z - PI_LO);
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* The length of `(x, y)`, `√(x² + y²)`, the same in every engine (`Math.hypot` is not: it scales its arguments as each
|
|
225
|
+
* engine likes). For the lengths of a game, which are neither near 1e154 nor near 1e-154
|
|
226
|
+
*
|
|
227
|
+
* @beta
|
|
228
|
+
*/
|
|
229
|
+
var hypot = (x, y) => Math.sqrt(x * x + y * y);
|
|
230
|
+
var LN2 = .6931471805599453;
|
|
231
|
+
/** Terms of the series: at a remainder under half of ln 2, the next term is under 1e-24 of the sum, well under a double's last place */
|
|
232
|
+
var EXP_TERMS = 18;
|
|
233
|
+
/**
|
|
234
|
+
* e^x, the same in every engine (`Math.exp` is not: each has its own): `x` is split into a count of ln 2 and a
|
|
235
|
+
* remainder under half of one, the remainder's exponential is its Taylor series (adding and multiplying alone, which
|
|
236
|
+
* are exact everywhere), and the result is that doubled or halved the count of times. Within a few units in the last
|
|
237
|
+
* place of `Math.exp`'s; the point is sameness, not speed. What a response curve of the computer player's is made of
|
|
238
|
+
* (`curve.saturate`, AI plan B1)
|
|
239
|
+
*/
|
|
240
|
+
function exp(x) {
|
|
241
|
+
if (x !== x) return NaN;
|
|
242
|
+
if (x > 709.782712893384) return Infinity;
|
|
243
|
+
if (x < -745.1332191019412) return 0;
|
|
244
|
+
const k = Math.round(x / LN2);
|
|
245
|
+
const r = x - k * LN2;
|
|
246
|
+
let term = 1;
|
|
247
|
+
let sum = 1;
|
|
248
|
+
for (let i = 1; i <= EXP_TERMS; i++) {
|
|
249
|
+
term *= r / i;
|
|
250
|
+
sum += term;
|
|
251
|
+
}
|
|
252
|
+
if (k > 0) for (let i = 0; i < k; i++) sum *= 2;
|
|
253
|
+
else for (let i = 0; i < -k; i++) sum *= .5;
|
|
254
|
+
return sum;
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* The simulation's maths, the same in every engine: what a game's rules use in the place of `Math`'s, so that its
|
|
258
|
+
* worlds come out the same in a page, on a server and in a replay (`sin`, `cos`, `atan`, `atan2`, `hypot`, `exp`)
|
|
259
|
+
*
|
|
260
|
+
* @beta
|
|
261
|
+
*/
|
|
262
|
+
var exactMath = {
|
|
263
|
+
sin,
|
|
264
|
+
cos,
|
|
265
|
+
atan,
|
|
266
|
+
atan2,
|
|
267
|
+
hypot,
|
|
268
|
+
exp
|
|
269
|
+
};
|
|
270
|
+
//#endregion
|
|
271
|
+
export { atan, atan2, cos, exactMath, exp, hypot, sin };
|
|
272
|
+
|
|
273
|
+
//# sourceMappingURL=exactMath.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exactMath.js","names":[],"sources":["../src/exactMath.ts"],"sourcesContent":["/**\n * The maths the simulation does, the same to the last bit in every engine (determinism D3). JavaScript says exactly\n * what `+`, `-`, `*`, `/` and `Math.sqrt` give, but not `Math.sin`, `Math.cos`, `Math.atan`, `Math.atan2` or\n * `Math.hypot`: V8, SpiderMonkey and JavaScriptCore each have their own, and two versions of one can differ (Node 22's\n * `atan2` and Chromium's do, in the last bit). These are fdlibm's (FreeBSD's msun), written with what is exact\n * everywhere, so a world run in a page, in a worker, on a server or in a replay comes out the same.\n *\n * Within a unit in the last place of `Math`'s; they are not faster. What only draws (a view, an effect) has no need of\n * them: what decides does\n */\n\n/** The high 32 bits of a number as a double: its sign, its exponent and the top of its fraction */\nconst view = new DataView(new ArrayBuffer(8))\nfunction highWord(x: number): number {\n\tview.setFloat64(0, x)\n\treturn view.getInt32(0)\n}\n\n// ---- sin, cos (k_sin.c, k_cos.c, e_rem_pio2.c)\n\nconst S1 = -1.66666666666666324348e-1\nconst S2 = 8.33333333332248946124e-3\nconst S3 = -1.98412698298579493134e-4\nconst S4 = 2.75573137070700676789e-6\nconst S5 = -2.50507602534068634195e-8\nconst S6 = 1.58969099521155010221e-10\n\n/** sin on [-π/4, π/4], of `x + y` where `y` is the tail of a reduced argument (`tail` false when there is none) */\nfunction kernelSin(x: number, y: number, tail: boolean): number {\n\tconst z = x * x\n\tconst w = z * z\n\tconst r = S2 + z * (S3 + z * S4) + z * w * (S5 + z * S6)\n\tconst v = z * x\n\tif (!tail) return x + v * (S1 + z * r)\n\treturn x - (z * (0.5 * y - v * r) - y - v * S1)\n}\n\nconst C1 = 4.16666666666666019037e-2\nconst C2 = -1.38888888888741095749e-3\nconst C3 = 2.48015872894767294178e-5\nconst C4 = -2.75573143513906633035e-7\nconst C5 = 2.0875723212981748279e-9\nconst C6 = -1.13596475577881948265e-11\n\n/** cos on [-π/4, π/4], of `x + y` */\nfunction kernelCos(x: number, y: number): number {\n\tconst z = x * x\n\tlet w = z * z\n\tconst r = z * (C1 + z * (C2 + z * C3)) + w * w * (C4 + z * (C5 + z * C6))\n\tconst hz = 0.5 * z\n\tw = 1 - hz\n\treturn w + (1 - w - hz + (z * r - x * y))\n}\n\nconst INV_PIO2 = 6.36619772367581382433e-1\nconst PIO2_1 = 1.57079632673412561417\nconst PIO2_1T = 6.07710050650619224932e-11\nconst PIO2_2 = 6.0771005063039659766e-11\nconst PIO2_2T = 2.02226624879595063154e-21\nconst PIO2_3 = 2.0222662487111664558e-21\nconst PIO2_3T = 8.47842766036889956997e-32\nconst TWO_PI = 6.283185307179586\n/** 1.5 × 2⁵²: added and taken away, it rounds a number to the nearest integer, ties to even, in every engine */\nconst ROUNDER = 6755399441055744\n\n/** `x` less the nearest multiple of π/2: which multiple (`n`), and the rest as a head and a tail (`y0 + y1`) */\nconst reduced = { n: 0, y0: 0, y1: 0 }\nfunction reduce(x: number): void {\n\t// far out (more than 2²⁰·π/2), whole turns are taken off first: less exact than fdlibm's long reduction, as exact\n\t// in every engine, and an angle in a game is never there\n\tif (Math.abs(x) > 1647099.3291652855) x -= TWO_PI * (x / TWO_PI + ROUNDER - ROUNDER)\n\tconst fn = x * INV_PIO2 + ROUNDER - ROUNDER\n\tlet r = x - fn * PIO2_1\n\tlet w = fn * PIO2_1T\n\tlet y0 = r - w\n\tconst j = (highWord(x) >> 20) & 0x7ff\n\tlet i = j - ((highWord(y0) >> 20) & 0x7ff)\n\tif (i > 16) {\n\t\t// a second step, where the first took off nearly all of it\n\t\tlet t = r\n\t\tw = fn * PIO2_2\n\t\tr = t - w\n\t\tw = fn * PIO2_2T - (t - r - w)\n\t\ty0 = r - w\n\t\ti = j - ((highWord(y0) >> 20) & 0x7ff)\n\t\tif (i > 49) {\n\t\t\tt = r\n\t\t\tw = fn * PIO2_3\n\t\t\tr = t - w\n\t\t\tw = fn * PIO2_3T - (t - r - w)\n\t\t\ty0 = r - w\n\t\t}\n\t}\n\treduced.n = fn\n\treduced.y0 = y0\n\treduced.y1 = r - y0 - w\n}\n\n/**\n * The sine, the same in every engine (fdlibm's)\n *\n * @beta\n */\nexport function sin(x: number): number {\n\tconst ax = Math.abs(x)\n\tif (ax <= 0.7853981633974483) return ax < 7.450580596923828e-9 ? x : kernelSin(x, 0, false)\n\tif (!Number.isFinite(x)) return NaN\n\treduce(x)\n\tconst { y0, y1 } = reduced\n\tswitch (reduced.n & 3) {\n\t\tcase 0:\n\t\t\treturn kernelSin(y0, y1, true)\n\t\tcase 1:\n\t\t\treturn kernelCos(y0, y1)\n\t\tcase 2:\n\t\t\treturn -kernelSin(y0, y1, true)\n\t\tdefault:\n\t\t\treturn -kernelCos(y0, y1)\n\t}\n}\n\n/**\n * The cosine, the same in every engine (fdlibm's)\n *\n * @beta\n */\nexport function cos(x: number): number {\n\tconst ax = Math.abs(x)\n\tif (ax <= 0.7853981633974483) return ax < 7.450580596923828e-9 ? 1 : kernelCos(x, 0)\n\tif (!Number.isFinite(x)) return NaN\n\treduce(x)\n\tconst { y0, y1 } = reduced\n\tswitch (reduced.n & 3) {\n\t\tcase 0:\n\t\t\treturn kernelCos(y0, y1)\n\t\tcase 1:\n\t\t\treturn -kernelSin(y0, y1, true)\n\t\tcase 2:\n\t\t\treturn -kernelCos(y0, y1)\n\t\tdefault:\n\t\t\treturn kernelSin(y0, y1, true)\n\t}\n}\n\n// ---- atan, atan2 (s_atan.c, e_atan2.c)\n\nconst ATAN_HI = [4.63647609000806093515e-1, 7.85398163397448278999e-1, 9.82793723247329054082e-1, 1.570796326794896558]\nconst ATAN_LO = [2.26987774529616870924e-17, 3.06161699786838301793e-17, 1.39033110312309984516e-17, 6.12323399573676603587e-17]\nconst AT = [\n\t3.33333333333329318027e-1, -1.99999999998764832476e-1, 1.42857142725034663711e-1, -1.1111110405462355788e-1, 9.09088713343650656196e-2,\n\t-7.69187620504482999495e-2, 6.66107313738753120669e-2, -5.83357013379057348645e-2, 4.97687799461593236017e-2, -3.6531572744216915527e-2,\n\t1.62858201153657823623e-2\n]\n\n/**\n * The arctangent, the same in every engine (fdlibm's)\n *\n * @beta\n */\nexport function atan(x: number): number {\n\tif (Number.isNaN(x)) return NaN\n\tconst negative = x < 0 || Object.is(x, -0)\n\tlet ax = Math.abs(x)\n\tif (ax >= 7.378697629483821e19) return negative ? -(ATAN_HI[3] + ATAN_LO[3]) : ATAN_HI[3] + ATAN_LO[3]\n\tlet id: number\n\tif (ax < 0.4375) {\n\t\tif (ax < 7.450580596923828e-9) return x\n\t\tid = -1\n\t\tax = x\n\t} else if (ax < 1.1875) {\n\t\tif (ax < 0.6875) {\n\t\t\tid = 0\n\t\t\tax = (2 * ax - 1) / (2 + ax)\n\t\t} else {\n\t\t\tid = 1\n\t\t\tax = (ax - 1) / (ax + 1)\n\t\t}\n\t} else if (ax < 2.4375) {\n\t\tid = 2\n\t\tax = (ax - 1.5) / (1 + 1.5 * ax)\n\t} else {\n\t\tid = 3\n\t\tax = -1 / ax\n\t}\n\tconst z = ax * ax\n\tconst w = z * z\n\tconst s1 = z * (AT[0] + w * (AT[2] + w * (AT[4] + w * (AT[6] + w * (AT[8] + w * AT[10])))))\n\tconst s2 = w * (AT[1] + w * (AT[3] + w * (AT[5] + w * (AT[7] + w * AT[9]))))\n\tif (id < 0) return ax - ax * (s1 + s2)\n\tconst result = ATAN_HI[id] - (ax * (s1 + s2) - ATAN_LO[id] - ax)\n\treturn negative ? -result : result\n}\n\nconst PI = 3.141592653589793116\nconst PI_LO = 1.2246467991473531772e-16\nconst PI_O_2 = 1.570796326794896558\nconst PI_O_4 = 7.85398163397448279e-1\n\n/**\n * The angle of a point from the x axis, `atan2(y, x)`, the same in every engine (fdlibm's)\n *\n * @beta\n */\nexport function atan2(y: number, x: number): number {\n\tif (Number.isNaN(x) || Number.isNaN(y)) return NaN\n\tif (x === 1) return atan(y)\n\tconst yNegative = y < 0 || Object.is(y, -0)\n\tconst xNegative = x < 0 || Object.is(x, -0)\n\tif (y === 0) return xNegative ? (yNegative ? -PI : PI) : y\n\tif (x === 0) return yNegative ? -PI_O_2 : PI_O_2\n\tif (!Number.isFinite(x)) {\n\t\tif (!Number.isFinite(y)) {\n\t\t\tconst angle = xNegative ? 3 * PI_O_4 : PI_O_4\n\t\t\treturn yNegative ? -angle : angle\n\t\t}\n\t\tconst angle = xNegative ? PI : 0\n\t\treturn yNegative ? -angle : angle\n\t}\n\tif (!Number.isFinite(y)) return yNegative ? -PI_O_2 : PI_O_2\n\tconst ratio = Math.abs(y / x)\n\tlet z: number\n\tif (ratio > 1.152921504606847e18) z = PI_O_2 + 0.5 * PI_LO\n\telse if (xNegative && ratio < 8.673617379884035e-19) z = 0\n\telse z = atan(ratio)\n\tif (!xNegative) return yNegative ? -z : z\n\treturn yNegative ? z - PI_LO - PI : PI - (z - PI_LO)\n}\n\n/**\n * The length of `(x, y)`, `√(x² + y²)`, the same in every engine (`Math.hypot` is not: it scales its arguments as each\n * engine likes). For the lengths of a game, which are neither near 1e154 nor near 1e-154\n *\n * @beta\n */\nexport const hypot = (x: number, y: number): number => Math.sqrt(x * x + y * y)\n\n// ---- exp\n\nconst LN2 = 6.93147180559945286227e-1\n/** Terms of the series: at a remainder under half of ln 2, the next term is under 1e-24 of the sum, well under a double's last place */\nconst EXP_TERMS = 18\n\n/**\n * e^x, the same in every engine (`Math.exp` is not: each has its own): `x` is split into a count of ln 2 and a\n * remainder under half of one, the remainder's exponential is its Taylor series (adding and multiplying alone, which\n * are exact everywhere), and the result is that doubled or halved the count of times. Within a few units in the last\n * place of `Math.exp`'s; the point is sameness, not speed. What a response curve of the computer player's is made of\n * (`curve.saturate`, AI plan B1)\n */\nexport function exp(x: number): number {\n\tif (x !== x) return NaN\n\tif (x > 709.782712893384) return Infinity\n\tif (x < -745.1332191019412) return 0\n\tconst k = Math.round(x / LN2)\n\tconst r = x - k * LN2\n\tlet term = 1\n\tlet sum = 1\n\tfor (let i = 1; i <= EXP_TERMS; i++) {\n\t\tterm *= r / i\n\t\tsum += term\n\t}\n\t// 2^k by doubling or halving: a count of exact steps, never `**`\n\tif (k > 0) for (let i = 0; i < k; i++) sum *= 2\n\telse for (let i = 0; i < -k; i++) sum *= 0.5\n\treturn sum\n}\n\n/**\n * The simulation's maths, the same in every engine: what a game's rules use in the place of `Math`'s, so that its\n * worlds come out the same in a page, on a server and in a replay (`sin`, `cos`, `atan`, `atan2`, `hypot`, `exp`)\n *\n * @beta\n */\nexport const exactMath = { sin, cos, atan, atan2, hypot, exp } as const\n"],"mappings":";;;;;;;;;;;;AAYA,IAAM,uBAAO,IAAI,yBAAS,IAAI,YAAY,CAAC,CAAC;AAC5C,SAAS,SAAS,GAAmB;CACpC,KAAK,WAAW,GAAG,CAAC;CACpB,OAAO,KAAK,SAAS,CAAC;AACvB;AAIA,IAAM,KAAK;AACX,IAAM,KAAK;AACX,IAAM,KAAK;AACX,IAAM,KAAK;AACX,IAAM,KAAK;AACX,IAAM,KAAK;;AAGX,SAAS,UAAU,GAAW,GAAW,MAAuB;CAC/D,MAAM,IAAI,IAAI;CACd,MAAM,IAAI,IAAI;CACd,MAAM,IAAI,KAAK,KAAK,KAAK,IAAI,MAAM,IAAI,KAAK,KAAK,IAAI;CACrD,MAAM,IAAI,IAAI;CACd,IAAI,CAAC,MAAM,OAAO,IAAI,KAAK,KAAK,IAAI;CACpC,OAAO,KAAK,KAAK,KAAM,IAAI,IAAI,KAAK,IAAI,IAAI;AAC7C;AAEA,IAAM,KAAK;AACX,IAAM,KAAK;AACX,IAAM,KAAK;AACX,IAAM,KAAK;AACX,IAAM,KAAK;AACX,IAAM,KAAK;;AAGX,SAAS,UAAU,GAAW,GAAmB;CAChD,MAAM,IAAI,IAAI;CACd,IAAI,IAAI,IAAI;CACZ,MAAM,IAAI,KAAK,KAAK,KAAK,KAAK,IAAI,OAAO,IAAI,KAAK,KAAK,KAAK,KAAK,IAAI;CACrE,MAAM,KAAK,KAAM;CACjB,IAAI,IAAI;CACR,OAAO,KAAK,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI;AACvC;AAEA,IAAM,WAAW;AACjB,IAAM,SAAS;AACf,IAAM,UAAU;AAChB,IAAM,SAAS;AACf,IAAM,UAAU;AAChB,IAAM,SAAS;AACf,IAAM,UAAU;AAChB,IAAM,SAAS;;AAEf,IAAM,UAAU;;AAGhB,IAAM,UAAU;CAAE,GAAG;CAAG,IAAI;CAAG,IAAI;AAAE;AACrC,SAAS,OAAO,GAAiB;CAGhC,IAAI,KAAK,IAAI,CAAC,IAAI,oBAAoB,KAAK,UAAU,IAAI,SAAS,UAAU;CAC5E,MAAM,KAAK,IAAI,WAAW,UAAU;CACpC,IAAI,IAAI,IAAI,KAAK;CACjB,IAAI,IAAI,KAAK;CACb,IAAI,KAAK,IAAI;CACb,MAAM,IAAK,SAAS,CAAC,KAAK,KAAM;CAChC,IAAI,IAAI,KAAM,SAAS,EAAE,KAAK,KAAM;CACpC,IAAI,IAAI,IAAI;EAEX,IAAI,IAAI;EACR,IAAI,KAAK;EACT,IAAI,IAAI;EACR,IAAI,KAAK,WAAW,IAAI,IAAI;EAC5B,KAAK,IAAI;EACT,IAAI,KAAM,SAAS,EAAE,KAAK,KAAM;EAChC,IAAI,IAAI,IAAI;GACX,IAAI;GACJ,IAAI,KAAK;GACT,IAAI,IAAI;GACR,IAAI,KAAK,WAAW,IAAI,IAAI;GAC5B,KAAK,IAAI;EACV;CACD;CACA,QAAQ,IAAI;CACZ,QAAQ,KAAK;CACb,QAAQ,KAAK,IAAI,KAAK;AACvB;;;;;;AAOA,SAAgB,IAAI,GAAmB;CACtC,MAAM,KAAK,KAAK,IAAI,CAAC;CACrB,IAAI,MAAM,mBAAoB,OAAO,KAAK,uBAAuB,IAAI,UAAU,GAAG,GAAG,KAAK;CAC1F,IAAI,CAAC,OAAO,SAAS,CAAC,GAAG,OAAO;CAChC,OAAO,CAAC;CACR,MAAM,EAAE,IAAI,OAAO;CACnB,QAAQ,QAAQ,IAAI,GAApB;EACC,KAAK,GACJ,OAAO,UAAU,IAAI,IAAI,IAAI;EAC9B,KAAK,GACJ,OAAO,UAAU,IAAI,EAAE;EACxB,KAAK,GACJ,OAAO,CAAC,UAAU,IAAI,IAAI,IAAI;EAC/B,SACC,OAAO,CAAC,UAAU,IAAI,EAAE;CAC1B;AACD;;;;;;AAOA,SAAgB,IAAI,GAAmB;CACtC,MAAM,KAAK,KAAK,IAAI,CAAC;CACrB,IAAI,MAAM,mBAAoB,OAAO,KAAK,uBAAuB,IAAI,UAAU,GAAG,CAAC;CACnF,IAAI,CAAC,OAAO,SAAS,CAAC,GAAG,OAAO;CAChC,OAAO,CAAC;CACR,MAAM,EAAE,IAAI,OAAO;CACnB,QAAQ,QAAQ,IAAI,GAApB;EACC,KAAK,GACJ,OAAO,UAAU,IAAI,EAAE;EACxB,KAAK,GACJ,OAAO,CAAC,UAAU,IAAI,IAAI,IAAI;EAC/B,KAAK,GACJ,OAAO,CAAC,UAAU,IAAI,EAAE;EACzB,SACC,OAAO,UAAU,IAAI,IAAI,IAAI;CAC/B;AACD;AAIA,IAAM,UAAU;CAAC;CAA2B;CAA2B;CAA2B;AAAoB;AACtH,IAAM,UAAU;CAAC;CAA4B;CAA4B;CAA4B;AAA0B;AAC/H,IAAM,KAAK;CACV;CAA2B;CAA4B;CAA2B;CAA2B;CAC7G;CAA4B;CAA2B;CAA4B;CAA2B;CAC9G;AACD;;;;;;AAOA,SAAgB,KAAK,GAAmB;CACvC,IAAI,OAAO,MAAM,CAAC,GAAG,OAAO;CAC5B,MAAM,WAAW,IAAI,KAAK,OAAO,GAAG,GAAG,EAAE;CACzC,IAAI,KAAK,KAAK,IAAI,CAAC;CACnB,IAAI,MAAM,qBAAsB,OAAO,WAAW,EAAE,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ;CACpG,IAAI;CACJ,IAAI,KAAK,OAAQ;EAChB,IAAI,KAAK,sBAAsB,OAAO;EACtC,KAAK;EACL,KAAK;CACN,OAAO,IAAI,KAAK,QAAQ;EACvB,IAAI,KAAK,OAAQ;GAChB,KAAK;GACL,MAAM,IAAI,KAAK,MAAM,IAAI;EAC1B,OAAO;GACN,KAAK;GACL,MAAM,KAAK,MAAM,KAAK;EACvB;CACD,OAAO,IAAI,KAAK,QAAQ;EACvB,KAAK;EACL,MAAM,KAAK,QAAQ,IAAI,MAAM;CAC9B,OAAO;EACN,KAAK;EACL,KAAK,KAAK;CACX;CACA,MAAM,IAAI,KAAK;CACf,MAAM,IAAI,IAAI;CACd,MAAM,KAAK,KAAK,GAAG,KAAK,KAAK,GAAG,KAAK,KAAK,GAAG,KAAK,KAAK,GAAG,KAAK,KAAK,GAAG,KAAK,IAAI,GAAG;CACnF,MAAM,KAAK,KAAK,GAAG,KAAK,KAAK,GAAG,KAAK,KAAK,GAAG,KAAK,KAAK,GAAG,KAAK,IAAI,GAAG;CACtE,IAAI,KAAK,GAAG,OAAO,KAAK,MAAM,KAAK;CACnC,MAAM,SAAS,QAAQ,OAAO,MAAM,KAAK,MAAM,QAAQ,MAAM;CAC7D,OAAO,WAAW,CAAC,SAAS;AAC7B;AAEA,IAAM,KAAK;AACX,IAAM,QAAQ;AACd,IAAM,SAAS;AACf,IAAM,SAAS;;;;;;AAOf,SAAgB,MAAM,GAAW,GAAmB;CACnD,IAAI,OAAO,MAAM,CAAC,KAAK,OAAO,MAAM,CAAC,GAAG,OAAO;CAC/C,IAAI,MAAM,GAAG,OAAO,KAAK,CAAC;CAC1B,MAAM,YAAY,IAAI,KAAK,OAAO,GAAG,GAAG,EAAE;CAC1C,MAAM,YAAY,IAAI,KAAK,OAAO,GAAG,GAAG,EAAE;CAC1C,IAAI,MAAM,GAAG,OAAO,YAAa,YAAY,qBAAM,KAAM;CACzD,IAAI,MAAM,GAAG,OAAO,YAAY,sBAAU;CAC1C,IAAI,CAAC,OAAO,SAAS,CAAC,GAAG;EACxB,IAAI,CAAC,OAAO,SAAS,CAAC,GAAG;GACxB,MAAM,QAAQ,YAAY,IAAI,SAAS;GACvC,OAAO,YAAY,CAAC,QAAQ;EAC7B;EACA,MAAM,QAAQ,YAAY,KAAK;EAC/B,OAAO,YAAY,CAAC,QAAQ;CAC7B;CACA,IAAI,CAAC,OAAO,SAAS,CAAC,GAAG,OAAO,YAAY,sBAAU;CACtD,MAAM,QAAQ,KAAK,IAAI,IAAI,CAAC;CAC5B,IAAI;CACJ,IAAI,QAAQ,oBAAsB,IAAI;MACjC,IAAI,aAAa,QAAQ,sBAAuB,IAAI;MACpD,IAAI,KAAK,KAAK;CACnB,IAAI,CAAC,WAAW,OAAO,YAAY,CAAC,IAAI;CACxC,OAAO,YAAY,IAAI,QAAQ,KAAK,MAAM,IAAI;AAC/C;;;;;;;AAQA,IAAa,SAAS,GAAW,MAAsB,KAAK,KAAK,IAAI,IAAI,IAAI,CAAC;AAI9E,IAAM,MAAM;;AAEZ,IAAM,YAAY;;;;;;;;AASlB,SAAgB,IAAI,GAAmB;CACtC,IAAI,MAAM,GAAG,OAAO;CACpB,IAAI,IAAI,kBAAkB,OAAO;CACjC,IAAI,IAAI,oBAAoB,OAAO;CACnC,MAAM,IAAI,KAAK,MAAM,IAAI,GAAG;CAC5B,MAAM,IAAI,IAAI,IAAI;CAClB,IAAI,OAAO;CACX,IAAI,MAAM;CACV,KAAK,IAAI,IAAI,GAAG,KAAK,WAAW,KAAK;EACpC,QAAQ,IAAI;EACZ,OAAO;CACR;CAEA,IAAI,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK,OAAO;MACzC,KAAK,IAAI,IAAI,GAAG,IAAI,CAAC,GAAG,KAAK,OAAO;CACzC,OAAO;AACR;;;;;;;AAQA,IAAa,YAAY;CAAE;CAAK;CAAK;CAAM;CAAO;CAAO;AAAI"}
|
package/dist/features.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { type HookDef } from './hooks';
|
|
2
2
|
/**
|
|
3
3
|
* The rules the engine brings along, written as hook handlers like any game module's. A module can leave any
|
|
4
|
-
* of them out by id (`
|
|
4
|
+
* of them out by id (`Rules.withoutHooks`), or put its own in place of one by giving a handler the same id.
|
|
5
5
|
*
|
|
6
6
|
* @beta
|
|
7
7
|
*/
|
package/dist/features.js
ADDED
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { bounty } from "./engineEvents.js";
|
|
2
|
+
import { replicateEvent } from "./replication.js";
|
|
3
|
+
import { earn } from "./player.js";
|
|
4
|
+
import { engineMessage } from "./messages.js";
|
|
5
|
+
import { form } from "./formState.js";
|
|
6
|
+
import { defineHook } from "./hooks.js";
|
|
7
|
+
import { Path } from "./paths.js";
|
|
8
|
+
import { attackLanded, breakBuffs, carrierDied, castTriggers, damageTriggers, killTriggers } from "./abilities/triggers.js";
|
|
9
|
+
import { dropLoot } from "./items.js";
|
|
10
|
+
import { garrisonHooks } from "./transport.js";
|
|
11
|
+
import { summonHooks, worthless } from "./summons.js";
|
|
12
|
+
import { leaveForm } from "./forms.js";
|
|
13
|
+
//#region src/features.ts
|
|
14
|
+
/**
|
|
15
|
+
* The rules the engine brings along, written as hook handlers like any game module's. A module can leave any
|
|
16
|
+
* of them out by id (`Rules.withoutHooks`), or put its own in place of one by giving a handler the same id.
|
|
17
|
+
*
|
|
18
|
+
* @beta
|
|
19
|
+
*/
|
|
20
|
+
var coreHooks = [
|
|
21
|
+
defineHook({
|
|
22
|
+
hook: "canPlace",
|
|
23
|
+
id: "mapPathsClear",
|
|
24
|
+
run(world, event) {
|
|
25
|
+
if (event.cancelled) return;
|
|
26
|
+
const { site } = event;
|
|
27
|
+
for (const def of world.map.paths) {
|
|
28
|
+
if (!def.keepClear) continue;
|
|
29
|
+
const path = new Path(def.points, def.width);
|
|
30
|
+
for (let cz = Math.floor(site.z - site.hd); cz < Math.ceil(site.z + site.hd); cz++) for (let cx = Math.floor(site.x - site.hw); cx < Math.ceil(site.x + site.hw); cx++) {
|
|
31
|
+
if (!path.containsCell(cx, cz)) continue;
|
|
32
|
+
event.cancelled = true;
|
|
33
|
+
event.reason = engineMessage("cannotBuildThere");
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}),
|
|
39
|
+
defineHook({
|
|
40
|
+
hook: "beforeDeath",
|
|
41
|
+
id: "undying",
|
|
42
|
+
run(_world, event) {
|
|
43
|
+
if (!event.fromDamage || !event.entity.def.undying) return;
|
|
44
|
+
event.cancelled = true;
|
|
45
|
+
event.entity.health = Math.max(event.entity.health, 1);
|
|
46
|
+
}
|
|
47
|
+
}),
|
|
48
|
+
defineHook({
|
|
49
|
+
hook: "death",
|
|
50
|
+
id: "formEnds",
|
|
51
|
+
run(world, { entity }) {
|
|
52
|
+
if (entity.get(form)?.back.includes("death")) leaveForm(world, entity, "death");
|
|
53
|
+
}
|
|
54
|
+
}),
|
|
55
|
+
defineHook({
|
|
56
|
+
hook: "death",
|
|
57
|
+
id: "loot",
|
|
58
|
+
run(world, { entity, killer }) {
|
|
59
|
+
if (killer && world.areEnemies(killer.owner, entity.owner) && !worthless(entity)) dropLoot(world, entity, killer);
|
|
60
|
+
}
|
|
61
|
+
}),
|
|
62
|
+
defineHook({
|
|
63
|
+
hook: "death",
|
|
64
|
+
id: "bounty",
|
|
65
|
+
run(world, { entity, killer }) {
|
|
66
|
+
const { bounty: bounty$1 } = entity.def;
|
|
67
|
+
const { currency } = world.registry;
|
|
68
|
+
if (!bounty$1 || !currency || !killer || !world.areEnemies(killer.owner, entity.owner) || worthless(entity)) return;
|
|
69
|
+
const amount = world.rng.int(bounty$1[0], bounty$1[1]);
|
|
70
|
+
earn(world.player(killer.owner).resources, currency, amount);
|
|
71
|
+
world.events.emit(bounty, {
|
|
72
|
+
entity,
|
|
73
|
+
player: killer.owner,
|
|
74
|
+
amount
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
}),
|
|
78
|
+
defineHook({
|
|
79
|
+
hook: "afterDamage",
|
|
80
|
+
id: "onHit",
|
|
81
|
+
run(world, { target, source, attack, dealt }) {
|
|
82
|
+
if (attack && source?.alive) attackLanded(world, source, target, dealt);
|
|
83
|
+
}
|
|
84
|
+
}),
|
|
85
|
+
defineHook({
|
|
86
|
+
hook: "afterDamage",
|
|
87
|
+
id: "triggers",
|
|
88
|
+
run(world, event) {
|
|
89
|
+
damageTriggers(world, event);
|
|
90
|
+
}
|
|
91
|
+
}),
|
|
92
|
+
defineHook({
|
|
93
|
+
hook: "afterCast",
|
|
94
|
+
id: "onCast",
|
|
95
|
+
run(world, { caster, ability, item, charged }) {
|
|
96
|
+
if (!item && !charged) castTriggers(world, caster, ability);
|
|
97
|
+
if (caster.alive && caster.buffs.length) breakBuffs(world, caster, "cast", ability.id);
|
|
98
|
+
}
|
|
99
|
+
}),
|
|
100
|
+
defineHook({
|
|
101
|
+
hook: "death",
|
|
102
|
+
id: "onCarrierDeath",
|
|
103
|
+
run(world, { entity }) {
|
|
104
|
+
if (entity.buffs.length) carrierDied(world, entity);
|
|
105
|
+
}
|
|
106
|
+
}),
|
|
107
|
+
defineHook({
|
|
108
|
+
hook: "afterDeath",
|
|
109
|
+
id: "onKill",
|
|
110
|
+
run(world, { entity, killer, attack, carried }) {
|
|
111
|
+
if (killer?.alive && world.areEnemies(killer.owner, entity.owner)) killTriggers(world, killer, entity, attack, carried);
|
|
112
|
+
}
|
|
113
|
+
}),
|
|
114
|
+
...summonHooks,
|
|
115
|
+
...garrisonHooks
|
|
116
|
+
];
|
|
117
|
+
/** A bounty, to whoever got it */
|
|
118
|
+
var toldBounty = replicateEvent(bounty, "bounty", ({ entity, player, amount }, view) => player === view.player ? {
|
|
119
|
+
type: "bounty",
|
|
120
|
+
x: entity.pos.x,
|
|
121
|
+
z: entity.pos.z,
|
|
122
|
+
amount
|
|
123
|
+
} : void 0);
|
|
124
|
+
//#endregion
|
|
125
|
+
export { coreHooks, toldBounty };
|
|
126
|
+
|
|
127
|
+
//# sourceMappingURL=features.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"features.js","names":["bounty","bountyEvent"],"sources":["../src/features.ts"],"sourcesContent":["import { bounty as bountyEvent } from '#engine/engineEvents'\nimport { attackLanded, breakBuffs, carrierDied, castTriggers, damageTriggers, killTriggers } from './abilities/triggers'\nimport { garrisonHooks } from './transport'\nimport { summonHooks, worthless } from './summons'\nimport { leaveForm } from './forms'\nimport { form } from './formState'\nimport { defineHook, type HookDef } from './hooks'\nimport { dropLoot } from './items'\nimport { engineMessage } from './messages'\nimport { Path } from './paths'\nimport { earn } from './player'\nimport { replicateEvent } from './replication'\n\n/**\n * The rules the engine brings along, written as hook handlers like any game module's. A module can leave any\n * of them out by id (`Rules.withoutHooks`), or put its own in place of one by giving a handler the same id.\n *\n * @beta\n */\nexport const coreHooks: HookDef[] = [\n\tdefineHook({\n\t\thook: 'canPlace',\n\t\tid: 'mapPathsClear',\n\t\trun(world, event) {\n\t\t\t// nothing is built on a path of the map that says so (`MapPath.keepClear`): a road that has to stay open\n\t\t\tif (event.cancelled) return\n\t\t\tconst { site } = event\n\t\t\tfor (const def of world.map.paths) {\n\t\t\t\tif (!def.keepClear) continue\n\t\t\t\tconst path = new Path(def.points, def.width)\n\t\t\t\tfor (let cz = Math.floor(site.z - site.hd); cz < Math.ceil(site.z + site.hd); cz++) {\n\t\t\t\t\tfor (let cx = Math.floor(site.x - site.hw); cx < Math.ceil(site.x + site.hw); cx++) {\n\t\t\t\t\t\tif (!path.containsCell(cx, cz)) continue\n\t\t\t\t\t\tevent.cancelled = true\n\t\t\t\t\t\tevent.reason = engineMessage('cannotBuildThere')\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}),\n\tdefineHook({\n\t\thook: 'beforeDeath',\n\t\tid: 'undying',\n\t\trun(_world, event) {\n\t\t\t// what cannot die of damage is left standing with next to nothing\n\t\t\tif (!event.fromDamage || !event.entity.def.undying) return\n\t\t\tevent.cancelled = true\n\t\t\tevent.entity.health = Math.max(event.entity.health, 1)\n\t\t}\n\t}),\n\tdefineHook({\n\t\thook: 'death',\n\t\tid: 'formEnds',\n\t\trun(world, { entity }) {\n\t\t\t// a hero in a form that ends with its death falls as itself, and is brought back as itself\n\t\t\tif (entity.get(form)?.back.includes('death')) leaveForm(world, entity, 'death')\n\t\t}\n\t}),\n\tdefineHook({\n\t\thook: 'death',\n\t\tid: 'loot',\n\t\trun(world, { entity, killer }) {\n\t\t\tif (killer && world.areEnemies(killer.owner, entity.owner) && !worthless(entity)) dropLoot(world, entity, killer)\n\t\t}\n\t}),\n\tdefineHook({\n\t\thook: 'death',\n\t\tid: 'bounty',\n\t\trun(world, { entity, killer }) {\n\t\t\tconst { bounty } = entity.def\n\t\t\tconst { currency } = world.registry\n\t\t\tif (!bounty || !currency || !killer || !world.areEnemies(killer.owner, entity.owner) || worthless(entity)) return\n\t\t\tconst amount = world.rng.int(bounty[0], bounty[1])\n\t\t\tearn(world.player(killer.owner).resources, currency, amount)\n\t\t\tworld.events.emit(bountyEvent, { entity, player: killer.owner, amount })\n\t\t}\n\t}),\n\tdefineHook({\n\t\thook: 'afterDamage',\n\t\tid: 'onHit',\n\t\trun(world, { target, source, attack, dealt }) {\n\t\t\t// effects of an attack that hit and did not kill: a slow, a second strike... (counted and used up on a kill too)\n\t\t\tif (attack && source?.alive) attackLanded(world, source, target, dealt)\n\t\t}\n\t}),\n\tdefineHook({\n\t\thook: 'afterDamage',\n\t\tid: 'triggers',\n\t\trun(world, event) {\n\t\t\t// what the hurt one's passives do (thorns, a shield at low health), its source's on an ability's hit, the buffs it breaks\n\t\t\tdamageTriggers(world, event)\n\t\t}\n\t}),\n\tdefineHook({\n\t\thook: 'afterCast',\n\t\tid: 'onCast',\n\t\trun(world, { caster, ability, item, charged }) {\n\t\t\t// the caster's passives that react to its casts. What spends a charge does not count to the next one\n\t\t\tif (!item && !charged) castTriggers(world, caster, ability)\n\t\t\t// what breaks on a cast, but what the cast itself put on\n\t\t\tif (caster.alive && caster.buffs.length) breakBuffs(world, caster, 'cast', ability.id)\n\t\t}\n\t}),\n\tdefineHook({\n\t\thook: 'death',\n\t\tid: 'onCarrierDeath',\n\t\trun(world, { entity }) {\n\t\t\t// what the buffs on the one who dies leave where it falls (Doom's demon), while it still stands there\n\t\t\tif (entity.buffs.length) carrierDied(world, entity)\n\t\t}\n\t}),\n\tdefineHook({\n\t\thook: 'afterDeath',\n\t\tid: 'onKill',\n\t\trun(world, { entity, killer, attack, carried }) {\n\t\t\tif (killer?.alive && world.areEnemies(killer.owner, entity.owner)) killTriggers(world, killer, entity, attack, carried)\n\t\t}\n\t}),\n\t...summonHooks,\n\t...garrisonHooks\n]\n\n/** A bounty, to whoever got it */\nexport const toldBounty = replicateEvent(bountyEvent, 'bounty', ({ entity, player, amount }, view) =>\n\tplayer === view.player ? { type: 'bounty', x: entity.pos.x, z: entity.pos.z, amount } : undefined\n)\n"],"mappings":"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"}
|
package/dist/fields.d.ts
CHANGED
|
@@ -34,7 +34,11 @@ export type Checked<F extends Fields> = {
|
|
|
34
34
|
} & {
|
|
35
35
|
[K in OptionalKeys<F>]?: Exclude<Out<F[K]>, undefined>;
|
|
36
36
|
};
|
|
37
|
-
/**
|
|
37
|
+
/**
|
|
38
|
+
* The error a checker throws for a value that is not what was wanted; its message says where and what
|
|
39
|
+
*
|
|
40
|
+
* @beta
|
|
41
|
+
*/
|
|
38
42
|
export declare class Invalid extends Error {
|
|
39
43
|
}
|
|
40
44
|
/**
|
|
@@ -43,7 +47,11 @@ export declare class Invalid extends Error {
|
|
|
43
47
|
* @beta
|
|
44
48
|
*/
|
|
45
49
|
export declare const isObject: (value: unknown) => value is Record<string, unknown>;
|
|
46
|
-
/**
|
|
50
|
+
/**
|
|
51
|
+
* Checks a value is true or false and gives it, or throws `Invalid`
|
|
52
|
+
*
|
|
53
|
+
* @beta
|
|
54
|
+
*/
|
|
47
55
|
export declare const bool: Check<boolean>;
|
|
48
56
|
/**
|
|
49
57
|
* Any finite number
|
|
@@ -87,11 +95,23 @@ export declare const rgb: Check<[number, number, number]>;
|
|
|
87
95
|
* @beta
|
|
88
96
|
*/
|
|
89
97
|
export declare const list: Check<unknown[]>;
|
|
90
|
-
/**
|
|
98
|
+
/**
|
|
99
|
+
* Checks a value is text of at most 200 characters and gives it, or throws `Invalid`
|
|
100
|
+
*
|
|
101
|
+
* @beta
|
|
102
|
+
*/
|
|
91
103
|
export declare const string: Check<string>;
|
|
92
|
-
/**
|
|
104
|
+
/**
|
|
105
|
+
* Checks a value is a list of at most 1000 entity ids and gives it, or throws `Invalid`
|
|
106
|
+
*
|
|
107
|
+
* @beta
|
|
108
|
+
*/
|
|
93
109
|
export declare const ids: Check<number[]>;
|
|
94
|
-
/**
|
|
110
|
+
/**
|
|
111
|
+
* Checks a value is a point `{ x, z }` of numbers and gives it, or throws `Invalid`
|
|
112
|
+
*
|
|
113
|
+
* @beta
|
|
114
|
+
*/
|
|
95
115
|
export declare const point: Check<Vec2>;
|
|
96
116
|
/**
|
|
97
117
|
* What may be left out
|
package/dist/fields.js
ADDED
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
//#region src/fields.ts
|
|
2
|
+
/**
|
|
3
|
+
* The error a checker throws for a value that is not what was wanted; its message says where and what
|
|
4
|
+
*
|
|
5
|
+
* @beta
|
|
6
|
+
*/
|
|
7
|
+
var Invalid = class extends Error {};
|
|
8
|
+
var fail = (path, wanted) => {
|
|
9
|
+
throw new Invalid(`${path} is ${wanted}`);
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Whether a value is a plain object (not a list, not null): what most of a file's fields are
|
|
13
|
+
*
|
|
14
|
+
* @beta
|
|
15
|
+
*/
|
|
16
|
+
var isObject = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
17
|
+
/** The longest string accepted. Ids and names are short; nothing needs more */
|
|
18
|
+
var MAX_STRING = 200;
|
|
19
|
+
/** The most ids accepted in one list: more than anyone can select */
|
|
20
|
+
var MAX_IDS = 1e3;
|
|
21
|
+
/**
|
|
22
|
+
* Checks a value is true or false and gives it, or throws `Invalid`
|
|
23
|
+
*
|
|
24
|
+
* @beta
|
|
25
|
+
*/
|
|
26
|
+
var bool = (value, path) => typeof value === "boolean" ? value : fail(path, "true or false");
|
|
27
|
+
/**
|
|
28
|
+
* Any finite number
|
|
29
|
+
*
|
|
30
|
+
* @beta
|
|
31
|
+
*/
|
|
32
|
+
var number = (value, path) => typeof value === "number" && Number.isFinite(value) ? value : fail(path, "a number");
|
|
33
|
+
/**
|
|
34
|
+
* A whole number, 0 or more
|
|
35
|
+
*
|
|
36
|
+
* @beta
|
|
37
|
+
*/
|
|
38
|
+
var index = (value, path) => Number.isInteger(value) && value >= 0 ? value : fail(path, "a whole number, 0 or more");
|
|
39
|
+
/**
|
|
40
|
+
* The id of an entity or a player
|
|
41
|
+
*
|
|
42
|
+
* @beta
|
|
43
|
+
*/
|
|
44
|
+
var id = (value, path) => Number.isInteger(value) && value >= 0 ? value : fail(path, "an id");
|
|
45
|
+
/**
|
|
46
|
+
* Any number of seconds: a finite number, not below 0
|
|
47
|
+
*
|
|
48
|
+
* @beta
|
|
49
|
+
*/
|
|
50
|
+
var seconds = (value, path) => {
|
|
51
|
+
const n = number(value, path);
|
|
52
|
+
return n >= 0 ? n : fail(path, "a number of seconds, not below 0");
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* Words of any length: what a file says (a line of dialog, a name), not what a player sends (`string`)
|
|
56
|
+
*
|
|
57
|
+
* @beta
|
|
58
|
+
*/
|
|
59
|
+
var text = (value, path) => typeof value === "string" ? value : fail(path, "text");
|
|
60
|
+
/**
|
|
61
|
+
* A colour as the client draws it: `[r, g, b]`, each a number
|
|
62
|
+
*
|
|
63
|
+
* @beta
|
|
64
|
+
*/
|
|
65
|
+
var rgb = (value, path) => Array.isArray(value) && value.length === 3 && value.every((n) => typeof n === "number" && Number.isFinite(n)) ? [
|
|
66
|
+
value[0],
|
|
67
|
+
value[1],
|
|
68
|
+
value[2]
|
|
69
|
+
] : fail(path, "a colour: [r, g, b]");
|
|
70
|
+
/**
|
|
71
|
+
* A list of anything, or none for one left out: each of its values checked by the caller, by its own path
|
|
72
|
+
*
|
|
73
|
+
* @beta
|
|
74
|
+
*/
|
|
75
|
+
var list = (value, path) => value === void 0 ? [] : Array.isArray(value) ? value : fail(path, "a list");
|
|
76
|
+
/**
|
|
77
|
+
* Checks a value is text of at most 200 characters and gives it, or throws `Invalid`
|
|
78
|
+
*
|
|
79
|
+
* @beta
|
|
80
|
+
*/
|
|
81
|
+
var string = (value, path) => typeof value === "string" && value.length <= MAX_STRING ? value : fail(path, `text of at most ${MAX_STRING} characters`);
|
|
82
|
+
/**
|
|
83
|
+
* Checks a value is a list of at most 1000 entity ids and gives it, or throws `Invalid`
|
|
84
|
+
*
|
|
85
|
+
* @beta
|
|
86
|
+
*/
|
|
87
|
+
var ids = (value, path) => {
|
|
88
|
+
if (!Array.isArray(value) || value.length > MAX_IDS) fail(path, `a list of at most ${MAX_IDS} ids`);
|
|
89
|
+
return value.map((item, i) => id(item, `${path}[${i}]`));
|
|
90
|
+
};
|
|
91
|
+
/**
|
|
92
|
+
* Checks a value is a point `{ x, z }` of numbers and gives it, or throws `Invalid`
|
|
93
|
+
*
|
|
94
|
+
* @beta
|
|
95
|
+
*/
|
|
96
|
+
var point = (value, path) => {
|
|
97
|
+
if (typeof value !== "object" || value === null) fail(path, "a point: { x, z }");
|
|
98
|
+
const { x, z } = value;
|
|
99
|
+
return {
|
|
100
|
+
x: number(x, `${path}.x`),
|
|
101
|
+
z: number(z, `${path}.z`)
|
|
102
|
+
};
|
|
103
|
+
};
|
|
104
|
+
/**
|
|
105
|
+
* What may be left out
|
|
106
|
+
*
|
|
107
|
+
* @beta
|
|
108
|
+
*/
|
|
109
|
+
function optional(check) {
|
|
110
|
+
return (value, path) => value === void 0 ? void 0 : check(value, path);
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* One of a few fixed values
|
|
114
|
+
*
|
|
115
|
+
* @beta
|
|
116
|
+
*/
|
|
117
|
+
function oneOf(...values) {
|
|
118
|
+
return (value, path) => values.includes(value) ? value : fail(path, `one of ${values.join(", ")}`);
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* An object with these fields. Fields that are not asked for are dropped, so nothing unchecked gets through
|
|
122
|
+
*
|
|
123
|
+
* @beta
|
|
124
|
+
*/
|
|
125
|
+
function object(fields) {
|
|
126
|
+
return (value, path) => {
|
|
127
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) fail(path, "an object");
|
|
128
|
+
const source = value;
|
|
129
|
+
const result = {};
|
|
130
|
+
for (const key in fields) {
|
|
131
|
+
const checked = fields[key](source[key], path ? `${path}.${key}` : key);
|
|
132
|
+
if (checked !== void 0) result[key] = checked;
|
|
133
|
+
}
|
|
134
|
+
return result;
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
//#endregion
|
|
138
|
+
export { Invalid, bool, id, ids, index, isObject, list, number, object, oneOf, optional, point, rgb, seconds, string, text };
|
|
139
|
+
|
|
140
|
+
//# sourceMappingURL=fields.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fields.js","names":[],"sources":["../src/fields.ts"],"sourcesContent":["import type { Vec2 } from './math'\n\n/**\n * Checkers for what comes in from the outside, like the commands of a player. On a server that is whatever\n * anyone sends, so nothing is taken on trust: a checker either hands back the value as the type it promises,\n * or throws `Invalid` saying what is wrong with it, and where (`td.intro.lanes[2].items[0].at is a number`): the\n * commands of a player, a cinematic's file, a lane's own items and the game's other files are checked by these alike.\n *\n * ```ts\n * const fields = { building: id, unitType: string, queue: optional(bool) }\n * type Fields = Checked<typeof fields> // { building: number; unitType: string; queue?: boolean }\n * ```\n *\n * @beta\n */\nexport type Check<T> = (value: unknown, path: string) => T\n\n/**\n * A set of named checkers: what an object must have\n *\n * @beta\n */\nexport type Fields = Record<string, Check<unknown>>\n\ntype Out<C> = C extends Check<infer T> ? T : never\n/** The fields a checker lets be left out: the ones it may hand back `undefined` for */\ntype OptionalKeys<F extends Fields> = { [K in keyof F]: undefined extends Out<F[K]> ? K : never }[keyof F]\n\n/**\n * The type a set of checkers hands back. Fields that may be left out are optional\n *\n * @beta\n */\nexport type Checked<F extends Fields> = {\n\t[K in keyof F as K extends OptionalKeys<F> ? never : K]: Out<F[K]>\n} & {\n\t[K in OptionalKeys<F>]?: Exclude<Out<F[K]>, undefined>\n}\n\n/**\n * The error a checker throws for a value that is not what was wanted; its message says where and what\n *\n * @beta\n */\nexport class Invalid extends Error {}\n\nconst fail = (path: string, wanted: string): never => {\n\tthrow new Invalid(`${path} is ${wanted}`)\n}\n\n/**\n * Whether a value is a plain object (not a list, not null): what most of a file's fields are\n *\n * @beta\n */\nexport const isObject = (value: unknown): value is Record<string, unknown> => typeof value === 'object' && value !== null && !Array.isArray(value)\n\n/** The longest string accepted. Ids and names are short; nothing needs more */\nconst MAX_STRING = 200\n/** The most ids accepted in one list: more than anyone can select */\nconst MAX_IDS = 1000\n\n/**\n * Checks a value is true or false and gives it, or throws `Invalid`\n *\n * @beta\n */\nexport const bool: Check<boolean> = (value, path) => (typeof value === 'boolean' ? value : fail(path, 'true or false'))\n\n/**\n * Any finite number\n *\n * @beta\n */\nexport const number: Check<number> = (value, path) => (typeof value === 'number' && Number.isFinite(value) ? value : fail(path, 'a number'))\n\n/**\n * A whole number, 0 or more\n *\n * @beta\n */\nexport const index: Check<number> = (value, path) =>\n\tNumber.isInteger(value) && (value as number) >= 0 ? (value as number) : fail(path, 'a whole number, 0 or more')\n\n/**\n * The id of an entity or a player\n *\n * @beta\n */\nexport const id: Check<number> = (value, path) => (Number.isInteger(value) && (value as number) >= 0 ? (value as number) : fail(path, 'an id'))\n\n/**\n * Any number of seconds: a finite number, not below 0\n *\n * @beta\n */\nexport const seconds: Check<number> = (value, path) => {\n\tconst n = number(value, path)\n\treturn n >= 0 ? n : fail(path, 'a number of seconds, not below 0')\n}\n\n/**\n * Words of any length: what a file says (a line of dialog, a name), not what a player sends (`string`)\n *\n * @beta\n */\nexport const text: Check<string> = (value, path) => (typeof value === 'string' ? value : fail(path, 'text'))\n\n/**\n * A colour as the client draws it: `[r, g, b]`, each a number\n *\n * @beta\n */\nexport const rgb: Check<[number, number, number]> = (value, path) =>\n\tArray.isArray(value) && value.length === 3 && value.every((n) => typeof n === 'number' && Number.isFinite(n))\n\t\t? [value[0], value[1], value[2]]\n\t\t: fail(path, 'a colour: [r, g, b]')\n\n/**\n * A list of anything, or none for one left out: each of its values checked by the caller, by its own path\n *\n * @beta\n */\nexport const list: Check<unknown[]> = (value, path) => (value === undefined ? [] : Array.isArray(value) ? value : fail(path, 'a list'))\n\n/**\n * Checks a value is text of at most 200 characters and gives it, or throws `Invalid`\n *\n * @beta\n */\nexport const string: Check<string> = (value, path) =>\n\ttypeof value === 'string' && value.length <= MAX_STRING ? value : fail(path, `text of at most ${MAX_STRING} characters`)\n\n/**\n * Checks a value is a list of at most 1000 entity ids and gives it, or throws `Invalid`\n *\n * @beta\n */\nexport const ids: Check<number[]> = (value, path) => {\n\tif (!Array.isArray(value) || value.length > MAX_IDS) fail(path, `a list of at most ${MAX_IDS} ids`)\n\treturn (value as unknown[]).map((item, i) => id(item, `${path}[${i}]`))\n}\n\n/**\n * Checks a value is a point `{ x, z }` of numbers and gives it, or throws `Invalid`\n *\n * @beta\n */\nexport const point: Check<Vec2> = (value, path) => {\n\tif (typeof value !== 'object' || value === null) fail(path, 'a point: { x, z }')\n\tconst { x, z } = value as Record<string, unknown>\n\treturn { x: number(x, `${path}.x`), z: number(z, `${path}.z`) }\n}\n\n/**\n * What may be left out\n *\n * @beta\n */\nexport function optional<T>(check: Check<T>): Check<T | undefined> {\n\treturn (value, path) => (value === undefined ? undefined : check(value, path))\n}\n\n/**\n * One of a few fixed values\n *\n * @beta\n */\nexport function oneOf<const T extends readonly (string | number)[]>(...values: T): Check<T[number]> {\n\treturn (value, path) => (values.includes(value as T[number]) ? (value as T[number]) : fail(path, `one of ${values.join(', ')}`))\n}\n\n/**\n * An object with these fields. Fields that are not asked for are dropped, so nothing unchecked gets through\n *\n * @beta\n */\nexport function object<F extends Fields>(fields: F): Check<Checked<F>> {\n\treturn (value, path) => {\n\t\tif (typeof value !== 'object' || value === null || Array.isArray(value)) fail(path, 'an object')\n\t\tconst source = value as Record<string, unknown>\n\t\tconst result: Record<string, unknown> = {}\n\t\tfor (const key in fields) {\n\t\t\tconst checked = fields[key](source[key], path ? `${path}.${key}` : key)\n\t\t\tif (checked !== undefined) result[key] = checked\n\t\t}\n\t\treturn result as Checked<F>\n\t}\n}\n"],"mappings":"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"}
|