@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
package/dist/prefabs.js
ADDED
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
import { cos, sin } from "./exactMath.js";
|
|
2
|
+
import { hashText } from "./math.js";
|
|
3
|
+
import { shapeAt } from "./areas.js";
|
|
4
|
+
import "./map/types.js";
|
|
5
|
+
import { spawnCamp } from "./camps.js";
|
|
6
|
+
//#region src/prefabs.ts
|
|
7
|
+
/**
|
|
8
|
+
* Typed help for writing a prefab
|
|
9
|
+
*
|
|
10
|
+
* @public
|
|
11
|
+
*/
|
|
12
|
+
var definePrefab = (def) => def;
|
|
13
|
+
/**
|
|
14
|
+
* A prefab put down in the world as one: its objects spawned (`world.spawn`, for the owner given or as each says),
|
|
15
|
+
* its camps (`spawnCamp`: a world with camps seats the creeps, `PlayerInit.creeps`), its areas added under ids of
|
|
16
|
+
* their own; turned and sized around its middle as asked
|
|
17
|
+
*
|
|
18
|
+
* @beta
|
|
19
|
+
*/
|
|
20
|
+
function spawnPrefab(world, prefab, options) {
|
|
21
|
+
return spawnWithin(world, prefab, options, []);
|
|
22
|
+
}
|
|
23
|
+
/** `spawnPrefab`, told the prefabs it is inside of: one inside itself is not spawned again */
|
|
24
|
+
function spawnWithin(world, prefab, options, within) {
|
|
25
|
+
const def = typeof prefab === "string" ? world.registry.prefab(prefab) : prefab;
|
|
26
|
+
const contents = typeof def.contents === "function" ? def.contents(options.at, world) : def.contents;
|
|
27
|
+
const turn = options.facing ?? 0;
|
|
28
|
+
const scale = options.scale ?? 1;
|
|
29
|
+
const c = cos(turn);
|
|
30
|
+
const s = sin(turn);
|
|
31
|
+
const place = (p) => {
|
|
32
|
+
const x = p.x * scale;
|
|
33
|
+
const z = p.z * scale;
|
|
34
|
+
return {
|
|
35
|
+
x: options.at.x + x * c + z * s,
|
|
36
|
+
z: options.at.z - x * s + z * c
|
|
37
|
+
};
|
|
38
|
+
};
|
|
39
|
+
const ownerOf = (owner) => owner === "neutral" ? 0 : owner === "creeps" ? 90 : typeof owner === "number" ? owner : options.owner ?? 0;
|
|
40
|
+
const out = {
|
|
41
|
+
entities: [],
|
|
42
|
+
camps: [],
|
|
43
|
+
areas: []
|
|
44
|
+
};
|
|
45
|
+
let suffix;
|
|
46
|
+
contents.objects?.forEach((object, i) => {
|
|
47
|
+
if (options.without?.objects?.includes(i)) return;
|
|
48
|
+
const entity = world.spawn(object.type, ownerOf(object.owner), place(object), {
|
|
49
|
+
facing: (object.facing ?? 0) + turn,
|
|
50
|
+
...object.scale !== void 0 && { scale: object.scale * scale },
|
|
51
|
+
...object.look !== void 0 && { look: object.look },
|
|
52
|
+
...object.name !== void 0 && { name: freeName(world, object.name) },
|
|
53
|
+
...object.underConstruction && { underConstruction: true }
|
|
54
|
+
});
|
|
55
|
+
if (object.health !== void 0 && object.health < 1) entity.health = Math.max(1, Math.round(entity.maxHealth * object.health));
|
|
56
|
+
out.entities.push(entity);
|
|
57
|
+
});
|
|
58
|
+
contents.camps?.forEach((camp, i) => {
|
|
59
|
+
if (options.without?.camps?.includes(i)) return;
|
|
60
|
+
const made = spawnCamp(world, 90, place(camp), camp.units);
|
|
61
|
+
if (camp.name) made.name = freeName(world, camp.name);
|
|
62
|
+
out.camps.push(made);
|
|
63
|
+
});
|
|
64
|
+
contents.areas?.forEach((area, i) => {
|
|
65
|
+
if (options.without?.areas?.includes(i)) return;
|
|
66
|
+
const at = place(area.shape);
|
|
67
|
+
const shape = shapeAt(area.shape, at, scale);
|
|
68
|
+
const id = `${area.id}#${suffix ??= world.newId()}`;
|
|
69
|
+
world.areas.add({
|
|
70
|
+
id,
|
|
71
|
+
shape
|
|
72
|
+
});
|
|
73
|
+
out.areas.push(id);
|
|
74
|
+
});
|
|
75
|
+
contents.prefabs?.forEach((inside, i) => {
|
|
76
|
+
if (options.without?.prefabs?.includes(i) || inside.prefab === def.id || within.includes(inside.prefab)) return;
|
|
77
|
+
const made = spawnWithin(world, inside.prefab, {
|
|
78
|
+
at: place(inside),
|
|
79
|
+
...options.owner !== void 0 && { owner: options.owner },
|
|
80
|
+
facing: turn + (inside.facing ?? 0),
|
|
81
|
+
scale: scale * (inside.scale ?? 1)
|
|
82
|
+
}, [...within, def.id]);
|
|
83
|
+
out.entities.push(...made.entities);
|
|
84
|
+
out.camps.push(...made.camps);
|
|
85
|
+
out.areas.push(...made.areas);
|
|
86
|
+
});
|
|
87
|
+
return out;
|
|
88
|
+
}
|
|
89
|
+
/** A name of the prefab's, free on this world: as it is, or with a number */
|
|
90
|
+
function freeName(world, name) {
|
|
91
|
+
if (!world.named(name)) return name;
|
|
92
|
+
for (let n = 2;; n++) if (!world.named(`${name} ${n}`)) return `${name} ${n}`;
|
|
93
|
+
}
|
|
94
|
+
/** The lists of a file's copy the engine reads */
|
|
95
|
+
var KINDS = [
|
|
96
|
+
"objects",
|
|
97
|
+
"camps",
|
|
98
|
+
"regions"
|
|
99
|
+
];
|
|
100
|
+
/**
|
|
101
|
+
* The id a part of a prefab inside another has in the outer one's copy, as the editor and `prefabsFrom` number it:
|
|
102
|
+
* made from the inner prefab's id there and the part's id in it (itself one of these, a level down), the same each
|
|
103
|
+
* time it is read; below zero, where a prefab's own parts (the map's ids they had) never are
|
|
104
|
+
*
|
|
105
|
+
* @beta
|
|
106
|
+
*/
|
|
107
|
+
function nestedPartId(nested, id) {
|
|
108
|
+
return -(parseInt(hashText(`${nested}/${id}`), 16) || 1);
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* A file read through the others it names, as the editor places it: a variant's source with its overrides, the file's
|
|
112
|
+
* own parts, the prefabs inside it unpacked where it says; what holds itself or names a file there is not is left out
|
|
113
|
+
*/
|
|
114
|
+
function readThrough(file, name, read, within) {
|
|
115
|
+
const path = [...within, name];
|
|
116
|
+
const out = {
|
|
117
|
+
objects: [],
|
|
118
|
+
camps: [],
|
|
119
|
+
regions: []
|
|
120
|
+
};
|
|
121
|
+
const join = (more) => {
|
|
122
|
+
for (const kind of KINDS) {
|
|
123
|
+
const taken = new Set(out[kind].map((part) => part.id));
|
|
124
|
+
for (const part of more[kind] ?? []) {
|
|
125
|
+
if (part.id !== void 0 && taken.has(part.id)) {
|
|
126
|
+
let next = 1;
|
|
127
|
+
while (taken.has(next)) next++;
|
|
128
|
+
part.id = next;
|
|
129
|
+
}
|
|
130
|
+
taken.add(part.id);
|
|
131
|
+
out[kind].push(part);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
};
|
|
135
|
+
const through = (of) => {
|
|
136
|
+
const other = !path.includes(of) ? read(of) : void 0;
|
|
137
|
+
return other && readThrough(other, of, read, path);
|
|
138
|
+
};
|
|
139
|
+
if (file.variant) {
|
|
140
|
+
const source = through(file.variant.of);
|
|
141
|
+
if (source) join(overriddenClip(source, file.variant.over, file.variant.without));
|
|
142
|
+
}
|
|
143
|
+
join(structuredClone(file.contents ?? {}));
|
|
144
|
+
for (const nested of file.prefabs ?? []) {
|
|
145
|
+
const inner = through(nested.prefab);
|
|
146
|
+
if (!inner) continue;
|
|
147
|
+
const turn = nested.turn ?? 0;
|
|
148
|
+
const scale = nested.scale ?? 1;
|
|
149
|
+
const c = cos(turn);
|
|
150
|
+
const s = sin(turn);
|
|
151
|
+
const place = (p) => {
|
|
152
|
+
const x = p.x * scale;
|
|
153
|
+
const z = p.z * scale;
|
|
154
|
+
return {
|
|
155
|
+
...p,
|
|
156
|
+
x: nested.x + x * c + z * s,
|
|
157
|
+
z: nested.z - x * s + z * c
|
|
158
|
+
};
|
|
159
|
+
};
|
|
160
|
+
const placed = overriddenClip(inner, nested.over, nested.without);
|
|
161
|
+
join({
|
|
162
|
+
objects: (placed.objects ?? []).map((object) => ({
|
|
163
|
+
...place(object),
|
|
164
|
+
id: nestedPartId(nested.id, object.id ?? 0),
|
|
165
|
+
facing: (object.facing ?? 0) + turn,
|
|
166
|
+
...scale !== 1 && { scale: (object.scale ?? 1) * scale }
|
|
167
|
+
})),
|
|
168
|
+
camps: (placed.camps ?? []).map((camp) => ({
|
|
169
|
+
...place(camp),
|
|
170
|
+
id: nestedPartId(nested.id, camp.id ?? 0)
|
|
171
|
+
})),
|
|
172
|
+
regions: (placed.regions ?? []).map((region) => ({
|
|
173
|
+
...region,
|
|
174
|
+
id: nestedPartId(nested.id, region.id ?? 0),
|
|
175
|
+
shape: shapeAt(region.shape, place(region.shape), scale)
|
|
176
|
+
}))
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
return out;
|
|
180
|
+
}
|
|
181
|
+
/** A copy with fields of its parts overridden and parts left out, by kind and id */
|
|
182
|
+
function overriddenClip(clip, over, without) {
|
|
183
|
+
const out = {};
|
|
184
|
+
for (const kind of KINDS) {
|
|
185
|
+
const left = new Set(without?.[kind] ?? []);
|
|
186
|
+
const fields = over?.[kind] ?? {};
|
|
187
|
+
out[kind] = (clip[kind] ?? []).filter((part) => part.id === void 0 || !left.has(part.id)).map((part) => ({
|
|
188
|
+
...structuredClone(part),
|
|
189
|
+
...part.id !== void 0 && structuredClone(fields[part.id])
|
|
190
|
+
}));
|
|
191
|
+
}
|
|
192
|
+
return out;
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* The prefabs a designer made in the editor (`prefabs/<name>.prefab.json` of the game's folder), as prefabs of the
|
|
196
|
+
* game's, by their file names: `prefabsFrom(import.meta.glob('./prefabs/*.prefab.json', { eager: true }))`, or any
|
|
197
|
+
* record of name to file. An object of a player's becomes the owner's; scenery, points and paths are left out. A
|
|
198
|
+
* variant is read through its source and a prefab with prefabs inside through those, as the editor places them, from
|
|
199
|
+
* the files given
|
|
200
|
+
*
|
|
201
|
+
* @public
|
|
202
|
+
*/
|
|
203
|
+
function prefabsFrom(files, options = {}) {
|
|
204
|
+
const byName = /* @__PURE__ */ new Map();
|
|
205
|
+
for (const [path, data] of Object.entries(files)) {
|
|
206
|
+
const file = data?.default ?? data;
|
|
207
|
+
if (file?.contents?.kind !== "v12-clip") continue;
|
|
208
|
+
byName.set(file.name ?? path.replace(/^.*[\\/]/, "").replace(/\.prefab\.json$/, ""), file);
|
|
209
|
+
}
|
|
210
|
+
const out = [];
|
|
211
|
+
for (const [name, file] of byName) {
|
|
212
|
+
const clip = file.variant || file.prefabs?.length ? readThrough(file, name, (of) => byName.get(of), []) : file.contents;
|
|
213
|
+
out.push({
|
|
214
|
+
id: `${options.prefix ?? ""}${name}`,
|
|
215
|
+
name,
|
|
216
|
+
contents: {
|
|
217
|
+
objects: (clip.objects ?? []).map(({ owner, ...object }) => ({
|
|
218
|
+
...object,
|
|
219
|
+
owner: owner === 0 ? "neutral" : owner === 90 ? "creeps" : "owner"
|
|
220
|
+
})),
|
|
221
|
+
camps: (clip.camps ?? []).map(({ x, z, units, name }) => ({
|
|
222
|
+
x,
|
|
223
|
+
z,
|
|
224
|
+
units,
|
|
225
|
+
...name && { name }
|
|
226
|
+
})),
|
|
227
|
+
areas: (clip.regions ?? []).map((region) => ({
|
|
228
|
+
id: region.name,
|
|
229
|
+
shape: region.shape
|
|
230
|
+
}))
|
|
231
|
+
}
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
return out;
|
|
235
|
+
}
|
|
236
|
+
//#endregion
|
|
237
|
+
export { definePrefab, nestedPartId, prefabsFrom, spawnPrefab };
|
|
238
|
+
|
|
239
|
+
//# sourceMappingURL=prefabs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prefabs.js","names":[],"sources":["../src/prefabs.ts"],"sourcesContent":["import { type Camp, spawnCamp } from './camps'\nimport { type AreaShape, shapeAt } from './areas'\nimport type { Entity, PlayerId } from './entity'\nimport { MAP_CREEPS, MAP_NEUTRAL } from './map'\nimport { cos, sin } from './exactMath'\nimport { hashText, type Vec2 } from './math'\nimport type { World } from './world'\n\n/*\n * Prefabs in code (master plan FA4): a group of things a game spawns as one, at a place, for a player: a camp of a\n * kind, a base for the computer's expansion, a wave's fortress. The same shape the editor's prefab files have of their\n * contents, in the map's plain terms (no client types): the editor places one as a designer would, and a game spawns\n * one at tick 300, and they look the same. A game's own are `definePrefab`; the files a designer made are\n * `prefabsFrom(import.meta.glob('./prefabs/*.prefab.json', { eager: true }))`.\n *\n * What a prefab spawns at runtime is what the engine has at runtime: units and buildings (`world.spawn`), camps of\n * creeps (`spawnCamp`) and areas the rules watch (`world.areas.add`). Scenery, points and paths are the map's own\n * and have no life at runtime: a file's are left out, and said so once.\n */\n\n/** A unit or a building of a prefab, where it stands around the prefab's middle *\n * @beta\n */\nexport interface PrefabObject {\n\t/** The unit type id to spawn */\n\ttype: string\n\t/**\n\t * Whose: the player the prefab is spawned for (`'owner'`, the default), neutral, the creeps, or a player of the\n\t * map's by id (a file's objects say the id they had; one that is a player's becomes `'owner'` as the file is read)\n\t */\n\towner?: 'owner' | 'neutral' | 'creeps' | PlayerId\n\t/** Where it stands east-west, in cells from the prefab's middle before the prefab's turn and size */\n\tx: number\n\t/** Where it stands north-south, in cells from the prefab's middle before the prefab's turn and size */\n\tz: number\n\t/** Radians, the way entities face */\n\tfacing?: number\n\t/** Size of the entity as a multiple of its type's own; the prefab's scale is applied on top */\n\tscale?: number\n\t/** The id of the look the entity is drawn with, in place of its type's own */\n\tlook?: string\n\t/** A name of its own, for the rules to find it by: made free where it is taken (a number added) */\n\tname?: string\n\t/** 0..1 of its health, less than whole */\n\thealth?: number\n\t/** Structures: as a construction site */\n\tunderConstruction?: boolean\n}\n\n/** A camp of creeps of a prefab *\n * @beta\n */\nexport interface PrefabCamp {\n\t/** East-west position of the camp from the prefab's middle, in cells */\n\tx: number\n\t/** North-south position of the camp from the prefab's middle, in cells */\n\tz: number\n\t/** Unit type ids of the creeps the camp holds */\n\tunits: string[]\n\t/** A name for the camp, for the rules to find it by */\n\tname?: string\n}\n\n/** An area the rules watch, of a prefab: its id gets the spawn's own suffix, so that two of one prefab are two areas *\n * @beta\n */\nexport interface PrefabArea {\n\t/** The area's id before the spawn's own suffix is added, so two spawns of one prefab give two areas */\n\tid: string\n\t/** The area's shape, placed around the prefab's middle */\n\tshape: AreaShape\n}\n\n/** A prefab inside a prefab: spawned with it, its middle where it says from the outer one's, turned and sized with it *\n * @beta\n */\nexport interface PrefabInside {\n\t/** The prefab's id */\n\tprefab: string\n\t/** East-west position of the inner prefab's middle, from the outer one's middle, in cells */\n\tx: number\n\t/** North-south position of the inner prefab's middle, from the outer one's middle, in cells */\n\tz: number\n\t/** Radians, the way facings turn: on top of the outer prefab's turn */\n\tfacing?: number\n\t/** Size of the inner prefab as a multiple, on top of the outer prefab's scale */\n\tscale?: number\n}\n\n/** What a prefab is made of, around its middle (0, 0) *\n * @beta\n */\nexport interface PrefabContents {\n\t/** The units and buildings it spawns */\n\tobjects?: PrefabObject[]\n\t/** The camps of creeps it spawns */\n\tcamps?: PrefabCamp[]\n\t/** The areas it adds for the rules to watch */\n\tareas?: PrefabArea[]\n\t/** Prefabs inside it, spawned with it (a prefab that holds itself, at any depth, is not spawned past the first) */\n\tprefabs?: PrefabInside[]\n}\n\n/**\n * A prefab of a game's own: what `world.spawnPrefab` puts down as one. Its contents as data, or made for the place\n * and the world (a camp the stronger the farther from the starts)\n *\n * @beta\n */\nexport interface PrefabDef {\n\t/** Shared by every game: give it a prefix of the game's (`'td.fortress'`) */\n\tid: string\n\t/** A readable name for the prefab, for tools that list prefabs */\n\tname?: string\n\t/** What the prefab is made of: plain data, or a function of the spawn point and the world that returns it */\n\tcontents: PrefabContents | ((at: Vec2, world: World) => PrefabContents)\n}\n\n/**\n * Typed help for writing a prefab\n *\n * @public\n */\nexport const definePrefab = (def: PrefabDef): PrefabDef => def\n\n/** How a prefab is spawned: where its middle goes, for whom, turned and sized *\n * @beta\n */\nexport interface SpawnPrefabOptions {\n\t/** Where the prefab's middle goes, in world coordinates */\n\tat: Vec2\n\t/** The player the prefab's `'owner'` objects are spawned for: neutral when left out */\n\towner?: PlayerId\n\t/** Radians, the way facings turn: the prefab turned around its middle */\n\tfacing?: number\n\t/** Size multiplier of the prefab around its middle; whole size when left out */\n\tscale?: number\n\t/** Parts left out, by their index in the prefab's lists: a gate without its towers */\n\twithout?: { objects?: number[]; camps?: number[]; areas?: number[]; prefabs?: number[] }\n}\n\n/** What a prefab spawned became *\n * @beta\n */\nexport interface SpawnedPrefab {\n\t/** The units and buildings spawned */\n\tentities: Entity[]\n\t/** The camps of creeps spawned */\n\tcamps: Camp[]\n\t/** The ids of the areas added */\n\tareas: string[]\n}\n\n/**\n * A prefab put down in the world as one: its objects spawned (`world.spawn`, for the owner given or as each says),\n * its camps (`spawnCamp`: a world with camps seats the creeps, `PlayerInit.creeps`), its areas added under ids of\n * their own; turned and sized around its middle as asked\n *\n * @beta\n */\nexport function spawnPrefab(world: World, prefab: PrefabDef | string, options: SpawnPrefabOptions): SpawnedPrefab {\n\treturn spawnWithin(world, prefab, options, [])\n}\n\n/** `spawnPrefab`, told the prefabs it is inside of: one inside itself is not spawned again */\nfunction spawnWithin(world: World, prefab: PrefabDef | string, options: SpawnPrefabOptions, within: readonly string[]): SpawnedPrefab {\n\tconst def = typeof prefab === 'string' ? world.registry.prefab(prefab) : prefab\n\tconst contents = typeof def.contents === 'function' ? def.contents(options.at, world) : def.contents\n\tconst turn = options.facing ?? 0\n\tconst scale = options.scale ?? 1\n\tconst c = cos(turn)\n\tconst s = sin(turn)\n\t// the way facings turn: a quarter takes what was ahead (+z) to the right (+x)\n\tconst place = (p: Vec2): Vec2 => {\n\t\tconst x = p.x * scale\n\t\tconst z = p.z * scale\n\t\treturn { x: options.at.x + x * c + z * s, z: options.at.z - x * s + z * c }\n\t}\n\tconst ownerOf = (owner: PrefabObject['owner']): PlayerId =>\n\t\towner === 'neutral' ? MAP_NEUTRAL : owner === 'creeps' ? MAP_CREEPS : typeof owner === 'number' ? owner : (options.owner ?? MAP_NEUTRAL)\n\tconst out: SpawnedPrefab = { entities: [], camps: [], areas: [] }\n\t// the areas' ids are the world's: the same in every world played the same way, and in one loaded from a save\n\tlet suffix: number | undefined\n\tcontents.objects?.forEach((object, i) => {\n\t\tif (options.without?.objects?.includes(i)) return\n\t\tconst entity = world.spawn(object.type, ownerOf(object.owner), place(object), {\n\t\t\tfacing: (object.facing ?? 0) + turn,\n\t\t\t...(object.scale !== undefined && { scale: object.scale * scale }),\n\t\t\t...(object.look !== undefined && { look: object.look }),\n\t\t\t...(object.name !== undefined && { name: freeName(world, object.name) }),\n\t\t\t...(object.underConstruction && { underConstruction: true })\n\t\t})\n\t\tif (object.health !== undefined && object.health < 1) entity.health = Math.max(1, Math.round(entity.maxHealth * object.health))\n\t\tout.entities.push(entity)\n\t})\n\tcontents.camps?.forEach((camp, i) => {\n\t\tif (options.without?.camps?.includes(i)) return\n\t\tconst made = spawnCamp(world, MAP_CREEPS, place(camp), camp.units)\n\t\tif (camp.name) made.name = freeName(world, camp.name)\n\t\tout.camps.push(made)\n\t})\n\tcontents.areas?.forEach((area, i) => {\n\t\tif (options.without?.areas?.includes(i)) return\n\t\tconst at = place(area.shape)\n\t\tconst shape: AreaShape = shapeAt(area.shape, at, scale)\n\t\tconst id = `${area.id}#${(suffix ??= world.newId())}`\n\t\tworld.areas.add({ id, shape })\n\t\tout.areas.push(id)\n\t})\n\tcontents.prefabs?.forEach((inside, i) => {\n\t\tif (options.without?.prefabs?.includes(i) || inside.prefab === def.id || within.includes(inside.prefab)) return\n\t\tconst made = spawnWithin(\n\t\t\tworld,\n\t\t\tinside.prefab,\n\t\t\t{\n\t\t\t\tat: place(inside),\n\t\t\t\t...(options.owner !== undefined && { owner: options.owner }),\n\t\t\t\tfacing: turn + (inside.facing ?? 0),\n\t\t\t\tscale: scale * (inside.scale ?? 1)\n\t\t\t},\n\t\t\t[...within, def.id]\n\t\t)\n\t\tout.entities.push(...made.entities)\n\t\tout.camps.push(...made.camps)\n\t\tout.areas.push(...made.areas)\n\t})\n\treturn out\n}\n\n/** A name of the prefab's, free on this world: as it is, or with a number */\nfunction freeName(world: World, name: string): string {\n\tif (!world.named(name)) return name\n\tfor (let n = 2; ; n++) if (!world.named(`${name} ${n}`)) return `${name} ${n}`\n}\n\n/** What a prefab's file holds, as far as the engine reads it: the editor's shape (a copy with a name and a version), or the first files' bare copy */\ninterface PrefabFileLike {\n\tname?: string\n\tversion?: number\n\tcontents?: ClipLike\n\t/** A variant of another prefab of the files, by its name: the fields it overrides and the parts it leaves out, by kind and id */\n\tvariant?: { of: string; over?: Overrides; without?: Without }\n\t/** Prefabs of the files inside it, by name: where, turned and sized, and what it overrides and leaves out of each */\n\tprefabs?: { id: number; prefab: string; x: number; z: number; turn?: number; scale?: number; over?: Overrides; without?: Without }[]\n}\n\ntype Overrides = Partial<Record<string, Record<number, Record<string, unknown>>>>\ntype Without = Partial<Record<string, number[]>>\n\ninterface ClipObject {\n\tid?: number\n\ttype: string\n\towner: PlayerId\n\tx: number\n\tz: number\n\tfacing?: number\n\tscale?: number\n\tlook?: string\n\tname?: string\n\thealth?: number\n\tunderConstruction?: boolean\n}\n\ninterface ClipLike {\n\tkind?: string\n\tobjects?: ClipObject[]\n\tcamps?: { id?: number; x: number; z: number; units: string[]; name?: string }[]\n\tregions?: { id?: number; name: string; shape: AreaShape }[]\n}\n\n/** The lists of a file's copy the engine reads */\nconst KINDS = ['objects', 'camps', 'regions'] as const\n\n/**\n * The id a part of a prefab inside another has in the outer one's copy, as the editor and `prefabsFrom` number it:\n * made from the inner prefab's id there and the part's id in it (itself one of these, a level down), the same each\n * time it is read; below zero, where a prefab's own parts (the map's ids they had) never are\n *\n * @beta\n */\nexport function nestedPartId(nested: number, id: number): number {\n\treturn -(parseInt(hashText(`${nested}/${id}`), 16) || 1)\n}\n\n/**\n * A file read through the others it names, as the editor places it: a variant's source with its overrides, the file's\n * own parts, the prefabs inside it unpacked where it says; what holds itself or names a file there is not is left out\n */\nfunction readThrough(file: PrefabFileLike, name: string, read: (name: string) => PrefabFileLike | undefined, within: readonly string[]): ClipLike {\n\tconst path = [...within, name]\n\tconst out: Required<Omit<ClipLike, 'kind'>> = { objects: [], camps: [], regions: [] }\n\tconst join = (more: ClipLike) => {\n\t\tfor (const kind of KINDS) {\n\t\t\tconst taken = new Set(out[kind].map((part) => part.id))\n\t\t\tfor (const part of more[kind] ?? []) {\n\t\t\t\tif (part.id !== undefined && taken.has(part.id)) {\n\t\t\t\t\tlet next = 1\n\t\t\t\t\twhile (taken.has(next)) next++\n\t\t\t\t\tpart.id = next\n\t\t\t\t}\n\t\t\t\ttaken.add(part.id)\n\t\t\t\t;(out[kind] as unknown[]).push(part)\n\t\t\t}\n\t\t}\n\t}\n\tconst through = (of: string): ClipLike | undefined => {\n\t\tconst other = !path.includes(of) ? read(of) : undefined\n\t\treturn other && readThrough(other, of, read, path)\n\t}\n\tif (file.variant) {\n\t\tconst source = through(file.variant.of)\n\t\tif (source) join(overriddenClip(source, file.variant.over, file.variant.without))\n\t}\n\tjoin(structuredClone(file.contents ?? {}))\n\tfor (const nested of file.prefabs ?? []) {\n\t\tconst inner = through(nested.prefab)\n\t\tif (!inner) continue\n\t\tconst turn = nested.turn ?? 0\n\t\tconst scale = nested.scale ?? 1\n\t\t// the engine's own sines: a prefab read on any machine is the same prefab\n\t\tconst c = cos(turn)\n\t\tconst s = sin(turn)\n\t\tconst place = <T extends { x: number; z: number }>(p: T): T => {\n\t\t\tconst x = p.x * scale\n\t\t\tconst z = p.z * scale\n\t\t\treturn { ...p, x: nested.x + x * c + z * s, z: nested.z - x * s + z * c }\n\t\t}\n\t\tconst placed = overriddenClip(inner, nested.over, nested.without)\n\t\tjoin({\n\t\t\tobjects: (placed.objects ?? []).map((object) => ({\n\t\t\t\t...place(object),\n\t\t\t\tid: nestedPartId(nested.id, object.id ?? 0),\n\t\t\t\tfacing: (object.facing ?? 0) + turn,\n\t\t\t\t...(scale !== 1 && { scale: (object.scale ?? 1) * scale })\n\t\t\t})),\n\t\t\tcamps: (placed.camps ?? []).map((camp) => ({ ...place(camp), id: nestedPartId(nested.id, camp.id ?? 0) })),\n\t\t\tregions: (placed.regions ?? []).map((region) => ({\n\t\t\t\t...region,\n\t\t\t\tid: nestedPartId(nested.id, region.id ?? 0),\n\t\t\t\tshape: shapeAt(region.shape, place(region.shape), scale)\n\t\t\t}))\n\t\t})\n\t}\n\treturn out\n}\n\n/** A copy with fields of its parts overridden and parts left out, by kind and id */\nfunction overriddenClip(clip: ClipLike, over: Overrides | undefined, without: Without | undefined): ClipLike {\n\tconst out: ClipLike = {}\n\tfor (const kind of KINDS) {\n\t\tconst left = new Set(without?.[kind] ?? [])\n\t\tconst fields = over?.[kind] ?? {}\n\t\t;(out[kind] as unknown[]) = (clip[kind] ?? [])\n\t\t\t.filter((part) => part.id === undefined || !left.has(part.id))\n\t\t\t.map((part) => ({ ...structuredClone(part), ...(part.id !== undefined && structuredClone(fields[part.id])) }))\n\t}\n\treturn out\n}\n\n/**\n * The prefabs a designer made in the editor (`prefabs/<name>.prefab.json` of the game's folder), as prefabs of the\n * game's, by their file names: `prefabsFrom(import.meta.glob('./prefabs/*.prefab.json', { eager: true }))`, or any\n * record of name to file. An object of a player's becomes the owner's; scenery, points and paths are left out. A\n * variant is read through its source and a prefab with prefabs inside through those, as the editor places them, from\n * the files given\n *\n * @public\n */\nexport function prefabsFrom(files: Record<string, unknown>, options: { prefix?: string } = {}): PrefabDef[] {\n\tconst byName = new Map<string, PrefabFileLike>()\n\tfor (const [path, data] of Object.entries(files)) {\n\t\tconst file = ((data as { default?: unknown })?.default ?? data) as PrefabFileLike\n\t\tif (file?.contents?.kind !== 'v12-clip') continue\n\t\tbyName.set(file.name ?? path.replace(/^.*[\\\\/]/, '').replace(/\\.prefab\\.json$/, ''), file)\n\t}\n\tconst out: PrefabDef[] = []\n\tfor (const [name, file] of byName) {\n\t\tconst clip = file.variant || file.prefabs?.length ? readThrough(file, name, (of) => byName.get(of), []) : file.contents!\n\t\tout.push({\n\t\t\tid: `${options.prefix ?? ''}${name}`,\n\t\t\tname,\n\t\t\tcontents: {\n\t\t\t\tobjects: (clip.objects ?? []).map(({ owner, ...object }) => ({\n\t\t\t\t\t...object,\n\t\t\t\t\towner: owner === MAP_NEUTRAL ? 'neutral' : owner === MAP_CREEPS ? 'creeps' : 'owner'\n\t\t\t\t})),\n\t\t\t\tcamps: (clip.camps ?? []).map(({ x, z, units, name }) => ({ x, z, units, ...(name && { name }) })),\n\t\t\t\tareas: (clip.regions ?? []).map((region) => ({ id: region.name, shape: region.shape }))\n\t\t\t}\n\t\t})\n\t}\n\treturn out\n}\n"],"mappings":";;;;;;;;;;;AA2HA,IAAa,gBAAgB,QAA8B;;;;;;;;AAqC3D,SAAgB,YAAY,OAAc,QAA4B,SAA4C;CACjH,OAAO,YAAY,OAAO,QAAQ,SAAS,CAAC,CAAC;AAC9C;;AAGA,SAAS,YAAY,OAAc,QAA4B,SAA6B,QAA0C;CACrI,MAAM,MAAM,OAAO,WAAW,WAAW,MAAM,SAAS,OAAO,MAAM,IAAI;CACzE,MAAM,WAAW,OAAO,IAAI,aAAa,aAAa,IAAI,SAAS,QAAQ,IAAI,KAAK,IAAI,IAAI;CAC5F,MAAM,OAAO,QAAQ,UAAU;CAC/B,MAAM,QAAQ,QAAQ,SAAS;CAC/B,MAAM,IAAI,IAAI,IAAI;CAClB,MAAM,IAAI,IAAI,IAAI;CAElB,MAAM,SAAS,MAAkB;EAChC,MAAM,IAAI,EAAE,IAAI;EAChB,MAAM,IAAI,EAAE,IAAI;EAChB,OAAO;GAAE,GAAG,QAAQ,GAAG,IAAI,IAAI,IAAI,IAAI;GAAG,GAAG,QAAQ,GAAG,IAAI,IAAI,IAAI,IAAI;EAAE;CAC3E;CACA,MAAM,WAAW,UAChB,UAAU,YAAA,IAA0B,UAAU,WAAA,KAAwB,OAAO,UAAU,WAAW,QAAS,QAAQ,SAAA;CACpH,MAAM,MAAqB;EAAE,UAAU,CAAC;EAAG,OAAO,CAAC;EAAG,OAAO,CAAC;CAAE;CAEhE,IAAI;CACJ,SAAS,SAAS,SAAS,QAAQ,MAAM;EACxC,IAAI,QAAQ,SAAS,SAAS,SAAS,CAAC,GAAG;EAC3C,MAAM,SAAS,MAAM,MAAM,OAAO,MAAM,QAAQ,OAAO,KAAK,GAAG,MAAM,MAAM,GAAG;GAC7E,SAAS,OAAO,UAAU,KAAK;GAC/B,GAAI,OAAO,UAAU,KAAA,KAAa,EAAE,OAAO,OAAO,QAAQ,MAAM;GAChE,GAAI,OAAO,SAAS,KAAA,KAAa,EAAE,MAAM,OAAO,KAAK;GACrD,GAAI,OAAO,SAAS,KAAA,KAAa,EAAE,MAAM,SAAS,OAAO,OAAO,IAAI,EAAE;GACtE,GAAI,OAAO,qBAAqB,EAAE,mBAAmB,KAAK;EAC3D,CAAC;EACD,IAAI,OAAO,WAAW,KAAA,KAAa,OAAO,SAAS,GAAG,OAAO,SAAS,KAAK,IAAI,GAAG,KAAK,MAAM,OAAO,YAAY,OAAO,MAAM,CAAC;EAC9H,IAAI,SAAS,KAAK,MAAM;CACzB,CAAC;CACD,SAAS,OAAO,SAAS,MAAM,MAAM;EACpC,IAAI,QAAQ,SAAS,OAAO,SAAS,CAAC,GAAG;EACzC,MAAM,OAAO,UAAU,OAAA,IAAmB,MAAM,IAAI,GAAG,KAAK,KAAK;EACjE,IAAI,KAAK,MAAM,KAAK,OAAO,SAAS,OAAO,KAAK,IAAI;EACpD,IAAI,MAAM,KAAK,IAAI;CACpB,CAAC;CACD,SAAS,OAAO,SAAS,MAAM,MAAM;EACpC,IAAI,QAAQ,SAAS,OAAO,SAAS,CAAC,GAAG;EACzC,MAAM,KAAK,MAAM,KAAK,KAAK;EAC3B,MAAM,QAAmB,QAAQ,KAAK,OAAO,IAAI,KAAK;EACtD,MAAM,KAAK,GAAG,KAAK,GAAG,GAAI,WAAW,MAAM,MAAM;EACjD,MAAM,MAAM,IAAI;GAAE;GAAI;EAAM,CAAC;EAC7B,IAAI,MAAM,KAAK,EAAE;CAClB,CAAC;CACD,SAAS,SAAS,SAAS,QAAQ,MAAM;EACxC,IAAI,QAAQ,SAAS,SAAS,SAAS,CAAC,KAAK,OAAO,WAAW,IAAI,MAAM,OAAO,SAAS,OAAO,MAAM,GAAG;EACzG,MAAM,OAAO,YACZ,OACA,OAAO,QACP;GACC,IAAI,MAAM,MAAM;GAChB,GAAI,QAAQ,UAAU,KAAA,KAAa,EAAE,OAAO,QAAQ,MAAM;GAC1D,QAAQ,QAAQ,OAAO,UAAU;GACjC,OAAO,SAAS,OAAO,SAAS;EACjC,GACA,CAAC,GAAG,QAAQ,IAAI,EAAE,CACnB;EACA,IAAI,SAAS,KAAK,GAAG,KAAK,QAAQ;EAClC,IAAI,MAAM,KAAK,GAAG,KAAK,KAAK;EAC5B,IAAI,MAAM,KAAK,GAAG,KAAK,KAAK;CAC7B,CAAC;CACD,OAAO;AACR;;AAGA,SAAS,SAAS,OAAc,MAAsB;CACrD,IAAI,CAAC,MAAM,MAAM,IAAI,GAAG,OAAO;CAC/B,KAAK,IAAI,IAAI,IAAK,KAAK,IAAI,CAAC,MAAM,MAAM,GAAG,KAAK,GAAG,GAAG,GAAG,OAAO,GAAG,KAAK,GAAG;AAC5E;;AAsCA,IAAM,QAAQ;CAAC;CAAW;CAAS;AAAS;;;;;;;;AAS5C,SAAgB,aAAa,QAAgB,IAAoB;CAChE,OAAO,EAAE,SAAS,SAAS,GAAG,OAAO,GAAG,IAAI,GAAG,EAAE,KAAK;AACvD;;;;;AAMA,SAAS,YAAY,MAAsB,MAAc,MAAoD,QAAqC;CACjJ,MAAM,OAAO,CAAC,GAAG,QAAQ,IAAI;CAC7B,MAAM,MAAwC;EAAE,SAAS,CAAC;EAAG,OAAO,CAAC;EAAG,SAAS,CAAC;CAAE;CACpF,MAAM,QAAQ,SAAmB;EAChC,KAAK,MAAM,QAAQ,OAAO;GACzB,MAAM,QAAQ,IAAI,IAAI,IAAI,KAAK,CAAC,KAAK,SAAS,KAAK,EAAE,CAAC;GACtD,KAAK,MAAM,QAAQ,KAAK,SAAS,CAAC,GAAG;IACpC,IAAI,KAAK,OAAO,KAAA,KAAa,MAAM,IAAI,KAAK,EAAE,GAAG;KAChD,IAAI,OAAO;KACX,OAAO,MAAM,IAAI,IAAI,GAAG;KACxB,KAAK,KAAK;IACX;IACA,MAAM,IAAI,KAAK,EAAE;IAChB,IAAK,KAAK,CAAe,KAAK,IAAI;GACpC;EACD;CACD;CACA,MAAM,WAAW,OAAqC;EACrD,MAAM,QAAQ,CAAC,KAAK,SAAS,EAAE,IAAI,KAAK,EAAE,IAAI,KAAA;EAC9C,OAAO,SAAS,YAAY,OAAO,IAAI,MAAM,IAAI;CAClD;CACA,IAAI,KAAK,SAAS;EACjB,MAAM,SAAS,QAAQ,KAAK,QAAQ,EAAE;EACtC,IAAI,QAAQ,KAAK,eAAe,QAAQ,KAAK,QAAQ,MAAM,KAAK,QAAQ,OAAO,CAAC;CACjF;CACA,KAAK,gBAAgB,KAAK,YAAY,CAAC,CAAC,CAAC;CACzC,KAAK,MAAM,UAAU,KAAK,WAAW,CAAC,GAAG;EACxC,MAAM,QAAQ,QAAQ,OAAO,MAAM;EACnC,IAAI,CAAC,OAAO;EACZ,MAAM,OAAO,OAAO,QAAQ;EAC5B,MAAM,QAAQ,OAAO,SAAS;EAE9B,MAAM,IAAI,IAAI,IAAI;EAClB,MAAM,IAAI,IAAI,IAAI;EAClB,MAAM,SAA6C,MAAY;GAC9D,MAAM,IAAI,EAAE,IAAI;GAChB,MAAM,IAAI,EAAE,IAAI;GAChB,OAAO;IAAE,GAAG;IAAG,GAAG,OAAO,IAAI,IAAI,IAAI,IAAI;IAAG,GAAG,OAAO,IAAI,IAAI,IAAI,IAAI;GAAE;EACzE;EACA,MAAM,SAAS,eAAe,OAAO,OAAO,MAAM,OAAO,OAAO;EAChE,KAAK;GACJ,UAAU,OAAO,WAAW,CAAC,EAAA,CAAG,KAAK,YAAY;IAChD,GAAG,MAAM,MAAM;IACf,IAAI,aAAa,OAAO,IAAI,OAAO,MAAM,CAAC;IAC1C,SAAS,OAAO,UAAU,KAAK;IAC/B,GAAI,UAAU,KAAK,EAAE,QAAQ,OAAO,SAAS,KAAK,MAAM;GACzD,EAAE;GACF,QAAQ,OAAO,SAAS,CAAC,EAAA,CAAG,KAAK,UAAU;IAAE,GAAG,MAAM,IAAI;IAAG,IAAI,aAAa,OAAO,IAAI,KAAK,MAAM,CAAC;GAAE,EAAE;GACzG,UAAU,OAAO,WAAW,CAAC,EAAA,CAAG,KAAK,YAAY;IAChD,GAAG;IACH,IAAI,aAAa,OAAO,IAAI,OAAO,MAAM,CAAC;IAC1C,OAAO,QAAQ,OAAO,OAAO,MAAM,OAAO,KAAK,GAAG,KAAK;GACxD,EAAE;EACH,CAAC;CACF;CACA,OAAO;AACR;;AAGA,SAAS,eAAe,MAAgB,MAA6B,SAAwC;CAC5G,MAAM,MAAgB,CAAC;CACvB,KAAK,MAAM,QAAQ,OAAO;EACzB,MAAM,OAAO,IAAI,IAAI,UAAU,SAAS,CAAC,CAAC;EAC1C,MAAM,SAAS,OAAO,SAAS,CAAC;EAC/B,IAAK,SAAuB,KAAK,SAAS,CAAC,EAAA,CAC1C,QAAQ,SAAS,KAAK,OAAO,KAAA,KAAa,CAAC,KAAK,IAAI,KAAK,EAAE,CAAC,CAAC,CAC7D,KAAK,UAAU;GAAE,GAAG,gBAAgB,IAAI;GAAG,GAAI,KAAK,OAAO,KAAA,KAAa,gBAAgB,OAAO,KAAK,GAAG;EAAG,EAAE;CAC/G;CACA,OAAO;AACR;;;;;;;;;;AAWA,SAAgB,YAAY,OAAgC,UAA+B,CAAC,GAAgB;CAC3G,MAAM,yBAAS,IAAI,IAA4B;CAC/C,KAAK,MAAM,CAAC,MAAM,SAAS,OAAO,QAAQ,KAAK,GAAG;EACjD,MAAM,OAAS,MAAgC,WAAW;EAC1D,IAAI,MAAM,UAAU,SAAS,YAAY;EACzC,OAAO,IAAI,KAAK,QAAQ,KAAK,QAAQ,YAAY,EAAE,CAAC,CAAC,QAAQ,mBAAmB,EAAE,GAAG,IAAI;CAC1F;CACA,MAAM,MAAmB,CAAC;CAC1B,KAAK,MAAM,CAAC,MAAM,SAAS,QAAQ;EAClC,MAAM,OAAO,KAAK,WAAW,KAAK,SAAS,SAAS,YAAY,MAAM,OAAO,OAAO,OAAO,IAAI,EAAE,GAAG,CAAC,CAAC,IAAI,KAAK;EAC/G,IAAI,KAAK;GACR,IAAI,GAAG,QAAQ,UAAU,KAAK;GAC9B;GACA,UAAU;IACT,UAAU,KAAK,WAAW,CAAC,EAAA,CAAG,KAAK,EAAE,OAAO,GAAG,cAAc;KAC5D,GAAG;KACH,OAAO,UAAA,IAAwB,YAAY,UAAA,KAAuB,WAAW;IAC9E,EAAE;IACF,QAAQ,KAAK,SAAS,CAAC,EAAA,CAAG,KAAK,EAAE,GAAG,GAAG,OAAO,YAAY;KAAE;KAAG;KAAG;KAAO,GAAI,QAAQ,EAAE,KAAK;IAAG,EAAE;IACjG,QAAQ,KAAK,WAAW,CAAC,EAAA,CAAG,KAAK,YAAY;KAAE,IAAI,OAAO;KAAM,OAAO,OAAO;IAAM,EAAE;GACvF;EACD,CAAC;CACF;CACA,OAAO;AACR"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
//#region src/presetBuildings.ts
|
|
2
|
+
/**
|
|
3
|
+
* A fountain: a building that keeps the game's aura on who is around it (`aura`, the id of a passive ability with an
|
|
4
|
+
* `aura` effect: a fountain of health's regeneration, a fountain of mana's). It cannot be hurt; a map puts it down
|
|
5
|
+
* for the neutral player, so the aura says `affects: 'all'` to reach everyone (the neutral player is nobody's ally).
|
|
6
|
+
* What is given over the fountain's own goes over it: `presetFountain('healingWaters', { id: 'fountainOfHealth' })`
|
|
7
|
+
*
|
|
8
|
+
* @beta
|
|
9
|
+
*/
|
|
10
|
+
function presetFountain(aura, over = {}) {
|
|
11
|
+
return {
|
|
12
|
+
id: "fountain",
|
|
13
|
+
name: "Fountain",
|
|
14
|
+
kind: "building",
|
|
15
|
+
radius: 1.5,
|
|
16
|
+
footprint: {
|
|
17
|
+
w: 3,
|
|
18
|
+
d: 3
|
|
19
|
+
},
|
|
20
|
+
stats: { health: 1e3 },
|
|
21
|
+
sight: 6,
|
|
22
|
+
invulnerable: true,
|
|
23
|
+
abilities: [aura],
|
|
24
|
+
...over
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* A marketplace's abilities: one for each trade (`MarketRate`), cast at once (`target: 'none'`), with an `exchange`
|
|
29
|
+
* effect that trades the caster's owner's resources at its rate. A building of the game's lists their ids in its
|
|
30
|
+
* `abilities` (`abilities: market.map((ability) => ability.id)`), the abilities go in the rules' `abilities`. With
|
|
31
|
+
* less than the amount to sell, the player is told and nothing goes. The computer player does not cast them in a
|
|
32
|
+
* fight (their `ai` says not now); its brain's `spells` may
|
|
33
|
+
*
|
|
34
|
+
* @beta
|
|
35
|
+
*/
|
|
36
|
+
function presetMarket(options) {
|
|
37
|
+
return options.rates.map(({ sell, buy, rate, amount = 100, id, name, hotkey }) => ({
|
|
38
|
+
id: id ?? `sell-${sell}-for-${buy}`,
|
|
39
|
+
name: name ?? `Sell ${sell} for ${buy}`,
|
|
40
|
+
description: `Trades ${amount} ${sell} for ${Math.floor(amount * rate + 1e-9)} ${buy}`,
|
|
41
|
+
target: "none",
|
|
42
|
+
maxLevel: 1,
|
|
43
|
+
...hotkey !== void 0 && { hotkey },
|
|
44
|
+
...options.cooldown !== void 0 && { cooldown: options.cooldown },
|
|
45
|
+
effects: [{
|
|
46
|
+
type: "exchange",
|
|
47
|
+
sell,
|
|
48
|
+
buy,
|
|
49
|
+
rate,
|
|
50
|
+
amount
|
|
51
|
+
}],
|
|
52
|
+
ai: () => null
|
|
53
|
+
}));
|
|
54
|
+
}
|
|
55
|
+
//#endregion
|
|
56
|
+
export { presetFountain, presetMarket };
|
|
57
|
+
|
|
58
|
+
//# sourceMappingURL=presetBuildings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presetBuildings.js","names":[],"sources":["../src/presetBuildings.ts"],"sourcesContent":["import type { AbilityDef, UnitTypeDef } from './defs'\n\n/*\n * Ready-made places a game takes or leaves, beside its own (campaign plan GP4): a fountain, a building whose aura is\n * the game's, and a marketplace's abilities, one resource traded for another at a rate (`exchange` in `trade.ts`).\n * They say only what there is; the looks, the numbers and who stands where are the game's\n */\n\n/**\n * A fountain: a building that keeps the game's aura on who is around it (`aura`, the id of a passive ability with an\n * `aura` effect: a fountain of health's regeneration, a fountain of mana's). It cannot be hurt; a map puts it down\n * for the neutral player, so the aura says `affects: 'all'` to reach everyone (the neutral player is nobody's ally).\n * What is given over the fountain's own goes over it: `presetFountain('healingWaters', { id: 'fountainOfHealth' })`\n *\n * @beta\n */\nexport function presetFountain(aura: string, over: Partial<UnitTypeDef> = {}): UnitTypeDef {\n\treturn {\n\t\tid: 'fountain',\n\t\tname: 'Fountain',\n\t\tkind: 'building',\n\t\tradius: 1.5,\n\t\tfootprint: { w: 3, d: 3 },\n\t\tstats: { health: 1000 },\n\t\tsight: 6,\n\t\tinvulnerable: true,\n\t\tabilities: [aura],\n\t\t...over\n\t}\n}\n\n/**\n * One trade of a marketplace (`presetMarket`): `amount` of `sell` for `rate` of `buy` for each one sold\n *\n * @beta\n */\nexport interface MarketRate {\n\t/** The resource traded away, by id */\n\tsell: string\n\t/** The resource traded for, by id */\n\tbuy: string\n\t/** How much of `buy` comes for each one of `sell`: 0.5 is 100 lumber for 50 gold */\n\trate: number\n\t/** How much is sold at a time: 100 when left out */\n\tamount?: number\n\t/** The ability's id: `sell-<sell>-for-<buy>` when left out */\n\tid?: string\n\t/** The ability's name: `Sell <sell> for <buy>` when left out */\n\tname?: string\n\t/** The key the ability's button is pressed with */\n\thotkey?: string\n}\n\n/**\n * What `presetMarket` is given: the trades, and the seconds between two of each (none when left out)\n *\n * @beta\n */\nexport interface PresetMarketOptions {\n\t/** The trades, an ability each, in the order of the buttons */\n\trates: readonly MarketRate[]\n\t/** Seconds between two trades of each: none when left out */\n\tcooldown?: number\n}\n\n/**\n * A marketplace's abilities: one for each trade (`MarketRate`), cast at once (`target: 'none'`), with an `exchange`\n * effect that trades the caster's owner's resources at its rate. A building of the game's lists their ids in its\n * `abilities` (`abilities: market.map((ability) => ability.id)`), the abilities go in the rules' `abilities`. With\n * less than the amount to sell, the player is told and nothing goes. The computer player does not cast them in a\n * fight (their `ai` says not now); its brain's `spells` may\n *\n * @beta\n */\nexport function presetMarket(options: PresetMarketOptions): AbilityDef[] {\n\treturn options.rates.map(({ sell, buy, rate, amount = 100, id, name, hotkey }) => ({\n\t\tid: id ?? `sell-${sell}-for-${buy}`,\n\t\tname: name ?? `Sell ${sell} for ${buy}`,\n\t\tdescription: `Trades ${amount} ${sell} for ${Math.floor(amount * rate + 1e-9)} ${buy}`,\n\t\ttarget: 'none',\n\t\tmaxLevel: 1,\n\t\t...(hotkey !== undefined && { hotkey }),\n\t\t...(options.cooldown !== undefined && { cooldown: options.cooldown }),\n\t\teffects: [{ type: 'exchange', sell, buy, rate, amount }],\n\t\t// not a spell for a fight: the computer player trades as its brain says, not as the engine works out of effects\n\t\tai: () => null\n\t}))\n}\n"],"mappings":";;;;;;;;;AAgBA,SAAgB,eAAe,MAAc,OAA6B,CAAC,GAAgB;CAC1F,OAAO;EACN,IAAI;EACJ,MAAM;EACN,MAAM;EACN,QAAQ;EACR,WAAW;GAAE,GAAG;GAAG,GAAG;EAAE;EACxB,OAAO,EAAE,QAAQ,IAAK;EACtB,OAAO;EACP,cAAc;EACd,WAAW,CAAC,IAAI;EAChB,GAAG;CACJ;AACD;;;;;;;;;;AA6CA,SAAgB,aAAa,SAA4C;CACxE,OAAO,QAAQ,MAAM,KAAK,EAAE,MAAM,KAAK,MAAM,SAAS,KAAK,IAAI,MAAM,cAAc;EAClF,IAAI,MAAM,QAAQ,KAAK,OAAO;EAC9B,MAAM,QAAQ,QAAQ,KAAK,OAAO;EAClC,aAAa,UAAU,OAAO,GAAG,KAAK,OAAO,KAAK,MAAM,SAAS,OAAO,IAAI,EAAE,GAAG;EACjF,QAAQ;EACR,UAAU;EACV,GAAI,WAAW,KAAA,KAAa,EAAE,OAAO;EACrC,GAAI,QAAQ,aAAa,KAAA,KAAa,EAAE,UAAU,QAAQ,SAAS;EACnE,SAAS,CAAC;GAAE,MAAM;GAAY;GAAM;GAAK;GAAM;EAAO,CAAC;EAEvD,UAAU;CACX,EAAE;AACH"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { FoliageStyleDef } from './foliage';
|
|
2
|
+
import type { World } from './world';
|
|
3
|
+
/**
|
|
4
|
+
* Ready-made kinds of grass to the rules, beside a game's own: what each hides, burns and slows, by the names of the
|
|
5
|
+
* client's ready-made looks (`presetFoliage`), so a style is the two of one name. And grass grown from the ground's
|
|
6
|
+
* paint made cells of the layer, for a game whose rules are to see it (`growOnTiles`)
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Ready-made kinds of grass to the rules (`FoliageStyleDef`), by the names of the client's looks (`presetFoliage`):
|
|
10
|
+
* `values: [{ value: 1, name: 'Meadow', foliage: presetFoliageStyles.meadow }]`. A meadow burns and grows back, tall
|
|
11
|
+
* grass, reeds, wheat, a thicket and a hedge hide who stands in them; dry grass burns hottest, snow grass hardly; a
|
|
12
|
+
* thicket slows those on foot, reeds a little; nothing walks through a hedge (`walkable: false`). A game changes what it
|
|
13
|
+
* wants: `{ ...presetFoliageStyles.wheat, trample: 'none' }`
|
|
14
|
+
*
|
|
15
|
+
* @beta
|
|
16
|
+
*/
|
|
17
|
+
export declare const presetFoliageStyles: Readonly<Record<'meadow' | 'tallGrass' | 'dryGrass' | 'reeds' | 'wheat' | 'snowGrass' | 'thicket' | 'hedge', FoliageStyleDef>>;
|
|
18
|
+
/**
|
|
19
|
+
* Grass grown from the ground's paint made cells of a layer the rules see: every cell whose tile is one of `tiles`
|
|
20
|
+
* (by id) and that nothing of the layer is painted on is set to `value` (`world.setCells`: saved, told to the players,
|
|
21
|
+
* remembered through the fog). What a game calls once, as its world begins, for the grass the client grows on those
|
|
22
|
+
* tiles (`FoliageLook.on`) to hide and burn as `value`'s style says: from then on they are cells as any painted, and a
|
|
23
|
+
* tile painted later grows nothing to the rules until it is called again. The cells set
|
|
24
|
+
*
|
|
25
|
+
* @beta
|
|
26
|
+
*/
|
|
27
|
+
export declare function growOnTiles(world: World, layer: string, tiles: readonly string[], value: number): number[];
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
//#region src/presetFoliage.ts
|
|
2
|
+
/**
|
|
3
|
+
* Ready-made kinds of grass to the rules, beside a game's own: what each hides, burns and slows, by the names of the
|
|
4
|
+
* client's ready-made looks (`presetFoliage`), so a style is the two of one name. And grass grown from the ground's
|
|
5
|
+
* paint made cells of the layer, for a game whose rules are to see it (`growOnTiles`)
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Ready-made kinds of grass to the rules (`FoliageStyleDef`), by the names of the client's looks (`presetFoliage`):
|
|
9
|
+
* `values: [{ value: 1, name: 'Meadow', foliage: presetFoliageStyles.meadow }]`. A meadow burns and grows back, tall
|
|
10
|
+
* grass, reeds, wheat, a thicket and a hedge hide who stands in them; dry grass burns hottest, snow grass hardly; a
|
|
11
|
+
* thicket slows those on foot, reeds a little; nothing walks through a hedge (`walkable: false`). A game changes what it
|
|
12
|
+
* wants: `{ ...presetFoliageStyles.wheat, trample: 'none' }`
|
|
13
|
+
*
|
|
14
|
+
* @beta
|
|
15
|
+
*/
|
|
16
|
+
var presetFoliageStyles = {
|
|
17
|
+
meadow: {
|
|
18
|
+
flammable: .6,
|
|
19
|
+
burns: 6,
|
|
20
|
+
regrows: 90
|
|
21
|
+
},
|
|
22
|
+
tallGrass: {
|
|
23
|
+
conceals: true,
|
|
24
|
+
height: 1.4,
|
|
25
|
+
flammable: 1,
|
|
26
|
+
burns: 8,
|
|
27
|
+
regrows: 120
|
|
28
|
+
},
|
|
29
|
+
dryGrass: {
|
|
30
|
+
flammable: 1,
|
|
31
|
+
burns: 4,
|
|
32
|
+
fuel: 1.5,
|
|
33
|
+
regrows: 150
|
|
34
|
+
},
|
|
35
|
+
reeds: {
|
|
36
|
+
conceals: true,
|
|
37
|
+
height: 1.8,
|
|
38
|
+
speed: .85,
|
|
39
|
+
flammable: .3,
|
|
40
|
+
burns: 6,
|
|
41
|
+
regrows: 90
|
|
42
|
+
},
|
|
43
|
+
wheat: {
|
|
44
|
+
conceals: true,
|
|
45
|
+
concealsTaller: false,
|
|
46
|
+
height: 1.1,
|
|
47
|
+
flammable: .9,
|
|
48
|
+
burns: 5,
|
|
49
|
+
fuel: 1.2,
|
|
50
|
+
trample: "crush"
|
|
51
|
+
},
|
|
52
|
+
snowGrass: {
|
|
53
|
+
flammable: .1,
|
|
54
|
+
burns: 3,
|
|
55
|
+
regrows: 180
|
|
56
|
+
},
|
|
57
|
+
thicket: {
|
|
58
|
+
conceals: true,
|
|
59
|
+
height: 1.4,
|
|
60
|
+
speed: .6,
|
|
61
|
+
flammable: .4,
|
|
62
|
+
burns: 12,
|
|
63
|
+
fuel: 1.5,
|
|
64
|
+
regrows: 240
|
|
65
|
+
},
|
|
66
|
+
hedge: {
|
|
67
|
+
conceals: true,
|
|
68
|
+
height: 1.5,
|
|
69
|
+
walkable: false,
|
|
70
|
+
flammable: .3,
|
|
71
|
+
burns: 15,
|
|
72
|
+
fuel: 1.2
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
/**
|
|
76
|
+
* Grass grown from the ground's paint made cells of a layer the rules see: every cell whose tile is one of `tiles`
|
|
77
|
+
* (by id) and that nothing of the layer is painted on is set to `value` (`world.setCells`: saved, told to the players,
|
|
78
|
+
* remembered through the fog). What a game calls once, as its world begins, for the grass the client grows on those
|
|
79
|
+
* tiles (`FoliageLook.on`) to hide and burn as `value`'s style says: from then on they are cells as any painted, and a
|
|
80
|
+
* tile painted later grows nothing to the rules until it is called again. The cells set
|
|
81
|
+
*
|
|
82
|
+
* @beta
|
|
83
|
+
*/
|
|
84
|
+
function growOnTiles(world, layer, tiles, value) {
|
|
85
|
+
if (!(Number.isInteger(value) && value >= 1 && value <= 255)) throw new Error(`growOnTiles: ${value} is no value of a layer (1 to 255)`);
|
|
86
|
+
const { terrain, registry } = world;
|
|
87
|
+
const ids = registry.tileIds;
|
|
88
|
+
const mask = /* @__PURE__ */ new Uint8Array(256);
|
|
89
|
+
for (let i = 0; i < ids.length && i < 255; i++) if (tiles.includes(ids[i])) mask[i + 1] = 1;
|
|
90
|
+
const painted = terrain.cells[layer];
|
|
91
|
+
const cells = [];
|
|
92
|
+
for (let c = 0, n = terrain.width * terrain.depth; c < n; c++) if (mask[terrain.tiles[c]] && !painted?.[c]) cells.push(c);
|
|
93
|
+
return cells.length ? world.setCells(layer, cells, value) : [];
|
|
94
|
+
}
|
|
95
|
+
//#endregion
|
|
96
|
+
export { growOnTiles, presetFoliageStyles };
|
|
97
|
+
|
|
98
|
+
//# sourceMappingURL=presetFoliage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presetFoliage.js","names":[],"sources":["../src/presetFoliage.ts"],"sourcesContent":["import type { FoliageStyleDef } from './foliage'\nimport type { World } from './world'\n\n/**\n * Ready-made kinds of grass to the rules, beside a game's own: what each hides, burns and slows, by the names of the\n * client's ready-made looks (`presetFoliage`), so a style is the two of one name. And grass grown from the ground's\n * paint made cells of the layer, for a game whose rules are to see it (`growOnTiles`)\n */\n\n/**\n * Ready-made kinds of grass to the rules (`FoliageStyleDef`), by the names of the client's looks (`presetFoliage`):\n * `values: [{ value: 1, name: 'Meadow', foliage: presetFoliageStyles.meadow }]`. A meadow burns and grows back, tall\n * grass, reeds, wheat, a thicket and a hedge hide who stands in them; dry grass burns hottest, snow grass hardly; a\n * thicket slows those on foot, reeds a little; nothing walks through a hedge (`walkable: false`). A game changes what it\n * wants: `{ ...presetFoliageStyles.wheat, trample: 'none' }`\n *\n * @beta\n */\nexport const presetFoliageStyles: Readonly<\n\tRecord<'meadow' | 'tallGrass' | 'dryGrass' | 'reeds' | 'wheat' | 'snowGrass' | 'thicket' | 'hedge', FoliageStyleDef>\n> = {\n\tmeadow: { flammable: 0.6, burns: 6, regrows: 90 },\n\ttallGrass: { conceals: true, height: 1.4, flammable: 1, burns: 8, regrows: 120 },\n\tdryGrass: { flammable: 1, burns: 4, fuel: 1.5, regrows: 150 },\n\treeds: { conceals: true, height: 1.8, speed: 0.85, flammable: 0.3, burns: 6, regrows: 90 },\n\twheat: { conceals: true, concealsTaller: false, height: 1.1, flammable: 0.9, burns: 5, fuel: 1.2, trample: 'crush' },\n\tsnowGrass: { flammable: 0.1, burns: 3, regrows: 180 },\n\tthicket: { conceals: true, height: 1.4, speed: 0.6, flammable: 0.4, burns: 12, fuel: 1.5, regrows: 240 },\n\thedge: { conceals: true, height: 1.5, walkable: false, flammable: 0.3, burns: 15, fuel: 1.2 }\n}\n\n/**\n * Grass grown from the ground's paint made cells of a layer the rules see: every cell whose tile is one of `tiles`\n * (by id) and that nothing of the layer is painted on is set to `value` (`world.setCells`: saved, told to the players,\n * remembered through the fog). What a game calls once, as its world begins, for the grass the client grows on those\n * tiles (`FoliageLook.on`) to hide and burn as `value`'s style says: from then on they are cells as any painted, and a\n * tile painted later grows nothing to the rules until it is called again. The cells set\n *\n * @beta\n */\nexport function growOnTiles(world: World, layer: string, tiles: readonly string[], value: number): number[] {\n\tif (!(Number.isInteger(value) && value >= 1 && value <= 255)) throw new Error(`growOnTiles: ${value} is no value of a layer (1 to 255)`)\n\tconst { terrain, registry } = world\n\tconst ids = registry.tileIds\n\tconst mask = new Uint8Array(256)\n\tfor (let i = 0; i < ids.length && i < 255; i++) if (tiles.includes(ids[i])) mask[i + 1] = 1\n\tconst painted = terrain.cells[layer]\n\tconst cells: number[] = []\n\tfor (let c = 0, n = terrain.width * terrain.depth; c < n; c++) if (mask[terrain.tiles[c]] && !painted?.[c]) cells.push(c)\n\treturn cells.length ? world.setCells(layer, cells, value) : []\n}\n"],"mappings":";;;;;;;;;;;;;;;AAkBA,IAAa,sBAET;CACH,QAAQ;EAAE,WAAW;EAAK,OAAO;EAAG,SAAS;CAAG;CAChD,WAAW;EAAE,UAAU;EAAM,QAAQ;EAAK,WAAW;EAAG,OAAO;EAAG,SAAS;CAAI;CAC/E,UAAU;EAAE,WAAW;EAAG,OAAO;EAAG,MAAM;EAAK,SAAS;CAAI;CAC5D,OAAO;EAAE,UAAU;EAAM,QAAQ;EAAK,OAAO;EAAM,WAAW;EAAK,OAAO;EAAG,SAAS;CAAG;CACzF,OAAO;EAAE,UAAU;EAAM,gBAAgB;EAAO,QAAQ;EAAK,WAAW;EAAK,OAAO;EAAG,MAAM;EAAK,SAAS;CAAQ;CACnH,WAAW;EAAE,WAAW;EAAK,OAAO;EAAG,SAAS;CAAI;CACpD,SAAS;EAAE,UAAU;EAAM,QAAQ;EAAK,OAAO;EAAK,WAAW;EAAK,OAAO;EAAI,MAAM;EAAK,SAAS;CAAI;CACvG,OAAO;EAAE,UAAU;EAAM,QAAQ;EAAK,UAAU;EAAO,WAAW;EAAK,OAAO;EAAI,MAAM;CAAI;AAC7F;;;;;;;;;;AAWA,SAAgB,YAAY,OAAc,OAAe,OAA0B,OAAyB;CAC3G,IAAI,EAAE,OAAO,UAAU,KAAK,KAAK,SAAS,KAAK,SAAS,MAAM,MAAM,IAAI,MAAM,gBAAgB,MAAM,mCAAmC;CACvI,MAAM,EAAE,SAAS,aAAa;CAC9B,MAAM,MAAM,SAAS;CACrB,MAAM,uBAAO,IAAI,WAAW,GAAG;CAC/B,KAAK,IAAI,IAAI,GAAG,IAAI,IAAI,UAAU,IAAI,KAAK,KAAK,IAAI,MAAM,SAAS,IAAI,EAAE,GAAG,KAAK,IAAI,KAAK;CAC1F,MAAM,UAAU,QAAQ,MAAM;CAC9B,MAAM,QAAkB,CAAC;CACzB,KAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,QAAQ,QAAQ,OAAO,IAAI,GAAG,KAAK,IAAI,KAAK,QAAQ,MAAM,OAAO,CAAC,UAAU,IAAI,MAAM,KAAK,CAAC;CACxH,OAAO,MAAM,SAAS,MAAM,SAAS,OAAO,OAAO,KAAK,IAAI,CAAC;AAC9D"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { defineCellLayer } from "./cellLayers.js";
|
|
2
|
+
import { defineTile } from "./tiles.js";
|
|
3
|
+
//#region src/presetGround.ts
|
|
4
|
+
/**
|
|
5
|
+
* Ready-made grounds a game takes or leaves, beside its own: the tiles of an RTS's ground (grass, dark grass, dirt,
|
|
6
|
+
* road, sand, rock, snow), which the client draws with its `TILE_LOOKS`, and the blight a race spoils ground with,
|
|
7
|
+
* which the client draws with its `blightLook`. They say only what there is; what they do is the game's
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* The tiles of an RTS's ground, by the ids the client's `TILE_LOOKS` has looks for: `tiles: presetTiles` in the rules,
|
|
11
|
+
* `tiles: TILE_LOOKS` in the view. A game adds its own beside them, or takes some (`presetTiles.filter(...)`)
|
|
12
|
+
*
|
|
13
|
+
* @beta
|
|
14
|
+
*/
|
|
15
|
+
var presetTiles = [
|
|
16
|
+
defineTile({
|
|
17
|
+
id: "grass",
|
|
18
|
+
name: "Grass"
|
|
19
|
+
}),
|
|
20
|
+
defineTile({
|
|
21
|
+
id: "darkGrass",
|
|
22
|
+
name: "Dark grass"
|
|
23
|
+
}),
|
|
24
|
+
defineTile({
|
|
25
|
+
id: "dirt",
|
|
26
|
+
name: "Dirt"
|
|
27
|
+
}),
|
|
28
|
+
defineTile({
|
|
29
|
+
id: "road",
|
|
30
|
+
name: "Road"
|
|
31
|
+
}),
|
|
32
|
+
defineTile({
|
|
33
|
+
id: "sand",
|
|
34
|
+
name: "Sand"
|
|
35
|
+
}),
|
|
36
|
+
defineTile({
|
|
37
|
+
id: "rock",
|
|
38
|
+
name: "Rock"
|
|
39
|
+
}),
|
|
40
|
+
defineTile({
|
|
41
|
+
id: "snow",
|
|
42
|
+
name: "Snow"
|
|
43
|
+
})
|
|
44
|
+
];
|
|
45
|
+
/**
|
|
46
|
+
* Blight: ground spoiled, a layer of cells a map's maker paints and the rules spread (`world.setCells('blight', …)`),
|
|
47
|
+
* drawn by the client's `blightLook`. What it does (who builds on it, who heals on it) is the game's: melee's
|
|
48
|
+
* undead in the example
|
|
49
|
+
*
|
|
50
|
+
* @beta
|
|
51
|
+
*/
|
|
52
|
+
var presetBlight = defineCellLayer({
|
|
53
|
+
id: "blight",
|
|
54
|
+
name: "Blight",
|
|
55
|
+
description: "Spoiled ground: what the game says of it, a race that builds on it, one that heals on it",
|
|
56
|
+
color: [
|
|
57
|
+
.45,
|
|
58
|
+
.3,
|
|
59
|
+
.55
|
|
60
|
+
]
|
|
61
|
+
});
|
|
62
|
+
//#endregion
|
|
63
|
+
export { presetBlight, presetTiles };
|
|
64
|
+
|
|
65
|
+
//# sourceMappingURL=presetGround.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presetGround.js","names":[],"sources":["../src/presetGround.ts"],"sourcesContent":["import { type CellLayerDef, defineCellLayer } from './cellLayers'\nimport { type TileDef, defineTile } from './tiles'\n\n/**\n * Ready-made grounds a game takes or leaves, beside its own: the tiles of an RTS's ground (grass, dark grass, dirt,\n * road, sand, rock, snow), which the client draws with its `TILE_LOOKS`, and the blight a race spoils ground with,\n * which the client draws with its `blightLook`. They say only what there is; what they do is the game's\n */\n\n/**\n * The tiles of an RTS's ground, by the ids the client's `TILE_LOOKS` has looks for: `tiles: presetTiles` in the rules,\n * `tiles: TILE_LOOKS` in the view. A game adds its own beside them, or takes some (`presetTiles.filter(...)`)\n *\n * @beta\n */\nexport const presetTiles: readonly TileDef[] = [\n\tdefineTile({ id: 'grass', name: 'Grass' }),\n\tdefineTile({ id: 'darkGrass', name: 'Dark grass' }),\n\tdefineTile({ id: 'dirt', name: 'Dirt' }),\n\tdefineTile({ id: 'road', name: 'Road' }),\n\tdefineTile({ id: 'sand', name: 'Sand' }),\n\tdefineTile({ id: 'rock', name: 'Rock' }),\n\tdefineTile({ id: 'snow', name: 'Snow' })\n]\n\n/**\n * Blight: ground spoiled, a layer of cells a map's maker paints and the rules spread (`world.setCells('blight', …)`),\n * drawn by the client's `blightLook`. What it does (who builds on it, who heals on it) is the game's: melee's\n * undead in the example\n *\n * @beta\n */\nexport const presetBlight: CellLayerDef = defineCellLayer({\n\tid: 'blight',\n\tname: 'Blight',\n\tdescription: 'Spoiled ground: what the game says of it, a race that builds on it, one that heals on it',\n\tcolor: [0.45, 0.3, 0.55]\n})\n"],"mappings":";;;;;;;;;;;;;;AAeA,IAAa,cAAkC;CAC9C,WAAW;EAAE,IAAI;EAAS,MAAM;CAAQ,CAAC;CACzC,WAAW;EAAE,IAAI;EAAa,MAAM;CAAa,CAAC;CAClD,WAAW;EAAE,IAAI;EAAQ,MAAM;CAAO,CAAC;CACvC,WAAW;EAAE,IAAI;EAAQ,MAAM;CAAO,CAAC;CACvC,WAAW;EAAE,IAAI;EAAQ,MAAM;CAAO,CAAC;CACvC,WAAW;EAAE,IAAI;EAAQ,MAAM;CAAO,CAAC;CACvC,WAAW;EAAE,IAAI;EAAQ,MAAM;CAAO,CAAC;AACxC;;;;;;;;AASA,IAAa,eAA6B,gBAAgB;CACzD,IAAI;CACJ,MAAM;CACN,aAAa;CACb,OAAO;EAAC;EAAM;EAAK;CAAI;AACxB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { EffectContext } from './abilities/effects';
|
|
2
|
+
import type { ProxyOrigin } from './defs';
|
|
3
|
+
import type { Entity } from './entity';
|
|
4
|
+
/**
|
|
5
|
+
* The units of the caster's an effect with a proxy origin goes off from (`ProxyOrigin`), in the order it goes off from
|
|
6
|
+
* them: those of its type that are the caster's (put down by it: `madeBy`; or its owner's where nothing says who put one
|
|
7
|
+
* down), within its `range` of the caster and `near` where it was aimed, and of those the ones it picks. The caster is
|
|
8
|
+
* not among them (`ProxyOrigin.caster` says when it goes off from it too). For a game's own effect, and a screen
|
|
9
|
+
*
|
|
10
|
+
* @beta
|
|
11
|
+
*/
|
|
12
|
+
export declare function proxiesOf(context: Pick<EffectContext, 'world' | 'caster' | 'point'>, origin: ProxyOrigin): Entity[];
|
package/dist/proxies.js
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { hypot } from "./exactMath.js";
|
|
2
|
+
//#region src/proxies.ts
|
|
3
|
+
/** Who put a unit down, where the ground objects pack says (`madeBy`): read by its id, so that this brings in none of the pack */
|
|
4
|
+
var MADE_BY = "core.madeBy";
|
|
5
|
+
/** Whether a unit is the caster's: put down by it, or, where nothing says who put it down, its owner's */
|
|
6
|
+
function isOf(world, unit, caster) {
|
|
7
|
+
const component = world.registry.component(MADE_BY);
|
|
8
|
+
const made = component && unit.get(component);
|
|
9
|
+
return made ? made.by === caster.id : unit.owner === caster.owner;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* The units of the caster's an effect with a proxy origin goes off from (`ProxyOrigin`), in the order it goes off from
|
|
13
|
+
* them: those of its type that are the caster's (put down by it: `madeBy`; or its owner's where nothing says who put one
|
|
14
|
+
* down), within its `range` of the caster and `near` where it was aimed, and of those the ones it picks. The caster is
|
|
15
|
+
* not among them (`ProxyOrigin.caster` says when it goes off from it too). For a game's own effect, and a screen
|
|
16
|
+
*
|
|
17
|
+
* @beta
|
|
18
|
+
*/
|
|
19
|
+
function proxiesOf(context, origin) {
|
|
20
|
+
const { world, caster, point } = context;
|
|
21
|
+
const found = [];
|
|
22
|
+
const candidates = origin.range === void 0 ? world.units.values() : world.spatial.query(caster.pos.x, caster.pos.z, origin.range + 2);
|
|
23
|
+
for (const unit of candidates) {
|
|
24
|
+
if (unit === caster || !unit.alive || unit.hidden || unit.def.id !== origin.proxy || !isOf(world, unit, caster)) continue;
|
|
25
|
+
if (origin.range !== void 0 && hypot(unit.pos.x - caster.pos.x, unit.pos.z - caster.pos.z) > origin.range) continue;
|
|
26
|
+
if (origin.near !== void 0 && hypot(unit.pos.x - point.x, unit.pos.z - point.z) > origin.near) continue;
|
|
27
|
+
found.push(unit);
|
|
28
|
+
}
|
|
29
|
+
found.sort((a, b) => a.id - b.id);
|
|
30
|
+
switch (origin.pick ?? "nearest") {
|
|
31
|
+
case "all": return found;
|
|
32
|
+
case "newest": return found.slice(-1);
|
|
33
|
+
case "oldest": return found.slice(0, 1);
|
|
34
|
+
default: {
|
|
35
|
+
let best;
|
|
36
|
+
let gap = Infinity;
|
|
37
|
+
for (const unit of found) {
|
|
38
|
+
const d = hypot(unit.pos.x - point.x, unit.pos.z - point.z);
|
|
39
|
+
if (d < gap) [best, gap] = [unit, d];
|
|
40
|
+
}
|
|
41
|
+
return best ? [best] : [];
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Runs an effect with a proxy origin (`EffectCommon.origin`): once from the caster where it says so, and once from each
|
|
47
|
+
* proxy it picks, that one the `origin` (its place the `point` with `at: 'proxy'`, and the `target` with `target`)
|
|
48
|
+
*
|
|
49
|
+
* @internal
|
|
50
|
+
*/
|
|
51
|
+
function fromProxies(context, effect, each) {
|
|
52
|
+
const origin = effect.origin;
|
|
53
|
+
const picked = proxiesOf(context, origin);
|
|
54
|
+
const fromCaster = origin.caster === true || origin.caster === "otherwise" && !picked.length;
|
|
55
|
+
const atProxy = origin.at === "proxy";
|
|
56
|
+
if (fromCaster) each(atProxy ? {
|
|
57
|
+
...context,
|
|
58
|
+
point: {
|
|
59
|
+
x: context.caster.pos.x,
|
|
60
|
+
z: context.caster.pos.z
|
|
61
|
+
}
|
|
62
|
+
} : context);
|
|
63
|
+
for (const proxy of picked) {
|
|
64
|
+
if (!proxy.alive) continue;
|
|
65
|
+
each({
|
|
66
|
+
...context,
|
|
67
|
+
origin: proxy,
|
|
68
|
+
...atProxy && { point: {
|
|
69
|
+
x: proxy.pos.x,
|
|
70
|
+
z: proxy.pos.z
|
|
71
|
+
} },
|
|
72
|
+
...origin.target && { target: proxy }
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
//#endregion
|
|
77
|
+
export { fromProxies, proxiesOf };
|
|
78
|
+
|
|
79
|
+
//# sourceMappingURL=proxies.js.map
|