@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,407 @@
|
|
|
1
|
+
import { ChunkIdsArray, Detour, DetourTileCacheParams, NavMesh, NavMeshParams, Raw, RecastBuildContext, RecastChunkyTriMesh, TileCache, TileCacheData, TileCacheMeshProcess, TriangleAreasArray, TrianglesArray, VerticesArray, allocCompactHeightfield, allocHeightfield, allocHeightfieldLayerSet, buildCompactHeightfield, buildHeightfieldLayers, buildTileCacheLayer, calcGridSize, cloneRcConfig, createHeightfield, createRcConfig, erodeWalkableArea, filterLedgeSpans, filterLowHangingWalkableObstacles, filterWalkableLowHeightSpans, freeCompactHeightfield, freeHeightfield, freeHeightfieldLayerSet, getHeightfieldLayerAreas, getHeightfieldLayerCons, getHeightfieldLayerHeights, markWalkableTriangles, rasterizeTriangles, recastConfigDefaults, statusFailed, vec3 } from "@recast-navigation/core";
|
|
2
|
+
import { dtIlog2, dtNextPow2, getBoundingBox } from "@recast-navigation/generators";
|
|
3
|
+
//#region src/navigation/groundAreas.ts
|
|
4
|
+
/** The areas of slow (or quick) ground: a speed in steps of a sixteenth, 1..62. 0 is ordinary ground, 63 Recast's walkable */
|
|
5
|
+
var STEPS = 16;
|
|
6
|
+
var WALKABLE = 63;
|
|
7
|
+
/** The area of ground of this speed: 0 for ordinary ground, else its speed in sixteenths, 1 at the least and 62 at the most */
|
|
8
|
+
function areaOfSpeed(speed) {
|
|
9
|
+
if (speed === 1 || !(speed >= 0)) return 0;
|
|
10
|
+
const steps = Math.round(speed * STEPS);
|
|
11
|
+
return steps === STEPS ? 0 : Math.min(Math.max(steps, 1), 62);
|
|
12
|
+
}
|
|
13
|
+
/** What a path pays for each area of slow ground, on a filter: `1 / speed`, ordinary ground 1 */
|
|
14
|
+
function setAreaCosts(filter) {
|
|
15
|
+
for (let area = 1; area < WALKABLE; area++) filter.setAreaCost(area, STEPS / area);
|
|
16
|
+
}
|
|
17
|
+
/** The speed of a cell of a build's grid: 1 off it, or with no grid */
|
|
18
|
+
function speedOfBuild(speeds, x, z) {
|
|
19
|
+
if (!speeds) return 1;
|
|
20
|
+
const column = Math.floor(x);
|
|
21
|
+
const row = Math.floor(z);
|
|
22
|
+
if (column < 0 || row < 0 || column >= speeds.width || row >= speeds.depth) return 1;
|
|
23
|
+
return speeds.values[row * speeds.width + column];
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* What makes a tile's polygons, as Recast's tile cache asks: each walkable (flags 1), its area the speed of the ground
|
|
27
|
+
* under its middle (`speedAt`). Without one, every polygon is ordinary ground, as Recast's default makes them
|
|
28
|
+
*/
|
|
29
|
+
function groundMeshProcess(speedAt) {
|
|
30
|
+
return new TileCacheMeshProcess((params, polyAreas, polyFlags) => {
|
|
31
|
+
const count = params.polyCount();
|
|
32
|
+
if (!speedAt) {
|
|
33
|
+
for (let i = 0; i < count; i++) {
|
|
34
|
+
polyAreas.set(i, 0);
|
|
35
|
+
polyFlags.set(i, 1);
|
|
36
|
+
}
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
const nvp = params.nvp();
|
|
40
|
+
const raw = params.raw;
|
|
41
|
+
const cs = raw.cs;
|
|
42
|
+
const originX = raw.get_bmin(0);
|
|
43
|
+
const originZ = raw.get_bmin(2);
|
|
44
|
+
for (let i = 0; i < count; i++) {
|
|
45
|
+
let x = 0;
|
|
46
|
+
let z = 0;
|
|
47
|
+
let corners = 0;
|
|
48
|
+
for (let j = 0; j < nvp; j++) {
|
|
49
|
+
const vertex = params.polys(i * nvp * 2 + j);
|
|
50
|
+
if (vertex === 65535) break;
|
|
51
|
+
x += params.verts(vertex * 3);
|
|
52
|
+
z += params.verts(vertex * 3 + 2);
|
|
53
|
+
corners++;
|
|
54
|
+
}
|
|
55
|
+
const speed = corners ? speedAt(originX + x / corners * cs, originZ + z / corners * cs) : 1;
|
|
56
|
+
polyAreas.set(i, areaOfSpeed(speed));
|
|
57
|
+
polyFlags.set(i, 1);
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
/** How a build is cut into tiles, as Recast's `generateTileCache` works it out */
|
|
62
|
+
function tileCutOf(build) {
|
|
63
|
+
const { bbMin, bbMax } = getBoundingBox(build.positions, build.indices);
|
|
64
|
+
const { expectedLayersPerTile, maxObstacles, ...recastConfig } = {
|
|
65
|
+
...recastConfigDefaults,
|
|
66
|
+
...build.config
|
|
67
|
+
};
|
|
68
|
+
const config = createRcConfig(recastConfig);
|
|
69
|
+
const gridSize = calcGridSize(bbMin, bbMax, config.cs);
|
|
70
|
+
config.width = gridSize.width;
|
|
71
|
+
config.height = gridSize.height;
|
|
72
|
+
config.minRegionArea = config.minRegionArea * config.minRegionArea;
|
|
73
|
+
config.mergeRegionArea = config.mergeRegionArea * config.mergeRegionArea;
|
|
74
|
+
config.detailSampleDist = config.detailSampleDist < .9 ? 0 : config.cs * config.detailSampleDist;
|
|
75
|
+
config.detailSampleMaxError = config.ch * config.detailSampleMaxError;
|
|
76
|
+
const tileSize = Math.floor(config.tileSize);
|
|
77
|
+
const tileWidth = Math.floor((config.width + tileSize - 1) / tileSize);
|
|
78
|
+
const tileHeight = Math.floor((config.height + tileSize - 1) / tileSize);
|
|
79
|
+
config.borderSize = config.walkableRadius + 3;
|
|
80
|
+
config.width = config.tileSize + config.borderSize * 2;
|
|
81
|
+
config.height = config.tileSize + config.borderSize * 2;
|
|
82
|
+
return {
|
|
83
|
+
config,
|
|
84
|
+
bbMin: [...bbMin],
|
|
85
|
+
bbMax: [...bbMax],
|
|
86
|
+
tileWidth,
|
|
87
|
+
tileHeight,
|
|
88
|
+
expectedLayersPerTile,
|
|
89
|
+
maxObstacles
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
/** The tile cache's parameters of a cut: room for every tile of it and its obstacles, or as much as `room` says */
|
|
93
|
+
function tileCacheParamsOf({ config, bbMin, tileWidth, tileHeight, expectedLayersPerTile, maxObstacles }, room) {
|
|
94
|
+
return DetourTileCacheParams.create({
|
|
95
|
+
orig: bbMin,
|
|
96
|
+
cs: config.cs,
|
|
97
|
+
ch: config.ch,
|
|
98
|
+
width: config.tileSize,
|
|
99
|
+
height: config.tileSize,
|
|
100
|
+
walkableHeight: config.walkableHeight * config.ch,
|
|
101
|
+
walkableRadius: config.walkableRadius * config.cs,
|
|
102
|
+
walkableClimb: config.walkableClimb * config.ch,
|
|
103
|
+
maxSimplificationError: config.maxSimplificationError,
|
|
104
|
+
maxTiles: room?.tiles ?? tileWidth * tileHeight * expectedLayersPerTile,
|
|
105
|
+
maxObstacles: room?.obstacles ?? maxObstacles
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* What rasterises the tiles of a build into their compressed layers, from the triangles given (indices into its
|
|
110
|
+
* positions, three to a triangle; all of them when left out): a tile is made of the triangles under it and its border,
|
|
111
|
+
* so a tile made from fewer triangles, those that reach it among them, is the same tile. Undefined where its triangles
|
|
112
|
+
* could not be sorted into chunks
|
|
113
|
+
*/
|
|
114
|
+
function tileRasterizer(build, cut, compressor, chunked = true, speedOf = build.speeds && ((x, z) => speedOfBuild(build.speeds, x, z))) {
|
|
115
|
+
const { positions } = build;
|
|
116
|
+
const { config, bbMin, bbMax } = cut;
|
|
117
|
+
const buildContext = new RecastBuildContext();
|
|
118
|
+
const verticesArray = new VerticesArray();
|
|
119
|
+
verticesArray.copy(positions);
|
|
120
|
+
const numVertices = build.indices.length;
|
|
121
|
+
const trianglesArray = new TrianglesArray();
|
|
122
|
+
const chunkyTriMesh = new RecastChunkyTriMesh();
|
|
123
|
+
const destroy = () => {
|
|
124
|
+
verticesArray.destroy();
|
|
125
|
+
trianglesArray.destroy();
|
|
126
|
+
};
|
|
127
|
+
if (chunked) {
|
|
128
|
+
trianglesArray.copy(build.indices);
|
|
129
|
+
if (!chunkyTriMesh.init(verticesArray, trianglesArray, build.indices.length / 3, 256)) {
|
|
130
|
+
destroy();
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/** The speed's area of the `t`th triangle of a chunk (its corners, as indices of the ground's vertices), by its middle */
|
|
135
|
+
const areaOf = (corners, t) => {
|
|
136
|
+
let x = 0;
|
|
137
|
+
let z = 0;
|
|
138
|
+
for (let k = 0; k < 3; k++) {
|
|
139
|
+
const vertex = corners.get(t * 3 + k);
|
|
140
|
+
x += positions[vertex * 3];
|
|
141
|
+
z += positions[vertex * 3 + 2];
|
|
142
|
+
}
|
|
143
|
+
const speed = speedOf(x / 3, z / 3);
|
|
144
|
+
if (speed < 0) return 0;
|
|
145
|
+
const area = areaOfSpeed(speed);
|
|
146
|
+
return area === 0 ? WALKABLE : area;
|
|
147
|
+
};
|
|
148
|
+
/** Marks a run of triangles walkable (with their speeds) and rasterises them into the heightfield: false where Recast could not */
|
|
149
|
+
const rasterizeRun = (tileConfig, heightfield, tris, count) => {
|
|
150
|
+
const areas = new TriangleAreasArray();
|
|
151
|
+
areas.resize(count);
|
|
152
|
+
markWalkableTriangles(buildContext, tileConfig.walkableSlopeAngle, verticesArray, numVertices, tris, count, areas);
|
|
153
|
+
if (speedOf) {
|
|
154
|
+
for (let t = 0; t < count; t++) if (areas.get(t) === WALKABLE) areas.set(t, areaOf(tris, t));
|
|
155
|
+
}
|
|
156
|
+
const rasterized = rasterizeTriangles(buildContext, verticesArray, numVertices, tris, areas, count, heightfield, tileConfig.walkableClimb);
|
|
157
|
+
areas.destroy();
|
|
158
|
+
return rasterized;
|
|
159
|
+
};
|
|
160
|
+
const rasterize = (tileX, tileY, own) => {
|
|
161
|
+
const tcs = config.tileSize * config.cs;
|
|
162
|
+
const tileConfig = cloneRcConfig(config);
|
|
163
|
+
const tileBoundsMin = [
|
|
164
|
+
bbMin[0] + tileX * tcs - config.borderSize * config.cs,
|
|
165
|
+
bbMin[1],
|
|
166
|
+
bbMin[2] + tileY * tcs - config.borderSize * config.cs
|
|
167
|
+
];
|
|
168
|
+
const tileBoundsMax = [
|
|
169
|
+
bbMin[0] + (tileX + 1) * tcs + config.borderSize * config.cs,
|
|
170
|
+
bbMax[1],
|
|
171
|
+
bbMin[2] + (tileY + 1) * tcs + config.borderSize * config.cs
|
|
172
|
+
];
|
|
173
|
+
for (let i = 0; i < 3; i++) {
|
|
174
|
+
tileConfig.set_bmin(i, tileBoundsMin[i]);
|
|
175
|
+
tileConfig.set_bmax(i, tileBoundsMax[i]);
|
|
176
|
+
}
|
|
177
|
+
const heightfield = allocHeightfield();
|
|
178
|
+
if (!createHeightfield(buildContext, heightfield, tileConfig.width, tileConfig.height, tileBoundsMin, tileBoundsMax, tileConfig.cs, tileConfig.ch)) {
|
|
179
|
+
freeHeightfield(heightfield);
|
|
180
|
+
return [];
|
|
181
|
+
}
|
|
182
|
+
if (own) {
|
|
183
|
+
if (own.length) {
|
|
184
|
+
trianglesArray.copy(own);
|
|
185
|
+
if (!rasterizeRun(tileConfig, heightfield, trianglesArray, own.length / 3)) {
|
|
186
|
+
freeHeightfield(heightfield);
|
|
187
|
+
return [];
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
} else {
|
|
191
|
+
const maxChunkIds = 512;
|
|
192
|
+
const chunkIdsArray = new ChunkIdsArray();
|
|
193
|
+
chunkIdsArray.resize(maxChunkIds);
|
|
194
|
+
const overlapping = chunkyTriMesh.getChunksOverlappingRect([tileBoundsMin[0], tileBoundsMin[2]], [tileBoundsMax[0], tileBoundsMax[2]], chunkIdsArray, maxChunkIds);
|
|
195
|
+
for (let i = 0; i < overlapping; ++i) {
|
|
196
|
+
const nodeId = chunkIdsArray.get(i);
|
|
197
|
+
if (!rasterizeRun(tileConfig, heightfield, chunkyTriMesh.getNodeTris(nodeId), chunkyTriMesh.nodes(nodeId).n)) {
|
|
198
|
+
chunkIdsArray.destroy();
|
|
199
|
+
freeHeightfield(heightfield);
|
|
200
|
+
return [];
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
chunkIdsArray.destroy();
|
|
204
|
+
}
|
|
205
|
+
filterLowHangingWalkableObstacles(buildContext, config.walkableClimb, heightfield);
|
|
206
|
+
filterLedgeSpans(buildContext, config.walkableHeight, config.walkableClimb, heightfield);
|
|
207
|
+
filterWalkableLowHeightSpans(buildContext, config.walkableHeight, heightfield);
|
|
208
|
+
const compactHeightfield = allocCompactHeightfield();
|
|
209
|
+
const compacted = buildCompactHeightfield(buildContext, config.walkableHeight, config.walkableClimb, heightfield, compactHeightfield);
|
|
210
|
+
freeHeightfield(heightfield);
|
|
211
|
+
if (!compacted || !erodeWalkableArea(buildContext, config.walkableRadius, compactHeightfield)) {
|
|
212
|
+
freeCompactHeightfield(compactHeightfield);
|
|
213
|
+
return [];
|
|
214
|
+
}
|
|
215
|
+
const layerSet = allocHeightfieldLayerSet();
|
|
216
|
+
const layered = buildHeightfieldLayers(buildContext, compactHeightfield, config.borderSize, config.walkableHeight, layerSet);
|
|
217
|
+
freeCompactHeightfield(compactHeightfield);
|
|
218
|
+
if (!layered) {
|
|
219
|
+
freeHeightfieldLayerSet(layerSet);
|
|
220
|
+
return [];
|
|
221
|
+
}
|
|
222
|
+
const tiles = [];
|
|
223
|
+
for (let i = 0; i < layerSet.nlayers(); i++) {
|
|
224
|
+
const tile = new TileCacheData();
|
|
225
|
+
const layer = layerSet.layers(i);
|
|
226
|
+
const header = new Raw.dtTileCacheLayerHeader();
|
|
227
|
+
header.magic = Detour.DT_TILECACHE_MAGIC;
|
|
228
|
+
header.version = Detour.DT_TILECACHE_VERSION;
|
|
229
|
+
header.tx = tileX;
|
|
230
|
+
header.ty = tileY;
|
|
231
|
+
header.tlayer = i;
|
|
232
|
+
const min = layer.bmin();
|
|
233
|
+
const max = layer.bmax();
|
|
234
|
+
header.set_bmin(0, min.x);
|
|
235
|
+
header.set_bmin(1, min.y);
|
|
236
|
+
header.set_bmin(2, min.z);
|
|
237
|
+
header.set_bmax(0, max.x);
|
|
238
|
+
header.set_bmax(1, max.y);
|
|
239
|
+
header.set_bmax(2, max.z);
|
|
240
|
+
header.width = layer.width();
|
|
241
|
+
header.height = layer.height();
|
|
242
|
+
header.minx = layer.minx();
|
|
243
|
+
header.maxx = layer.maxx();
|
|
244
|
+
header.miny = layer.miny();
|
|
245
|
+
header.maxy = layer.maxy();
|
|
246
|
+
header.hmin = layer.hmin();
|
|
247
|
+
header.hmax = layer.hmax();
|
|
248
|
+
const status = buildTileCacheLayer(compressor, header, getHeightfieldLayerHeights(layer), getHeightfieldLayerAreas(layer), getHeightfieldLayerCons(layer), tile);
|
|
249
|
+
if (statusFailed(status)) break;
|
|
250
|
+
tiles.push(tile);
|
|
251
|
+
}
|
|
252
|
+
freeHeightfieldLayerSet(layerSet);
|
|
253
|
+
return tiles;
|
|
254
|
+
};
|
|
255
|
+
return {
|
|
256
|
+
rasterize,
|
|
257
|
+
destroy
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Builds a tile cache and its navmesh from a build, as Recast's `generateTileCache` does, but with each triangle of the
|
|
262
|
+
* ground marked with its cell's speed (`NavigationBuild.speeds`) before it is rasterised. What it gives is Recast's own;
|
|
263
|
+
* the caller exports and lets go of it
|
|
264
|
+
*/
|
|
265
|
+
function generateGroundTileCache(build) {
|
|
266
|
+
const { speeds } = build;
|
|
267
|
+
const tileCache = new TileCache();
|
|
268
|
+
const navMesh = new NavMesh();
|
|
269
|
+
const process = groundMeshProcess((x, z) => speedOfBuild(speeds, x, z));
|
|
270
|
+
const cut = tileCutOf(build);
|
|
271
|
+
const { config, bbMin, tileWidth, tileHeight, expectedLayersPerTile } = cut;
|
|
272
|
+
let rasterizer;
|
|
273
|
+
const fail = (error) => {
|
|
274
|
+
rasterizer?.destroy();
|
|
275
|
+
tileCache.destroy();
|
|
276
|
+
navMesh.destroy();
|
|
277
|
+
throw new Error(`Navmesh generation failed: ${error}`);
|
|
278
|
+
};
|
|
279
|
+
const allocator = new Raw.RecastLinearAllocator(32e3);
|
|
280
|
+
const compressor = new Raw.RecastFastLZCompressor();
|
|
281
|
+
if (!tileCache.init(tileCacheParamsOf(cut), allocator, compressor, process)) fail("Failed to initialize tile cache");
|
|
282
|
+
const tileBits = Math.min(Math.floor(dtIlog2(dtNextPow2(tileWidth * tileHeight * expectedLayersPerTile))), 14);
|
|
283
|
+
const navMeshParams = NavMeshParams.create({
|
|
284
|
+
orig: vec3.fromArray(bbMin),
|
|
285
|
+
tileWidth: config.tileSize * config.cs,
|
|
286
|
+
tileHeight: config.tileSize * config.cs,
|
|
287
|
+
maxTiles: 1 << tileBits,
|
|
288
|
+
maxPolys: 1 << 22 - tileBits
|
|
289
|
+
});
|
|
290
|
+
if (!navMesh.initTiled(navMeshParams)) fail("Failed to initialize tiled navmesh");
|
|
291
|
+
rasterizer = tileRasterizer(build, cut, compressor);
|
|
292
|
+
if (!rasterizer) return fail("Failed to build chunky triangle mesh");
|
|
293
|
+
for (let y = 0; y < tileHeight; ++y) for (let x = 0; x < tileWidth; ++x) for (const tile of rasterizer.rasterize(x, y)) tileCache.addTile(tile);
|
|
294
|
+
for (let y = 0; y < tileHeight; y++) for (let x = 0; x < tileWidth; x++) if (statusFailed(tileCache.buildNavMeshTilesAt(x, y, navMesh))) fail(`Failed to build nav mesh tiles at ${x}, ${y}`);
|
|
295
|
+
rasterizer.destroy();
|
|
296
|
+
return {
|
|
297
|
+
navMesh,
|
|
298
|
+
tileCache,
|
|
299
|
+
process
|
|
300
|
+
};
|
|
301
|
+
}
|
|
302
|
+
/** A tile of the grid by its column and row: `tx * 65536 + ty` */
|
|
303
|
+
var tileKey = (tx, ty) => tx * 65536 + ty;
|
|
304
|
+
/**
|
|
305
|
+
* Some tiles of a build made again (`RecastNavigation.reshape`): each tile's compressed layers, made as
|
|
306
|
+
* `generateGroundTileCache` makes them, from the triangles that reach it. Also the bounds of the whole build, for the
|
|
307
|
+
* caller to know the tiles are cut on the grid it has (a build of other bounds is cut on another). `speedOf` is the speed
|
|
308
|
+
* of the ground at a point where the build has no speeds of its own (a part of the ground, `RecastNavigation.groundChanged`).
|
|
309
|
+
* Undefined where they could not be made
|
|
310
|
+
*/
|
|
311
|
+
function groundTileLayers(build, tiles, cut = tileCutOf(build), speedOf) {
|
|
312
|
+
const { config, bbMin, tileWidth, tileHeight } = cut;
|
|
313
|
+
const tcs = config.tileSize * config.cs;
|
|
314
|
+
const border = config.borderSize * config.cs;
|
|
315
|
+
const own = new Map(tiles.map((key) => [key, []]));
|
|
316
|
+
const { positions, indices } = build;
|
|
317
|
+
for (let t = 0; t < indices.length; t += 3) {
|
|
318
|
+
let x0 = Infinity;
|
|
319
|
+
let x1 = -Infinity;
|
|
320
|
+
let z0 = Infinity;
|
|
321
|
+
let z1 = -Infinity;
|
|
322
|
+
for (let k = 0; k < 3; k++) {
|
|
323
|
+
const v = indices[t + k] * 3;
|
|
324
|
+
x0 = Math.min(x0, positions[v]);
|
|
325
|
+
x1 = Math.max(x1, positions[v]);
|
|
326
|
+
z0 = Math.min(z0, positions[v + 2]);
|
|
327
|
+
z1 = Math.max(z1, positions[v + 2]);
|
|
328
|
+
}
|
|
329
|
+
const tx0 = Math.max(0, Math.floor((x0 - border - bbMin[0]) / tcs));
|
|
330
|
+
const tx1 = Math.min(tileWidth - 1, Math.floor((x1 + border - bbMin[0]) / tcs));
|
|
331
|
+
const ty0 = Math.max(0, Math.floor((z0 - border - bbMin[2]) / tcs));
|
|
332
|
+
const ty1 = Math.min(tileHeight - 1, Math.floor((z1 + border - bbMin[2]) / tcs));
|
|
333
|
+
for (let tx = tx0; tx <= tx1; tx++) for (let ty = ty0; ty <= ty1; ty++) own.get(tileKey(tx, ty))?.push(indices[t], indices[t + 1], indices[t + 2]);
|
|
334
|
+
}
|
|
335
|
+
const made = /* @__PURE__ */ new Map();
|
|
336
|
+
const compressor = new Raw.RecastFastLZCompressor();
|
|
337
|
+
const rasterizer = speedOf ? tileRasterizer(build, cut, compressor, false, speedOf) : tileRasterizer(build, cut, compressor, false);
|
|
338
|
+
if (!rasterizer) {
|
|
339
|
+
Raw.destroy(compressor);
|
|
340
|
+
return;
|
|
341
|
+
}
|
|
342
|
+
try {
|
|
343
|
+
for (const key of tiles) {
|
|
344
|
+
const layers = rasterizer.rasterize(Math.floor(key / 65536), key % 65536, Uint32Array.from(own.get(key)));
|
|
345
|
+
made.set(key, layers.map((layer) => {
|
|
346
|
+
const bytes = layer.toTypedArray().slice();
|
|
347
|
+
layer.destroy();
|
|
348
|
+
return bytes;
|
|
349
|
+
}));
|
|
350
|
+
}
|
|
351
|
+
} finally {
|
|
352
|
+
rasterizer.destroy();
|
|
353
|
+
Raw.destroy(compressor);
|
|
354
|
+
}
|
|
355
|
+
return made;
|
|
356
|
+
}
|
|
357
|
+
/**
|
|
358
|
+
* The grid a build is cut on: its bounds and its tiles across and down. A build of the same grid as another's is cut
|
|
359
|
+
* into the same tiles, so a tile of one may be made again alone from the other (`groundTileLayers`)
|
|
360
|
+
*/
|
|
361
|
+
function tileGridOf(build) {
|
|
362
|
+
const cut = tileCutOf(build);
|
|
363
|
+
const { bbMin, bbMax, tileWidth, tileHeight, config } = cut;
|
|
364
|
+
return {
|
|
365
|
+
bbMin,
|
|
366
|
+
bbMax,
|
|
367
|
+
tileWidth,
|
|
368
|
+
tileHeight,
|
|
369
|
+
tileSize: config.tileSize * config.cs,
|
|
370
|
+
border: config.borderSize * config.cs,
|
|
371
|
+
cut
|
|
372
|
+
};
|
|
373
|
+
}
|
|
374
|
+
/**
|
|
375
|
+
* A tile cache of the grid a build is cut on (`tileGridOf`), empty, with room for `room`'s tiles and obstacles: what
|
|
376
|
+
* a column of tiles made again alone is made into the navmesh's tiles through (`RecastNavigation.groundChanged`,
|
|
377
|
+
* `reshape`), as the whole's tile cache would make them. It works in the allocator and compressor given (the whole's:
|
|
378
|
+
* a tile is made in one call, and each starts the allocator over), which it does not take. Undefined where Recast
|
|
379
|
+
* would not make it
|
|
380
|
+
*/
|
|
381
|
+
function columnTileCache(cut, process, room, allocator, compressor) {
|
|
382
|
+
const tileCache = new TileCache();
|
|
383
|
+
const params = tileCacheParamsOf(cut, room);
|
|
384
|
+
const made = tileCache.init(params, allocator, compressor, process);
|
|
385
|
+
Raw.destroy(params.raw);
|
|
386
|
+
if (made) return tileCache;
|
|
387
|
+
tileCache.destroy();
|
|
388
|
+
}
|
|
389
|
+
/**
|
|
390
|
+
* Puts a compressed layer (`groundTileLayers`) in a tile cache, which does not take it: its copy is given back, to be let
|
|
391
|
+
* go of (`destroy`) once the tile cache is. Undefined where the tile cache would not take it
|
|
392
|
+
*/
|
|
393
|
+
function addTileLayer(tileCache, bytes) {
|
|
394
|
+
const data = new TileCacheData();
|
|
395
|
+
data.copy(bytes);
|
|
396
|
+
if (!statusFailed(tileCache.addTile(data, 0).status)) return data;
|
|
397
|
+
data.destroy();
|
|
398
|
+
}
|
|
399
|
+
/**
|
|
400
|
+
* Which layer of its column a compressed layer (`groundTileLayers`) is: the navmesh's tile made of it is at that layer.
|
|
401
|
+
* Its header (Detour's `dtTileCacheLayerHeader`) leads it uncompressed: magic, version, tx, ty, then the layer, each an int
|
|
402
|
+
*/
|
|
403
|
+
var layerOf = (bytes) => new DataView(bytes.buffer, bytes.byteOffset, 20).getInt32(16, true);
|
|
404
|
+
//#endregion
|
|
405
|
+
export { addTileLayer, areaOfSpeed, columnTileCache, generateGroundTileCache, groundMeshProcess, groundTileLayers, layerOf, setAreaCosts, speedOfBuild, tileGridOf, tileKey };
|
|
406
|
+
|
|
407
|
+
//# sourceMappingURL=groundAreas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"groundAreas.js","names":[],"sources":["../../src/navigation/groundAreas.ts"],"sourcesContent":["import {\n\tallocCompactHeightfield,\n\tallocHeightfield,\n\tallocHeightfieldLayerSet,\n\tbuildCompactHeightfield,\n\tbuildHeightfieldLayers,\n\tbuildTileCacheLayer,\n\tcalcGridSize,\n\tChunkIdsArray,\n\tcloneRcConfig,\n\tcreateHeightfield,\n\tcreateRcConfig,\n\tDetour,\n\tDetourTileCacheParams,\n\terodeWalkableArea,\n\tfilterLedgeSpans,\n\tfilterLowHangingWalkableObstacles,\n\tfilterWalkableLowHeightSpans,\n\tfreeCompactHeightfield,\n\tfreeHeightfield,\n\tfreeHeightfieldLayerSet,\n\tgetHeightfieldLayerAreas,\n\tgetHeightfieldLayerCons,\n\tgetHeightfieldLayerHeights,\n\tmarkWalkableTriangles,\n\tNavMesh,\n\ttype NavMeshCreateParams,\n\tNavMeshParams,\n\ttype QueryFilter,\n\trasterizeTriangles,\n\tRaw,\n\tRecastBuildContext,\n\tRecastChunkyTriMesh,\n\trecastConfigDefaults,\n\tstatusFailed,\n\tTileCache,\n\tTileCacheData,\n\tTileCacheMeshProcess,\n\tTriangleAreasArray,\n\tTrianglesArray,\n\tvec3,\n\tVerticesArray\n} from '@recast-navigation/core'\nimport { dtIlog2, dtNextPow2, getBoundingBox } from '@recast-navigation/generators'\nimport type { NavigationBuild, NavigationSpeeds } from './builds'\n\n/*\n * Ground that slows, in the ways units are sent (EN2). A cell's speed (its tile's and its layers', `groundSpeedOfCell`)\n * is an area of the navigation's: each triangle of the ground is marked with its cell's as it is cut, so the\n * navigation's polygons part where the speed does, and a path weighs each polygon by `1 / speed` (`setAreaCosts`), so a\n * road around the mud wins when it is quicker. Ordinary ground (speed 1) is area 0 as it always was: a map without slow\n * ground is cut and walked exactly as before. Each polygon's area is the speed under its middle, worked out whenever a\n * tile is made (`groundMeshProcess`): as it is built, as it is read again, as a building comes or goes on it. Where a\n * slowing layer of cells changes in play (`RecastNavigation.groundChanged`), the tiles it reaches are cut again from the\n * ground with its speeds as they are now (`groundTileLayers`), as a world made or loaded now cuts them: made again only\n * from the layers they were first cut into, their polygons would part where the speed did then\n */\n\n/** The areas of slow (or quick) ground: a speed in steps of a sixteenth, 1..62. 0 is ordinary ground, 63 Recast's walkable */\nconst STEPS = 16\nconst WALKABLE = 63\n\n/** The area of ground of this speed: 0 for ordinary ground, else its speed in sixteenths, 1 at the least and 62 at the most */\nexport function areaOfSpeed(speed: number): number {\n\tif (speed === 1 || !(speed >= 0)) return 0\n\tconst steps = Math.round(speed * STEPS)\n\treturn steps === STEPS ? 0 : Math.min(Math.max(steps, 1), WALKABLE - 1)\n}\n\n/** What a path pays for each area of slow ground, on a filter: `1 / speed`, ordinary ground 1 */\nexport function setAreaCosts(filter: QueryFilter): void {\n\tfor (let area = 1; area < WALKABLE; area++) filter.setAreaCost(area, STEPS / area)\n}\n\n/** The speed of a cell of a build's grid: 1 off it, or with no grid */\nexport function speedOfBuild(speeds: NavigationSpeeds | undefined, x: number, z: number): number {\n\tif (!speeds) return 1\n\tconst column = Math.floor(x)\n\tconst row = Math.floor(z)\n\tif (column < 0 || row < 0 || column >= speeds.width || row >= speeds.depth) return 1\n\treturn speeds.values[row * speeds.width + column]\n}\n\n/**\n * What makes a tile's polygons, as Recast's tile cache asks: each walkable (flags 1), its area the speed of the ground\n * under its middle (`speedAt`). Without one, every polygon is ordinary ground, as Recast's default makes them\n */\nexport function groundMeshProcess(speedAt?: (x: number, z: number) => number): TileCacheMeshProcess {\n\treturn new TileCacheMeshProcess((params: NavMeshCreateParams, polyAreas, polyFlags) => {\n\t\tconst count = params.polyCount()\n\t\tif (!speedAt) {\n\t\t\tfor (let i = 0; i < count; i++) {\n\t\t\t\tpolyAreas.set(i, 0)\n\t\t\t\tpolyFlags.set(i, 1)\n\t\t\t}\n\t\t\treturn\n\t\t}\n\t\t// a polygon's corners, as indices into the tile's vertices (voxels from its corner), then as many for its neighbours\n\t\tconst nvp = params.nvp()\n\t\tconst raw = params.raw\n\t\tconst cs = raw.cs\n\t\tconst originX = raw.get_bmin(0)\n\t\tconst originZ = raw.get_bmin(2)\n\t\tfor (let i = 0; i < count; i++) {\n\t\t\tlet x = 0\n\t\t\tlet z = 0\n\t\t\tlet corners = 0\n\t\t\tfor (let j = 0; j < nvp; j++) {\n\t\t\t\tconst vertex = params.polys(i * nvp * 2 + j)\n\t\t\t\t// Recast's \"no more corners\"\n\t\t\t\tif (vertex === 0xffff) break\n\t\t\t\tx += params.verts(vertex * 3)\n\t\t\t\tz += params.verts(vertex * 3 + 2)\n\t\t\t\tcorners++\n\t\t\t}\n\t\t\tconst speed = corners ? speedAt(originX + (x / corners) * cs, originZ + (z / corners) * cs) : 1\n\t\t\tpolyAreas.set(i, areaOfSpeed(speed))\n\t\t\tpolyFlags.set(i, 1)\n\t\t}\n\t})\n}\n\n/** How a build is cut into tiles: Recast's config for one tile with its border, the bounds of the whole, the grid of tiles */\nexport interface TileCut {\n\tconfig: ReturnType<typeof createRcConfig>\n\tbbMin: [number, number, number]\n\tbbMax: [number, number, number]\n\t/** Tiles across and down */\n\ttileWidth: number\n\ttileHeight: number\n\texpectedLayersPerTile: number\n\tmaxObstacles: number\n}\n\n/** How a build is cut into tiles, as Recast's `generateTileCache` works it out */\nfunction tileCutOf(build: NavigationBuild): TileCut {\n\tconst { bbMin, bbMax } = getBoundingBox(build.positions as unknown as number[], build.indices as unknown as number[])\n\tconst { expectedLayersPerTile, maxObstacles, ...recastConfig } = { ...recastConfigDefaults, ...build.config }\n\tconst config = createRcConfig(recastConfig)\n\tconst gridSize = calcGridSize(bbMin, bbMax, config.cs)\n\tconfig.width = gridSize.width\n\tconfig.height = gridSize.height\n\tconfig.minRegionArea = config.minRegionArea * config.minRegionArea\n\tconfig.mergeRegionArea = config.mergeRegionArea * config.mergeRegionArea\n\tconfig.detailSampleDist = config.detailSampleDist < 0.9 ? 0 : config.cs * config.detailSampleDist\n\tconfig.detailSampleMaxError = config.ch * config.detailSampleMaxError\n\tconst tileSize = Math.floor(config.tileSize)\n\tconst tileWidth = Math.floor((config.width + tileSize - 1) / tileSize)\n\tconst tileHeight = Math.floor((config.height + tileSize - 1) / tileSize)\n\tconfig.borderSize = config.walkableRadius + 3\n\tconfig.width = config.tileSize + config.borderSize * 2\n\tconfig.height = config.tileSize + config.borderSize * 2\n\treturn { config, bbMin: [...bbMin] as TileCut['bbMin'], bbMax: [...bbMax] as TileCut['bbMax'], tileWidth, tileHeight, expectedLayersPerTile, maxObstacles }\n}\n\n/** The tile cache's parameters of a cut: room for every tile of it and its obstacles, or as much as `room` says */\nfunction tileCacheParamsOf(\n\t{ config, bbMin, tileWidth, tileHeight, expectedLayersPerTile, maxObstacles }: TileCut,\n\troom?: { tiles: number; obstacles: number }\n): DetourTileCacheParams {\n\treturn DetourTileCacheParams.create({\n\t\torig: bbMin,\n\t\tcs: config.cs,\n\t\tch: config.ch,\n\t\twidth: config.tileSize,\n\t\theight: config.tileSize,\n\t\twalkableHeight: config.walkableHeight * config.ch,\n\t\twalkableRadius: config.walkableRadius * config.cs,\n\t\twalkableClimb: config.walkableClimb * config.ch,\n\t\tmaxSimplificationError: config.maxSimplificationError,\n\t\tmaxTiles: room?.tiles ?? tileWidth * tileHeight * expectedLayersPerTile,\n\t\tmaxObstacles: room?.obstacles ?? maxObstacles\n\t})\n}\n\n/**\n * What rasterises the tiles of a build into their compressed layers, from the triangles given (indices into its\n * positions, three to a triangle; all of them when left out): a tile is made of the triangles under it and its border,\n * so a tile made from fewer triangles, those that reach it among them, is the same tile. Undefined where its triangles\n * could not be sorted into chunks\n */\nfunction tileRasterizer(\n\tbuild: NavigationBuild,\n\tcut: TileCut,\n\tcompressor: InstanceType<typeof Raw.RecastFastLZCompressor>,\n\t/** Sorted into Recast's chunks (all the build's triangles, for every tile), or none where each tile is given its own */\n\tchunked = true,\n\t/** The speed of the ground at a point, where it is not the build's own (`NavigationBuild.speeds`) */\n\tspeedOf: ((x: number, z: number) => number) | undefined = build.speeds && ((x, z) => speedOfBuild(build.speeds, x, z))\n): { rasterize(tileX: number, tileY: number, own?: Uint32Array): InstanceType<typeof TileCacheData>[]; destroy(): void } | undefined {\n\tconst { positions } = build\n\tconst { config, bbMin, bbMax } = cut\n\tconst buildContext = new RecastBuildContext()\n\tconst verticesArray = new VerticesArray()\n\tverticesArray.copy(positions as unknown as number[])\n\t// as Recast's own counts it: the number of indices of the whole build\n\tconst numVertices = build.indices.length\n\tconst trianglesArray = new TrianglesArray()\n\tconst chunkyTriMesh = new RecastChunkyTriMesh()\n\tconst destroy = () => {\n\t\tverticesArray.destroy()\n\t\ttrianglesArray.destroy()\n\t}\n\tif (chunked) {\n\t\ttrianglesArray.copy(build.indices as unknown as number[])\n\t\tif (!chunkyTriMesh.init(verticesArray, trianglesArray, build.indices.length / 3, 256)) {\n\t\t\tdestroy()\n\t\t\treturn undefined\n\t\t}\n\t}\n\n\t/** The speed's area of the `t`th triangle of a chunk (its corners, as indices of the ground's vertices), by its middle */\n\tconst areaOf = (corners: { get(index: number): number }, t: number) => {\n\t\tlet x = 0\n\t\tlet z = 0\n\t\tfor (let k = 0; k < 3; k++) {\n\t\t\tconst vertex = corners.get(t * 3 + k)\n\t\t\tx += positions[vertex * 3]\n\t\t\tz += positions[vertex * 3 + 2]\n\t\t}\n\t\tconst speed = speedOf!(x / 3, z / 3)\n\t\t// ground nobody on foot goes through (a thicket, `navigationSpeedOn`): left out, as a wall's is\n\t\tif (speed < 0) return 0\n\t\tconst area = areaOfSpeed(speed)\n\t\treturn area === 0 ? WALKABLE : area\n\t}\n\n\t/** Marks a run of triangles walkable (with their speeds) and rasterises them into the heightfield: false where Recast could not */\n\tconst rasterizeRun = (tileConfig: ReturnType<typeof cloneRcConfig>, heightfield: ReturnType<typeof allocHeightfield>, tris: InstanceType<typeof TrianglesArray>, count: number) => {\n\t\tconst areas = new TriangleAreasArray()\n\t\tareas.resize(count)\n\t\tmarkWalkableTriangles(buildContext, tileConfig.walkableSlopeAngle, verticesArray, numVertices, tris, count, areas)\n\t\t// what is walkable takes its cell's speed: the one change from Recast's own\n\t\tif (speedOf) for (let t = 0; t < count; t++) if (areas.get(t) === WALKABLE) areas.set(t, areaOf(tris, t))\n\t\tconst rasterized = rasterizeTriangles(buildContext, verticesArray, numVertices, tris, areas, count, heightfield, tileConfig.walkableClimb)\n\t\tareas.destroy()\n\t\treturn rasterized\n\t}\n\n\tconst rasterize = (tileX: number, tileY: number, own?: Uint32Array): InstanceType<typeof TileCacheData>[] => {\n\t\tconst tcs = config.tileSize * config.cs\n\t\tconst tileConfig = cloneRcConfig(config)\n\t\tconst tileBoundsMin: [number, number, number] = [\n\t\t\tbbMin[0] + tileX * tcs - config.borderSize * config.cs,\n\t\t\tbbMin[1],\n\t\t\tbbMin[2] + tileY * tcs - config.borderSize * config.cs\n\t\t]\n\t\tconst tileBoundsMax: [number, number, number] = [\n\t\t\tbbMin[0] + (tileX + 1) * tcs + config.borderSize * config.cs,\n\t\t\tbbMax[1],\n\t\t\tbbMin[2] + (tileY + 1) * tcs + config.borderSize * config.cs\n\t\t]\n\t\tfor (let i = 0; i < 3; i++) {\n\t\t\ttileConfig.set_bmin(i, tileBoundsMin[i])\n\t\t\ttileConfig.set_bmax(i, tileBoundsMax[i])\n\t\t}\n\t\tconst heightfield = allocHeightfield()\n\t\tif (\n\t\t\t!createHeightfield(buildContext, heightfield, tileConfig.width, tileConfig.height, tileBoundsMin, tileBoundsMax, tileConfig.cs, tileConfig.ch)\n\t\t) {\n\t\t\tfreeHeightfield(heightfield)\n\t\t\treturn []\n\t\t}\n\t\tif (own) {\n\t\t\t// the tile's own triangles, as one run\n\t\t\tif (own.length) {\n\t\t\t\ttrianglesArray.copy(own as unknown as number[])\n\t\t\t\tif (!rasterizeRun(tileConfig, heightfield, trianglesArray, own.length / 3)) {\n\t\t\t\t\tfreeHeightfield(heightfield)\n\t\t\t\t\treturn []\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tconst maxChunkIds = 512\n\t\t\tconst chunkIdsArray = new ChunkIdsArray()\n\t\t\tchunkIdsArray.resize(maxChunkIds)\n\t\t\tconst overlapping = chunkyTriMesh.getChunksOverlappingRect(\n\t\t\t\t[tileBoundsMin[0], tileBoundsMin[2]],\n\t\t\t\t[tileBoundsMax[0], tileBoundsMax[2]],\n\t\t\t\tchunkIdsArray,\n\t\t\t\tmaxChunkIds\n\t\t\t)\n\t\t\tfor (let i = 0; i < overlapping; ++i) {\n\t\t\t\tconst nodeId = chunkIdsArray.get(i)\n\t\t\t\tif (!rasterizeRun(tileConfig, heightfield, chunkyTriMesh.getNodeTris(nodeId), chunkyTriMesh.nodes(nodeId).n)) {\n\t\t\t\t\tchunkIdsArray.destroy()\n\t\t\t\t\tfreeHeightfield(heightfield)\n\t\t\t\t\treturn []\n\t\t\t\t}\n\t\t\t}\n\t\t\tchunkIdsArray.destroy()\n\t\t}\n\t\tfilterLowHangingWalkableObstacles(buildContext, config.walkableClimb, heightfield)\n\t\tfilterLedgeSpans(buildContext, config.walkableHeight, config.walkableClimb, heightfield)\n\t\tfilterWalkableLowHeightSpans(buildContext, config.walkableHeight, heightfield)\n\t\tconst compactHeightfield = allocCompactHeightfield()\n\t\tconst compacted = buildCompactHeightfield(buildContext, config.walkableHeight, config.walkableClimb, heightfield, compactHeightfield)\n\t\tfreeHeightfield(heightfield)\n\t\tif (!compacted || !erodeWalkableArea(buildContext, config.walkableRadius, compactHeightfield)) {\n\t\t\tfreeCompactHeightfield(compactHeightfield)\n\t\t\treturn []\n\t\t}\n\t\tconst layerSet = allocHeightfieldLayerSet()\n\t\tconst layered = buildHeightfieldLayers(buildContext, compactHeightfield, config.borderSize, config.walkableHeight, layerSet)\n\t\tfreeCompactHeightfield(compactHeightfield)\n\t\tif (!layered) {\n\t\t\tfreeHeightfieldLayerSet(layerSet)\n\t\t\treturn []\n\t\t}\n\t\tconst tiles: InstanceType<typeof TileCacheData>[] = []\n\t\tfor (let i = 0; i < layerSet.nlayers(); i++) {\n\t\t\tconst tile = new TileCacheData()\n\t\t\tconst layer = layerSet.layers(i)\n\t\t\tconst header = new Raw.dtTileCacheLayerHeader()\n\t\t\theader.magic = Detour.DT_TILECACHE_MAGIC\n\t\t\theader.version = Detour.DT_TILECACHE_VERSION\n\t\t\theader.tx = tileX\n\t\t\theader.ty = tileY\n\t\t\theader.tlayer = i\n\t\t\tconst min = layer.bmin()\n\t\t\tconst max = layer.bmax()\n\t\t\theader.set_bmin(0, min.x)\n\t\t\theader.set_bmin(1, min.y)\n\t\t\theader.set_bmin(2, min.z)\n\t\t\theader.set_bmax(0, max.x)\n\t\t\theader.set_bmax(1, max.y)\n\t\t\theader.set_bmax(2, max.z)\n\t\t\theader.width = layer.width()\n\t\t\theader.height = layer.height()\n\t\t\theader.minx = layer.minx()\n\t\t\theader.maxx = layer.maxx()\n\t\t\theader.miny = layer.miny()\n\t\t\theader.maxy = layer.maxy()\n\t\t\theader.hmin = layer.hmin()\n\t\t\theader.hmax = layer.hmax()\n\t\t\tconst status = buildTileCacheLayer(\n\t\t\t\tcompressor,\n\t\t\t\theader,\n\t\t\t\tgetHeightfieldLayerHeights(layer),\n\t\t\t\tgetHeightfieldLayerAreas(layer),\n\t\t\t\tgetHeightfieldLayerCons(layer),\n\t\t\t\ttile\n\t\t\t)\n\t\t\tif (statusFailed(status)) break\n\t\t\ttiles.push(tile)\n\t\t}\n\t\tfreeHeightfieldLayerSet(layerSet)\n\t\treturn tiles\n\t}\n\treturn { rasterize, destroy }\n}\n\n/**\n * Builds a tile cache and its navmesh from a build, as Recast's `generateTileCache` does, but with each triangle of the\n * ground marked with its cell's speed (`NavigationBuild.speeds`) before it is rasterised. What it gives is Recast's own;\n * the caller exports and lets go of it\n */\nexport function generateGroundTileCache(build: NavigationBuild): { navMesh: NavMesh; tileCache: TileCache; process: TileCacheMeshProcess } {\n\tconst { speeds } = build\n\tconst tileCache = new TileCache()\n\tconst navMesh = new NavMesh()\n\tconst process = groundMeshProcess((x, z) => speedOfBuild(speeds, x, z))\n\tconst cut = tileCutOf(build)\n\tconst { config, bbMin, tileWidth, tileHeight, expectedLayersPerTile } = cut\n\tlet rasterizer: ReturnType<typeof tileRasterizer>\n\tconst fail = (error: string): never => {\n\t\trasterizer?.destroy()\n\t\ttileCache.destroy()\n\t\tnavMesh.destroy()\n\t\tthrow new Error(`Navmesh generation failed: ${error}`)\n\t}\n\tconst allocator = new Raw.RecastLinearAllocator(32000)\n\tconst compressor = new Raw.RecastFastLZCompressor()\n\tif (!tileCache.init(tileCacheParamsOf(cut), allocator, compressor, process)) fail('Failed to initialize tile cache')\n\tconst tileBits = Math.min(Math.floor(dtIlog2(dtNextPow2(tileWidth * tileHeight * expectedLayersPerTile))), 14)\n\tconst navMeshParams = NavMeshParams.create({\n\t\torig: vec3.fromArray(bbMin),\n\t\ttileWidth: config.tileSize * config.cs,\n\t\ttileHeight: config.tileSize * config.cs,\n\t\tmaxTiles: 1 << tileBits,\n\t\tmaxPolys: 1 << (22 - tileBits)\n\t})\n\tif (!navMesh.initTiled(navMeshParams)) fail('Failed to initialize tiled navmesh')\n\trasterizer = tileRasterizer(build, cut, compressor)\n\tif (!rasterizer) return fail('Failed to build chunky triangle mesh')\n\tfor (let y = 0; y < tileHeight; ++y) {\n\t\tfor (let x = 0; x < tileWidth; ++x) for (const tile of rasterizer.rasterize(x, y)) tileCache.addTile(tile)\n\t}\n\tfor (let y = 0; y < tileHeight; y++) {\n\t\tfor (let x = 0; x < tileWidth; x++)\n\t\t\tif (statusFailed(tileCache.buildNavMeshTilesAt(x, y, navMesh))) fail(`Failed to build nav mesh tiles at ${x}, ${y}`)\n\t}\n\trasterizer.destroy()\n\treturn { navMesh, tileCache, process }\n}\n\n/** A tile of the grid by its column and row: `tx * 65536 + ty` */\nexport const tileKey = (tx: number, ty: number): number => tx * 65536 + ty\n\n/**\n * Some tiles of a build made again (`RecastNavigation.reshape`): each tile's compressed layers, made as\n * `generateGroundTileCache` makes them, from the triangles that reach it. Also the bounds of the whole build, for the\n * caller to know the tiles are cut on the grid it has (a build of other bounds is cut on another). `speedOf` is the speed\n * of the ground at a point where the build has no speeds of its own (a part of the ground, `RecastNavigation.groundChanged`).\n * Undefined where they could not be made\n */\nexport function groundTileLayers(\n\tbuild: NavigationBuild,\n\ttiles: readonly number[],\n\tcut: TileCut = tileCutOf(build),\n\tspeedOf?: (x: number, z: number) => number\n): Map<number, Uint8Array[]> | undefined {\n\tconst { config, bbMin, tileWidth, tileHeight } = cut\n\tconst tcs = config.tileSize * config.cs\n\tconst border = config.borderSize * config.cs\n\t// each tile wanted, the triangles that reach it with its border, in the build's order\n\tconst own = new Map<number, number[]>(tiles.map((key) => [key, []]))\n\tconst { positions, indices } = build\n\tfor (let t = 0; t < indices.length; t += 3) {\n\t\tlet x0 = Infinity\n\t\tlet x1 = -Infinity\n\t\tlet z0 = Infinity\n\t\tlet z1 = -Infinity\n\t\tfor (let k = 0; k < 3; k++) {\n\t\t\tconst v = indices[t + k] * 3\n\t\t\tx0 = Math.min(x0, positions[v])\n\t\t\tx1 = Math.max(x1, positions[v])\n\t\t\tz0 = Math.min(z0, positions[v + 2])\n\t\t\tz1 = Math.max(z1, positions[v + 2])\n\t\t}\n\t\tconst tx0 = Math.max(0, Math.floor((x0 - border - bbMin[0]) / tcs))\n\t\tconst tx1 = Math.min(tileWidth - 1, Math.floor((x1 + border - bbMin[0]) / tcs))\n\t\tconst ty0 = Math.max(0, Math.floor((z0 - border - bbMin[2]) / tcs))\n\t\tconst ty1 = Math.min(tileHeight - 1, Math.floor((z1 + border - bbMin[2]) / tcs))\n\t\tfor (let tx = tx0; tx <= tx1; tx++) for (let ty = ty0; ty <= ty1; ty++) own.get(tileKey(tx, ty))?.push(indices[t], indices[t + 1], indices[t + 2])\n\t}\n\tconst made = new Map<number, Uint8Array[]>()\n\tconst compressor = new Raw.RecastFastLZCompressor()\n\tconst rasterizer = speedOf ? tileRasterizer(build, cut, compressor, false, speedOf) : tileRasterizer(build, cut, compressor, false)\n\tif (!rasterizer) {\n\t\tRaw.destroy(compressor)\n\t\treturn undefined\n\t}\n\ttry {\n\t\tfor (const key of tiles) {\n\t\t\tconst layers = rasterizer.rasterize(Math.floor(key / 65536), key % 65536, Uint32Array.from(own.get(key)!))\n\t\t\tmade.set(\n\t\t\t\tkey,\n\t\t\t\tlayers.map((layer) => {\n\t\t\t\t\tconst bytes = layer.toTypedArray().slice()\n\t\t\t\t\t// made by Recast (dtBuildTileCacheLayer), in no tile cache: let go of here\n\t\t\t\t\tlayer.destroy()\n\t\t\t\t\treturn bytes\n\t\t\t\t})\n\t\t\t)\n\t\t}\n\t} finally {\n\t\trasterizer.destroy()\n\t\tRaw.destroy(compressor)\n\t}\n\treturn made\n}\n\n/**\n * The grid a build is cut on: its bounds and its tiles across and down. A build of the same grid as another's is cut\n * into the same tiles, so a tile of one may be made again alone from the other (`groundTileLayers`)\n */\nexport function tileGridOf(build: NavigationBuild): {\n\tbbMin: readonly number[]\n\tbbMax: readonly number[]\n\ttileWidth: number\n\ttileHeight: number\n\t/** A tile's side, in ground units */\n\ttileSize: number\n\t/** How far round a tile the ground it is made of reaches, in ground units */\n\tborder: number\n\t/** The whole of how it is cut, for `groundTileLayers` and `emptyTileCache` not to work it out again */\n\tcut: TileCut\n} {\n\tconst cut = tileCutOf(build)\n\tconst { bbMin, bbMax, tileWidth, tileHeight, config } = cut\n\treturn { bbMin, bbMax, tileWidth, tileHeight, tileSize: config.tileSize * config.cs, border: config.borderSize * config.cs, cut }\n}\n\n/**\n * A tile cache of the grid a build is cut on (`tileGridOf`), empty, with room for `room`'s tiles and obstacles: what\n * a column of tiles made again alone is made into the navmesh's tiles through (`RecastNavigation.groundChanged`,\n * `reshape`), as the whole's tile cache would make them. It works in the allocator and compressor given (the whole's:\n * a tile is made in one call, and each starts the allocator over), which it does not take. Undefined where Recast\n * would not make it\n */\nexport function columnTileCache(\n\tcut: TileCut,\n\tprocess: TileCacheMeshProcess,\n\troom: { tiles: number; obstacles: number },\n\tallocator: InstanceType<typeof Raw.RecastLinearAllocator>,\n\tcompressor: InstanceType<typeof Raw.RecastFastLZCompressor>\n): TileCache | undefined {\n\tconst tileCache = new TileCache()\n\tconst params = tileCacheParamsOf(cut, room)\n\tconst made = tileCache.init(params, allocator, compressor, process)\n\t// Detour copies them in: let go of here, as a column may be made many times a game\n\tRaw.destroy(params.raw)\n\tif (made) return tileCache\n\ttileCache.destroy()\n\treturn undefined\n}\n\n/**\n * Puts a compressed layer (`groundTileLayers`) in a tile cache, which does not take it: its copy is given back, to be let\n * go of (`destroy`) once the tile cache is. Undefined where the tile cache would not take it\n */\nexport function addTileLayer(tileCache: TileCache, bytes: Uint8Array): InstanceType<typeof TileCacheData> | undefined {\n\tconst data = new TileCacheData()\n\tdata.copy(bytes)\n\tif (!statusFailed(tileCache.addTile(data, 0).status)) return data\n\tdata.destroy()\n\treturn undefined\n}\n\n/**\n * Which layer of its column a compressed layer (`groundTileLayers`) is: the navmesh's tile made of it is at that layer.\n * Its header (Detour's `dtTileCacheLayerHeader`) leads it uncompressed: magic, version, tx, ty, then the layer, each an int\n */\nexport const layerOf = (bytes: Uint8Array): number => new DataView(bytes.buffer, bytes.byteOffset, 20).getInt32(16, true)\n"],"mappings":"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"}
|
|
@@ -25,30 +25,62 @@ export interface AgentState {
|
|
|
25
25
|
* @beta
|
|
26
26
|
*/
|
|
27
27
|
export interface AgentSave {
|
|
28
|
+
/** Where the agent is on the map's x axis, in cells */
|
|
28
29
|
x: number;
|
|
30
|
+
/** Where the agent is on the map's z axis, in cells */
|
|
29
31
|
z: number;
|
|
32
|
+
/** Its velocity along x, in cells per second */
|
|
30
33
|
vx: number;
|
|
34
|
+
/** Its velocity along z, in cells per second */
|
|
31
35
|
vz: number;
|
|
36
|
+
/** Its radius, in cells */
|
|
32
37
|
radius: number;
|
|
38
|
+
/** How fast it goes, in cells per second */
|
|
33
39
|
speed: number;
|
|
34
40
|
/** How fast it gets up to speed, where that is not what follows from the speed */
|
|
35
41
|
acceleration?: number;
|
|
42
|
+
/** Whether it flies, over what blocks the ground */
|
|
36
43
|
flying?: boolean;
|
|
44
|
+
/** Whether it sails, on deep water instead of the ground */
|
|
37
45
|
naval?: boolean;
|
|
38
46
|
/** Where it was sent, snapped to where it can go. Null when it was not */
|
|
39
47
|
target: Vec2 | null;
|
|
48
|
+
/** Whether it holds its ground, so that others walk around it */
|
|
40
49
|
anchored: boolean;
|
|
41
50
|
/** Where an anchored agent holds its ground */
|
|
42
51
|
anchor?: Vec2;
|
|
52
|
+
/** Whether it ignores other agents */
|
|
43
53
|
ghost: boolean;
|
|
54
|
+
/** Whether it walks through every other agent and they through it (`Navigation.setPhasing`) */
|
|
55
|
+
phasing?: boolean;
|
|
44
56
|
}
|
|
45
|
-
/**
|
|
57
|
+
/**
|
|
58
|
+
* A mesh of the navigation, for drawing: `triangles` and `lines` of it
|
|
59
|
+
*
|
|
60
|
+
* @beta
|
|
61
|
+
*/
|
|
46
62
|
export interface NavDebugGeometry {
|
|
47
63
|
/** xyz triples, 3 vertices per triangle */
|
|
48
64
|
triangles: Float32Array;
|
|
49
65
|
/** xyz triples, 2 vertices per line */
|
|
50
66
|
lines: Float32Array;
|
|
51
67
|
}
|
|
68
|
+
/**
|
|
69
|
+
* A part of the ground, in cells: the first cell, and how many across and down (what `World.reshapeGround` changed,
|
|
70
|
+
* as its `TerrainPatch` says)
|
|
71
|
+
*
|
|
72
|
+
* @beta
|
|
73
|
+
*/
|
|
74
|
+
export interface CellArea {
|
|
75
|
+
/** The first cell on the x axis */
|
|
76
|
+
x: number;
|
|
77
|
+
/** The first cell on the z axis */
|
|
78
|
+
z: number;
|
|
79
|
+
/** How many cells across */
|
|
80
|
+
width: number;
|
|
81
|
+
/** How many cells down */
|
|
82
|
+
depth: number;
|
|
83
|
+
}
|
|
52
84
|
/**
|
|
53
85
|
* Pathfinding and local avoidance. The simulation only talks to this interface,
|
|
54
86
|
* so the backing implementation can be replaced without touching game logic.
|
|
@@ -58,18 +90,31 @@ export interface NavDebugGeometry {
|
|
|
58
90
|
export interface Navigation {
|
|
59
91
|
/** Bumped whenever walkable space changes (obstacles added or removed) */
|
|
60
92
|
readonly version: number;
|
|
93
|
+
/** Puts an agent in the crowd by its id (the entity's), at a position and with its radius, speed and the like */
|
|
61
94
|
addAgent(id: number, position: Vec2, params: AgentParams): void;
|
|
95
|
+
/** Takes the agent out of the crowd */
|
|
62
96
|
removeAgent(id: number): void;
|
|
97
|
+
/** Whether an agent by this id is in the crowd */
|
|
63
98
|
hasAgent(id: number): boolean;
|
|
64
99
|
/** Path towards `target`. The target is snapped to walkable space; returns false when nothing walkable is near it. */
|
|
65
100
|
setDestination(id: number, target: Vec2): boolean;
|
|
101
|
+
/** Forgets where the agent was sent; it stops where it is */
|
|
66
102
|
clearDestination(id: number): void;
|
|
103
|
+
/** Moves the agent to the position at once, without a walk */
|
|
67
104
|
teleport(id: number, position: Vec2): void;
|
|
68
105
|
/** Anchored agents hold their ground: others have to walk around them instead of shoving them away. */
|
|
69
106
|
setAnchored(id: number, anchored: boolean): void;
|
|
70
107
|
/** Ghost agents ignore other agents (used by workers hauling resources). */
|
|
71
108
|
setGhost(id: number, ghost: boolean): void;
|
|
109
|
+
/**
|
|
110
|
+
* An agent that phases walks through every other agent and every other through it: neither steers round nor pushes
|
|
111
|
+
* the other (`BuffDef.phasing`). What blocks the ground (walls, cliffs, obstacles) still stops it. A navigation
|
|
112
|
+
* without it has the agent a ghost instead (`setGhost`), which others may still push aside
|
|
113
|
+
*/
|
|
114
|
+
setPhasing?(id: number, phasing: boolean): void;
|
|
115
|
+
/** Changes how fast the agent goes, in cells per second */
|
|
72
116
|
setSpeed(id: number, speed: number): void;
|
|
117
|
+
/** Writes the agent's position, velocity and next corners into `out`; returns false when there is no such agent */
|
|
73
118
|
readAgent(id: number, out: AgentState): boolean;
|
|
74
119
|
/** What a save needs of an agent, or undefined when there is none of that id */
|
|
75
120
|
saveAgent(id: number): AgentSave | undefined;
|
|
@@ -86,12 +131,14 @@ export interface Navigation {
|
|
|
86
131
|
reseat(agents: readonly (readonly [id: number, save: AgentSave])[]): void;
|
|
87
132
|
/** After a load: brings walkable space up to date with the obstacles put back, and takes on the version it had */
|
|
88
133
|
settle(version: number): void;
|
|
134
|
+
/** Steps the crowd by `dt` seconds: agents follow their paths and steer around each other */
|
|
89
135
|
update(dt: number): void;
|
|
90
136
|
/**
|
|
91
137
|
* Something that blocks the way, a building or a shut gate. False when there is no room for another (see
|
|
92
138
|
* `obstacleRoom`): it is then not in the way, and never thrown over in the middle of a tick
|
|
93
139
|
*/
|
|
94
140
|
addObstacle(key: number, rect: Rect): boolean;
|
|
141
|
+
/** Takes the obstacle with this key out of the way, opening the ground it covered */
|
|
95
142
|
removeObstacle(key: number): void;
|
|
96
143
|
/** How many more obstacles there is room for: what placing a building is refused over, before it is placed */
|
|
97
144
|
obstacleRoom(): number;
|
|
@@ -104,24 +151,66 @@ export interface Navigation {
|
|
|
104
151
|
holdObstacles?(hold: boolean): void;
|
|
105
152
|
/**
|
|
106
153
|
* Whether two agents are in each other's way: on the same crowd, so that each steers around the other and neither
|
|
107
|
-
* walks through. Agents of different layers (ground, air, water)
|
|
108
|
-
* several (`SizedNavigation`)
|
|
154
|
+
* walks through. Agents of different layers (ground, air, water) are not; those of different sizes where the ground
|
|
155
|
+
* is cut for several are (`SizedNavigation`). Taken as yes where a navigation does not say
|
|
109
156
|
*/
|
|
110
157
|
sameCrowd?(a: number, b: number): boolean;
|
|
111
158
|
/** Closest walkable point, or null when there is none within `searchRadius`. */
|
|
112
159
|
closestPoint(point: Vec2, searchRadius?: number): Vec2 | null;
|
|
160
|
+
/** Finds a path between two points over walkable space, as a list of corners; null when there is none */
|
|
113
161
|
findPath(from: Vec2, to: Vec2): Vec2[] | null;
|
|
114
162
|
/**
|
|
115
163
|
* A layer of cells that slows one on foot changed on these cells (`World.setCells`): what a path weighs there is
|
|
116
|
-
* made again (EN2)
|
|
164
|
+
* made again (EN2), as a navigation cut now of the ground as it is would weigh it, so a world loaded from a save made
|
|
165
|
+
* after plays out the same. `walkability`: the change may have made cells walkable or not (a layer with a thicket
|
|
166
|
+
* among its values, `FoliageStyleDef.walkable`), which the ways keep their distance from beyond the cells' own part of
|
|
167
|
+
* the navigation. Nothing where a navigation weighs no ground
|
|
168
|
+
*/
|
|
169
|
+
groundChanged?(cells: readonly number[], walkability?: boolean): void;
|
|
170
|
+
/**
|
|
171
|
+
* The ground it is a navigation of was reshaped (`World.reshapeGround`): cut again from it as it is now, what is in
|
|
172
|
+
* the way and every agent kept as they were. Told the part that changed (`area`), it may cut again only what that
|
|
173
|
+
* part reaches. False where it will not be (a navigation of no ground); one that cannot be cut of the ground as it is
|
|
174
|
+
* now is left as it was. A navigation may do it, and `groundChanged`, later than asked, all together, as long as
|
|
175
|
+
* nothing asked of it before then sees the ground as it was (`settleGround`)
|
|
117
176
|
*/
|
|
118
|
-
|
|
177
|
+
reshape?(area?: CellArea): boolean;
|
|
119
178
|
/**
|
|
120
|
-
*
|
|
121
|
-
*
|
|
122
|
-
*
|
|
179
|
+
* Does now what the ground's changes asked of it and it has not done yet (`groundChanged`, `reshape`): the world asks
|
|
180
|
+
* it as each tick ends, so that a tick's changes of the ground are done together, once, and none is left over for
|
|
181
|
+
* after the tick (a save, a screen). Nothing where a navigation does them at once
|
|
123
182
|
*/
|
|
124
|
-
|
|
183
|
+
settleGround?(): void;
|
|
184
|
+
/** Gives the navigation mesh as triangles and lines, for the debug view */
|
|
125
185
|
debugGeometry(): NavDebugGeometry;
|
|
186
|
+
/** Frees the navigation and its crowd; it is not used after */
|
|
126
187
|
dispose(): void;
|
|
127
188
|
}
|
|
189
|
+
/**
|
|
190
|
+
* Where an agent is and how fast it goes, as one crowd tells another of it (`AgentMirrors`)
|
|
191
|
+
*
|
|
192
|
+
* @beta
|
|
193
|
+
*/
|
|
194
|
+
export interface AgentMotion {
|
|
195
|
+
x: number;
|
|
196
|
+
y: number;
|
|
197
|
+
z: number;
|
|
198
|
+
vx: number;
|
|
199
|
+
vz: number;
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* What a navigation of one size does for `SizedNavigation`: has agents of its other sizes stand in its crowd as
|
|
203
|
+
* mirrors. A mirror is steered round and pushed against as any agent is, but it never moves by itself: it is where it
|
|
204
|
+
* was last told, and pushes without being pushed, as an anchored agent does
|
|
205
|
+
*
|
|
206
|
+
* @beta
|
|
207
|
+
*/
|
|
208
|
+
export interface AgentMirrors {
|
|
209
|
+
readMotion(id: number, out: AgentMotion): boolean;
|
|
210
|
+
addMirror(id: number, motion: AgentMotion, radius: number, ghost: boolean): void;
|
|
211
|
+
moveMirror(id: number, motion: AgentMotion): void;
|
|
212
|
+
setMirrorGhost(id: number, ghost: boolean): void;
|
|
213
|
+
/** The agent of a mirror phases (`Navigation.setPhasing`): its mirror is in nobody's way meanwhile */
|
|
214
|
+
setMirrorPhasing?(id: number, phasing: boolean): void;
|
|
215
|
+
removeMirror(id: number): void;
|
|
216
|
+
}
|