@datamoc/mw_games 0.7.6 → 0.7.8
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/CHANGELOG.md +359 -0
- package/README.md +7 -7
- package/dist/actors/Inventory.d.ts +7 -1
- package/dist/actors/Inventory.d.ts.map +1 -1
- package/dist/actors/Inventory.js.map +1 -1
- package/dist/actors/Shop.d.ts.map +1 -1
- package/dist/actors/Shop.js +4 -1
- package/dist/actors/Shop.js.map +1 -1
- package/dist/actors/craft.d.ts +35 -14
- package/dist/actors/craft.d.ts.map +1 -1
- package/dist/actors/craft.js +56 -24
- package/dist/actors/craft.js.map +1 -1
- package/dist/actors/index.d.ts +1 -1
- package/dist/actors/index.d.ts.map +1 -1
- package/dist/ai/Heuristics.d.ts +240 -0
- package/dist/ai/Heuristics.d.ts.map +1 -0
- package/dist/ai/Heuristics.js +298 -0
- package/dist/ai/Heuristics.js.map +1 -0
- package/dist/ai/index.d.ts +4 -0
- package/dist/ai/index.d.ts.map +1 -1
- package/dist/ai/index.js +2 -0
- package/dist/ai/index.js.map +1 -1
- package/dist/ai/lua.d.ts +21 -0
- package/dist/ai/lua.d.ts.map +1 -1
- package/dist/ai/lua.js +21 -0
- package/dist/ai/lua.js.map +1 -1
- package/dist/ai/score.d.ts +162 -0
- package/dist/ai/score.d.ts.map +1 -0
- package/dist/ai/score.js +147 -0
- package/dist/ai/score.js.map +1 -0
- package/dist/assets/loader.d.ts +18 -4
- package/dist/assets/loader.d.ts.map +1 -1
- package/dist/assets/loader.js +40 -11
- package/dist/assets/loader.js.map +1 -1
- package/dist/audio/Positional.d.ts +125 -0
- package/dist/audio/Positional.d.ts.map +1 -0
- package/dist/audio/Positional.js +135 -0
- package/dist/audio/Positional.js.map +1 -0
- package/dist/audio/Sound.d.ts +7 -1
- package/dist/audio/Sound.d.ts.map +1 -1
- package/dist/audio/Sound.js +8 -2
- package/dist/audio/Sound.js.map +1 -1
- package/dist/audio/index.d.ts +2 -0
- package/dist/audio/index.d.ts.map +1 -1
- package/dist/audio/index.js +1 -0
- package/dist/audio/index.js.map +1 -1
- package/dist/battle/AttackDialog.d.ts +75 -0
- package/dist/battle/AttackDialog.d.ts.map +1 -0
- package/dist/battle/AttackDialog.js +115 -0
- package/dist/battle/AttackDialog.js.map +1 -0
- package/dist/battle/AttackPreview.d.ts +70 -0
- package/dist/battle/AttackPreview.d.ts.map +1 -0
- package/dist/battle/AttackPreview.js +78 -0
- package/dist/battle/AttackPreview.js.map +1 -0
- package/dist/battle/BattleStats.d.ts +45 -0
- package/dist/battle/BattleStats.d.ts.map +1 -0
- package/dist/battle/BattleStats.js +63 -0
- package/dist/battle/BattleStats.js.map +1 -0
- package/dist/battle/UnitSelector.d.ts +72 -0
- package/dist/battle/UnitSelector.d.ts.map +1 -0
- package/dist/battle/UnitSelector.js +117 -0
- package/dist/battle/UnitSelector.js.map +1 -0
- package/dist/battle/Whiteboard.d.ts +50 -0
- package/dist/battle/Whiteboard.d.ts.map +1 -0
- package/dist/battle/Whiteboard.js +94 -0
- package/dist/battle/Whiteboard.js.map +1 -0
- package/dist/battle/index.d.ts +10 -0
- package/dist/battle/index.d.ts.map +1 -1
- package/dist/battle/index.js +5 -0
- package/dist/battle/index.js.map +1 -1
- package/dist/board/Classics.d.ts.map +1 -1
- package/dist/board/Classics.js +51 -39
- package/dist/board/Classics.js.map +1 -1
- package/dist/board/FogOfWar.d.ts +32 -2
- package/dist/board/FogOfWar.d.ts.map +1 -1
- package/dist/board/FogOfWar.js +70 -6
- package/dist/board/FogOfWar.js.map +1 -1
- package/dist/board/HexSkirmish.d.ts.map +1 -1
- package/dist/board/HexSkirmish.js +69 -20
- package/dist/board/HexSkirmish.js.map +1 -1
- package/dist/board/Tactics.d.ts +7 -0
- package/dist/board/Tactics.d.ts.map +1 -1
- package/dist/board/Tactics.js +2 -2
- package/dist/board/Tactics.js.map +1 -1
- package/dist/core/Achievements.d.ts +40 -7
- package/dist/core/Achievements.d.ts.map +1 -1
- package/dist/core/Achievements.js +53 -7
- package/dist/core/Achievements.js.map +1 -1
- package/dist/core/Hex.d.ts +26 -6
- package/dist/core/Hex.d.ts.map +1 -1
- package/dist/core/Hex.js +40 -13
- package/dist/core/Hex.js.map +1 -1
- package/dist/core/Input.d.ts +36 -0
- package/dist/core/Input.d.ts.map +1 -1
- package/dist/core/Input.js +63 -1
- package/dist/core/Input.js.map +1 -1
- package/dist/core/Random.d.ts +93 -0
- package/dist/core/Random.d.ts.map +1 -1
- package/dist/core/Random.js +177 -0
- package/dist/core/Random.js.map +1 -1
- package/dist/core/SyncGuard.d.ts +57 -0
- package/dist/core/SyncGuard.d.ts.map +1 -0
- package/dist/core/SyncGuard.js +116 -0
- package/dist/core/SyncGuard.js.map +1 -0
- package/dist/core/index.d.ts +3 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +2 -1
- package/dist/core/index.js.map +1 -1
- package/dist/i18n/Po.d.ts +51 -0
- package/dist/i18n/Po.d.ts.map +1 -0
- package/dist/i18n/Po.js +176 -0
- package/dist/i18n/Po.js.map +1 -0
- package/dist/i18n/index.d.ts +2 -0
- package/dist/i18n/index.d.ts.map +1 -1
- package/dist/i18n/index.js +1 -0
- package/dist/i18n/index.js.map +1 -1
- package/dist/mw_games.global.js +104 -98
- package/dist/mwl/MapFile.d.ts +41 -0
- package/dist/mwl/MapFile.d.ts.map +1 -0
- package/dist/mwl/MapFile.js +43 -0
- package/dist/mwl/MapFile.js.map +1 -0
- package/dist/mwl/actors.d.ts +46 -2
- package/dist/mwl/actors.d.ts.map +1 -1
- package/dist/mwl/actors.js +46 -2
- package/dist/mwl/actors.js.map +1 -1
- package/dist/mwl/campaign.d.ts +51 -0
- package/dist/mwl/campaign.d.ts.map +1 -0
- package/dist/mwl/campaign.js +58 -0
- package/dist/mwl/campaign.js.map +1 -0
- package/dist/mwl/carryover.d.ts +86 -0
- package/dist/mwl/carryover.d.ts.map +1 -0
- package/dist/mwl/carryover.js +70 -0
- package/dist/mwl/carryover.js.map +1 -0
- package/dist/mwl/catalog.d.ts +10 -1
- package/dist/mwl/catalog.d.ts.map +1 -1
- package/dist/mwl/catalog.js +10 -1
- package/dist/mwl/catalog.js.map +1 -1
- package/dist/mwl/compiler.d.ts +70 -3
- package/dist/mwl/compiler.d.ts.map +1 -1
- package/dist/mwl/compiler.js +70 -3
- package/dist/mwl/compiler.js.map +1 -1
- package/dist/mwl/conditions.d.ts +10 -1
- package/dist/mwl/conditions.d.ts.map +1 -1
- package/dist/mwl/conditions.js +10 -1
- package/dist/mwl/conditions.js.map +1 -1
- package/dist/mwl/content.d.ts +21 -0
- package/dist/mwl/content.d.ts.map +1 -1
- package/dist/mwl/content.js +19 -0
- package/dist/mwl/content.js.map +1 -1
- package/dist/mwl/expression.d.ts +21 -0
- package/dist/mwl/expression.d.ts.map +1 -1
- package/dist/mwl/expression.js +21 -0
- package/dist/mwl/expression.js.map +1 -1
- package/dist/mwl/fengari.d.ts +12 -1
- package/dist/mwl/fengari.d.ts.map +1 -1
- package/dist/mwl/fengari.js +12 -1
- package/dist/mwl/fengari.js.map +1 -1
- package/dist/mwl/grammar.d.ts +45 -1
- package/dist/mwl/grammar.d.ts.map +1 -1
- package/dist/mwl/grammar.js +45 -1
- package/dist/mwl/grammar.js.map +1 -1
- package/dist/mwl/hooks.d.ts +51 -6
- package/dist/mwl/hooks.d.ts.map +1 -1
- package/dist/mwl/hooks.js +45 -1
- package/dist/mwl/hooks.js.map +1 -1
- package/dist/mwl/index.d.ts +9 -3
- package/dist/mwl/index.d.ts.map +1 -1
- package/dist/mwl/index.js +5 -2
- package/dist/mwl/index.js.map +1 -1
- package/dist/mwl/persistence.d.ts +32 -0
- package/dist/mwl/persistence.d.ts.map +1 -1
- package/dist/mwl/persistence.js +32 -0
- package/dist/mwl/persistence.js.map +1 -1
- package/dist/mwl/readers.d.ts +24 -2
- package/dist/mwl/readers.d.ts.map +1 -1
- package/dist/mwl/readers.js +27 -4
- package/dist/mwl/readers.js.map +1 -1
- package/dist/mwl/report.d.ts +21 -2
- package/dist/mwl/report.d.ts.map +1 -1
- package/dist/mwl/report.js +21 -2
- package/dist/mwl/report.js.map +1 -1
- package/dist/mwl/runtime.d.ts +212 -7
- package/dist/mwl/runtime.d.ts.map +1 -1
- package/dist/mwl/runtime.js +682 -90
- package/dist/mwl/runtime.js.map +1 -1
- package/dist/mwl/schema.d.ts +57 -1
- package/dist/mwl/schema.d.ts.map +1 -1
- package/dist/mwl/schema.js +181 -21
- package/dist/mwl/schema.js.map +1 -1
- package/dist/mwl/scripts.d.ts +12 -1
- package/dist/mwl/scripts.d.ts.map +1 -1
- package/dist/mwl/scripts.js +12 -1
- package/dist/mwl/scripts.js.map +1 -1
- package/dist/mwl/utils.d.ts +2 -0
- package/dist/mwl/utils.d.ts.map +1 -1
- package/dist/mwl/utils.js +4 -1
- package/dist/mwl/utils.js.map +1 -1
- package/dist/roguelike/MultiTurnBeam.d.ts +50 -12
- package/dist/roguelike/MultiTurnBeam.d.ts.map +1 -1
- package/dist/roguelike/MultiTurnBeam.js +100 -53
- package/dist/roguelike/MultiTurnBeam.js.map +1 -1
- package/dist/roguelike/Targeting.d.ts +94 -0
- package/dist/roguelike/Targeting.d.ts.map +1 -1
- package/dist/roguelike/Targeting.js +123 -0
- package/dist/roguelike/Targeting.js.map +1 -1
- package/dist/roguelike/index.d.ts +3 -1
- package/dist/roguelike/index.d.ts.map +1 -1
- package/dist/roguelike/index.js +1 -0
- package/dist/roguelike/index.js.map +1 -1
- package/dist/rpg/GameState.d.ts +2 -2
- package/dist/rpg/GameState.js +2 -2
- package/dist/simulation/CampaignSave.d.ts +68 -0
- package/dist/simulation/CampaignSave.d.ts.map +1 -0
- package/dist/simulation/CampaignSave.js +54 -0
- package/dist/simulation/CampaignSave.js.map +1 -0
- package/dist/simulation/EventPresentation.d.ts +111 -0
- package/dist/simulation/EventPresentation.d.ts.map +1 -0
- package/dist/simulation/EventPresentation.js +120 -0
- package/dist/simulation/EventPresentation.js.map +1 -0
- package/dist/simulation/index.d.ts +4 -0
- package/dist/simulation/index.d.ts.map +1 -1
- package/dist/simulation/index.js +2 -0
- package/dist/simulation/index.js.map +1 -1
- package/dist/two-d/pixi-interop.d.ts +18 -6
- package/dist/two-d/pixi-interop.d.ts.map +1 -1
- package/dist/two-d/pixi-interop.js +18 -6
- package/dist/two-d/pixi-interop.js.map +1 -1
- package/dist/two-d/render/AnimatedSprite.d.ts +74 -7
- package/dist/two-d/render/AnimatedSprite.d.ts.map +1 -1
- package/dist/two-d/render/AnimatedSprite.js +88 -26
- package/dist/two-d/render/AnimatedSprite.js.map +1 -1
- package/dist/two-d/render/Camera.d.ts +64 -4
- package/dist/two-d/render/Camera.d.ts.map +1 -1
- package/dist/two-d/render/Camera.js +132 -11
- package/dist/two-d/render/Camera.js.map +1 -1
- package/dist/two-d/render/ColorTransformBatcher.d.ts +7 -1
- package/dist/two-d/render/ColorTransformBatcher.d.ts.map +1 -1
- package/dist/two-d/render/ColorTransformBatcher.js +10 -1
- package/dist/two-d/render/ColorTransformBatcher.js.map +1 -1
- package/dist/two-d/render/Halo.d.ts +58 -0
- package/dist/two-d/render/Halo.d.ts.map +1 -0
- package/dist/two-d/render/Halo.js +48 -0
- package/dist/two-d/render/Halo.js.map +1 -0
- package/dist/two-d/render/ImageModifiers.d.ts +174 -0
- package/dist/two-d/render/ImageModifiers.d.ts.map +1 -1
- package/dist/two-d/render/ImageModifiers.js +454 -1
- package/dist/two-d/render/ImageModifiers.js.map +1 -1
- package/dist/two-d/render/LightningArc.d.ts +57 -0
- package/dist/two-d/render/LightningArc.d.ts.map +1 -0
- package/dist/two-d/render/LightningArc.js +91 -0
- package/dist/two-d/render/LightningArc.js.map +1 -0
- package/dist/two-d/render/PaletteRemap.d.ts +135 -0
- package/dist/two-d/render/PaletteRemap.d.ts.map +1 -0
- package/dist/two-d/render/PaletteRemap.js +181 -0
- package/dist/two-d/render/PaletteRemap.js.map +1 -0
- package/dist/two-d/render/Particles.d.ts +26 -0
- package/dist/two-d/render/Particles.d.ts.map +1 -1
- package/dist/two-d/render/Particles.js +23 -2
- package/dist/two-d/render/Particles.js.map +1 -1
- package/dist/two-d/render/SpriteAttachment.d.ts +55 -0
- package/dist/two-d/render/SpriteAttachment.d.ts.map +1 -0
- package/dist/two-d/render/SpriteAttachment.js +60 -0
- package/dist/two-d/render/SpriteAttachment.js.map +1 -0
- package/dist/two-d/render/TerrainGraphics.d.ts +142 -0
- package/dist/two-d/render/TerrainGraphics.d.ts.map +1 -0
- package/dist/two-d/render/TerrainGraphics.js +161 -0
- package/dist/two-d/render/TerrainGraphics.js.map +1 -0
- package/dist/two-d/render/TerrainGraphicsLayer.d.ts +55 -0
- package/dist/two-d/render/TerrainGraphicsLayer.d.ts.map +1 -0
- package/dist/two-d/render/TerrainGraphicsLayer.js +54 -0
- package/dist/two-d/render/TerrainGraphicsLayer.js.map +1 -0
- package/dist/two-d/render/TintedSprite.js +2 -2
- package/dist/two-d/render/TintedSprite.js.map +1 -1
- package/dist/two-d/render/index.d.ts +15 -3
- package/dist/two-d/render/index.d.ts.map +1 -1
- package/dist/two-d/render/index.js +7 -1
- package/dist/two-d/render/index.js.map +1 -1
- package/dist/two-d/stage/StoryScreen.d.ts +110 -0
- package/dist/two-d/stage/StoryScreen.d.ts.map +1 -0
- package/dist/two-d/stage/StoryScreen.js +178 -0
- package/dist/two-d/stage/StoryScreen.js.map +1 -0
- package/dist/two-d/stage/index.d.ts +2 -0
- package/dist/two-d/stage/index.d.ts.map +1 -1
- package/dist/two-d/stage/index.js +1 -0
- package/dist/two-d/stage/index.js.map +1 -1
- package/dist/two-d/ui/Checkbox.d.ts +44 -0
- package/dist/two-d/ui/Checkbox.d.ts.map +1 -0
- package/dist/two-d/ui/Checkbox.js +89 -0
- package/dist/two-d/ui/Checkbox.js.map +1 -0
- package/dist/two-d/ui/DataTable.d.ts +79 -0
- package/dist/two-d/ui/DataTable.d.ts.map +1 -0
- package/dist/two-d/ui/DataTable.js +164 -0
- package/dist/two-d/ui/DataTable.js.map +1 -0
- package/dist/two-d/ui/Dropdown.d.ts +72 -0
- package/dist/two-d/ui/Dropdown.d.ts.map +1 -0
- package/dist/two-d/ui/Dropdown.js +126 -0
- package/dist/two-d/ui/Dropdown.js.map +1 -0
- package/dist/two-d/ui/FloatingText.d.ts +43 -4
- package/dist/two-d/ui/FloatingText.d.ts.map +1 -1
- package/dist/two-d/ui/FloatingText.js +52 -5
- package/dist/two-d/ui/FloatingText.js.map +1 -1
- package/dist/two-d/ui/FloatingTextStack.d.ts +86 -13
- package/dist/two-d/ui/FloatingTextStack.d.ts.map +1 -1
- package/dist/two-d/ui/FloatingTextStack.js +89 -18
- package/dist/two-d/ui/FloatingTextStack.js.map +1 -1
- package/dist/two-d/ui/Layout.d.ts +105 -0
- package/dist/two-d/ui/Layout.d.ts.map +1 -0
- package/dist/two-d/ui/Layout.js +174 -0
- package/dist/two-d/ui/Layout.js.map +1 -0
- package/dist/two-d/ui/MarkupText.d.ts +53 -0
- package/dist/two-d/ui/MarkupText.d.ts.map +1 -0
- package/dist/two-d/ui/MarkupText.js +122 -0
- package/dist/two-d/ui/MarkupText.js.map +1 -0
- package/dist/two-d/ui/ScrollBox.d.ts +67 -0
- package/dist/two-d/ui/ScrollBox.d.ts.map +1 -0
- package/dist/two-d/ui/ScrollBox.js +127 -0
- package/dist/two-d/ui/ScrollBox.js.map +1 -0
- package/dist/two-d/ui/Skins.d.ts +59 -0
- package/dist/two-d/ui/Skins.d.ts.map +1 -0
- package/dist/two-d/ui/Skins.js +77 -0
- package/dist/two-d/ui/Skins.js.map +1 -0
- package/dist/two-d/ui/Slider.d.ts +91 -0
- package/dist/two-d/ui/Slider.d.ts.map +1 -0
- package/dist/two-d/ui/Slider.js +170 -0
- package/dist/two-d/ui/Slider.js.map +1 -0
- package/dist/two-d/ui/Spinner.d.ts +67 -0
- package/dist/two-d/ui/Spinner.d.ts.map +1 -0
- package/dist/two-d/ui/Spinner.js +137 -0
- package/dist/two-d/ui/Spinner.js.map +1 -0
- package/dist/two-d/ui/TabbedList.d.ts +118 -0
- package/dist/two-d/ui/TabbedList.d.ts.map +1 -0
- package/dist/two-d/ui/TabbedList.js +221 -0
- package/dist/two-d/ui/TabbedList.js.map +1 -0
- package/dist/two-d/ui/TextModel.d.ts +65 -0
- package/dist/two-d/ui/TextModel.d.ts.map +1 -0
- package/dist/two-d/ui/TextModel.js +126 -0
- package/dist/two-d/ui/TextModel.js.map +1 -0
- package/dist/two-d/ui/TreeView.d.ts +68 -0
- package/dist/two-d/ui/TreeView.d.ts.map +1 -0
- package/dist/two-d/ui/TreeView.js +133 -0
- package/dist/two-d/ui/TreeView.js.map +1 -0
- package/dist/two-d/ui/Window.d.ts +13 -0
- package/dist/two-d/ui/Window.d.ts.map +1 -1
- package/dist/two-d/ui/Window.js +23 -0
- package/dist/two-d/ui/Window.js.map +1 -1
- package/dist/two-d/ui/WindowStack.d.ts.map +1 -1
- package/dist/two-d/ui/WindowStack.js +2 -0
- package/dist/two-d/ui/WindowStack.js.map +1 -1
- package/dist/two-d/ui/index.d.ts +29 -3
- package/dist/two-d/ui/index.d.ts.map +1 -1
- package/dist/two-d/ui/index.js +15 -2
- package/dist/two-d/ui/index.js.map +1 -1
- package/dist/two-d/ui/markup.d.ts +181 -0
- package/dist/two-d/ui/markup.d.ts.map +1 -0
- package/dist/two-d/ui/markup.js +370 -0
- package/dist/two-d/ui/markup.js.map +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/world/SideTurns.d.ts +115 -0
- package/dist/world/SideTurns.d.ts.map +1 -0
- package/dist/world/SideTurns.js +138 -0
- package/dist/world/SideTurns.js.map +1 -0
- package/dist/world/index.d.ts +2 -0
- package/dist/world/index.d.ts.map +1 -1
- package/dist/world/index.js +1 -0
- package/dist/world/index.js.map +1 -1
- package/package.json +2 -1
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { ColorMatrixFilter, Rectangle, Sprite, Texture } from 'pixi.js';
|
|
2
|
+
import { recolorTexture, withTextureCanvas } from './PaletteRemap.js';
|
|
2
3
|
/** Split top-level modifiers while keeping nested `~` paths inside arguments.
|
|
3
4
|
* @example
|
|
4
5
|
* ```ts
|
|
@@ -79,6 +80,114 @@ export function colorShiftMatrix(red, green, blue) {
|
|
|
79
80
|
0,
|
|
80
81
|
];
|
|
81
82
|
}
|
|
83
|
+
/**
|
|
84
|
+
* Build the matrix for `~R`/`~G`/`~B(percent)`: scales one or more channels by a percentage
|
|
85
|
+
* (100 = unchanged), leaving any channel not passed at 100%.
|
|
86
|
+
*
|
|
87
|
+
* @example
|
|
88
|
+
* ```ts
|
|
89
|
+
* import { channelScaleMatrix } from '@datamoc/mw_games/two-d/render';
|
|
90
|
+
* const matrix = channelScaleMatrix({ red: 150 }); // ~R(150), a 50% brighter red channel
|
|
91
|
+
* console.log(matrix[0]); // 1.5
|
|
92
|
+
* ```
|
|
93
|
+
*/
|
|
94
|
+
export function channelScaleMatrix(scale) {
|
|
95
|
+
const r = (scale.red ?? 100) / 100;
|
|
96
|
+
const g = (scale.green ?? 100) / 100;
|
|
97
|
+
const b = (scale.blue ?? 100) / 100;
|
|
98
|
+
return [r, 0, 0, 0, 0, 0, g, 0, 0, 0, 0, 0, b, 0, 0, 0, 0, 0, 1, 0];
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* A live, per-frame colour-matrix approximation of a blend towards `color` (0xRRGGBB) by
|
|
102
|
+
* `ratio`, the same shape `TintedSprite.lerpTint` gives an additive-capable sprite, expressed
|
|
103
|
+
* here as a plain matrix so a bare Pixi `Sprite` can use it too. This is *not* what
|
|
104
|
+
* `applyTextureModifiers` uses for `~BLEND` itself (that bakes an exact per-pixel blend once,
|
|
105
|
+
* via `blendPixels`, rather than attaching a runtime filter) - kept as its own export for a
|
|
106
|
+
* game that wants a cheap, adjustable-at-runtime approximation instead of a baked texture, the
|
|
107
|
+
* tradeoff `~CS`'s `colorShiftMatrix` already makes for an additive shift.
|
|
108
|
+
*
|
|
109
|
+
* @example
|
|
110
|
+
* ```ts
|
|
111
|
+
* import { blendMatrix } from '@datamoc/mw_games/two-d/render';
|
|
112
|
+
* const matrix = blendMatrix(0xff0000, 0.5); // half-way to red
|
|
113
|
+
* ```
|
|
114
|
+
*/
|
|
115
|
+
export function blendMatrix(color, ratio) {
|
|
116
|
+
const keep = 1 - ratio;
|
|
117
|
+
const r = ((color >> 16) & 0xff) / 255;
|
|
118
|
+
const g = ((color >> 8) & 0xff) / 255;
|
|
119
|
+
const b = (color & 0xff) / 255;
|
|
120
|
+
return [
|
|
121
|
+
keep,
|
|
122
|
+
0,
|
|
123
|
+
0,
|
|
124
|
+
0,
|
|
125
|
+
r * ratio,
|
|
126
|
+
0,
|
|
127
|
+
keep,
|
|
128
|
+
0,
|
|
129
|
+
0,
|
|
130
|
+
g * ratio,
|
|
131
|
+
0,
|
|
132
|
+
0,
|
|
133
|
+
keep,
|
|
134
|
+
0,
|
|
135
|
+
b * ratio,
|
|
136
|
+
0,
|
|
137
|
+
0,
|
|
138
|
+
0,
|
|
139
|
+
1,
|
|
140
|
+
0,
|
|
141
|
+
];
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Build the matrix for `~CHAN(r,g,b,a)`: each output channel is fed by whichever named input
|
|
145
|
+
* channel (or constant black/white) is given for it, missing trailing entries left as the
|
|
146
|
+
* output channel's own identity source (`R,G,B,A`).
|
|
147
|
+
*
|
|
148
|
+
* @example
|
|
149
|
+
* ```ts
|
|
150
|
+
* import { channelSwapMatrix } from '@datamoc/mw_games/two-d/render';
|
|
151
|
+
* const matrix = channelSwapMatrix(['B', 'G', 'R']); // swap the red and blue channels
|
|
152
|
+
* ```
|
|
153
|
+
*/
|
|
154
|
+
export function channelSwapMatrix(sources) {
|
|
155
|
+
const defaults = ['R', 'G', 'B', 'A'];
|
|
156
|
+
const rows = defaults.map((identity, index) => sources[index] ?? identity);
|
|
157
|
+
const row = (source) => {
|
|
158
|
+
switch (source) {
|
|
159
|
+
case 'R':
|
|
160
|
+
return [1, 0, 0, 0, 0];
|
|
161
|
+
case 'G':
|
|
162
|
+
return [0, 1, 0, 0, 0];
|
|
163
|
+
case 'B':
|
|
164
|
+
return [0, 0, 1, 0, 0];
|
|
165
|
+
case 'A':
|
|
166
|
+
return [0, 0, 0, 1, 0];
|
|
167
|
+
case '0':
|
|
168
|
+
return [0, 0, 0, 0, 0];
|
|
169
|
+
case '1':
|
|
170
|
+
return [0, 0, 0, 0, 1];
|
|
171
|
+
}
|
|
172
|
+
};
|
|
173
|
+
return rows.flatMap((source) => row(source));
|
|
174
|
+
}
|
|
175
|
+
function parsePercentOrRatio(value) {
|
|
176
|
+
if (value === undefined)
|
|
177
|
+
return undefined;
|
|
178
|
+
const trimmed = value.trim();
|
|
179
|
+
const percent = trimmed.endsWith('%');
|
|
180
|
+
const num = Number(percent ? trimmed.slice(0, -1) : trimmed);
|
|
181
|
+
if (!Number.isFinite(num))
|
|
182
|
+
return undefined;
|
|
183
|
+
return percent || num > 1 ? num / 100 : num;
|
|
184
|
+
}
|
|
185
|
+
function parseHexColor(value) {
|
|
186
|
+
if (value === undefined)
|
|
187
|
+
return undefined;
|
|
188
|
+
const num = Number.parseInt(value.replace(/^#/, ''), 16);
|
|
189
|
+
return Number.isFinite(num) ? num : undefined;
|
|
190
|
+
}
|
|
82
191
|
/** Apply the renderer-neutral subset supported by the Pixi backend. */
|
|
83
192
|
/**
|
|
84
193
|
* @example
|
|
@@ -106,7 +215,7 @@ export function applyImageModifiers(sprite, parsed, scale = 1) {
|
|
|
106
215
|
if (imageModifier(parsed, 'GS')) {
|
|
107
216
|
const filter = new ColorMatrixFilter();
|
|
108
217
|
filter.greyscale(1, false);
|
|
109
|
-
sprite.filters = [filter];
|
|
218
|
+
sprite.filters = [...(sprite.filters ?? []), filter];
|
|
110
219
|
}
|
|
111
220
|
const shift = imageModifier(parsed, 'CS');
|
|
112
221
|
if (shift) {
|
|
@@ -117,6 +226,40 @@ export function applyImageModifiers(sprite, parsed, scale = 1) {
|
|
|
117
226
|
sprite.filters = [...(sprite.filters ?? []), filter];
|
|
118
227
|
}
|
|
119
228
|
}
|
|
229
|
+
const rScale = imageModifier(parsed, 'R');
|
|
230
|
+
const gScale = imageModifier(parsed, 'G');
|
|
231
|
+
const bScale = imageModifier(parsed, 'B');
|
|
232
|
+
if (rScale || gScale || bScale) {
|
|
233
|
+
const red = rScale ? Number(rScale.args[0]) : undefined;
|
|
234
|
+
const green = gScale ? Number(gScale.args[0]) : undefined;
|
|
235
|
+
const blue = bScale ? Number(bScale.args[0]) : undefined;
|
|
236
|
+
const filter = new ColorMatrixFilter();
|
|
237
|
+
filter.matrix = channelScaleMatrix({
|
|
238
|
+
red: Number.isFinite(red) ? red : undefined,
|
|
239
|
+
green: Number.isFinite(green) ? green : undefined,
|
|
240
|
+
blue: Number.isFinite(blue) ? blue : undefined,
|
|
241
|
+
});
|
|
242
|
+
sprite.filters = [...(sprite.filters ?? []), filter];
|
|
243
|
+
}
|
|
244
|
+
//~BLEND and ~ROTATE are NOT handled here: Wesnoth's ~BLEND is a per-pixel colour blend and
|
|
245
|
+
//its ~ROTATE rotates the source pixels and expands the surface, neither of which a sprite
|
|
246
|
+
//transform or a colour matrix can express exactly (a colour matrix's linear approximation of
|
|
247
|
+
//a blend is close but not the same operation; a sprite's own `rotation` turns the display
|
|
248
|
+
//object, not the art, which differs for terrain that must still tile after rotating). Both
|
|
249
|
+
//are in `applyTextureModifiers` instead, next to the other pixel-level modifiers.
|
|
250
|
+
const chan = imageModifier(parsed, 'CHAN');
|
|
251
|
+
if (chan && chan.args.length > 0) {
|
|
252
|
+
const sources = chan.args.map((arg) => arg.trim().toUpperCase());
|
|
253
|
+
const filter = new ColorMatrixFilter();
|
|
254
|
+
filter.matrix = channelSwapMatrix(sources);
|
|
255
|
+
sprite.filters = [...(sprite.filters ?? []), filter];
|
|
256
|
+
}
|
|
257
|
+
const opacity = imageModifier(parsed, 'O');
|
|
258
|
+
if (opacity) {
|
|
259
|
+
const ratio = parsePercentOrRatio(opacity.args[0]);
|
|
260
|
+
if (ratio !== undefined)
|
|
261
|
+
sprite.alpha *= Math.min(1, Math.max(0, ratio));
|
|
262
|
+
}
|
|
120
263
|
}
|
|
121
264
|
/** Make a cropped view without mutating the shared source texture. */
|
|
122
265
|
/**
|
|
@@ -142,4 +285,314 @@ export function croppedTexture(texture, parsed) {
|
|
|
142
285
|
? new Texture({ source: texture.source, frame: new Rectangle(x, y, width, height) })
|
|
143
286
|
: texture;
|
|
144
287
|
}
|
|
288
|
+
/** hex first (`#c0ffee`, `c0ffee`), a caller's `resolveColor` (named colours) otherwise */
|
|
289
|
+
function resolveColor(value, resolve) {
|
|
290
|
+
const trimmed = value.trim();
|
|
291
|
+
return parseHexColor(trimmed) ?? resolve?.(trimmed);
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* `~RC(src>dst,src>dst,...)`'s pairs, each side hex (`#c0ffee`, `c0ffee`) or, when `resolve` is
|
|
295
|
+
* given, a named colour (`~RC(magenta>red)`) it resolves. A pair whose either side is neither
|
|
296
|
+
* hex nor resolvable is dropped rather than aborting the whole list.
|
|
297
|
+
*
|
|
298
|
+
* @example
|
|
299
|
+
* ```ts
|
|
300
|
+
* import { parseColorPairs, parseImagePath, imageModifier } from '@datamoc/mw_games/two-d/render';
|
|
301
|
+
*
|
|
302
|
+
* const rc = imageModifier(parseImagePath('unit.png~RC(magenta>ff0000)'), 'RC')!;
|
|
303
|
+
* const mapping = parseColorPairs(rc.args, (name) => (name === 'magenta' ? 0xff00ff : undefined));
|
|
304
|
+
* console.log(mapping); // { from: [0xff00ff], to: [0xff0000] }
|
|
305
|
+
* ```
|
|
306
|
+
*/
|
|
307
|
+
export function parseColorPairs(args, resolve) {
|
|
308
|
+
const from = [];
|
|
309
|
+
const to = [];
|
|
310
|
+
for (const arg of args) {
|
|
311
|
+
const [source, target] = arg.split('>');
|
|
312
|
+
if (source === undefined || target === undefined)
|
|
313
|
+
continue;
|
|
314
|
+
const sourceColor = resolveColor(source, resolve);
|
|
315
|
+
const targetColor = resolveColor(target, resolve);
|
|
316
|
+
if (sourceColor !== undefined && targetColor !== undefined) {
|
|
317
|
+
from.push(sourceColor);
|
|
318
|
+
to.push(targetColor);
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
return { from, to };
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* `~PAL(a,b,c>x,y,z)`'s two comma-separated colour lists, one per side of a single `>`. The
|
|
325
|
+
* modifier's own args have already been comma-split by `parseImagePath` before this runs (the
|
|
326
|
+
* same naive split every modifier's argument list goes through), so `a,b,c>x,y,z` arrives as
|
|
327
|
+
* the four separate tokens `['a', 'b', 'c>x', 'y', 'z']` - rejoining them with `,` recovers the
|
|
328
|
+
* original text before this does its own split on `>` and then `,`, rather than assuming the
|
|
329
|
+
* list boundary landed on an argument boundary the way a naive `args[0]`/`args[1]` read would.
|
|
330
|
+
*
|
|
331
|
+
* @example
|
|
332
|
+
* ```ts
|
|
333
|
+
* import { parsePaletteLists, parseImagePath, imageModifier } from '@datamoc/mw_games/two-d/render';
|
|
334
|
+
*
|
|
335
|
+
* const pal = imageModifier(parseImagePath('unit.png~PAL(ff0000,00ff00>0000ff,ffff00)'), 'PAL')!;
|
|
336
|
+
* console.log(parsePaletteLists(pal.args)); // { from: [0xff0000, 0x00ff00], to: [0x0000ff, 0xffff00] }
|
|
337
|
+
* ```
|
|
338
|
+
*/
|
|
339
|
+
export function parsePaletteLists(args, resolve) {
|
|
340
|
+
const raw = args.join(',');
|
|
341
|
+
const separator = raw.indexOf('>');
|
|
342
|
+
if (separator < 0)
|
|
343
|
+
return { from: [], to: [] };
|
|
344
|
+
const parseList = (side) => side
|
|
345
|
+
.split(',')
|
|
346
|
+
.map((entry) => resolveColor(entry, resolve))
|
|
347
|
+
.filter((color) => color !== undefined);
|
|
348
|
+
return { from: parseList(raw.slice(0, separator)), to: parseList(raw.slice(separator + 1)) };
|
|
349
|
+
}
|
|
350
|
+
/**
|
|
351
|
+
* Applies the modifiers that need real pixel access or a sibling texture rather than a sprite
|
|
352
|
+
* property or a Pixi filter: `~RC` (exact palette swap, `src>dst` hex or named-colour pairs -
|
|
353
|
+
* see `resolveColor`/`parseColorPairs`), `~PAL` (the same swap from two comma-separated colour
|
|
354
|
+
* lists either side of one `>` - see `parsePaletteLists`), `~BLIT` (composite another image on
|
|
355
|
+
* top at an offset), `~MASK` (take alpha from another image at an offset, keeping this image's
|
|
356
|
+
* own colour), `~BLEND` (an exact per-pixel lerp towards a colour, via `blendPixels`) and
|
|
357
|
+
* `~ROTATE` (rotates the source pixels themselves and expands the surface, via `rotatePixels` -
|
|
358
|
+
* this is why `~ROTATE` lives here rather than as a sprite transform: it has to be right for
|
|
359
|
+
* terrain and anything else that must keep tiling after the rotation). `~BLIT`/`~MASK` need
|
|
360
|
+
* `probe.resolveTexture` to find the sibling image; without it they are skipped rather than
|
|
361
|
+
* treated as an error, since a caller that only wants `~RC`/`~PAL` has no sibling image to
|
|
362
|
+
* resolve. `resolveTexture` receives the argument exactly as written, nested modifiers included
|
|
363
|
+
* (`~BLIT(claws.png~FL(horiz),4,4)` calls it with `'claws.png~FL(horiz)'`, not `'claws.png'`) -
|
|
364
|
+
* parsing and applying those recursively is the caller's own job, this function composites
|
|
365
|
+
* whatever texture it is handed back.
|
|
366
|
+
*
|
|
367
|
+
* @example
|
|
368
|
+
* ```ts
|
|
369
|
+
* import { Texture } from 'pixi.js';
|
|
370
|
+
* import { applyTextureModifiers, parseImagePath } from '@datamoc/mw_games/two-d/render';
|
|
371
|
+
* const recolored = applyTextureModifiers(Texture.EMPTY, parseImagePath('unit.png~RC(ff00ff>ff0000)'));
|
|
372
|
+
* ```
|
|
373
|
+
*/
|
|
374
|
+
export function applyTextureModifiers(texture, parsed, probe = {}) {
|
|
375
|
+
let result = texture;
|
|
376
|
+
const rc = imageModifier(parsed, 'RC');
|
|
377
|
+
if (rc && rc.args.length > 0) {
|
|
378
|
+
const mapping = parseColorPairs(rc.args, probe.resolveColor);
|
|
379
|
+
//'exact' (recolorTexture's default): RC/PAL name a short, specific palette, not a
|
|
380
|
+
//covering of the whole image, so 'nearest' would repaint pixels that were never named
|
|
381
|
+
if (mapping.from.length > 0)
|
|
382
|
+
result = recolorTexture(result, mapping, probe, 'exact');
|
|
383
|
+
}
|
|
384
|
+
const pal = imageModifier(parsed, 'PAL');
|
|
385
|
+
if (pal) {
|
|
386
|
+
const mapping = parsePaletteLists(pal.args, probe.resolveColor);
|
|
387
|
+
if (mapping.from.length > 0 && mapping.from.length === mapping.to.length) {
|
|
388
|
+
result = recolorTexture(result, mapping, probe, 'exact');
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
const blit = imageModifier(parsed, 'BLIT');
|
|
392
|
+
if (blit && blit.args.length > 0 && probe.resolveTexture) {
|
|
393
|
+
const overlay = probe.resolveTexture(blit.args[0]);
|
|
394
|
+
if (overlay) {
|
|
395
|
+
const x = Number(blit.args[1] ?? 0) || 0;
|
|
396
|
+
const y = Number(blit.args[2] ?? 0) || 0;
|
|
397
|
+
result = withTextureCanvas(result, probe, (context) => {
|
|
398
|
+
context.drawImage(overlay.source.resource, x, y);
|
|
399
|
+
});
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
const mask = imageModifier(parsed, 'MASK');
|
|
403
|
+
if (mask && mask.args.length > 0 && probe.resolveTexture) {
|
|
404
|
+
const overlay = probe.resolveTexture(mask.args[0]);
|
|
405
|
+
if (overlay) {
|
|
406
|
+
const x = Number(mask.args[1] ?? 0) || 0;
|
|
407
|
+
const y = Number(mask.args[2] ?? 0) || 0;
|
|
408
|
+
result = withTextureCanvas(result, probe, (context, width, height) => {
|
|
409
|
+
const base = context.getImageData(0, 0, width, height);
|
|
410
|
+
const maskCanvas = createCanvas(overlay.width, overlay.height, probe);
|
|
411
|
+
if (!maskCanvas)
|
|
412
|
+
return;
|
|
413
|
+
const maskContext = maskCanvas.getContext('2d');
|
|
414
|
+
if (!maskContext)
|
|
415
|
+
return;
|
|
416
|
+
maskContext.drawImage(overlay.source.resource, 0, 0);
|
|
417
|
+
const maskData = maskContext.getImageData(0, 0, overlay.width, overlay.height);
|
|
418
|
+
const masked = maskPixels(base.data, width, height, maskData.data, overlay.width, overlay.height, x, y);
|
|
419
|
+
context.putImageData({ data: masked, width, height }, 0, 0);
|
|
420
|
+
});
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
const blend = imageModifier(parsed, 'BLEND');
|
|
424
|
+
if (blend) {
|
|
425
|
+
const color = resolveColor(blend.args[0] ?? '', probe.resolveColor);
|
|
426
|
+
const ratio = parsePercentOrRatio(blend.args[1]);
|
|
427
|
+
if (color !== undefined && ratio !== undefined) {
|
|
428
|
+
result = withTextureCanvas(result, probe, (context, width, height) => {
|
|
429
|
+
const imageData = context.getImageData(0, 0, width, height);
|
|
430
|
+
const blended = blendPixels(imageData.data, color, ratio);
|
|
431
|
+
context.putImageData({ data: blended, width, height }, 0, 0);
|
|
432
|
+
});
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
const rotate = imageModifier(parsed, 'ROTATE');
|
|
436
|
+
if (rotate) {
|
|
437
|
+
const degrees = Number(rotate.args[0]);
|
|
438
|
+
if (Number.isFinite(degrees) && degrees % 360 !== 0) {
|
|
439
|
+
const width = result.width;
|
|
440
|
+
const height = result.height;
|
|
441
|
+
if (width > 0 && height > 0 && result.source) {
|
|
442
|
+
const source = createCanvas(width, height, probe);
|
|
443
|
+
const sourceContext = source?.getContext('2d');
|
|
444
|
+
if (source && sourceContext) {
|
|
445
|
+
sourceContext.drawImage(result.source.resource, 0, 0);
|
|
446
|
+
const pixels = sourceContext.getImageData(0, 0, width, height);
|
|
447
|
+
const rotated = rotatePixels(pixels.data, width, height, degrees);
|
|
448
|
+
const destination = createCanvas(rotated.width, rotated.height, probe);
|
|
449
|
+
const destinationContext = destination?.getContext('2d');
|
|
450
|
+
if (destination && destinationContext) {
|
|
451
|
+
destinationContext.putImageData({ data: rotated.data, width: rotated.width, height: rotated.height }, 0, 0);
|
|
452
|
+
result = Texture.from(destination);
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
return result;
|
|
459
|
+
}
|
|
460
|
+
function createCanvas(width, height, probe) {
|
|
461
|
+
const canvas = probe.createCanvas?.(width, height) ??
|
|
462
|
+
(typeof document === 'undefined' ? null : document.createElement('canvas'));
|
|
463
|
+
if (!canvas)
|
|
464
|
+
return null;
|
|
465
|
+
canvas.width = width;
|
|
466
|
+
canvas.height = height;
|
|
467
|
+
return canvas;
|
|
468
|
+
}
|
|
469
|
+
/**
|
|
470
|
+
* The renderer-free core of `~MASK`: `base`'s alpha channel is multiplied by `mask`'s alpha at
|
|
471
|
+
* the given offset (a pixel the mask does not cover keeps zero alpha), `base`'s own colour
|
|
472
|
+
* left untouched. Exported so the masking logic is testable without a canvas.
|
|
473
|
+
*
|
|
474
|
+
* @example
|
|
475
|
+
* ```ts
|
|
476
|
+
* import { maskPixels } from '@datamoc/mw_games/two-d/render';
|
|
477
|
+
* const base = new Uint8ClampedArray([10, 20, 30, 255]); // one opaque pixel
|
|
478
|
+
* const mask = new Uint8ClampedArray([0, 0, 0, 128]); // half-alpha mask, same 1x1 size
|
|
479
|
+
* const out = maskPixels(base, 1, 1, mask, 1, 1, 0, 0);
|
|
480
|
+
* console.log([...out]); // [10, 20, 30, 128]
|
|
481
|
+
* ```
|
|
482
|
+
*/
|
|
483
|
+
export function maskPixels(base, baseWidth, baseHeight, mask, maskWidth, maskHeight, offsetX, offsetY) {
|
|
484
|
+
const out = new Uint8ClampedArray(base.length);
|
|
485
|
+
for (let y = 0; y < baseHeight; y += 1) {
|
|
486
|
+
for (let x = 0; x < baseWidth; x += 1) {
|
|
487
|
+
const baseIndex = (y * baseWidth + x) * 4;
|
|
488
|
+
const maskX = x - offsetX;
|
|
489
|
+
const maskY = y - offsetY;
|
|
490
|
+
const inMask = maskX >= 0 && maskX < maskWidth && maskY >= 0 && maskY < maskHeight;
|
|
491
|
+
const maskAlpha = inMask ? mask[(maskY * maskWidth + maskX) * 4 + 3] : 0;
|
|
492
|
+
out[baseIndex] = base[baseIndex];
|
|
493
|
+
out[baseIndex + 1] = base[baseIndex + 1];
|
|
494
|
+
out[baseIndex + 2] = base[baseIndex + 2];
|
|
495
|
+
out[baseIndex + 3] = Math.round((base[baseIndex + 3] * maskAlpha) / 255);
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
return out;
|
|
499
|
+
}
|
|
500
|
+
/**
|
|
501
|
+
* The renderer-free core of `~BLEND`: every pixel's RGB is lerped `ratio` of the way towards
|
|
502
|
+
* `color` (0xRRGGBB), an exact per-pixel blend rather than `blendMatrix`'s runtime
|
|
503
|
+
* approximation - this is what `applyTextureModifiers` bakes into the texture once. Alpha is
|
|
504
|
+
* untouched; a fully transparent pixel is skipped entirely, matching `remapPixels`.
|
|
505
|
+
*
|
|
506
|
+
* @example
|
|
507
|
+
* ```ts
|
|
508
|
+
* import { blendPixels } from '@datamoc/mw_games/two-d/render';
|
|
509
|
+
*
|
|
510
|
+
* const pixels = new Uint8ClampedArray([0, 0, 0, 255]); // one opaque black pixel
|
|
511
|
+
* const out = blendPixels(pixels, 0xff0000, 0.5);
|
|
512
|
+
* console.log([...out]); // [128, 0, 0, 255] - half-way to red
|
|
513
|
+
* ```
|
|
514
|
+
*/
|
|
515
|
+
export function blendPixels(pixels, color, ratio) {
|
|
516
|
+
const clamped = Math.min(1, Math.max(0, ratio));
|
|
517
|
+
const r = (color >> 16) & 0xff;
|
|
518
|
+
const g = (color >> 8) & 0xff;
|
|
519
|
+
const b = color & 0xff;
|
|
520
|
+
const out = new Uint8ClampedArray(pixels.length);
|
|
521
|
+
for (let index = 0; index < pixels.length; index += 4) {
|
|
522
|
+
const alpha = pixels[index + 3];
|
|
523
|
+
out[index + 3] = alpha;
|
|
524
|
+
if (alpha === 0) {
|
|
525
|
+
out[index] = pixels[index];
|
|
526
|
+
out[index + 1] = pixels[index + 1];
|
|
527
|
+
out[index + 2] = pixels[index + 2];
|
|
528
|
+
continue;
|
|
529
|
+
}
|
|
530
|
+
out[index] = pixels[index] * (1 - clamped) + r * clamped;
|
|
531
|
+
out[index + 1] = pixels[index + 1] * (1 - clamped) + g * clamped;
|
|
532
|
+
out[index + 2] = pixels[index + 2] * (1 - clamped) + b * clamped;
|
|
533
|
+
}
|
|
534
|
+
return out;
|
|
535
|
+
}
|
|
536
|
+
/**
|
|
537
|
+
* The renderer-free core of `~ROTATE`: rotates the source pixels themselves by `degrees`
|
|
538
|
+
* (clockwise) around their centre and expands the surface to fit the rotated bounds, rather
|
|
539
|
+
* than turning a sprite's own transform - `applyImageModifiers`'s `sprite.rotation` leaves the
|
|
540
|
+
* art unrotated and does not grow the surface, which is wrong for terrain and anything else
|
|
541
|
+
* that has to keep tiling after the rotation. A destination pixel outside the source once
|
|
542
|
+
* rotated back is fully transparent. Sampling is nearest-neighbour, so an exact multiple of 90
|
|
543
|
+
* degrees round-trips pixel-for-pixel; other angles show the aliasing any nearest-neighbour
|
|
544
|
+
* rotation does.
|
|
545
|
+
*
|
|
546
|
+
* @example
|
|
547
|
+
* ```ts
|
|
548
|
+
* import { rotatePixels } from '@datamoc/mw_games/two-d/render';
|
|
549
|
+
*
|
|
550
|
+
* const pixels = new Uint8ClampedArray([255, 0, 0, 255, 0, 255, 0, 255]); // 2x1: red, green
|
|
551
|
+
* const rotated = rotatePixels(pixels, 2, 1, 90);
|
|
552
|
+
* console.log(rotated.width, rotated.height); // 1, 2 - the surface expanded to fit
|
|
553
|
+
* ```
|
|
554
|
+
*/
|
|
555
|
+
export function rotatePixels(pixels, width, height, degrees) {
|
|
556
|
+
const radians = (degrees * Math.PI) / 180;
|
|
557
|
+
const cos = Math.cos(radians);
|
|
558
|
+
const sin = Math.sin(radians);
|
|
559
|
+
const halfW = width / 2;
|
|
560
|
+
const halfH = height / 2;
|
|
561
|
+
let maxX = 0;
|
|
562
|
+
let maxY = 0;
|
|
563
|
+
for (const [x, y] of [
|
|
564
|
+
[-halfW, -halfH],
|
|
565
|
+
[halfW, -halfH],
|
|
566
|
+
[halfW, halfH],
|
|
567
|
+
[-halfW, halfH],
|
|
568
|
+
]) {
|
|
569
|
+
maxX = Math.max(maxX, Math.abs(x * cos - y * sin));
|
|
570
|
+
maxY = Math.max(maxY, Math.abs(x * sin + y * cos));
|
|
571
|
+
}
|
|
572
|
+
const outWidth = Math.max(1, Math.round(maxX * 2));
|
|
573
|
+
const outHeight = Math.max(1, Math.round(maxY * 2));
|
|
574
|
+
const out = new Uint8ClampedArray(outWidth * outHeight * 4);
|
|
575
|
+
const cx = width / 2 - 0.5;
|
|
576
|
+
const cy = height / 2 - 0.5;
|
|
577
|
+
const ocx = outWidth / 2 - 0.5;
|
|
578
|
+
const ocy = outHeight / 2 - 0.5;
|
|
579
|
+
for (let oy = 0; oy < outHeight; oy += 1) {
|
|
580
|
+
for (let ox = 0; ox < outWidth; ox += 1) {
|
|
581
|
+
const dx = ox - ocx;
|
|
582
|
+
const dy = oy - ocy;
|
|
583
|
+
//inverse rotation: where in the source does this destination pixel come from
|
|
584
|
+
const sx = Math.round(dx * cos + dy * sin + cx);
|
|
585
|
+
const sy = Math.round(-dx * sin + dy * cos + cy);
|
|
586
|
+
if (sx < 0 || sx >= width || sy < 0 || sy >= height)
|
|
587
|
+
continue;
|
|
588
|
+
const outIndex = (oy * outWidth + ox) * 4;
|
|
589
|
+
const inIndex = (sy * width + sx) * 4;
|
|
590
|
+
out[outIndex] = pixels[inIndex];
|
|
591
|
+
out[outIndex + 1] = pixels[inIndex + 1];
|
|
592
|
+
out[outIndex + 2] = pixels[inIndex + 2];
|
|
593
|
+
out[outIndex + 3] = pixels[inIndex + 3];
|
|
594
|
+
}
|
|
595
|
+
}
|
|
596
|
+
return { data: out, width: outWidth, height: outHeight };
|
|
597
|
+
}
|
|
145
598
|
//# sourceMappingURL=ImageModifiers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ImageModifiers.js","sourceRoot":"","sources":["../../../src/two-d/render/ImageModifiers.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ImageModifiers.js","sourceRoot":"","sources":["../../../src/two-d/render/ImageModifiers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
export interface LightningArcPoint {
|
|
2
|
+
x: number;
|
|
3
|
+
y: number;
|
|
4
|
+
}
|
|
5
|
+
export interface LightningArcOptions {
|
|
6
|
+
/** seconds this arc lives before `done` becomes true; omit for a bolt with no lifetime of its own */
|
|
7
|
+
duration?: number;
|
|
8
|
+
/** how many jittered points along the line, between the two fixed endpoints; default 6 */
|
|
9
|
+
segments?: number;
|
|
10
|
+
/** perpendicular jitter amplitude in world units, tapering to 0 at both endpoints; default 12 */
|
|
11
|
+
jitter?: number;
|
|
12
|
+
/** seconds between re-rolling the jitter, so a held tether flickers; omit to jitter once and hold */
|
|
13
|
+
flickerInterval?: number;
|
|
14
|
+
/** injectable RNG (0 to 1) for a reproducible bolt shape; defaults to `Math.random` */
|
|
15
|
+
random?: () => number;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* The position data for a jagged line between two points - a lightning bolt, a tether, a chain
|
|
19
|
+
* lightning link - the temporised two-point visual `two-d/render` had no helper for. Owns
|
|
20
|
+
* geometry only, the same division `Projectile` draws for a single moving point: this decides
|
|
21
|
+
* where the line's points are, a caller draws them (through `Shape2D`'s `Graphics`, typically,
|
|
22
|
+
* one `lineTo` per point) and decides colour, width and blend mode.
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```ts
|
|
26
|
+
* import { LightningArc } from '@datamoc/mw_games/two-d/render';
|
|
27
|
+
*
|
|
28
|
+
* const bolt = new LightningArc({ x: 0, y: 0 }, { x: 100, y: 0 }, { duration: 0.2, segments: 4 });
|
|
29
|
+
* console.log(bolt.points.length); // 6 - both endpoints plus 4 interior points
|
|
30
|
+
*
|
|
31
|
+
* const expired = bolt.update(0.25);
|
|
32
|
+
* console.log(expired); // true - the instant it outlives its duration
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export declare class LightningArc {
|
|
36
|
+
private from;
|
|
37
|
+
private to;
|
|
38
|
+
private readonly segments;
|
|
39
|
+
private readonly jitter;
|
|
40
|
+
private readonly flickerInterval?;
|
|
41
|
+
private readonly random;
|
|
42
|
+
private readonly duration?;
|
|
43
|
+
private elapsed;
|
|
44
|
+
private sinceFlicker;
|
|
45
|
+
private expired;
|
|
46
|
+
private current;
|
|
47
|
+
constructor(from: LightningArcPoint, to: LightningArcPoint, options?: LightningArcOptions);
|
|
48
|
+
/** the endpoints plus every jittered interior point, in order from `from` to `to` */
|
|
49
|
+
get points(): readonly LightningArcPoint[];
|
|
50
|
+
get done(): boolean;
|
|
51
|
+
/** moves either endpoint, for a tether following two units that are themselves moving */
|
|
52
|
+
retarget(from?: LightningArcPoint, to?: LightningArcPoint): void;
|
|
53
|
+
/** @returns true the instant `duration` elapses, so a caller can remove the arc exactly once */
|
|
54
|
+
update(dt: number): boolean;
|
|
55
|
+
private reroll;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=LightningArc.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LightningArc.d.ts","sourceRoot":"","sources":["../../../src/two-d/render/LightningArc.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IACjC,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACV;AAED,MAAM,WAAW,mBAAmB;IACnC,qGAAqG;IACrG,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,0FAA0F;IAC1F,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,iGAAiG;IACjG,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,qGAAqG;IACrG,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB,uFAAuF;IACvF,MAAM,CAAC,EAAE,MAAM,MAAM,CAAC;CACtB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,YAAY;IACxB,OAAO,CAAC,IAAI,CAAoB;IAChC,OAAO,CAAC,EAAE,CAAoB;IAC9B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;IACtC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAS;IAEnC,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,OAAO,CAA2B;IAE1C,YAAY,IAAI,EAAE,iBAAiB,EAAE,EAAE,EAAE,iBAAiB,EAAE,OAAO,GAAE,mBAAwB,EAS5F;IAED,qFAAqF;IACrF,IAAI,MAAM,IAAI,SAAS,iBAAiB,EAAE,CAEzC;IAED,IAAI,IAAI,IAAI,OAAO,CAElB;IAED,yFAAyF;IACzF,QAAQ,CAAC,IAAI,CAAC,EAAE,iBAAiB,EAAE,EAAE,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAI/D;IAED,gGAAgG;IAChG,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAiB1B;IAED,OAAO,CAAC,MAAM;CAuBd"}
|