@v12-engine/engine 0.1.1 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/abilities/amounts.d.ts +28 -0
- package/dist/abilities/amounts.js +74 -0
- package/dist/abilities/amounts.js.map +1 -0
- package/dist/abilities/buffs.d.ts +106 -6
- package/dist/abilities/buffs.js +443 -0
- package/dist/abilities/buffs.js.map +1 -0
- package/dist/abilities/castTold.d.ts +2 -0
- package/dist/abilities/castTold.js +66 -0
- package/dist/abilities/castTold.js.map +1 -0
- package/dist/abilities/chance.d.ts +38 -0
- package/dist/abilities/chance.js +77 -0
- package/dist/abilities/chance.js.map +1 -0
- package/dist/abilities/charges.d.ts +18 -0
- package/dist/abilities/charges.js +101 -0
- package/dist/abilities/charges.js.map +1 -0
- package/dist/abilities/control.d.ts +28 -0
- package/dist/abilities/control.js +113 -0
- package/dist/abilities/control.js.map +1 -0
- package/dist/abilities/dispel.js +51 -0
- package/dist/abilities/dispel.js.map +1 -0
- package/dist/abilities/effectFields.d.ts +1 -1
- package/dist/abilities/effectFields.js +676 -0
- package/dist/abilities/effectFields.js.map +1 -0
- package/dist/abilities/effectIndex.d.ts +27 -0
- package/dist/abilities/effectIndex.js +64 -0
- package/dist/abilities/effectIndex.js.map +1 -0
- package/dist/abilities/effects/buff.d.ts +9 -3
- package/dist/abilities/effects/buff.js +84 -0
- package/dist/abilities/effects/buff.js.map +1 -0
- package/dist/abilities/effects/conditions.d.ts +2 -0
- package/dist/abilities/effects/conditions.js +41 -0
- package/dist/abilities/effects/conditions.js.map +1 -0
- package/dist/abilities/effects/core.js +54 -0
- package/dist/abilities/effects/core.js.map +1 -0
- package/dist/abilities/effects/damage.d.ts +1 -1
- package/dist/abilities/effects/damage.js +43 -0
- package/dist/abilities/effects/damage.js.map +1 -0
- package/dist/abilities/effects/heal.d.ts +2 -2
- package/dist/abilities/effects/heal.js +51 -0
- package/dist/abilities/effects/heal.js.map +1 -0
- package/dist/abilities/effects/missile.d.ts +13 -1
- package/dist/abilities/effects/missile.js +104 -0
- package/dist/abilities/effects/missile.js.map +1 -0
- package/dist/abilities/effects/morph.d.ts +5 -0
- package/dist/abilities/effects/morph.js +43 -0
- package/dist/abilities/effects/morph.js.map +1 -0
- package/dist/abilities/effects/moves.d.ts +16 -4
- package/dist/abilities/effects/moves.js +212 -0
- package/dist/abilities/effects/moves.js.map +1 -0
- package/dist/abilities/effects/passives.d.ts +19 -9
- package/dist/abilities/effects/passives.js +131 -0
- package/dist/abilities/effects/passives.js.map +1 -0
- package/dist/abilities/effects/proxy.d.ts +5 -0
- package/dist/abilities/effects/proxy.js +60 -0
- package/dist/abilities/effects/proxy.js.map +1 -0
- package/dist/abilities/effects/sight.d.ts +2 -2
- package/dist/abilities/effects/sight.js +39 -0
- package/dist/abilities/effects/sight.js.map +1 -0
- package/dist/abilities/effects/spawn.d.ts +5 -2
- package/dist/abilities/effects/spawn.js +40 -0
- package/dist/abilities/effects/spawn.js.map +1 -0
- package/dist/abilities/effects/timed.d.ts +2 -2
- package/dist/abilities/effects/timed.js +96 -0
- package/dist/abilities/effects/timed.js.map +1 -0
- package/dist/abilities/effects/trade.d.ts +1 -1
- package/dist/abilities/effects/trade.js +25 -0
- package/dist/abilities/effects/trade.js.map +1 -0
- package/dist/abilities/effects.d.ts +97 -23
- package/dist/abilities/effects.js +860 -0
- package/dist/abilities/effects.js.map +1 -0
- package/dist/abilities/land.d.ts +38 -4
- package/dist/abilities/land.js +189 -0
- package/dist/abilities/land.js.map +1 -0
- package/dist/abilities/recast.d.ts +45 -0
- package/dist/abilities/recast.js +118 -0
- package/dist/abilities/recast.js.map +1 -0
- package/dist/abilities/scaled.js +40 -0
- package/dist/abilities/scaled.js.map +1 -0
- package/dist/abilities/screen.d.ts +6 -0
- package/dist/abilities/screen.js +83 -0
- package/dist/abilities/screen.js.map +1 -0
- package/dist/abilities/shapes.d.ts +66 -0
- package/dist/abilities/shapes.js +122 -0
- package/dist/abilities/shapes.js.map +1 -0
- package/dist/abilities/text.d.ts +14 -2
- package/dist/abilities/text.js +204 -0
- package/dist/abilities/text.js.map +1 -0
- package/dist/abilities/triggers.d.ts +98 -0
- package/dist/abilities/triggers.js +351 -0
- package/dist/abilities/triggers.js.map +1 -0
- package/dist/abilityChanges.d.ts +131 -0
- package/dist/abilityChanges.js +345 -0
- package/dist/abilityChanges.js.map +1 -0
- package/dist/ai/area.d.ts +4 -1
- package/dist/ai/brain.d.ts +4 -1
- package/dist/ai/brain.js +844 -0
- package/dist/ai/brain.js.map +1 -0
- package/dist/ai/budget.js +74 -0
- package/dist/ai/budget.js.map +1 -0
- package/dist/ai/checks.d.ts +9 -1
- package/dist/ai/checks.js +242 -0
- package/dist/ai/checks.js.map +1 -0
- package/dist/ai/computer.d.ts +11 -4
- package/dist/ai/computer.js +251 -0
- package/dist/ai/computer.js.map +1 -0
- package/dist/ai/defence.d.ts +4 -0
- package/dist/ai/defence.js +430 -0
- package/dist/ai/defence.js.map +1 -0
- package/dist/ai/define.d.ts +3 -2
- package/dist/ai/define.js +31 -0
- package/dist/ai/define.js.map +1 -0
- package/dist/ai/economy.d.ts +10 -7
- package/dist/ai/economy.js +780 -0
- package/dist/ai/economy.js.map +1 -0
- package/dist/ai/geometry.js +38 -0
- package/dist/ai/geometry.js.map +1 -0
- package/dist/ai/goals.d.ts +1 -0
- package/dist/ai/goals.js +560 -0
- package/dist/ai/goals.js.map +1 -0
- package/dist/ai/knowledge.d.ts +72 -7
- package/dist/ai/knowledge.js +804 -0
- package/dist/ai/knowledge.js.map +1 -0
- package/dist/ai/lanes.d.ts +10 -2
- package/dist/ai/lanes.js +715 -0
- package/dist/ai/lanes.js.map +1 -0
- package/dist/ai/melee/build.js +264 -0
- package/dist/ai/melee/build.js.map +1 -0
- package/dist/ai/melee/goals.d.ts +7 -0
- package/dist/ai/melee/goals.js +720 -0
- package/dist/ai/melee/goals.js.map +1 -0
- package/dist/ai/melee/heroes.js +68 -0
- package/dist/ai/melee/heroes.js.map +1 -0
- package/dist/ai/melee/index.d.ts +1 -1
- package/dist/ai/melee/index.js +51 -0
- package/dist/ai/melee/index.js.map +1 -0
- package/dist/ai/melee/production.js +29 -0
- package/dist/ai/melee/production.js.map +1 -0
- package/dist/ai/melee/surrender.js +64 -0
- package/dist/ai/melee/surrender.js.map +1 -0
- package/dist/ai/micro.d.ts +9 -0
- package/dist/ai/micro.js +1316 -0
- package/dist/ai/micro.js.map +1 -0
- package/dist/ai/mission.d.ts +9 -2
- package/dist/ai/mission.js +538 -0
- package/dist/ai/mission.js.map +1 -0
- package/dist/ai/missionRules.d.ts +1 -1
- package/dist/ai/missionRules.js +26 -0
- package/dist/ai/missionRules.js.map +1 -0
- package/dist/ai/module.d.ts +6 -2
- package/dist/ai/module.js +37 -0
- package/dist/ai/module.js.map +1 -0
- package/dist/ai/options.d.ts +3 -3
- package/dist/ai/plans/build.d.ts +20 -1
- package/dist/ai/plans/build.js +608 -0
- package/dist/ai/plans/build.js.map +1 -0
- package/dist/ai/plans/placement.d.ts +4 -1
- package/dist/ai/plans/placement.js +295 -0
- package/dist/ai/plans/placement.js.map +1 -0
- package/dist/ai/plans/plans.d.ts +9 -0
- package/dist/ai/plans/plans.js +110 -0
- package/dist/ai/plans/plans.js.map +1 -0
- package/dist/ai/plans/production.d.ts +14 -2
- package/dist/ai/plans/production.js +434 -0
- package/dist/ai/plans/production.js.map +1 -0
- package/dist/ai/plans/purse.d.ts +6 -3
- package/dist/ai/plans/purse.js +139 -0
- package/dist/ai/plans/purse.js.map +1 -0
- package/dist/ai/plans/tech.d.ts +6 -0
- package/dist/ai/plans/tech.js +122 -0
- package/dist/ai/plans/tech.js.map +1 -0
- package/dist/ai/profiles.d.ts +4 -4
- package/dist/{profiles-B3NS9jwk.js → ai/profiles.js} +3 -98
- package/dist/ai/profiles.js.map +1 -0
- package/dist/ai/reach.js +54 -0
- package/dist/ai/reach.js.map +1 -0
- package/dist/ai/report.d.ts +8 -0
- package/dist/ai/report.js +87 -0
- package/dist/ai/report.js.map +1 -0
- package/dist/ai/roles.d.ts +4 -0
- package/dist/ai/roles.js +207 -0
- package/dist/ai/roles.js.map +1 -0
- package/dist/ai/rules.d.ts +8 -2
- package/dist/ai/rules.js +416 -0
- package/dist/ai/rules.js.map +1 -0
- package/dist/ai/scouting.d.ts +6 -0
- package/dist/ai/scouting.js +324 -0
- package/dist/ai/scouting.js.map +1 -0
- package/dist/ai/settings.js +99 -0
- package/dist/ai/settings.js.map +1 -0
- package/dist/ai/squads.d.ts +21 -2
- package/dist/ai/squads.js +916 -0
- package/dist/ai/squads.js.map +1 -0
- package/dist/ai/strength.js +320 -0
- package/dist/ai/strength.js.map +1 -0
- package/dist/ai/task.d.ts +3 -1
- package/dist/ai/task.js +17 -0
- package/dist/ai/task.js.map +1 -0
- package/dist/ai/tasks/attack.js +24 -0
- package/dist/ai/tasks/attack.js.map +1 -0
- package/dist/ai/tasks/capture.d.ts +3 -3
- package/dist/ai/tasks/capture.js +37 -0
- package/dist/ai/tasks/capture.js.map +1 -0
- package/dist/ai/tasks/creep.js +29 -0
- package/dist/ai/tasks/creep.js.map +1 -0
- package/dist/ai/tasks/defend.js +61 -0
- package/dist/ai/tasks/defend.js.map +1 -0
- package/dist/ai/tasks/drop.js +81 -0
- package/dist/ai/tasks/drop.js.map +1 -0
- package/dist/ai/tasks/escort.js +59 -0
- package/dist/ai/tasks/escort.js.map +1 -0
- package/dist/ai/tasks/gather.js +48 -0
- package/dist/ai/tasks/gather.js.map +1 -0
- package/dist/ai/tasks/harass.js +39 -0
- package/dist/ai/tasks/harass.js.map +1 -0
- package/dist/ai/tasks/hold.js +32 -0
- package/dist/ai/tasks/hold.js.map +1 -0
- package/dist/ai/tasks/index.js +34 -0
- package/dist/ai/tasks/index.js.map +1 -0
- package/dist/ai/tasks/move.js +26 -0
- package/dist/ai/tasks/move.js.map +1 -0
- package/dist/ai/tasks/patrol.js +59 -0
- package/dist/ai/tasks/patrol.js.map +1 -0
- package/dist/ai/tasks/retreat.js +28 -0
- package/dist/ai/tasks/retreat.js.map +1 -0
- package/dist/ai/tasks/scout.js +73 -0
- package/dist/ai/tasks/scout.js.map +1 -0
- package/dist/ai/tasks/shared.d.ts +1 -1
- package/dist/ai/tasks/shared.js +137 -0
- package/dist/ai/tasks/shared.js.map +1 -0
- package/dist/ai/team.d.ts +18 -1
- package/dist/ai/team.js +492 -0
- package/dist/ai/team.js.map +1 -0
- package/dist/ai/threat.d.ts +6 -0
- package/dist/ai/threat.js +206 -0
- package/dist/ai/threat.js.map +1 -0
- package/dist/ai/view.d.ts +21 -7
- package/dist/ai/view.js +677 -0
- package/dist/ai/view.js.map +1 -0
- package/dist/ai/waves.d.ts +6 -0
- package/dist/ai/waves.js +410 -0
- package/dist/ai/waves.js.map +1 -0
- package/dist/ai.js +54 -6239
- package/dist/aiTesting.d.ts +6 -3
- package/dist/aiTesting.js +229 -0
- package/dist/aiTesting.js.map +1 -0
- package/dist/areas.d.ts +4 -1
- package/dist/areas.js +295 -0
- package/dist/areas.js.map +1 -0
- package/dist/attacks.d.ts +3 -3
- package/dist/attacks.js +127 -0
- package/dist/attacks.js.map +1 -0
- package/dist/burning.d.ts +267 -0
- package/dist/burning.js +795 -0
- package/dist/burning.js.map +1 -0
- package/dist/bytes.js +21 -0
- package/dist/bytes.js.map +1 -0
- package/dist/callings.d.ts +71 -0
- package/dist/callings.js +157 -0
- package/dist/callings.js.map +1 -0
- package/dist/cameraOrders.d.ts +78 -0
- package/dist/cameraOrders.js +114 -0
- package/dist/cameraOrders.js.map +1 -0
- package/dist/camps.d.ts +70 -4
- package/dist/camps.js +501 -0
- package/dist/camps.js.map +1 -0
- package/dist/capture.d.ts +15 -3
- package/dist/capture.js +304 -0
- package/dist/capture.js.map +1 -0
- package/dist/cellLayers.d.ts +78 -13
- package/dist/cellLayers.js +275 -0
- package/dist/cellLayers.js.map +1 -0
- package/dist/cellPatches.d.ts +24 -0
- package/dist/cellPatches.js +73 -0
- package/dist/cellPatches.js.map +1 -0
- package/dist/cinematics.d.ts +10 -5
- package/dist/cinematics.js +161 -0
- package/dist/cinematics.js.map +1 -0
- package/dist/clock.d.ts +2 -2
- package/dist/clock.js +78 -0
- package/dist/clock.js.map +1 -0
- package/dist/commands.d.ts +36 -4
- package/dist/commands.js +636 -0
- package/dist/commands.js.map +1 -0
- package/dist/components.d.ts +31 -10
- package/dist/components.js +74 -0
- package/dist/components.js.map +1 -0
- package/dist/computers.d.ts +4 -4
- package/dist/computers.js +194 -0
- package/dist/computers.js.map +1 -0
- package/dist/concealment.d.ts +25 -2
- package/dist/concealment.js +409 -0
- package/dist/concealment.js.map +1 -0
- package/dist/coreComponents.js +130 -0
- package/dist/coreComponents.js.map +1 -0
- package/dist/createGame.d.ts +306 -0
- package/dist/createGame.js +405 -0
- package/dist/createGame.js.map +1 -0
- package/dist/dashing.d.ts +18 -2
- package/dist/dashing.js +41 -0
- package/dist/dashing.js.map +1 -0
- package/dist/debug.d.ts +8 -0
- package/dist/debug.js +5 -3
- package/dist/debug2.js +76 -0
- package/dist/debug2.js.map +1 -0
- package/dist/debugCommands.d.ts +6 -6
- package/dist/debugCommands.js +537 -0
- package/dist/debugCommands.js.map +1 -0
- package/dist/debugging.d.ts +1 -0
- package/dist/defaultSets.d.ts +183 -0
- package/dist/defaultSets.js +216 -0
- package/dist/defaultSets.js.map +1 -0
- package/dist/definitions.d.ts +6 -0
- package/dist/definitions.js +78 -0
- package/dist/definitions.js.map +1 -0
- package/dist/defs.d.ts +1895 -165
- package/dist/defs.js +380 -0
- package/dist/defs.js.map +1 -0
- package/dist/denying.d.ts +4 -4
- package/dist/denying.js +106 -0
- package/dist/denying.js.map +1 -0
- package/dist/destructibles.d.ts +2 -2
- package/dist/destructibles.js +36 -0
- package/dist/destructibles.js.map +1 -0
- package/dist/determinism.d.ts +4 -4
- package/dist/determinism.js +247 -0
- package/dist/determinism.js.map +1 -0
- package/dist/dialog.d.ts +17 -2
- package/dist/dialog.js +108 -0
- package/dist/dialog.js.map +1 -0
- package/dist/effectRefs.js +28 -0
- package/dist/effectRefs.js.map +1 -0
- package/dist/effects.d.ts +27 -11
- package/dist/effects.js +110 -0
- package/dist/effects.js.map +1 -0
- package/dist/endings.d.ts +1 -1
- package/dist/endings.js +78 -0
- package/dist/endings.js.map +1 -0
- package/dist/engagement.d.ts +40 -6
- package/dist/engagement.js +530 -0
- package/dist/engagement.js.map +1 -0
- package/dist/engineEvents.d.ts +72 -9
- package/dist/engineEvents.js +520 -0
- package/dist/engineEvents.js.map +1 -0
- package/dist/entity.d.ts +275 -26
- package/dist/entity.js +441 -0
- package/dist/entity.js.map +1 -0
- package/dist/entityIndex.d.ts +10 -3
- package/dist/entityIndex.js +149 -0
- package/dist/entityIndex.js.map +1 -0
- package/dist/errors.d.ts +6 -2
- package/dist/errors.js +59 -0
- package/dist/errors.js.map +1 -0
- package/dist/events.d.ts +11 -5
- package/dist/events.js +158 -0
- package/dist/events.js.map +1 -0
- package/dist/exactMath.js +273 -0
- package/dist/exactMath.js.map +1 -0
- package/dist/features.d.ts +1 -1
- package/dist/features.js +127 -0
- package/dist/features.js.map +1 -0
- package/dist/fields.d.ts +25 -5
- package/dist/fields.js +140 -0
- package/dist/fields.js.map +1 -0
- package/dist/fixture.d.ts +3 -3
- package/dist/fixture.js +512 -0
- package/dist/fixture.js.map +1 -0
- package/dist/fog.d.ts +26 -3
- package/dist/fog.js +333 -0
- package/dist/fog.js.map +1 -0
- package/dist/foliage.d.ts +476 -0
- package/dist/foliage.js +1478 -0
- package/dist/foliage.js.map +1 -0
- package/dist/foliageDebug.d.ts +57 -0
- package/dist/foliageDebug.js +172 -0
- package/dist/foliageDebug.js.map +1 -0
- package/dist/foliageRegrowth.d.ts +20 -0
- package/dist/foliageRegrowth.js +332 -0
- package/dist/foliageRegrowth.js.map +1 -0
- package/dist/formState.d.ts +67 -0
- package/dist/formState.js +65 -0
- package/dist/formState.js.map +1 -0
- package/dist/formation.d.ts +46 -8
- package/dist/formation.js +297 -0
- package/dist/formation.js.map +1 -0
- package/dist/forms.d.ts +58 -0
- package/dist/forms.js +146 -0
- package/dist/forms.js.map +1 -0
- package/dist/friendlyFire.d.ts +2 -2
- package/dist/friendlyFire.js +37 -0
- package/dist/friendlyFire.js.map +1 -0
- package/dist/game.d.ts +141 -48
- package/dist/game.js +834 -0
- package/dist/game.js.map +1 -0
- package/dist/gameData.d.ts +96 -22
- package/dist/gameData.js +1690 -0
- package/dist/gameData.js.map +1 -0
- package/dist/gameFiles.d.ts +3 -3
- package/dist/gameFiles.js +14 -0
- package/dist/gameFiles.js.map +1 -0
- package/dist/gates.js +92 -0
- package/dist/gates.js.map +1 -0
- package/dist/generate.d.ts +28 -1
- package/dist/generate.js +1062 -0
- package/dist/generate.js.map +1 -0
- package/dist/generateWorker.d.ts +7 -3
- package/dist/generateWorker.js +86 -0
- package/dist/generateWorker.js.map +1 -0
- package/dist/grid.d.ts +9 -0
- package/dist/grid.js +102 -0
- package/dist/grid.js.map +1 -0
- package/dist/ground.d.ts +17 -1
- package/dist/ground.js +375 -0
- package/dist/ground.js.map +1 -0
- package/dist/groundObjects.d.ts +70 -0
- package/dist/groundObjects.js +371 -0
- package/dist/groundObjects.js.map +1 -0
- package/dist/groundSpeed.d.ts +20 -3
- package/dist/groundSpeed.js +117 -0
- package/dist/groundSpeed.js.map +1 -0
- package/dist/hero.d.ts +126 -10
- package/dist/hero.js +432 -0
- package/dist/hero.js.map +1 -0
- package/dist/holds.d.ts +94 -0
- package/dist/holds.js +305 -0
- package/dist/holds.js.map +1 -0
- package/dist/home.d.ts +1 -1
- package/dist/home.js +30 -0
- package/dist/home.js.map +1 -0
- package/dist/hooks.d.ts +339 -57
- package/dist/hooks.js +105 -0
- package/dist/hooks.js.map +1 -0
- package/dist/hotReload.d.ts +6 -5
- package/dist/hotReload.js +145 -0
- package/dist/hotReload.js.map +1 -0
- package/dist/ids.d.ts +3 -3
- package/dist/ids.js +30 -0
- package/dist/ids.js.map +1 -0
- package/dist/idsFile.d.ts +36 -0
- package/dist/idsFile.js +134 -0
- package/dist/idsFile.js.map +1 -0
- package/dist/index.d.ts +105 -68
- package/dist/index.js +194 -4701
- package/dist/inspect.d.ts +29 -2
- package/dist/{inspect-D9dWHmZ0.js → inspect.js} +21 -12
- package/dist/inspect.js.map +1 -0
- package/dist/inventory.d.ts +14 -1
- package/dist/inventory.js +84 -0
- package/dist/inventory.js.map +1 -0
- package/dist/items.d.ts +136 -8
- package/dist/items.js +585 -0
- package/dist/items.js.map +1 -0
- package/dist/lanes.d.ts +12 -3
- package/dist/lanes.js +496 -0
- package/dist/lanes.js.map +1 -0
- package/dist/life.d.ts +6 -2
- package/dist/life.js +287 -0
- package/dist/life.js.map +1 -0
- package/dist/log.d.ts +26 -3
- package/dist/log.js +192 -0
- package/dist/log.js.map +1 -0
- package/dist/manaBurn.d.ts +2 -2
- package/dist/manaBurn.js +75 -0
- package/dist/manaBurn.js.map +1 -0
- package/dist/map/file.d.ts +56 -3
- package/dist/map/file.js +264 -0
- package/dist/map/file.js.map +1 -0
- package/dist/map/images.js +61 -0
- package/dist/map/images.js.map +1 -0
- package/dist/map/look.d.ts +1 -1
- package/dist/map/look.js +30 -0
- package/dist/map/look.js.map +1 -0
- package/dist/map/pathProfile.js +183 -0
- package/dist/map/pathProfile.js.map +1 -0
- package/dist/map/resize.d.ts +4 -0
- package/dist/map/resize.js +136 -0
- package/dist/map/resize.js.map +1 -0
- package/dist/map/schema.js +257 -0
- package/dist/map/schema.js.map +1 -0
- package/dist/map/terrain.js +214 -0
- package/dist/map/terrain.js.map +1 -0
- package/dist/map/types.d.ts +92 -13
- package/dist/map/types.js +251 -0
- package/dist/map/types.js.map +1 -0
- package/dist/mapCheck/cells.js +94 -0
- package/dist/mapCheck/cells.js.map +1 -0
- package/dist/mapCheck/rules/foliage.d.ts +9 -0
- package/dist/mapCheck/rules/foliage.js +83 -0
- package/dist/mapCheck/rules/foliage.js.map +1 -0
- package/dist/mapCheck/rules/names.js +39 -0
- package/dist/mapCheck/rules/names.js.map +1 -0
- package/dist/mapCheck/rules/objects.d.ts +1 -1
- package/dist/mapCheck/rules/objects.js +56 -0
- package/dist/mapCheck/rules/objects.js.map +1 -0
- package/dist/mapCheck/rules/paths.js +32 -0
- package/dist/mapCheck/rules/paths.js.map +1 -0
- package/dist/mapCheck/rules/players.js +20 -0
- package/dist/mapCheck/rules/players.js.map +1 -0
- package/dist/mapCheck/rules/races.js +56 -0
- package/dist/mapCheck/rules/races.js.map +1 -0
- package/dist/mapCheck/rules/random.js +47 -0
- package/dist/mapCheck/rules/random.js.map +1 -0
- package/dist/mapCheck/rules/regions.js +30 -0
- package/dist/mapCheck/rules/regions.js.map +1 -0
- package/dist/mapCheck/rules/targets.js +31 -0
- package/dist/mapCheck/rules/targets.js.map +1 -0
- package/dist/mapCheck/rules/walking.js +45 -0
- package/dist/mapCheck/rules/walking.js.map +1 -0
- package/dist/mapCheck.d.ts +2 -2
- package/dist/mapCheck.js +63 -0
- package/dist/mapCheck.js.map +1 -0
- package/dist/mapFields.d.ts +25 -2
- package/dist/mapFields.js +134 -0
- package/dist/mapFields.js.map +1 -0
- package/dist/mapFile.js +176 -0
- package/dist/mapFile.js.map +1 -0
- package/dist/mapMeasure.d.ts +8 -0
- package/dist/mapMeasure.js +283 -0
- package/dist/mapMeasure.js.map +1 -0
- package/dist/mapMerge.d.ts +1 -0
- package/dist/mapMerge.js +172 -0
- package/dist/mapMerge.js.map +1 -0
- package/dist/mapObjectives.js +138 -0
- package/dist/mapObjectives.js.map +1 -0
- package/dist/mapObjects.js +80 -0
- package/dist/mapObjects.js.map +1 -0
- package/dist/math.d.ts +37 -7
- package/dist/math.js +155 -0
- package/dist/math.js.map +1 -0
- package/dist/messages.d.ts +71 -4
- package/dist/messages.js +29 -0
- package/dist/messages.js.map +1 -0
- package/dist/missionRules.d.ts +10 -2
- package/dist/{missionRules-C-bGxm0Q.js → missionRules.js} +30 -150
- package/dist/missionRules.js.map +1 -0
- package/dist/mods.d.ts +39 -20
- package/dist/mods.js +271 -0
- package/dist/mods.js.map +1 -0
- package/dist/moves.d.ts +87 -0
- package/dist/moves.js +539 -0
- package/dist/moves.js.map +1 -0
- package/dist/names.d.ts +7 -0
- package/dist/names.js +122 -0
- package/dist/names.js.map +1 -0
- package/dist/navigation/agentParams.js +14 -0
- package/dist/navigation/agentParams.js.map +1 -0
- package/dist/navigation/air.d.ts +7 -3
- package/dist/navigation/air.js +401 -0
- package/dist/navigation/air.js.map +1 -0
- package/dist/navigation/builds.d.ts +34 -2
- package/dist/navigation/builds.js +287 -0
- package/dist/navigation/builds.js.map +1 -0
- package/dist/navigation/groundAreas.d.ts +59 -1
- package/dist/navigation/groundAreas.js +407 -0
- package/dist/navigation/groundAreas.js.map +1 -0
- package/dist/navigation/navigation.d.ts +98 -9
- package/dist/navigation/recast.d.ts +194 -18
- package/dist/navigation/recast.js +1379 -0
- package/dist/navigation/recast.js.map +1 -0
- package/dist/navigation/sidePaths.d.ts +8 -3
- package/dist/navigation/sidePaths.js +241 -0
- package/dist/navigation/sidePaths.js.map +1 -0
- package/dist/navigation/sized.js +243 -0
- package/dist/navigation/sized.js.map +1 -0
- package/dist/nearest.js +32 -0
- package/dist/nearest.js.map +1 -0
- package/dist/noise.js +59 -0
- package/dist/noise.js.map +1 -0
- package/dist/objectives.d.ts +12 -3
- package/dist/objectives.js +144 -0
- package/dist/objectives.js.map +1 -0
- package/dist/orders/basic.d.ts +5 -5
- package/dist/orders/basic.js +417 -0
- package/dist/orders/basic.js.map +1 -0
- package/dist/orders/build.js +278 -0
- package/dist/orders/build.js.map +1 -0
- package/dist/orders/cast.d.ts +13 -3
- package/dist/orders/cast.js +558 -0
- package/dist/orders/cast.js.map +1 -0
- package/dist/orders/facts.js +16 -0
- package/dist/orders/facts.js.map +1 -0
- package/dist/orders/harvest.d.ts +21 -5
- package/dist/orders/harvest.js +540 -0
- package/dist/orders/harvest.js.map +1 -0
- package/dist/orders/idle.d.ts +3 -1
- package/dist/orders/idle.js +234 -0
- package/dist/orders/idle.js.map +1 -0
- package/dist/orders/items.js +92 -0
- package/dist/orders/items.js.map +1 -0
- package/dist/orders/queue.js +108 -0
- package/dist/orders/queue.js.map +1 -0
- package/dist/orders/waiting.d.ts +39 -0
- package/dist/orders/waiting.js +149 -0
- package/dist/orders/waiting.js.map +1 -0
- package/dist/pack.schema.js +13 -0
- package/dist/pack.schema.js.map +1 -0
- package/dist/pack.schema.json +7622 -841
- package/dist/packs/director/index.d.ts +13 -5
- package/dist/packs/director/index.js +204 -0
- package/dist/packs/director/index.js.map +1 -0
- package/dist/packs/heroes/campaign.d.ts +3 -2
- package/dist/packs/heroes/campaign.js +241 -0
- package/dist/packs/heroes/campaign.js.map +1 -0
- package/dist/packs/heroes/carry.d.ts +6 -0
- package/dist/packs/heroes/carry.js +112 -0
- package/dist/packs/heroes/carry.js.map +1 -0
- package/dist/packs/heroes/commands.js +115 -0
- package/dist/packs/heroes/commands.js.map +1 -0
- package/dist/packs/heroes/fallen.d.ts +43 -0
- package/dist/packs/heroes/fallen.js +61 -0
- package/dist/packs/heroes/fallen.js.map +1 -0
- package/dist/packs/heroes/hire.js +60 -0
- package/dist/packs/heroes/hire.js.map +1 -0
- package/dist/packs/heroes/index.d.ts +7 -6
- package/dist/packs/heroes/index.js +130 -0
- package/dist/packs/heroes/index.js.map +1 -0
- package/dist/packs/heroes/loop.d.ts +95 -0
- package/dist/packs/heroes/loop.js +250 -0
- package/dist/packs/heroes/loop.js.map +1 -0
- package/dist/packs/heroes/making.d.ts +6 -3
- package/dist/packs/heroes/making.js +55 -0
- package/dist/packs/heroes/making.js.map +1 -0
- package/dist/packs/heroes/respawn.d.ts +3 -3
- package/dist/packs/heroes/respawn.js +87 -0
- package/dist/packs/heroes/respawn.js.map +1 -0
- package/dist/packs/heroes/sets.d.ts +32 -0
- package/dist/packs/heroes/sets.js +51 -0
- package/dist/packs/heroes/sets.js.map +1 -0
- package/dist/packs/heroes/spells.d.ts +16 -0
- package/dist/packs/heroes/spells.js +269 -0
- package/dist/packs/heroes/spells.js.map +1 -0
- package/dist/packs/items/defaults.d.ts +43 -0
- package/dist/packs/items/defaults.js +1504 -0
- package/dist/packs/items/defaults.js.map +1 -0
- package/dist/packs/items/index.d.ts +27 -0
- package/dist/packs/items/index.js +214 -0
- package/dist/packs/items/index.js.map +1 -0
- package/dist/packs/moba/index.d.ts +3 -3
- package/dist/packs/moba/index.js +174 -0
- package/dist/packs/moba/index.js.map +1 -0
- package/dist/packs/pack.d.ts +15 -15
- package/dist/packs/pack.js +14 -0
- package/dist/packs/pack.js.map +1 -0
- package/dist/packs.d.ts +15 -7
- package/dist/packs.js +222 -0
- package/dist/packs.js.map +1 -0
- package/dist/paths.d.ts +2 -0
- package/dist/paths.js +109 -0
- package/dist/paths.js.map +1 -0
- package/dist/plain.js +57 -0
- package/dist/plain.js.map +1 -0
- package/dist/player.d.ts +33 -10
- package/dist/player.js +159 -0
- package/dist/player.js.map +1 -0
- package/dist/portals.d.ts +1 -1
- package/dist/portals.js +194 -0
- package/dist/portals.js.map +1 -0
- package/dist/prefabs.d.ts +25 -2
- package/dist/prefabs.js +239 -0
- package/dist/prefabs.js.map +1 -0
- package/dist/presetBuildings.js +58 -0
- package/dist/presetBuildings.js.map +1 -0
- package/dist/presetFoliage.d.ts +27 -0
- package/dist/presetFoliage.js +98 -0
- package/dist/presetFoliage.js.map +1 -0
- package/dist/presetGround.js +65 -0
- package/dist/presetGround.js.map +1 -0
- package/dist/proxies.d.ts +12 -0
- package/dist/proxies.js +79 -0
- package/dist/proxies.js.map +1 -0
- package/dist/query.d.ts +56 -0
- package/dist/query.js +88 -0
- package/dist/query.js.map +1 -0
- package/dist/races.d.ts +15 -14
- package/dist/races.js +172 -0
- package/dist/races.js.map +1 -0
- package/dist/randomGroups.js +91 -0
- package/dist/randomGroups.js.map +1 -0
- package/dist/registry.d.ts +117 -53
- package/dist/registry.js +323 -0
- package/dist/registry.js.map +1 -0
- package/dist/remains.d.ts +11 -9
- package/dist/remains.js +188 -0
- package/dist/remains.js.map +1 -0
- package/dist/replication.d.ts +12 -7
- package/dist/replication.js +100 -0
- package/dist/replication.js.map +1 -0
- package/dist/rng.d.ts +2 -0
- package/dist/rng.js +40 -0
- package/dist/rng.js.map +1 -0
- package/dist/rules.d.ts +186 -99
- package/dist/rules.js +179 -0
- package/dist/rules.js.map +1 -0
- package/dist/rulesCheck.d.ts +5 -4
- package/dist/rulesCheck.js +693 -0
- package/dist/rulesCheck.js.map +1 -0
- package/dist/runes.d.ts +2 -2
- package/dist/runes.js +80 -0
- package/dist/runes.js.map +1 -0
- package/dist/save.d.ts +37 -12
- package/dist/save.js +532 -0
- package/dist/save.js.map +1 -0
- package/dist/scenario.d.ts +2 -2
- package/dist/scenario.js +99 -0
- package/dist/scenario.js.map +1 -0
- package/dist/scheduler.d.ts +3 -0
- package/dist/scheduler.js +156 -0
- package/dist/scheduler.js.map +1 -0
- package/dist/score.d.ts +19 -19
- package/dist/score.js +709 -0
- package/dist/score.js.map +1 -0
- package/dist/sequences.d.ts +10 -6
- package/dist/sequences.js +206 -0
- package/dist/sequences.js.map +1 -0
- package/dist/server/doorman.js +154 -0
- package/dist/server/doorman.js.map +1 -0
- package/dist/server/gameServer.d.ts +16 -1
- package/dist/server/gameServer.js +643 -0
- package/dist/server/gameServer.js.map +1 -0
- package/dist/server/index.d.ts +1 -1
- package/dist/server/lobby.js +199 -0
- package/dist/server/lobby.js.map +1 -0
- package/dist/server/log.js +18 -0
- package/dist/server/log.js.map +1 -0
- package/dist/server/match.js +267 -0
- package/dist/server/match.js.map +1 -0
- package/dist/server/mode.d.ts +18 -9
- package/dist/server/mode.js +220 -0
- package/dist/server/mode.js.map +1 -0
- package/dist/{navigation-worker.js → server/navigation-worker.js} +1 -1
- package/dist/server/navigation-worker.js.map +1 -0
- package/dist/server/navigation.js +39 -0
- package/dist/server/navigation.js.map +1 -0
- package/dist/server/ops.d.ts +4 -0
- package/dist/server/ops.js +137 -0
- package/dist/server/ops.js.map +1 -0
- package/dist/server/packs.d.ts +3 -3
- package/dist/server/packs.js +32 -0
- package/dist/server/packs.js.map +1 -0
- package/dist/server/ratings.d.ts +5 -0
- package/dist/server/ratings.js +104 -0
- package/dist/server/ratings.js.map +1 -0
- package/dist/server/relay.d.ts +12 -2
- package/dist/server/relay.js +144 -0
- package/dist/server/relay.js.map +1 -0
- package/dist/server/rooms.d.ts +9 -2
- package/dist/server/rooms.js +442 -0
- package/dist/server/rooms.js.map +1 -0
- package/dist/server/seat.js +116 -0
- package/dist/server/seat.js.map +1 -0
- package/dist/server/seatSettings.d.ts +3 -3
- package/dist/server/seatSettings.js +63 -0
- package/dist/server/seatSettings.js.map +1 -0
- package/dist/server/secret.js +13 -0
- package/dist/server/secret.js.map +1 -0
- package/dist/server/start.d.ts +13 -6
- package/dist/server/start.js +76 -0
- package/dist/server/start.js.map +1 -0
- package/dist/server/websocket.d.ts +9 -1
- package/dist/server/websocket.js +306 -0
- package/dist/server/websocket.js.map +1 -0
- package/dist/server.js +15 -2861
- package/dist/session/can.js +26 -0
- package/dist/session/can.js.map +1 -0
- package/dist/session/commandReplay.d.ts +8 -2
- package/dist/session/commandReplay.js +293 -0
- package/dist/session/commandReplay.js.map +1 -0
- package/dist/session/debug.js +151 -0
- package/dist/session/debug.js.map +1 -0
- package/dist/session/delay.js +62 -0
- package/dist/session/delay.js.map +1 -0
- package/dist/session/delta.d.ts +14 -1
- package/dist/session/delta.js +407 -0
- package/dist/session/delta.js.map +1 -0
- package/dist/session/entityState.js +415 -0
- package/dist/session/entityState.js.map +1 -0
- package/dist/session/local.d.ts +47 -5
- package/dist/session/local.js +670 -0
- package/dist/session/local.js.map +1 -0
- package/dist/session/memory.d.ts +20 -2
- package/dist/session/memory.js +131 -0
- package/dist/session/memory.js.map +1 -0
- package/dist/session/protocol.d.ts +325 -31
- package/dist/session/protocol.js +55 -0
- package/dist/session/protocol.js.map +1 -0
- package/dist/session/remote.d.ts +74 -12
- package/dist/session/remote.js +1394 -0
- package/dist/session/remote.js.map +1 -0
- package/dist/session/replay.d.ts +11 -2
- package/dist/session/replay.js +160 -0
- package/dist/session/replay.js.map +1 -0
- package/dist/session/seed.js +12 -0
- package/dist/session/seed.js.map +1 -0
- package/dist/session/share.d.ts +5 -1
- package/dist/session/share.js +94 -0
- package/dist/session/share.js.map +1 -0
- package/dist/session/socket.d.ts +1 -1
- package/dist/session/socket.js +29 -0
- package/dist/session/socket.js.map +1 -0
- package/dist/session/wire.d.ts +5 -0
- package/dist/session/wire.js +84 -0
- package/dist/session/wire.js.map +1 -0
- package/dist/session/worker.d.ts +77 -12
- package/dist/session/worker.js +499 -0
- package/dist/session/worker.js.map +1 -0
- package/dist/shared.d.ts +31 -5
- package/dist/shared.js +166 -0
- package/dist/shared.js.map +1 -0
- package/dist/sides.d.ts +9 -3
- package/dist/sides.js +149 -0
- package/dist/sides.js.map +1 -0
- package/dist/sight.js +85 -0
- package/dist/sight.js.map +1 -0
- package/dist/simulate-worker.js +1 -1
- package/dist/simulate.d.ts +12 -8
- package/dist/{simulate-oXBiw1Ff.js → simulate.js} +10 -11
- package/dist/simulate.js.map +1 -0
- package/dist/smart.js +77 -0
- package/dist/smart.js.map +1 -0
- package/dist/spatial.d.ts +32 -16
- package/dist/spatial.js +234 -0
- package/dist/spatial.js.map +1 -0
- package/dist/spawning.d.ts +1 -0
- package/dist/spawning.js +224 -0
- package/dist/spawning.js.map +1 -0
- package/dist/stances.d.ts +6 -3
- package/dist/stances.js +169 -0
- package/dist/stances.js.map +1 -0
- package/dist/start.d.ts +10 -10
- package/dist/start.js +75 -0
- package/dist/start.js.map +1 -0
- package/dist/stats.d.ts +42 -16
- package/dist/stats.js +290 -0
- package/dist/stats.js.map +1 -0
- package/dist/summoned.d.ts +52 -0
- package/dist/summoned.js +38 -0
- package/dist/summoned.js.map +1 -0
- package/dist/summons.d.ts +10 -13
- package/dist/summons.js +271 -0
- package/dist/summons.js.map +1 -0
- package/dist/systems/abilities.js +224 -0
- package/dist/systems/abilities.js.map +1 -0
- package/dist/systems/combat.d.ts +35 -1
- package/dist/systems/combat.js +677 -0
- package/dist/systems/combat.js.map +1 -0
- package/dist/systems/combatTold.d.ts +3 -1
- package/dist/systems/combatTold.js +85 -0
- package/dist/systems/combatTold.js.map +1 -0
- package/dist/systems/construction.js +80 -0
- package/dist/systems/construction.js.map +1 -0
- package/dist/systems/economy.d.ts +0 -6
- package/dist/systems/economy.js +128 -0
- package/dist/systems/economy.js.map +1 -0
- package/dist/systems/fog.d.ts +1 -1
- package/dist/systems/fog.js +120 -0
- package/dist/systems/fog.js.map +1 -0
- package/dist/systems/life.js +32 -0
- package/dist/systems/life.js.map +1 -0
- package/dist/systems/movement.d.ts +24 -12
- package/dist/systems/movement.js +1247 -0
- package/dist/systems/movement.js.map +1 -0
- package/dist/systems/orders.js +64 -0
- package/dist/systems/orders.js.map +1 -0
- package/dist/systems/production.js +322 -0
- package/dist/systems/production.js.map +1 -0
- package/dist/systems/productionQueue.js +120 -0
- package/dist/systems/productionQueue.js.map +1 -0
- package/dist/systems/victory.d.ts +1 -1
- package/dist/systems/victory.js +56 -0
- package/dist/systems/victory.js.map +1 -0
- package/dist/talk.d.ts +6 -6
- package/dist/talk.js +153 -0
- package/dist/talk.js.map +1 -0
- package/dist/targeting.d.ts +142 -0
- package/dist/targeting.js +49 -0
- package/dist/targeting.js.map +1 -0
- package/dist/tech.d.ts +20 -3
- package/dist/tech.js +239 -0
- package/dist/tech.js.map +1 -0
- package/dist/techTree.d.ts +7 -0
- package/dist/techTree.js +90 -0
- package/dist/techTree.js.map +1 -0
- package/dist/terrain.d.ts +59 -7
- package/dist/terrain.js +389 -0
- package/dist/terrain.js.map +1 -0
- package/dist/terrainSave.d.ts +6 -0
- package/dist/terrainSave.js +74 -0
- package/dist/terrainSave.js.map +1 -0
- package/dist/testing.d.ts +8 -7
- package/dist/testing.js +13 -739
- package/dist/testing.js.map +1 -1
- package/dist/tiles.d.ts +1 -1
- package/dist/tiles.js +43 -0
- package/dist/tiles.js.map +1 -0
- package/dist/timers.d.ts +29 -4
- package/dist/timers.js +242 -0
- package/dist/timers.js.map +1 -0
- package/dist/tomes.d.ts +4 -4
- package/dist/tomes.js +94 -0
- package/dist/tomes.js.map +1 -0
- package/dist/trade.js +103 -0
- package/dist/trade.js.map +1 -0
- package/dist/transport.d.ts +6 -1
- package/dist/transport.js +281 -0
- package/dist/transport.js.map +1 -0
- package/dist/tunables.d.ts +10 -3
- package/dist/tunables.js +56 -0
- package/dist/tunables.js.map +1 -0
- package/dist/unitResources.d.ts +67 -0
- package/dist/unitResources.js +266 -0
- package/dist/unitResources.js.map +1 -0
- package/dist/upkeep.d.ts +6 -1
- package/dist/upkeep.js +26 -0
- package/dist/upkeep.js.map +1 -0
- package/dist/veterancy.d.ts +8 -3
- package/dist/veterancy.js +131 -0
- package/dist/veterancy.js.map +1 -0
- package/dist/vision.d.ts +36 -0
- package/dist/vision.js +133 -0
- package/dist/vision.js.map +1 -0
- package/dist/walls.d.ts +1 -1
- package/dist/walls.js +278 -0
- package/dist/walls.js.map +1 -0
- package/dist/world.d.ts +606 -88
- package/dist/world.js +1263 -0
- package/dist/world.js.map +1 -0
- package/package.json +2 -2
- package/dist/ai.js.map +0 -1
- package/dist/attributes.d.ts +0 -66
- package/dist/brain-BvVdUhX8.js +0 -7659
- package/dist/brain-BvVdUhX8.js.map +0 -1
- package/dist/builds-C6LfgvEU.js +0 -460
- package/dist/builds-C6LfgvEU.js.map +0 -1
- package/dist/coreComponents-syuh2fPG.js +0 -5149
- package/dist/coreComponents-syuh2fPG.js.map +0 -1
- package/dist/debugCommands-CzjrSm66.js +0 -14739
- package/dist/debugCommands-CzjrSm66.js.map +0 -1
- package/dist/determinism-BCymQwiE.js +0 -518
- package/dist/determinism-BCymQwiE.js.map +0 -1
- package/dist/game-DiJEN-Ks.js +0 -5800
- package/dist/game-DiJEN-Ks.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/inspect-D9dWHmZ0.js.map +0 -1
- package/dist/local-Dkovq42k.js +0 -1379
- package/dist/local-Dkovq42k.js.map +0 -1
- package/dist/missionRules-C-bGxm0Q.js.map +0 -1
- package/dist/navigation-worker.js.map +0 -1
- package/dist/packs-g5thvmGn.js +0 -3199
- package/dist/packs-g5thvmGn.js.map +0 -1
- package/dist/profiles-B3NS9jwk.js.map +0 -1
- package/dist/server.js.map +0 -1
- package/dist/simulate-oXBiw1Ff.js.map +0 -1
package/dist/inspect.d.ts
CHANGED
|
@@ -8,6 +8,7 @@ import type { World } from './world';
|
|
|
8
8
|
* @beta
|
|
9
9
|
*/
|
|
10
10
|
export interface InspectedSection {
|
|
11
|
+
/** The heading of the section in the inspector, such as `stats` or a component's name */
|
|
11
12
|
title: string;
|
|
12
13
|
/** What it holds, plain data. Entities in it are written `footman#12`, for the inspector to link to */
|
|
13
14
|
value: unknown;
|
|
@@ -34,17 +35,21 @@ export type InspectTarget = {
|
|
|
34
35
|
* @beta
|
|
35
36
|
*/
|
|
36
37
|
export interface Inspection {
|
|
38
|
+
/** What is inspected: an entity by id, a player by id, or the world itself */
|
|
37
39
|
target: InspectTarget;
|
|
38
40
|
/** What it is called: `Footman #14`, a player's name, `World` */
|
|
39
41
|
title: string;
|
|
40
42
|
/** What else says what it is: type and owner, team */
|
|
41
43
|
about: string;
|
|
44
|
+
/** The tick of the simulation the inspection was taken at */
|
|
42
45
|
tick: number;
|
|
46
|
+
/** Whether the inspected entity or player is still there; false once it has been removed or defeated */
|
|
43
47
|
alive: boolean;
|
|
44
48
|
/** Where it is, for an entity */
|
|
45
49
|
at?: Vec2;
|
|
46
50
|
/** What is so of it that is not a number: hidden, asleep, scenery */
|
|
47
51
|
flags: string[];
|
|
52
|
+
/** The parts of it the inspector lists, in order */
|
|
48
53
|
sections: InspectedSection[];
|
|
49
54
|
/**
|
|
50
55
|
* What the computer that plays a player is thinking, where a brain does (`Brain.report`, with the seat's timing):
|
|
@@ -64,16 +69,25 @@ export declare function inspect(world: World, target: InspectTarget): Inspection
|
|
|
64
69
|
* @beta
|
|
65
70
|
*/
|
|
66
71
|
export interface EntityRow {
|
|
72
|
+
/** The entity's id */
|
|
67
73
|
id: EntityId;
|
|
74
|
+
/** The id of the entity's unit type */
|
|
68
75
|
type: string;
|
|
76
|
+
/** The entity's display name */
|
|
69
77
|
name: string;
|
|
78
|
+
/** The player that owns it */
|
|
70
79
|
owner: PlayerId;
|
|
80
|
+
/** What kind of thing it is: `unit`, `building` or `resource` */
|
|
71
81
|
kind: string;
|
|
72
|
-
|
|
73
|
-
|
|
82
|
+
/** Its health now */
|
|
83
|
+
health: number;
|
|
84
|
+
/** Its largest health */
|
|
85
|
+
maxHealth: number;
|
|
74
86
|
/** Type of what it is doing, null for nothing */
|
|
75
87
|
order: string | null;
|
|
88
|
+
/** Whether it is scenery, kept out of play and shown as ground dressing */
|
|
76
89
|
scenery: boolean;
|
|
90
|
+
/** Whether it is hidden from the players */
|
|
77
91
|
hidden: boolean;
|
|
78
92
|
}
|
|
79
93
|
/**
|
|
@@ -82,10 +96,15 @@ export interface EntityRow {
|
|
|
82
96
|
* @beta
|
|
83
97
|
*/
|
|
84
98
|
export interface PlayerRow {
|
|
99
|
+
/** The player's id */
|
|
85
100
|
id: PlayerId;
|
|
101
|
+
/** The player's name */
|
|
86
102
|
name: string;
|
|
103
|
+
/** The team the player is on */
|
|
87
104
|
team: number;
|
|
105
|
+
/** Whether it is a neutral player (creeps and the like), not one of the sides */
|
|
88
106
|
neutral: boolean;
|
|
107
|
+
/** Whether the player has lost the game */
|
|
89
108
|
defeated: boolean;
|
|
90
109
|
}
|
|
91
110
|
/**
|
|
@@ -94,8 +113,11 @@ export interface PlayerRow {
|
|
|
94
113
|
* @beta
|
|
95
114
|
*/
|
|
96
115
|
export interface WorldListing {
|
|
116
|
+
/** The tick of the simulation the listing was taken at */
|
|
97
117
|
tick: number;
|
|
118
|
+
/** Every player of the world, as `PlayerRow` */
|
|
98
119
|
players: PlayerRow[];
|
|
120
|
+
/** Every entity of the world, as `EntityRow`, hidden and scenery ones too */
|
|
99
121
|
entities: EntityRow[];
|
|
100
122
|
}
|
|
101
123
|
/**
|
|
@@ -108,6 +130,7 @@ export interface LoggedEvent {
|
|
|
108
130
|
seq: number;
|
|
109
131
|
/** The tick it happened in */
|
|
110
132
|
tick: number;
|
|
133
|
+
/** Whether it is an engine `event` or a `hook` */
|
|
111
134
|
kind: 'event' | 'hook';
|
|
112
135
|
/** The engine's name for it, or a game's id */
|
|
113
136
|
name: string;
|
|
@@ -163,12 +186,16 @@ export declare class EventLog implements Trace {
|
|
|
163
186
|
attach(world: World): void;
|
|
164
187
|
/** Stops following it. What was logged stays */
|
|
165
188
|
detach(): void;
|
|
189
|
+
/** Whether the log is attached to a world, following what happens in it */
|
|
166
190
|
get attached(): boolean;
|
|
167
191
|
/** What was logged, oldest first. The same list, kept up to date: to read, not to keep */
|
|
168
192
|
get entries(): readonly LoggedEvent[];
|
|
193
|
+
/** Empties the log and the hooks it is counting for the current tick */
|
|
169
194
|
clear(): void;
|
|
170
195
|
private event;
|
|
196
|
+
/** Notes that the listener with this id ran on the event going out; part of `Trace` */
|
|
171
197
|
listener(id: string): void;
|
|
198
|
+
/** Notes that the hook ran, with the ids of its handlers and whether it is a game's own; a hook run again in the same tick only adds to its count */
|
|
172
199
|
hook(name: string, handlers: readonly {
|
|
173
200
|
id: string;
|
|
174
201
|
}[], own: boolean, event: unknown): void;
|
|
@@ -1,4 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { statsOf } from "./stats.js";
|
|
2
|
+
import { isGameEvent } from "./events.js";
|
|
3
|
+
import { Entity, deposit, fighting, moving } from "./entity.js";
|
|
4
|
+
import { productionOf } from "./systems/productionQueue.js";
|
|
5
|
+
import { dashing } from "./dashing.js";
|
|
6
|
+
import { harvesterOf } from "./orders/harvest.js";
|
|
2
7
|
//#region src/inspect.ts
|
|
3
8
|
/**
|
|
4
9
|
* What the debug tools see of the rules: everything in the world (`listWorld`), an entity, a player or the world as the
|
|
@@ -52,8 +57,8 @@ var PART_COMPONENTS = {
|
|
|
52
57
|
};
|
|
53
58
|
/** The numbers of an entity of its own, not in a part */
|
|
54
59
|
var OWN_NUMBERS = [
|
|
55
|
-
"
|
|
56
|
-
"
|
|
60
|
+
"health",
|
|
61
|
+
"maxHealth",
|
|
57
62
|
"mana",
|
|
58
63
|
"maxMana",
|
|
59
64
|
"facing",
|
|
@@ -102,7 +107,7 @@ function relationsOf(world, entity) {
|
|
|
102
107
|
add("rallies to", productionOf(entity)?.rally?.target);
|
|
103
108
|
for (const buff of entity.buffs) add(`buff ${buff.id} from`, buff.source);
|
|
104
109
|
let after = 0;
|
|
105
|
-
for (const other of world.
|
|
110
|
+
for (const other of world.units.values()) {
|
|
106
111
|
if (other === entity || !other.alive) continue;
|
|
107
112
|
if (other.orders[0]?.init.target === entity.id || other.get(fighting)?.autoTarget === entity.id) {
|
|
108
113
|
if (++after > 8) break;
|
|
@@ -254,7 +259,7 @@ function inspectWorld(world) {
|
|
|
254
259
|
hour: world.registry.day ? world.hour : void 0,
|
|
255
260
|
winner: world.winner,
|
|
256
261
|
entities: world.entities.size,
|
|
257
|
-
actors: world.
|
|
262
|
+
actors: world.units.size,
|
|
258
263
|
projectiles: world.projectiles.length,
|
|
259
264
|
missiles: world.missiles.length,
|
|
260
265
|
items: world.items.length
|
|
@@ -301,7 +306,7 @@ function holderOf(root, path) {
|
|
|
301
306
|
return holder;
|
|
302
307
|
}
|
|
303
308
|
/**
|
|
304
|
-
* Changes a number where `inspect` showed it: of an entity `['
|
|
309
|
+
* Changes a number where `inspect` showed it: of an entity `['health']`, `['abilities', 0, 'cooldown']`,
|
|
305
310
|
* `['components', 'td.bounty', 'gold']`; of a player `['resources', 'gold']`, `['upgrades', 'armor']`,
|
|
306
311
|
* `['state', 'td.score', 'kills']`; of the world `['state', 'td.waves', 'wave']`. An entity's health is kept within what
|
|
307
312
|
* it can have, and none left kills it. Whether it was changed: false for what is not a number or a switch (a boolean), or not to be changed
|
|
@@ -336,12 +341,12 @@ function setInspected(world, target, path, value) {
|
|
|
336
341
|
if (!entity?.alive || !EDITABLE.has(String(path[0]))) return false;
|
|
337
342
|
const holder = holderOf(entity, path);
|
|
338
343
|
if (!holder || typeof holder[last] !== typeof value) return false;
|
|
339
|
-
if (typeof value === "number" && path.length === 1 && last === "
|
|
344
|
+
if (typeof value === "number" && path.length === 1 && last === "health") {
|
|
340
345
|
if (value <= 0) {
|
|
341
346
|
world.kill(entity);
|
|
342
347
|
return true;
|
|
343
348
|
}
|
|
344
|
-
value = Math.min(value, entity.
|
|
349
|
+
value = Math.min(value, entity.maxHealth);
|
|
345
350
|
}
|
|
346
351
|
if (typeof value === "number" && path.length === 1 && last === "mana") value = Math.max(0, Math.min(value, entity.maxMana));
|
|
347
352
|
holder[last] = value;
|
|
@@ -363,8 +368,8 @@ function listWorld(world) {
|
|
|
363
368
|
name: entity.def.name,
|
|
364
369
|
owner: entity.owner,
|
|
365
370
|
kind: entity.def.kind,
|
|
366
|
-
|
|
367
|
-
|
|
371
|
+
health: Math.ceil(entity.health),
|
|
372
|
+
maxHealth: Math.ceil(entity.maxHealth),
|
|
368
373
|
order: entity.orders[0]?.type ?? null,
|
|
369
374
|
scenery: entity.scenery,
|
|
370
375
|
hidden: entity.hidden
|
|
@@ -423,6 +428,7 @@ var EventLog = class {
|
|
|
423
428
|
this.world = null;
|
|
424
429
|
this.current = null;
|
|
425
430
|
}
|
|
431
|
+
/** Whether the log is attached to a world, following what happens in it */
|
|
426
432
|
get attached() {
|
|
427
433
|
return this.world !== null;
|
|
428
434
|
}
|
|
@@ -430,6 +436,7 @@ var EventLog = class {
|
|
|
430
436
|
get entries() {
|
|
431
437
|
return this.list;
|
|
432
438
|
}
|
|
439
|
+
/** Empties the log and the hooks it is counting for the current tick */
|
|
433
440
|
clear() {
|
|
434
441
|
this.list.length = 0;
|
|
435
442
|
this.hooks.clear();
|
|
@@ -447,9 +454,11 @@ var EventLog = class {
|
|
|
447
454
|
ran: []
|
|
448
455
|
});
|
|
449
456
|
}
|
|
457
|
+
/** Notes that the listener with this id ran on the event going out; part of `Trace` */
|
|
450
458
|
listener(id) {
|
|
451
459
|
this.current?.ran.push(id);
|
|
452
460
|
}
|
|
461
|
+
/** Notes that the hook ran, with the ids of its handlers and whether it is a game's own; a hook run again in the same tick only adds to its count */
|
|
453
462
|
hook(name, handlers, own, event) {
|
|
454
463
|
const { tick } = this.world;
|
|
455
464
|
if (tick !== this.hooksAt) {
|
|
@@ -486,6 +495,6 @@ var EventLog = class {
|
|
|
486
495
|
}
|
|
487
496
|
};
|
|
488
497
|
//#endregion
|
|
489
|
-
export {
|
|
498
|
+
export { EventLog, inspect, listWorld, setInspected, summarize };
|
|
490
499
|
|
|
491
|
-
//# sourceMappingURL=inspect
|
|
500
|
+
//# sourceMappingURL=inspect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inspect.js","names":[],"sources":["../src/inspect.ts"],"sourcesContent":["import { harvesterOf } from './orders/harvest'\nimport { dashing } from './dashing'\nimport { productionOf } from './systems/productionQueue'\nimport { deposit, Entity, type EntityId, fighting, moving, type PlayerId } from './entity'\nimport { isGameEvent } from './events'\nimport type { AiReport } from './ai/report'\nimport type { Vec2 } from './math'\nimport { statsOf } from './stats'\nimport type { World } from './world'\n\n/**\n * What the debug tools see of the rules: everything in the world (`listWorld`), an entity, a player or the world as the\n * rules have it (`inspect`), a number of it changed (`setInspected`), and the events and hooks of the last seconds\n * (`EventLog`). Everything they give is plain data,\n * so that it can come from a simulation that runs somewhere else, the way the snapshots do\n */\n\n/**\n * A value as plain data, to be shown: entities become `footman#12`, definitions their id, numbers are rounded, and\n * what is deep or long is cut short\n *\n * @internal\n */\nexport function summarize(value: unknown, depth = 0): unknown {\n\tif (value === null || value === undefined || typeof value === 'string' || typeof value === 'boolean') return value\n\tif (typeof value === 'number') return Number.isInteger(value) || !Number.isFinite(value) ? value : Math.round(value * 1000) / 1000\n\tif (typeof value === 'function') return undefined\n\tif (typeof value !== 'object') return String(value)\n\tif (value instanceof Entity) return `${value.def.id}#${value.id}`\n\tif (value instanceof Map || value instanceof Set) return `${value.constructor.name}(${value.size})`\n\tif (ArrayBuffer.isView(value)) return `${value.constructor.name}(${(value as unknown as ArrayLike<number>).length})`\n\tif (Array.isArray(value)) {\n\t\tif (depth > 3) return `[${value.length}]`\n\t\tconst items = value.slice(0, 12).map((item) => summarize(item, depth + 1))\n\t\tif (value.length > 12) items.push(`… ${value.length - 12} more`)\n\t\treturn items\n\t}\n\tconst record = value as Record<string, unknown>\n\tconst plain = Object.getPrototypeOf(value) === Object.prototype || Object.getPrototypeOf(value) === null\n\t// what is inside something else and has an id of its own is said by that id: a definition, a projectile\n\tif (depth > 0 && typeof record.id === 'string' && (!plain || 'name' in record)) return record.id\n\tif (depth > 0 && typeof record.id === 'number' && !plain) return `${value.constructor.name.toLowerCase()} ${record.id}`\n\tif (depth > 3) return '{…}'\n\tconst out: Record<string, unknown> = {}\n\tfor (const key in record) {\n\t\tconst item = summarize(record[key], depth + 1)\n\t\tif (item !== undefined) out[key] = item\n\t}\n\treturn out\n}\n\n/**\n * A part of what is inspected, as the inspector shows it\n *\n * @beta\n */\nexport interface InspectedSection {\n\t/** The heading of the section in the inspector, such as `stats` or a component's name */\n\ttitle: string\n\t/** What it holds, plain data. Entities in it are written `footman#12`, for the inspector to link to */\n\tvalue: unknown\n\t/** Where it is kept, for `setInspected`. Left out for what is worked out, or not to be changed by hand, like stats */\n\tpath?: (string | number)[]\n\t/** State of the game's own (a component), rather than the engine's */\n\town?: boolean\n}\n\n/**\n * What the inspector can look at: an entity, a player, or the world itself\n *\n * @beta\n */\nexport type InspectTarget = { entity: EntityId } | { player: PlayerId } | { world: true }\n\n/**\n * Something as the simulation has it, for the inspector\n *\n * @beta\n */\nexport interface Inspection {\n\t/** What is inspected: an entity by id, a player by id, or the world itself */\n\ttarget: InspectTarget\n\t/** What it is called: `Footman #14`, a player's name, `World` */\n\ttitle: string\n\t/** What else says what it is: type and owner, team */\n\tabout: string\n\t/** The tick of the simulation the inspection was taken at */\n\ttick: number\n\t/** Whether the inspected entity or player is still there; false once it has been removed or defeated */\n\talive: boolean\n\t/** Where it is, for an entity */\n\tat?: Vec2\n\t/** What is so of it that is not a number: hidden, asleep, scenery */\n\tflags: string[]\n\t/** The parts of it the inspector lists, in order */\n\tsections: InspectedSection[]\n\t/**\n\t * What the computer that plays a player is thinking, where a brain does (`Brain.report`, with the seat's timing):\n\t * what the debug panel's AI tab draws. A computer player of another kind is a section (`Computer player`)\n\t */\n\tai?: AiReport\n}\n\n/** The parts of an entity the engine keeps, by field, with what the inspector calls them */\nconst PARTS: [keyof Entity, string][] = [\n\t['orders', 'Orders'],\n\t['abilities', 'Abilities'],\n\t['buffs', 'Buffs']\n]\n\n/** The engine's parts that are components, by id, with what the inspector calls them */\nconst PART_COMPONENTS: Record<string, string> = { [moving.id]: 'Movement', [fighting.id]: 'Combat', [deposit.id]: 'Resource' }\n\n/** The numbers of an entity of its own, not in a part */\nconst OWN_NUMBERS = ['health', 'maxHealth', 'mana', 'maxMana', 'facing', 'expires', 'unseenIn'] as const\n\n/** What `setInspected` may change of an entity: the numbers of its own, the parts and the components. Never where it is, nor its type */\nconst EDITABLE = new Set<string>([...OWN_NUMBERS, ...PARTS.map(([key]) => key), 'components'])\n\n/** The world's own state the inspector shows apart, rather than as a component */\nconst TIMERS_STATE = 'core.timers'\n\n/** Whether a timer's data says something about the entity: a field that names it by id */\nfunction mentions(data: unknown, id: EntityId, depth = 0): boolean {\n\tif (!data || typeof data !== 'object' || depth > 3) return false\n\tfor (const [key, value] of Object.entries(data)) {\n\t\tif (typeof value === 'number' && value === id && /id|entity|unit|target|source|caster|owner/i.test(key)) return true\n\t\tif (typeof value === 'object' && mentions(value, id, depth + 1)) return true\n\t}\n\treturn false\n}\n\n/** An entity by id as the inspector links to it, or nothing when there is none */\nconst named = (world: World, id: EntityId | undefined | null): string | undefined => {\n\tconst entity = id ? world.get(id) : undefined\n\treturn entity && `${entity.def.id}#${entity.id}`\n}\n\n/**\n * The other entities an entity has to do with, by what they are to it: what it is told to go for, fight, gather\n * from, who put a buff on it; and the other way, who is after it. The world has no tree of entities: these are its\n * relations\n */\nfunction relationsOf(world: World, entity: Entity): Record<string, string> {\n\tconst out: Record<string, string> = {}\n\tconst add = (what: string, id: EntityId | undefined | null) => {\n\t\tconst name = named(world, id)\n\t\tif (name && id !== entity.id) out[what] = name\n\t}\n\tentity.orders.forEach((order, index) => add(`orders[${index}] ${order.type}`, order.init.target))\n\tadd('goes to', entity.get(moving)?.goalEntity)\n\tadd('fights', entity.get(fighting)?.autoTarget)\n\tadd('swings at', entity.get(fighting)?.swingTarget)\n\tadd('was hit by', entity.get(fighting)?.lastAttacker)\n\tadd('gathers from', harvesterOf(entity)?.resource)\n\tadd('rallies to', productionOf(entity)?.rally?.target)\n\tfor (const buff of entity.buffs) add(`buff ${buff.id} from`, buff.source)\n\tlet after = 0\n\tfor (const other of world.units.values()) {\n\t\tif (other === entity || !other.alive) continue\n\t\tif (other.orders[0]?.init.target === entity.id || other.get(fighting)?.autoTarget === entity.id) {\n\t\t\tif (++after > 8) break\n\t\t\tadd(`after it ${after}`, other.id)\n\t\t}\n\t}\n\treturn out\n}\n\nfunction inspectEntity(world: World, id: EntityId): Inspection | null {\n\tconst entity = world.get(id)\n\tif (!entity) return null\n\tconst state: Record<string, unknown> = {}\n\tfor (const key of OWN_NUMBERS) if (entity[key] !== null) state[key] = summarize(entity[key])\n\tconst flags: string[] = []\n\tif (entity.hidden) flags.push('hidden')\n\tif (entity.asleep) flags.push('asleep')\n\tif (entity.unseen) flags.push('unseen')\n\tif (entity.scenery) flags.push('scenery')\n\tif (entity.get(dashing)) flags.push('dashing')\n\tif (entity.scale !== 1) flags.push(`scale ${entity.scale}`)\n\tif (entity.look) flags.push(`look ${entity.look}`)\n\tconst sections: InspectedSection[] = [\n\t\t{ title: 'State', value: state, path: [] },\n\t\t{ title: 'Stats', value: summarize({ ...statsOf(world, entity) }) }\n\t]\n\tconst related = relationsOf(world, entity)\n\tif (Object.keys(related).length) sections.push({ title: 'Related', value: related })\n\tfor (const [key, title] of PARTS) {\n\t\tconst value = entity[key]\n\t\tif (value === undefined || value === null || (Array.isArray(value) && !value.length)) continue\n\t\tsections.push({ title, value: summarize(value), path: [key] })\n\t}\n\tfor (const [component, value] of Object.entries(entity.components)) {\n\t\tconst part = PART_COMPONENTS[component]\n\t\tsections.push({ title: part ?? component, value: summarize(value), path: ['components', component], own: !part })\n\t}\n\tconst timers = world.timers.list().filter((timer) => mentions(timer.data, id))\n\tif (timers.length) sections.push({ title: 'Timers', value: summarize(timers) })\n\tconst owner = world.players.get(entity.owner)?.name ?? String(entity.owner)\n\treturn {\n\t\ttarget: { entity: id },\n\t\ttitle: `${entity.def.name} #${id}`,\n\t\tabout: `${entity.def.id}, ${owner}`,\n\t\ttick: world.tick,\n\t\talive: entity.alive,\n\t\tat: { x: entity.pos.x, z: entity.pos.z },\n\t\tflags,\n\t\tsections\n\t}\n}\n\n/** The components kept in a state store, each a section of its own */\nconst componentSections = (values: Record<string, unknown>): InspectedSection[] =>\n\tObject.entries(values)\n\t\t.filter(([id]) => id !== TIMERS_STATE)\n\t\t.map(([id, value]) => ({ title: id, value: summarize(value), path: ['state', id], own: true }))\n\nfunction inspectPlayer(world: World, id: PlayerId): Inspection | null {\n\tconst player = world.players.get(id)\n\tif (!player) return null\n\tconst objectives = world.objectives.of(id)\n\tconst sections: InspectedSection[] = [\n\t\t{ title: 'Resources', value: summarize(player.resources), path: ['resources'] },\n\t\t{\n\t\t\ttitle: 'Player',\n\t\t\tvalue: { team: player.team, supplyUsed: player.supplyUsed, supplyCap: player.supplyCap, entities: world.index.ownedBy(id).size }\n\t\t},\n\t\t{ title: 'Upgrades', value: Object.fromEntries(player.upgrades), path: ['upgrades'] }\n\t]\n\tif (player.researching.size) sections.push({ title: 'Researching', value: [...player.researching] })\n\tif (objectives.length) sections.push({ title: 'Objectives', value: summarize(objectives) })\n\tsections.push(...componentSections(player.states.values))\n\t// the computer that plays it, where one does: what it is thinking, as it says (`ComputerPlayer.inspect`). A brain's\n\t// is its report, with the seat's milliseconds: the AI tab's\n\tconst seat = world.computers.get(id)\n\tconst thinking = seat?.computer.inspect?.()\n\tconst ai = isReport(thinking) ? { ...thinking, timing: seat!.timing() } : undefined\n\tif (thinking !== undefined && !ai) sections.push({ title: 'Computer player', value: summarize(thinking) })\n\tconst flags = [player.neutral && 'neutral', player.creeps && 'creeps', player.defeated && 'defeated'].filter((flag): flag is string => !!flag)\n\treturn {\n\t\ttarget: { player: id },\n\t\ttitle: player.name,\n\t\tabout: `player ${id}, team ${player.team}`,\n\t\ttick: world.tick,\n\t\talive: !player.defeated,\n\t\tflags,\n\t\tsections,\n\t\t...(ai && { ai })\n\t}\n}\n\n/** Whether what a computer player says of itself is a brain's report */\nconst isReport = (value: unknown): value is AiReport =>\n\t!!value &&\n\ttypeof value === 'object' &&\n\t(value as AiReport).v === 1 &&\n\ttypeof (value as AiReport).brain === 'string' &&\n\tArray.isArray((value as AiReport).goals)\n\nfunction inspectWorld(world: World): Inspection {\n\tconst sections: InspectedSection[] = [\n\t\t{\n\t\t\ttitle: 'World',\n\t\t\tvalue: summarize({\n\t\t\t\ttick: world.tick,\n\t\t\t\ttime: world.time,\n\t\t\t\thour: world.registry.day ? world.hour : undefined,\n\t\t\t\twinner: world.winner,\n\t\t\t\tentities: world.entities.size,\n\t\t\t\tactors: world.units.size,\n\t\t\t\tprojectiles: world.projectiles.length,\n\t\t\t\tmissiles: world.missiles.length,\n\t\t\t\titems: world.items.length\n\t\t\t})\n\t\t},\n\t\t...componentSections(world.states.values),\n\t\t{ title: 'Timers', value: summarize(world.timers.list()) },\n\t\t{ title: 'Systems', value: world.systems.map((system) => `${system.name} (${system.phase})`) }\n\t]\n\treturn { target: { world: true }, title: 'World', about: `${world.players.size} players`, tick: world.tick, alive: true, flags: [], sections }\n}\n\n/**\n * Something as the simulation has it right now, or null when there is no such entity or player\n *\n * @beta\n */\nexport function inspect(world: World, target: InspectTarget): Inspection | null {\n\tif ('entity' in target) return inspectEntity(world, target.entity)\n\tif ('player' in target) return inspectPlayer(world, target.player)\n\treturn inspectWorld(world)\n}\n\n/** Walks a path to what holds the last key. Null when it does not lead anywhere */\nfunction holderOf(root: unknown, path: readonly (string | number)[]): Record<string | number, unknown> | null {\n\tlet holder = root as Record<string | number, unknown>\n\tfor (const key of path.slice(0, -1)) {\n\t\tconst next = holder[key]\n\t\tif (!next || typeof next !== 'object') return null\n\t\tholder = next as Record<string | number, unknown>\n\t}\n\treturn holder\n}\n\n/**\n * Changes a number where `inspect` showed it: of an entity `['health']`, `['abilities', 0, 'cooldown']`,\n * `['components', 'td.bounty', 'gold']`; of a player `['resources', 'gold']`, `['upgrades', 'armor']`,\n * `['state', 'td.score', 'kills']`; of the world `['state', 'td.waves', 'wave']`. An entity's health is kept within what\n * it can have, and none left kills it. Whether it was changed: false for what is not a number or a switch (a boolean), or not to be changed\n *\n * @internal\n */\nexport function setInspected(world: World, target: InspectTarget, path: readonly (string | number)[], value: number | boolean): boolean {\n\tif (!path.length || (typeof value === 'number' && !Number.isFinite(value))) return false\n\tconst last = path[path.length - 1]\n\tif ('player' in target) {\n\t\tconst player = world.players.get(target.player)\n\t\tif (!player) return false\n\t\t// upgrades go through the player, which tells whatever is worked out from them\n\t\tif (path[0] === 'upgrades' && path.length === 2) {\n\t\t\tif (typeof value !== 'number') return false\n\t\t\tplayer.setUpgrade(String(last), Math.max(0, Math.round(value)))\n\t\t\treturn true\n\t\t}\n\t\tconst root = path[0] === 'resources' ? player : path[0] === 'state' ? { state: player.states.values } : null\n\t\tconst holder = root && holderOf(root, path)\n\t\tif (!holder || typeof holder[last] !== typeof value) return false\n\t\tholder[last] = value\n\t\treturn true\n\t}\n\tif ('world' in target) {\n\t\tif (path[0] !== 'state' || path[1] === TIMERS_STATE) return false\n\t\tconst holder = holderOf({ state: world.states.values }, path)\n\t\tif (!holder || typeof holder[last] !== typeof value) return false\n\t\tholder[last] = value\n\t\treturn true\n\t}\n\tconst entity = world.get(target.entity)\n\tif (!entity?.alive || !EDITABLE.has(String(path[0]))) return false\n\tconst holder = holderOf(entity, path)\n\tif (!holder || typeof holder[last] !== typeof value) return false\n\tif (typeof value === 'number' && path.length === 1 && last === 'health') {\n\t\tif (value <= 0) {\n\t\t\tworld.kill(entity)\n\t\t\treturn true\n\t\t}\n\t\tvalue = Math.min(value, entity.maxHealth)\n\t}\n\tif (typeof value === 'number' && path.length === 1 && last === 'mana') value = Math.max(0, Math.min(value, entity.maxMana))\n\tholder[last] = value\n\t// levels, buffs and the like go into its stats: they are worked out again\n\tentity.statsCache = null\n\treturn true\n}\n\n/**\n * An entity as the list of all of them shows it\n *\n * @beta\n */\nexport interface EntityRow {\n\t/** The entity's id */\n\tid: EntityId\n\t/** The id of the entity's unit type */\n\ttype: string\n\t/** The entity's display name */\n\tname: string\n\t/** The player that owns it */\n\towner: PlayerId\n\t/** What kind of thing it is: `unit`, `building` or `resource` */\n\tkind: string\n\t/** Its health now */\n\thealth: number\n\t/** Its largest health */\n\tmaxHealth: number\n\t/** Type of what it is doing, null for nothing */\n\torder: string | null\n\t/** Whether it is scenery, kept out of play and shown as ground dressing */\n\tscenery: boolean\n\t/** Whether it is hidden from the players */\n\thidden: boolean\n}\n\n/**\n * A player as the list shows it\n *\n * @beta\n */\nexport interface PlayerRow {\n\t/** The player's id */\n\tid: PlayerId\n\t/** The player's name */\n\tname: string\n\t/** The team the player is on */\n\tteam: number\n\t/** Whether it is a neutral player (creeps and the like), not one of the sides */\n\tneutral: boolean\n\t/** Whether the player has lost the game */\n\tdefeated: boolean\n}\n\n/**\n * Everything in the world, for the list of the debug tools: what is out of sight, hidden or scenery too\n *\n * @beta\n */\nexport interface WorldListing {\n\t/** The tick of the simulation the listing was taken at */\n\ttick: number\n\t/** Every player of the world, as `PlayerRow` */\n\tplayers: PlayerRow[]\n\t/** Every entity of the world, as `EntityRow`, hidden and scenery ones too */\n\tentities: EntityRow[]\n}\n\n/**\n * Every player and entity of the world, in a few numbers each\n *\n * @internal\n */\nexport function listWorld(world: World): WorldListing {\n\tconst entities: EntityRow[] = []\n\tfor (const entity of world.entities.values()) {\n\t\tif (!entity.alive) continue\n\t\tentities.push({\n\t\t\tid: entity.id,\n\t\t\ttype: entity.def.id,\n\t\t\tname: entity.def.name,\n\t\t\towner: entity.owner,\n\t\t\tkind: entity.def.kind,\n\t\t\thealth: Math.ceil(entity.health),\n\t\t\tmaxHealth: Math.ceil(entity.maxHealth),\n\t\t\torder: entity.orders[0]?.type ?? null,\n\t\t\tscenery: entity.scenery,\n\t\t\thidden: entity.hidden\n\t\t})\n\t}\n\tconst players = [...world.players.values()].map(({ id, name, team, neutral, defeated }) => ({ id, name, team, neutral, defeated }))\n\treturn { tick: world.tick, players, entities }\n}\n\n/**\n * Something that happened in the rules, as the event log keeps it\n *\n * @beta\n */\nexport interface LoggedEvent {\n\t/** In the order they were logged, for asking for what came after */\n\tseq: number\n\t/** The tick it happened in */\n\ttick: number\n\t/** Whether it is an engine `event` or a `hook` */\n\tkind: 'event' | 'hook'\n\t/** The engine's name for it, or a game's id */\n\tname: string\n\t/** One of the game's own, rather than the engine's */\n\town: boolean\n\t/** What it said, plain data. For a hook, what the first run of it in the tick was given */\n\tdetail?: unknown\n\t/** The listeners that ran on an event, or the handlers of a hook */\n\tran: string[]\n\t/** How many times a hook ran in the tick */\n\tcount?: number\n}\n\n/**\n * What a world tells whoever follows it of the rules as they run, see `World.trace`\n *\n * @beta\n */\nexport interface Trace {\n\t/** A hook with handlers ran. `own`: a hook of the game's */\n\thook(name: string, handlers: readonly { id: string }[], own: boolean, event: unknown): void\n\t/** A listener of the game is about to run, on the event going out */\n\tlistener(id: string): void\n}\n\n/**\n * The events and hooks of the last seconds of a world, the game's own among them, with the listeners and handlers\n * that ran on them. Hooks run often (every target search asks one), so a hook is one line a tick, with how many times.\n * Following costs a little: it is only on while `attach`ed\n *\n * @beta\n */\nexport class EventLog implements Trace {\n\tprivate readonly list: LoggedEvent[] = []\n\tprivate seq = 0\n\t/** The hooks of the tick going on, by name */\n\tprivate hooks = new Map<string, LoggedEvent>()\n\tprivate hooksAt = -1\n\t/** The event going out, which listeners that run belong to */\n\tprivate current: LoggedEvent | null = null\n\tprivate world: World | null = null\n\tprivate untap: (() => void) | null = null\n\n\tconstructor(\n\t\t/** Seconds of it that are kept */\n\t\treadonly seconds = 10,\n\t\t/** Lines kept at most, however short a time they took */\n\t\treadonly max = 2000\n\t) {}\n\n\t/** Starts following a world */\n\tattach(world: World): void {\n\t\tthis.detach()\n\t\tthis.world = world\n\t\tworld.trace = this\n\t\tthis.untap = world.events.tap((type, payload) => this.event(type, payload))\n\t}\n\n\t/** Stops following it. What was logged stays */\n\tdetach(): void {\n\t\tconst { world } = this\n\t\tif (!world) return\n\t\tif (world.trace === this) world.trace = null\n\t\tthis.untap?.()\n\t\tthis.untap = null\n\t\tthis.world = null\n\t\tthis.current = null\n\t}\n\n\t/** Whether the log is attached to a world, following what happens in it */\n\tget attached(): boolean {\n\t\treturn this.world !== null\n\t}\n\n\t/** What was logged, oldest first. The same list, kept up to date: to read, not to keep */\n\tget entries(): readonly LoggedEvent[] {\n\t\treturn this.list\n\t}\n\n\t/** Empties the log and the hooks it is counting for the current tick */\n\tclear(): void {\n\t\tthis.list.length = 0\n\t\tthis.hooks.clear()\n\t}\n\n\tprivate event(type: PropertyKey, payload: unknown): void {\n\t\tconst world = this.world!\n\t\t// what is held for the end of a tick goes out once the tick is counted\n\t\tconst tick = world.events.releasing ? world.tick - 1 : world.tick\n\t\tconst name = String(type)\n\t\tthis.current = this.add({ tick, kind: 'event', name, own: isGameEvent(name), detail: summarize(payload, 1), ran: [] })\n\t}\n\n\t/** Notes that the listener with this id ran on the event going out; part of `Trace` */\n\tlistener(id: string): void {\n\t\tthis.current?.ran.push(id)\n\t}\n\n\t/** Notes that the hook ran, with the ids of its handlers and whether it is a game's own; a hook run again in the same tick only adds to its count */\n\thook(name: string, handlers: readonly { id: string }[], own: boolean, event: unknown): void {\n\t\tconst { tick } = this.world!\n\t\tif (tick !== this.hooksAt) {\n\t\t\tthis.hooks.clear()\n\t\t\tthis.hooksAt = tick\n\t\t}\n\t\tconst known = this.hooks.get(name)\n\t\tif (known) {\n\t\t\tknown.count!++\n\t\t\treturn\n\t\t}\n\t\tconst entry = this.add({ tick, kind: 'hook', name, own, detail: summarize(event, 1), ran: handlers.map((handler) => handler.id), count: 1 })\n\t\tthis.hooks.set(name, entry)\n\t}\n\n\tprivate add(entry: Omit<LoggedEvent, 'seq'>): LoggedEvent {\n\t\tconst logged = { seq: ++this.seq, ...entry }\n\t\tthis.list.push(logged)\n\t\tconst oldest = logged.tick - this.seconds * this.world!.tickRate\n\t\tlet drop = 0\n\t\twhile (drop < this.list.length && (this.list.length - drop > this.max || this.list[drop].tick < oldest)) drop++\n\t\tif (drop) this.list.splice(0, drop)\n\t\treturn logged\n\t}\n}\n"],"mappings":"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"}
|
package/dist/inventory.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { Entity, ItemInstance } from './entity';
|
|
2
2
|
import type { InventoryInfo } from './session/protocol';
|
|
3
|
+
import type { World } from './world';
|
|
3
4
|
/**
|
|
4
5
|
* The slots of what a unit carries (`UnitTypeDef.inventory`), null for an empty one: set as it is spawned (and as its
|
|
5
6
|
* type changes), for a type with slots. Sent to everyone who sees it as `InventoryInfo`: the items it carries, and to
|
|
@@ -14,5 +15,17 @@ export declare const inventorySlots: import("./components").Component<(ItemInsta
|
|
|
14
15
|
* @beta
|
|
15
16
|
*/
|
|
16
17
|
export declare const slotsOf: (entity: Entity) => (ItemInstance | null)[] | undefined;
|
|
17
|
-
/**
|
|
18
|
+
/**
|
|
19
|
+
* The index of the first free slot of the entity's inventory, or -1 when it has none or no inventory
|
|
20
|
+
*
|
|
21
|
+
* @beta
|
|
22
|
+
*/
|
|
18
23
|
export declare const freeSlot: (entity: Entity) => number;
|
|
24
|
+
/**
|
|
25
|
+
* The passives of what an entity carries (`ItemDef.passive`), by ability id, in slot order: those of items sharing a
|
|
26
|
+
* `unique` name once, the first carried (unless the game says otherwise, `ItemSettings.unique`). What the abilities
|
|
27
|
+
* system keeps up and the triggers go by
|
|
28
|
+
*
|
|
29
|
+
* @beta
|
|
30
|
+
*/
|
|
31
|
+
export declare function carriedPassives(world: World, entity: Entity): readonly string[];
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { defineComponent } from "./components.js";
|
|
2
|
+
//#region src/inventory.ts
|
|
3
|
+
/**
|
|
4
|
+
* What a unit carries (`UnitTypeDef.inventory`): its slots of items, the component the stats, the abilities and the
|
|
5
|
+
* shops read. Here alone, of nothing but components, so that what reads it (the stats, on every hit) loads nothing of
|
|
6
|
+
* the shops (`items.ts`)
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* The slots of what a unit carries (`UnitTypeDef.inventory`), null for an empty one: set as it is spawned (and as its
|
|
10
|
+
* type changes), for a type with slots. Sent to everyone who sees it as `InventoryInfo`: the items it carries, and to
|
|
11
|
+
* its owner and their allies the slots, for commands
|
|
12
|
+
*
|
|
13
|
+
* @beta
|
|
14
|
+
*/
|
|
15
|
+
var inventorySlots = defineComponent({
|
|
16
|
+
id: "core.inventory",
|
|
17
|
+
refs: (slots) => ({ items: slots.flatMap((carried) => carried ? [carried.item] : []) }),
|
|
18
|
+
onSpawn: (entity) => {
|
|
19
|
+
if (entity.def.inventory) entity.set(inventorySlots, Array.from({ length: entity.def.inventory }, () => null));
|
|
20
|
+
},
|
|
21
|
+
replicate: "everyone",
|
|
22
|
+
snapshot(slots, _entity, { ally }) {
|
|
23
|
+
const items = [];
|
|
24
|
+
for (const slot of slots) if (slot) items.push(slot.item);
|
|
25
|
+
if (!ally) return items.length ? { items } : void 0;
|
|
26
|
+
return {
|
|
27
|
+
items,
|
|
28
|
+
slots: slots.map((slot) => slot && {
|
|
29
|
+
id: slot.id,
|
|
30
|
+
item: slot.item,
|
|
31
|
+
charges: slot.charges,
|
|
32
|
+
cooldown: slot.state?.cooldown ?? 0,
|
|
33
|
+
...slot.state?.charges !== void 0 && { uses: slot.state.charges }
|
|
34
|
+
})
|
|
35
|
+
};
|
|
36
|
+
},
|
|
37
|
+
same: (a, b) => a.items.length === b.items.length && a.items.every((item, i) => item === b.items[i]) && a.slots === void 0 === (b.slots === void 0) && (!a.slots || a.slots.length === b.slots.length && a.slots.every((slot, i) => {
|
|
38
|
+
const other = b.slots[i];
|
|
39
|
+
return slot === other || !!slot && !!other && slot.id === other.id && slot.item === other.item && slot.charges === other.charges && slot.cooldown === other.cooldown && slot.uses === other.uses;
|
|
40
|
+
}))
|
|
41
|
+
});
|
|
42
|
+
/**
|
|
43
|
+
* The slots of what a unit carries, null for an empty one: none for a type that carries nothing (`inventorySlots`)
|
|
44
|
+
*
|
|
45
|
+
* @beta
|
|
46
|
+
*/
|
|
47
|
+
var slotsOf = (entity) => entity.get(inventorySlots);
|
|
48
|
+
/**
|
|
49
|
+
* The index of the first free slot of the entity's inventory, or -1 when it has none or no inventory
|
|
50
|
+
*
|
|
51
|
+
* @beta
|
|
52
|
+
*/
|
|
53
|
+
var freeSlot = (entity) => slotsOf(entity)?.findIndex((slot) => slot === null) ?? -1;
|
|
54
|
+
/** What carries no passive carries: one list for all of them */
|
|
55
|
+
var NONE = Object.freeze([]);
|
|
56
|
+
/**
|
|
57
|
+
* The passives of what an entity carries (`ItemDef.passive`), by ability id, in slot order: those of items sharing a
|
|
58
|
+
* `unique` name once, the first carried (unless the game says otherwise, `ItemSettings.unique`). What the abilities
|
|
59
|
+
* system keeps up and the triggers go by
|
|
60
|
+
*
|
|
61
|
+
* @beta
|
|
62
|
+
*/
|
|
63
|
+
function carriedPassives(world, entity) {
|
|
64
|
+
const slots = slotsOf(entity);
|
|
65
|
+
if (!slots) return NONE;
|
|
66
|
+
let out;
|
|
67
|
+
let seen;
|
|
68
|
+
const unique = world.settings.items.unique;
|
|
69
|
+
for (const instance of slots) {
|
|
70
|
+
if (!instance) continue;
|
|
71
|
+
const def = world.registry.item(instance.item);
|
|
72
|
+
if (!def.passive) continue;
|
|
73
|
+
if (unique && def.unique !== void 0) {
|
|
74
|
+
if (seen?.has(def.unique)) continue;
|
|
75
|
+
(seen ??= /* @__PURE__ */ new Set()).add(def.unique);
|
|
76
|
+
}
|
|
77
|
+
(out ??= []).push(def.passive);
|
|
78
|
+
}
|
|
79
|
+
return out ?? NONE;
|
|
80
|
+
}
|
|
81
|
+
//#endregion
|
|
82
|
+
export { carriedPassives, freeSlot, inventorySlots, slotsOf };
|
|
83
|
+
|
|
84
|
+
//# sourceMappingURL=inventory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inventory.js","names":[],"sources":["../src/inventory.ts"],"sourcesContent":["/**\n * What a unit carries (`UnitTypeDef.inventory`): its slots of items, the component the stats, the abilities and the\n * shops read. Here alone, of nothing but components, so that what reads it (the stats, on every hit) loads nothing of\n * the shops (`items.ts`)\n */\nimport { defineComponent } from './components'\nimport type { Entity, ItemInstance } from './entity'\nimport type { CarriedItem, InventoryInfo } from './session/protocol'\nimport type { World } from './world'\n\n/**\n * The slots of what a unit carries (`UnitTypeDef.inventory`), null for an empty one: set as it is spawned (and as its\n * type changes), for a type with slots. Sent to everyone who sees it as `InventoryInfo`: the items it carries, and to\n * its owner and their allies the slots, for commands\n *\n * @beta\n */\nexport const inventorySlots = defineComponent<(ItemInstance | null)[], InventoryInfo>({ id: 'core.inventory', refs: (slots) => ({ items: (slots as (ItemInstance | null)[]).flatMap((carried) => (carried ? [carried.item] : [])) }),\n\t// its slots, empty, for a type that carries\n\tonSpawn: (entity) => {\n\t\tif (entity.def.inventory)\n\t\t\tentity.set(\n\t\t\t\tinventorySlots,\n\t\t\t\tArray.from({ length: entity.def.inventory }, () => null)\n\t\t\t)\n\t},\n\treplicate: 'everyone',\n\tsnapshot(slots, _entity, { ally }) {\n\t\tconst items: string[] = []\n\t\tfor (const slot of slots) if (slot) items.push(slot.item)\n\t\tif (!ally) return items.length ? { items } : undefined\n\t\treturn {\n\t\t\titems,\n\t\t\tslots: slots.map(\n\t\t\t\t(slot): CarriedItem | null =>\n\t\t\t\t\tslot && {\n\t\t\t\t\t\tid: slot.id,\n\t\t\t\t\t\titem: slot.item,\n\t\t\t\t\t\tcharges: slot.charges,\n\t\t\t\t\t\tcooldown: slot.state?.cooldown ?? 0,\n\t\t\t\t\t\t...(slot.state?.charges !== undefined && { uses: slot.state.charges })\n\t\t\t\t\t}\n\t\t\t)\n\t\t}\n\t},\n\tsame: (a, b) =>\n\t\ta.items.length === b.items.length &&\n\t\ta.items.every((item, i) => item === b.items[i]) &&\n\t\t(a.slots === undefined) === (b.slots === undefined) &&\n\t\t(!a.slots ||\n\t\t\t(a.slots.length === b.slots!.length &&\n\t\t\t\ta.slots.every((slot, i) => {\n\t\t\t\t\tconst other = b.slots![i]\n\t\t\t\t\treturn (\n\t\t\t\t\t\tslot === other ||\n\t\t\t\t\t\t(!!slot &&\n\t\t\t\t\t\t\t!!other &&\n\t\t\t\t\t\t\tslot.id === other.id &&\n\t\t\t\t\t\t\tslot.item === other.item &&\n\t\t\t\t\t\t\tslot.charges === other.charges &&\n\t\t\t\t\t\t\tslot.cooldown === other.cooldown &&\n\t\t\t\t\t\t\tslot.uses === other.uses)\n\t\t\t\t\t)\n\t\t\t\t}))) })\n\n/**\n * The slots of what a unit carries, null for an empty one: none for a type that carries nothing (`inventorySlots`)\n *\n * @beta\n */\nexport const slotsOf = (entity: Entity): (ItemInstance | null)[] | undefined => entity.get(inventorySlots)\n\n/**\n * The index of the first free slot of the entity's inventory, or -1 when it has none or no inventory\n *\n * @beta\n */\nexport const freeSlot = (entity: Entity) => slotsOf(entity)?.findIndex((slot) => slot === null) ?? -1\n\n/** What carries no passive carries: one list for all of them */\nconst NONE: readonly string[] = Object.freeze([])\n\n/**\n * The passives of what an entity carries (`ItemDef.passive`), by ability id, in slot order: those of items sharing a\n * `unique` name once, the first carried (unless the game says otherwise, `ItemSettings.unique`). What the abilities\n * system keeps up and the triggers go by\n *\n * @beta\n */\nexport function carriedPassives(world: World, entity: Entity): readonly string[] {\n\t// asked of every unit on every hit and every upkeep: what carries no passive makes no list\n\tconst slots = slotsOf(entity)\n\tif (!slots) return NONE\n\tlet out: string[] | undefined\n\tlet seen: Set<string> | undefined\n\tconst unique = world.settings.items.unique\n\tfor (const instance of slots) {\n\t\tif (!instance) continue\n\t\tconst def = world.registry.item(instance.item)\n\t\tif (!def.passive) continue\n\t\tif (unique && def.unique !== undefined) {\n\t\t\tif (seen?.has(def.unique)) continue\n\t\t\t;(seen ??= new Set()).add(def.unique)\n\t\t}\n\t\t;(out ??= []).push(def.passive)\n\t}\n\treturn out ?? NONE\n}\n"],"mappings":";;;;;;;;;;;;;;AAiBA,IAAa,iBAAiB,gBAAwD;CAAE,IAAI;CAAkB,OAAO,WAAW,EAAE,OAAQ,MAAkC,SAAS,YAAa,UAAU,CAAC,QAAQ,IAAI,IAAI,CAAC,CAAE,EAAE;CAEjO,UAAU,WAAW;EACpB,IAAI,OAAO,IAAI,WACd,OAAO,IACN,gBACA,MAAM,KAAK,EAAE,QAAQ,OAAO,IAAI,UAAU,SAAS,IAAI,CACxD;CACF;CACA,WAAW;CACX,SAAS,OAAO,SAAS,EAAE,QAAQ;EAClC,MAAM,QAAkB,CAAC;EACzB,KAAK,MAAM,QAAQ,OAAO,IAAI,MAAM,MAAM,KAAK,KAAK,IAAI;EACxD,IAAI,CAAC,MAAM,OAAO,MAAM,SAAS,EAAE,MAAM,IAAI,KAAA;EAC7C,OAAO;GACN;GACA,OAAO,MAAM,KACX,SACA,QAAQ;IACP,IAAI,KAAK;IACT,MAAM,KAAK;IACX,SAAS,KAAK;IACd,UAAU,KAAK,OAAO,YAAY;IAClC,GAAI,KAAK,OAAO,YAAY,KAAA,KAAa,EAAE,MAAM,KAAK,MAAM,QAAQ;GACrE,CACF;EACD;CACD;CACA,OAAO,GAAG,MACT,EAAE,MAAM,WAAW,EAAE,MAAM,UAC3B,EAAE,MAAM,OAAO,MAAM,MAAM,SAAS,EAAE,MAAM,EAAE,KAC7C,EAAE,UAAU,KAAA,OAAgB,EAAE,UAAU,KAAA,OACxC,CAAC,EAAE,SACF,EAAE,MAAM,WAAW,EAAE,MAAO,UAC5B,EAAE,MAAM,OAAO,MAAM,MAAM;EAC1B,MAAM,QAAQ,EAAE,MAAO;EACvB,OACC,SAAS,SACR,CAAC,CAAC,QACF,CAAC,CAAC,SACF,KAAK,OAAO,MAAM,MAClB,KAAK,SAAS,MAAM,QACpB,KAAK,YAAY,MAAM,WACvB,KAAK,aAAa,MAAM,YACxB,KAAK,SAAS,MAAM;CAEvB,CAAC;AAAI,CAAC;;;;;;AAOV,IAAa,WAAW,WAAwD,OAAO,IAAI,cAAc;;;;;;AAOzG,IAAa,YAAY,WAAmB,QAAQ,MAAM,CAAC,EAAE,WAAW,SAAS,SAAS,IAAI,KAAK;;AAGnG,IAAM,OAA0B,OAAO,OAAO,CAAC,CAAC;;;;;;;;AAShD,SAAgB,gBAAgB,OAAc,QAAmC;CAEhF,MAAM,QAAQ,QAAQ,MAAM;CAC5B,IAAI,CAAC,OAAO,OAAO;CACnB,IAAI;CACJ,IAAI;CACJ,MAAM,SAAS,MAAM,SAAS,MAAM;CACpC,KAAK,MAAM,YAAY,OAAO;EAC7B,IAAI,CAAC,UAAU;EACf,MAAM,MAAM,MAAM,SAAS,KAAK,SAAS,IAAI;EAC7C,IAAI,CAAC,IAAI,SAAS;EAClB,IAAI,UAAU,IAAI,WAAW,KAAA,GAAW;GACvC,IAAI,MAAM,IAAI,IAAI,MAAM,GAAG;GAC1B,CAAC,yBAAS,IAAI,IAAI,EAAA,CAAG,IAAI,IAAI,MAAM;EACrC;EACC,CAAC,QAAQ,CAAC,EAAA,CAAG,KAAK,IAAI,OAAO;CAC/B;CACA,OAAO,OAAO;AACf"}
|
package/dist/items.d.ts
CHANGED
|
@@ -1,34 +1,106 @@
|
|
|
1
|
+
import type { Cost, ItemDef, ItemTier } from './defs';
|
|
1
2
|
import type { Entity, ItemInstance, Placed, StockState } from './entity';
|
|
2
|
-
import type { StockInfo } from './session/protocol';
|
|
3
|
+
import type { PurchaseInfo, StockInfo } from './session/protocol';
|
|
3
4
|
import { type Vec2 } from './math';
|
|
4
5
|
import type { World } from './world';
|
|
6
|
+
import { type Message } from './messages';
|
|
7
|
+
import type { Registry } from './registry';
|
|
5
8
|
/**
|
|
6
9
|
* An item lying on the ground
|
|
7
10
|
*
|
|
8
11
|
* @beta
|
|
9
12
|
*/
|
|
10
13
|
export interface GroundItem {
|
|
14
|
+
/** The item instance's id, kept when it is picked up again */
|
|
11
15
|
id: number;
|
|
16
|
+
/** The item type's id */
|
|
12
17
|
item: string;
|
|
18
|
+
/** How many charges the item has left */
|
|
13
19
|
charges: number;
|
|
20
|
+
/** The item's place on the map's x axis */
|
|
14
21
|
x: number;
|
|
22
|
+
/** The item's place on the map's z axis */
|
|
15
23
|
z: number;
|
|
16
24
|
}
|
|
17
|
-
/**
|
|
25
|
+
/**
|
|
26
|
+
* Makes an instance of an item type with an id of its own, with the charges given or those of the type (0 when it has none)
|
|
27
|
+
*
|
|
28
|
+
* @beta
|
|
29
|
+
*/
|
|
18
30
|
export declare function createItem(world: World, item: string, charges?: number): ItemInstance;
|
|
19
31
|
/**
|
|
20
|
-
*
|
|
32
|
+
* The tier of an item, `epic` (the old word) read as `intermediate`: what the registry keeps of it (`ItemTier`)
|
|
33
|
+
*
|
|
34
|
+
* @beta
|
|
35
|
+
*/
|
|
36
|
+
export declare function itemTier(def: Pick<ItemDef, 'tier'>): ItemTier | undefined;
|
|
37
|
+
/**
|
|
38
|
+
* The items of the game with a tag (`ItemDef.tags`), in the game's order: `itemsTagged(registry, 'lifesteal')`
|
|
39
|
+
*
|
|
40
|
+
* @beta
|
|
41
|
+
*/
|
|
42
|
+
export declare function itemsTagged(registry: Pick<Registry, 'items'>, tag: string): ItemDef[];
|
|
43
|
+
/**
|
|
44
|
+
* The most of an item's group one carrier may have (`ItemDef.group`): the item's own limit, the game's of the group
|
|
45
|
+
* (`ItemSettings.groups`), or 1. No limit for an item of no group
|
|
46
|
+
*
|
|
47
|
+
* @beta
|
|
48
|
+
*/
|
|
49
|
+
export declare function groupLimitOf(world: World, def: ItemDef): number;
|
|
50
|
+
/**
|
|
51
|
+
* Whether the entity has room for an item: a free slot, or a stack of it with room (`ItemDef.stack`)
|
|
52
|
+
*
|
|
53
|
+
* @beta
|
|
54
|
+
*/
|
|
55
|
+
export declare function hasRoomFor(world: World, entity: Entity, item: string, charges?: number): boolean;
|
|
56
|
+
/**
|
|
57
|
+
* Why a carrier may not take an item, or nothing when it may: one more of its group than it may carry (`ItemDef.group`),
|
|
58
|
+
* or what the game's own rule says (`ItemSettings.mayCarry`). `uses`, the parts buying it uses up, by id: they go out as
|
|
59
|
+
* it comes in. `handed`: it is handed over, and the words say "they". Asked as an item is bought, picked up or handed
|
|
60
|
+
* over; room in the inventory is asked apart (`hasRoomFor`)
|
|
61
|
+
*
|
|
62
|
+
* @beta
|
|
63
|
+
*/
|
|
64
|
+
export declare function carryRefusal(world: World, carrier: Entity, item: string, uses?: readonly string[], handed?: boolean): Message | undefined;
|
|
65
|
+
/**
|
|
66
|
+
* Why one who carries these items (by id) may not take one more of an item's group (`ItemDef.group`), or nothing when
|
|
67
|
+
* it may: the engine's part of `carryRefusal`, which a screen asks too, with the game's registry alone, to say so before
|
|
68
|
+
* the buy (the shop window). `uses` are the parts buying it uses up: they go out as it comes in, so they are not
|
|
69
|
+
* counted. The limit is the item's own, the game's of the group (`ItemSettings.groups`), or 1
|
|
70
|
+
*
|
|
71
|
+
* @beta
|
|
72
|
+
*/
|
|
73
|
+
export declare function groupRefusal(registry: Pick<Registry, 'items' | 'settings'>, carried: readonly string[], item: string, uses?: readonly string[], handed?: boolean): Message | undefined;
|
|
74
|
+
/**
|
|
75
|
+
* Puts an item into the inventory: into a stack of it with room (`ItemDef.stack`, its charges added), or the first free
|
|
76
|
+
* slot. False when there is neither. The engine's rules of what may be carried are asked before (`carryRefusal`)
|
|
21
77
|
*
|
|
22
78
|
* @beta
|
|
23
79
|
*/
|
|
24
80
|
export declare function giveItem(world: World, entity: Entity, instance: ItemInstance): boolean;
|
|
25
|
-
/**
|
|
81
|
+
/**
|
|
82
|
+
* Takes the item instance with this id out of the entity's inventory and returns it; undefined when it does not carry it
|
|
83
|
+
*
|
|
84
|
+
* @beta
|
|
85
|
+
*/
|
|
26
86
|
export declare function takeItem(world: World, entity: Entity, instanceId: number): ItemInstance | undefined;
|
|
27
|
-
/**
|
|
87
|
+
/**
|
|
88
|
+
* Finds the item instance with this id in the entity's inventory; undefined when it is not there or no id is given
|
|
89
|
+
*
|
|
90
|
+
* @beta
|
|
91
|
+
*/
|
|
28
92
|
export declare function findItem(entity: Entity, instanceId: number | undefined): ItemInstance | undefined;
|
|
29
|
-
/**
|
|
93
|
+
/**
|
|
94
|
+
* Puts the item on the ground at the closest walkable point to `at`, tells the game (`itemDropped`) and returns the ground item
|
|
95
|
+
*
|
|
96
|
+
* @beta
|
|
97
|
+
*/
|
|
30
98
|
export declare function dropOnGround(world: World, instance: ItemInstance, at: Vec2): GroundItem;
|
|
31
|
-
/**
|
|
99
|
+
/**
|
|
100
|
+
* Has the entity pick up the item lying on the ground by its id; returns false when none is there, no slot is free or `beforePickUp` refuses
|
|
101
|
+
*
|
|
102
|
+
* @beta
|
|
103
|
+
*/
|
|
32
104
|
export declare function pickUp(world: World, entity: Entity, groundId: number): boolean;
|
|
33
105
|
/**
|
|
34
106
|
* One use of an item that has charges. The last one takes the item with it
|
|
@@ -71,6 +143,62 @@ export declare function shopper(world: World, shop: Entity, player: number, item
|
|
|
71
143
|
* @beta
|
|
72
144
|
*/
|
|
73
145
|
export declare function buy(world: World, shop: Entity, item: string, player: number, buyer?: Entity): boolean;
|
|
146
|
+
/**
|
|
147
|
+
* A purchase that may still be undone (`undoBuy`), kept on the buyer (`purchases`) for `ShopSettings.undo` seconds
|
|
148
|
+
* while it stands at the shop and has not used the item
|
|
149
|
+
*
|
|
150
|
+
* @beta
|
|
151
|
+
*/
|
|
152
|
+
export interface Purchase {
|
|
153
|
+
/** The purchase's id: the id of the item instance bought (what `undoBuy` names it by) */
|
|
154
|
+
id: number;
|
|
155
|
+
/** The item type's id */
|
|
156
|
+
item: string;
|
|
157
|
+
/** The shop it was bought at: the buyer has to be there still */
|
|
158
|
+
shop: number;
|
|
159
|
+
/** The game's time it was bought at */
|
|
160
|
+
at: number;
|
|
161
|
+
/** What was paid, given back whole */
|
|
162
|
+
paid: Cost;
|
|
163
|
+
/** The charges the item had as bought, or the stack had with it: fewer, and it was used */
|
|
164
|
+
charges: number;
|
|
165
|
+
/** The stack it went into (its instance id), when it was stacked onto one carried rather than put in a slot of its own */
|
|
166
|
+
into?: number;
|
|
167
|
+
/** The parts it used up, as they were, to come back */
|
|
168
|
+
used: ItemInstance[];
|
|
169
|
+
/** Whether the shop counted it off its stock, to count it back */
|
|
170
|
+
stocked: boolean;
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* The purchases a hero may still undo (`Purchase`, `undoBuy`): kept on the buyer, sent to its player (`PurchaseInfo`:
|
|
174
|
+
* each with the seconds left to undo it), dropped as they run out, as the hero leaves the shop or as the item is used
|
|
175
|
+
* (`expirePurchases`, the abilities system's every tick)
|
|
176
|
+
*
|
|
177
|
+
* @beta
|
|
178
|
+
*/
|
|
179
|
+
export declare const purchases: import("./components").Component<Purchase[], PurchaseInfo[]>;
|
|
180
|
+
/**
|
|
181
|
+
* Whether a purchase may still be undone (`undoBuy`): within `ShopSettings.undo` seconds of it, the buyer alive and at
|
|
182
|
+
* the shop still, the shop standing, the item carried with its charges as bought and its ability not used
|
|
183
|
+
*
|
|
184
|
+
* @beta
|
|
185
|
+
*/
|
|
186
|
+
export declare function undoable(world: World, entity: Entity, purchase: Purchase): boolean;
|
|
187
|
+
/**
|
|
188
|
+
* Why a purchase of the hero's may not be undone, or nothing when it may: nothing to undo (none within the time, the
|
|
189
|
+
* hero away from the shop, the item used), or no room for the parts to come back
|
|
190
|
+
*
|
|
191
|
+
* @beta
|
|
192
|
+
*/
|
|
193
|
+
export declare function undoRefusal(world: World, entity: Entity, purchaseId?: number): Message | undefined;
|
|
194
|
+
/**
|
|
195
|
+
* Takes a purchase back (`ShopSettings.undo`): the latest the hero may still undo, or the one named by its id. The
|
|
196
|
+
* item goes (out of its stack, where it went into one), what it cost comes back whole, the parts it used up come back
|
|
197
|
+
* as they were, and the shop has it back in stock. False, and the player told why, where it cannot (`undoRefusal`)
|
|
198
|
+
*
|
|
199
|
+
* @beta
|
|
200
|
+
*/
|
|
201
|
+
export declare function undoBuy(world: World, entity: Entity, purchaseId?: number): boolean;
|
|
74
202
|
/**
|
|
75
203
|
* Whether a shop the player can trade with is close enough to the entity
|
|
76
204
|
*
|
|
@@ -88,4 +216,4 @@ export declare function dropLoot(world: World, entity: Entity, killer?: Entity):
|
|
|
88
216
|
/** An item picked up, to those who see who picked it */
|
|
89
217
|
export declare const toldPicked: import("./replication").ReplicatedEvent;
|
|
90
218
|
/** The items on the ground where the player sees (`Snapshot.items`) */
|
|
91
|
-
export declare const itemsPart: import("./replication").
|
|
219
|
+
export declare const itemsPart: import("./replication").SnapshotField<keyof import(".").Snapshot>;
|