v0.8.0
2026-03-02
- [x] Upon accepting an invite, it says "Redirecting you to the campaign..." but it doesn't actually redirect you.
- [x] In System 8 attacks, remove "proficient" toggle. The proficiency bonus no longer exists in System 8. Ensure that the resultant math always uses the full ability score modifier, without any proficiency bonus added in.
- [x] In the Edit Actions modal, show a tab in the code editor area to browse previous versions of the code, with the option to roll back to a previous version. This implies data model changes to store previous versions of the code.
- [x] When importing a character in system 8, instead of assigning an action to each power, look for the power's actions (in powers.json, actions have been added to the power's metadata. They are relative URLs to action documents on the same wiki). Fetch the actions and create an Action for each of those.
- Actions have metadata which specifies their targeting, area effect (if any), duration, action required, energy cost, etc. For targeting/area, use this information to configure the targeting of the action. For the rest, just make a note of the metadata in the chat return for that action.
- If a power has no actions at all, create an action for it similar to the way actions were made before this change.
- [x] When importing a character, the actions generated for Attacks should have targeting. Unarmed, natural weapons, and melee attacks should be single target, range 0, and ranged attacks should default to range unlimited if not otherwise specified. For implements, treat as ranged attacks by default; individual powers should have their own targeting already implemented elsewhere.
- [x] In targeting mode, increase the stroke width of the line connecting the origin and target tokens to 10 px. This also goes for the outline of origin and target tokens in this mode.
- [x] Actions from Character Import are already distinct from custom actions, so that the import process doesn't delete custom actions when re-importing. However, if the user edits an imported action, it will still be overwritten by the next re-import. If the user edits an imported action, it should be treated as a custom action from then on, and not be overwritten by future imports. However, the Edit Action modal should note that this action was originally imported from the character's associated system, and show a button to "Reset to Imported Version", which reverts the action back to the latest imported version (which could be different from the original imported version, if the character has been re-imported since the last edit).
- [x] Bug: if I select a token, press an arrow key to move it one square, then activate a targeted action, the origin square for the action is the previous square. This does not occur if I click-drag to move the token, or if I move it, click off, then click again to reselect. The likely cause is the logic that moves the token with the keyboard is not properly updating the selected token's position in the state before the action checks for the origin token's position. This should be fixed so that keyboard movement works as expected with targeting.
- [x] Bug: single-target actions are not outputting targeting information. All targeted actions should output whatever the action outputs, plus targeting information (in this case, the token name and image of the selected target, the distance to the target, and whether the target was valid or not). This is happening for all area effects, just not single-target actions.
- [x] The tracking of custom vs non-custom actions is broken. Re-imported characters are getting a fresh set of duplicate actions on top of the previous set. The correct logic is:
- Any action created through Character Import is marked as a generated action.
- Generated actions show a label indicating such. (working)
- Generated actions will be replaced when the character is updated, rather than duplicated. (this is broken as described, although not consistently for all tokens)
- If changed by the user, generated actions will no longer be replaced (or duplicated) by re-import. Also, the UI will note that this was once a generated action but now is treated as custom, with an option to revert. (this is working, but the re-import adds a duplicate of the action without the custom changes, so both the custom and generated action exist simultaneously)
- Any non-generated actions are ignored by the import process and should never be changed or duplicated by it. (working)
- [x] Actions should be able to be grouped by category in the Token Context. A switcher should allow grouping vs ungrouped (same UI treatment as the standard list component for characters, maps, etc). By default, they are grouped. Groups are sorted alphabetically, and actions within groups are sorted alphabetically.
Map
- [x] To change facing, the user can select a token, then, while holding shift, press one or two arrow keys to set the facing (e.g. up arrow sets north, up+right sets northeast).
- [x] Make sure the map context menu doesn't overflow the viewport. Right now, some use cases such as "set position" can generate a very tall menu/submenu which overflows.
- [x] When the user selects "none" for their token's facing, hide the facing arrow until they select a facing again. Currently, the arrow doesn't change.
- [x] When a token with tokenized art has a transparent background color set, the transparent parts of the token art show up as the border color instead. The border should only be a ring, not a complete circle. If this isn't possible, then the option to set a transparent background color should be removed.
- [x] Add an option in the tokened art config to detect the prevailing background color or texture of the token art and fill in the background where the original art is "uncropped"--that is, where a positive x/y offset causes areas of the token circle with no original pixels to display. The existing in-browser model should be able to generate image data to fill the uncropped portion if necessary, although if the background is simple enough, a solid color fill option might be sufficient.
- [x] When creating a new token (or importing a character), if there is token art, default to "tokenized". Currently, the default for imported characters who already had art is non-tokenized.
- [x] When spawning a submenu from the map context menu, instead of positioning it at top 0% relative to the parent menu item, position it at top 0% relative to the parent menu itself. This will help prevent overflow.
Targeting (major feature)
See docs/todo/features/TODO targeting.md for full specification.
Phase 1: Single-Target Targeting
- Actions can now declare a target requirement (creature, point, or self) with optional range and line-of-sight constraints
- Entering targeting mode highlights the origin token, draws a targeting line to the cursor, and shows distance
- Valid/invalid targeting states visualized with green/red indicators; line-of-sight occlusion via VBL shapes
- Target token is injected into the action sandbox as the
targetvariable with full property access - Action Editor updated with targeting configuration: target type, range, and line-of-sight toggle
- Escape key cancels targeting mode
Phase 2: Area Targeting
- Area-of-effect targeting with cone, cube, cylinder, line, and sphere shape support
- Origin modes: self-centered or ranged placement with configurable area dimensions
- Real-time area preview overlay rendered in the WebGL canvas during placement
- Grid-based token containment detection (center-point and quadrant-overlap strategies)
- Affected tokens highlighted;
targetvariable set to first affected token in sandbox - Action Editor extended with area type, dimensions, and origin mode fields
Phase 3: applyDamage and Damage Resolution
target.applyDamage(amount, type?)API available in action scripts- Full damage calculation pipeline: base damage → resistances, vulnerabilities, immunities → modifiers (half, double, flat, min, max, override, absorb)
- Damage pending chat tokens with approve/deny UI for GMs
- Approved damage automatically deducts from token HP with overkill tracking
- Campaign-level damage type configuration (default D&D 5e types)
- 43 unit tests for damage calculator, 6 additional executor tests
Phase 4: Multi-Target Targeting
- Actions can specify
minTargets/maxTargetsfor multi-target selection - Multi-target mode: click tokens to add/remove from selection, with blue ring indicators
- Undo/redo support for target selection stack
- Contextual UI panel showing selected targets, count validity, confirm/cancel buttons
targetsarray variable injected into action sandbox (array of proxied tokens)targetremains the first selected token for backward compatibility- Action Editor updated with min/max target count fields
Phase 5: Polish and Integration
- Keyboard shortcuts: Enter (confirm multi-target), Tab/Shift+Tab (cycle valid targets), Escape (cancel)
- Targeting history: localStorage-based per-campaign record of recently targeted tokens
- 207 total targeting-related unit tests across 6 test files
Map
- [x] To change facing, the user can select a token, then, while holding shift, press one or two arrow keys to set the facing (e.g. up arrow sets north, up+right sets northeast).
- [x] Make sure the map context menu doesn't overflow the viewport. Right now, some use cases such as "set position" can generate a very tall menu/submenu which overflows.
- [x] When the user selects "none" for their token's facing, hide the facing arrow until they select a facing again. Currently, the arrow doesn't change.
- [x] When a token with tokenized art has a transparent background color set, the transparent parts of the token art show up as the border color instead. The border should only be a ring, not a complete circle. If this isn't possible, then the option to set a transparent background color should be removed.
- [x] Add an option in the tokened art config to detect the prevailing background color or texture of the token art and fill in the background where the original art is "uncropped"--that is, where a positive x/y offset causes areas of the token circle with no original pixels to display. The existing in-browser model should be able to generate image data to fill the uncropped portion if necessary, although if the background is simple enough, a solid color fill option might be sufficient.
- [x] When creating a new token (or importing a character), if there is token art, default to "tokenized". Currently, the default for imported characters who already had art is non-tokenized.
- [x] When spawning a submenu from the map context menu, instead of positioning it at top 0% relative to the parent menu item, position it at top 0% relative to the parent menu itself. This will help prevent overflow.
Targeting (major feature)
Fixes Needed
- [x] Add facing indicators to tokens, and the ability to set facing.
- [x] The arrow is 90 degrees off. For instance, if I set north, it faces east. Also, when the arrow is pointing south (set to east), it is invisible. (Fixed: rotation now defaults to null; arrows only show when facing is explicitly set)
- [x] It should be possible to select a token, hold shift, and use the mouse wheel to change facing, with the indicator updating in real time as you do so.
- [x] Background tokens should not have facing indicators. (Now restricted to tokens layer only)