Skip to content

v0.12.0

2026-03-29

Playtesting

  • [x] PCs aren't noticing they're in targeting mode, make it more obvious. Show a "targeting mode" banner, and prompt the user to select a target. Offer a 'cancel' button in the banner to exit targeting mode without selecting a target. This won't cancel the action that spawned targeting mode, it will just resolve it with no target.
  • [x] Generate Monster -> google image -> artwork has no type and doesn't show on map. The dropdown to choose portrait/token/other is not present. That dropdown shouldn't be conditional.
  • [x] When I Import a Character who has artwork, the correct flow is that it uses that artwork for both token and portrait art. The current behavior is correct for token art, but the portrait art is designated "other" instead of "portrait" so it doesn't work for portrait purposes. Ensure the portrait is designated as portrait art, and automatically runs in-browser background removal on it.
  • [x] Mousing over a token spawns a tooltip with artwork. Increase the height of the bounding box for that artwork by 100%.
  • [x] Remove auto-approve damage from applyDamage(). It's too easy to accidentally trigger it and do damage you didn't intend to do.
  • [x] In any part of the UI where a token's properties are rendered along with + and - buttons, change the behavior of these buttons from the current behavior to:
    • Clicking + or - adds or subtracts 1 from the property value instantly.
    • Clicking + or - while holding shift adds or subtracts 10 from the property value instantly.
    • Clicking + or - while holding control (or command on Mac) opens a prompt where the user can input any number to add or subtract from the property value.
  • [x] CurrentTokenBar
    • When showing token art, the image area should be square, as wide as the bar is tall, instead of the larger portrait size used for portrait art. The token art should fit cleanly inside the space.
    • When showing token art, there is a black "halo" embedded inside the token art, but smaller than the main token image. It may be an artifact of an earlier rendering of bars, but bars are already covered and this black ring should be removed.
    • The bar at the bottom seems to have an incorrect value. Example: 31/60 hp, showing all black as if 0 hp. (Note: bar value issue may be related to metadata key naming vs bar expression; needs investigation if still occurring)
  • [x] Bug: sometimes when impersonating a token, I randomly start impersonating a different one. Trying to figure out the antecedents. (Fixed: impersonation restoration effect now only runs once per map change, preventing re-impersonation when tokens are updated)
  • [x] Mini-Initiative
    • New UI element, bottom center, above the CurrentTokenBar (if shown), only visible during combat when initiative is active
    • Shows the initiative order, with current turn in the center in a frame or outline indicating such, past turns to the left, and future turns to the right
    • Each turn is a token art image and a name, similar to what is shown in the current initiative tracker, but vertically stacked
    • Constrained by space. If there's enough room to show the next 3 turns to the right, show only 3. If there's enough room for 10, show 10.
    • Remove the dark grey container background for this tracker, and remove the rounded rectangular border around the token images.

Keyboard Shortcuts

  • [x] ?: Debug Mode. A tooltip near the cursor shows world coordinates, grid coordinates, and zoom level. This doesn't need a banner since it doesn't change click behavior. The tooltip should say 'press Esc to exit debug mode'. Also triggers on /. When this is implement, hide the existing always-on debug window that shows the same information.

  • [x] T: Ensure chat log is visible, scroll down to latest message, and focus the text input to start typing a message.

  • [x] R: Roll Dice. Pops up a palette of common dice rolls (d20, d12, d10, d8, d6, d4). If Impersonating, has the same effect as using the dice roll buttons in the CurrentTokenBar. If not Impersonating, has the same effect as using the dice roll buttons in the ChatLog.

  • [x] I: Impersonate Mode. Click to impersonate a token. Uses the same banner and cursor as Heal/Harm mode (see below), but the banner says "Impersonate mode: Click a token to impersonate it. Press Esc to exit." When the user clicks a token, they start impersonating that token. If they click outside of any token, it exits Impersonate mode.

  • [x] -: Zoom out. Triggers a camera movement that zooms the camera out by 1 increment (as indicated in the debug tooltip which says: Zoom: (number)). Accelerate in and out of the movement, completing the movement in 0.5 seconds.

  • [x] +: Zoom in. Same behavior as zoom out, but in the opposite direction.

  • [x] 0: Zoom default. Moves camera to 0,0 and sets zoom to the default level of 1.

  • [x] C: Character Sheet. If impersonating, has the same effect as clicking View Character Sheet (which opens the character sheet in the left sidebar). If said sidebar is open, it closes instead. If not impersonating, no effect. Ensure this doesn't trigger when the user presses ctrl-C or cmd-C to copy.

  • [x] Home: Impersonate your token. "Your" token is a token on the map, if present, that is linked to a character you own. If several exist, this cycles between them. If none exist, no effect.

  • [x] 1-9: Quick Actions. By default, these are assigned in order actions were added, the first being 1, etc. The Import Character flow should assign the six ability score buttons to 1-6. The Generate Monster flow should do the same. Pressing an assigned digit executes the action, same as clicking the button. Pressing an unassigned button does nothing. Pressing Shift and a digit, while hovering over an action button in CurrentTokenBar, assigns that digit as the quick action for that button. This assignment should be visible in the UI, as a badge on the button. This functionality only works when impersonating a token.

  • [x] Ctrl-Z or Cmd-Z: same as clicking the Undo button in the top menu bar. (This may already be implemented)

  • [x] Ctrl-Shift-Z or Cmd-Shift-Z: same as clicking the Redo button in the top menu bar. (This may already be implemented)

  • [x] Ctrl-Y or Cmd-Y: same as clicking the Redo button in the top menu bar. (This may already be implemented)

  • [x] Add a Help menu item to the Top Menu Bar, rightmost in the main menu. Submenu items:

    • Keyboard Shortcuts: shows a list of all keyboard shortcuts and their descriptions, ideally with an accompanying diagram showing the keys on a keyboard.

Bugs

  • [x] In Edit Token modal, in the Artwork editor drawer, the Background Color and Border Color inputs do not spawn a color picker when clicked. (Or, it's spawning, but invisible due to z-index).
  • [x] If a character has one piece of artwork, and they are imported as a token, the artwork should be duplicated: one tokenized to use as the token art, and one with background removal for portrait. This works for Import Character, but not Import Party. The latter is only setting the token art, and not creating a portrait art.
  • [x] When a token has one piece of art (set to token art, with tokenization), and the user presses 'copy to portrait', it should create a new artwork, using the same base art, but set to portrait with background removal. Currently it creates the new artwork, but sets the base art to the tokenized image. (This may be specific to the broken Import Party flow; recheck this when that is fixed).

Map

  • [x] When multiple tokens are selected, and one is click-dragged to move it, it should move to the new location (currently working), and all the other selected tokens should move with it, maintaining their relative positions.
  • [x] When click-dragging a token to move them, show the number of squares in the path. For instance, in the first square moved, show 1, then 2, etc. For diagonal movement, show the appropriate number based on the diagonal measurement method being used (e.g. 1.41 for the first diagonal square if using Pythagorean measurement).
  • [ ] TODO: review diagonal movement pathing to see if it's working right (human needed)
  • [x] When right-clicking a single token, show an option to "Copy to Map", which duplicates the token and all its properties, including artwork, and places the duplicate on the chosen map.
  • [x] When multiple tokens are selected, in the panel of the left sidebar that shows multi-token options, show a "Copy to Map" button that duplicates all the selected tokens and their properties, including artwork, and places the duplicates on the chosen map.
  • [x] In "copy to map" and "switch map" menu items, the map list is not sorted. Sort it alphabetically by map name.
  • [x] In the token context menu, collapse "send to front", "bring forward", "send to back", and "send backward" into a single "Arrange" submenu.
  • [x] In the token context menu, add an "Actions" submenu that shows the token's actions. The first ones should be universal/campaign actions like Heal and Inflict Damage. If the actions have categories, use those as sub-submenus. Sort alphabetically.
  • [x] When the user presses H, enter Heal/Harm mode. Start with Harm. The cursor changes to a sword (or similar), and a banner (same location as the "It's your turn" and "Targeting mode" banners) appears, saying "Heal/Harm mode: Click a token to heal or harm it. Press H to toggle between heal and harm. Press Esc to exit." Pressing H again toggles to Heal, pressing again goes back to Harm, etc. When the user clicks a token, it applies the Heal or Inflict Damage action to that token, depending on the current mode. If the user clicks outside of any token, it exits Heal/Harm mode. If they press Esc, it also exits Heal/Harm mode.
  • [x] In Import Character modal, add a search input to quickly filter the character list. Also, by default, show characters assigned to the current campaign only.

Palette

  • [x] Create a tool palette in the main map view
    • Position: top center of the map pane, flush with the bottom of the top menu bar, horizontally centered between any active sidebars.
      • This overlaps the world/grid coordinates UI. This can be relocated to the bottom of the palette, collapsed and hidden by default, but expandable.
      • Note: architect this component in a manner that will allow for future user customizability (e.g. moving the tool palette to the side and making it vertical).
    • The palette is a horizontal strip of square icon buttons, each representing a tool or category of tools with the theme "modify the map". The tools, from left to right:
      • Plus icon: this adds something to the map. Submenu items: Create Token, Generate Monster, Insert Monster, Import Character, Import Party, Add Background (GM)
        • All of these work as they currently do. For new actions:
          • Add Background: shortcut to Create Token, pre-set to Background layer. Special UI: when added, temporarily switch to the background layer, and add a notification to the top center of the map pane (just below the palette) with a "return to token layer" button.
        • Notable exception: Add Drawing has its own top-level tool.
      • Minus icon: changes cursor to a deletion cursor (cursor icon tbd: scissors? torch? trash?). If the user clicks a token, that's the same as selecting 'delete token'. If they click a drawing, it's the same as clicking X to delete the drawing. In this mode, no confirmation dialogs are used. The user can click-drag, and every intersected object that is deletable is deleted. Example objects: tokens, drawings, VBL shapes.
      • Paintbrush icon: enters Drawing mode. Same as the existing Add Drawing Here action in the context menu.
        • Note: Drawing mode currently spawns a tool palette in the same space as this new one. Modify this palette to be a sub-palette of the main one, docked to its underside.
      • Fog of War icon (GM only): not sure which tabler icon to use. Enters Fog-of-War mode. Add sub-palette:
        • Fog-of-war toggle
        • Fog-of-war reveal tools: there is an existing UI for this, very similar to the Add Drawing palette. These tools should be integrated into the new sub-palette.
        • Show as Player toggle
      • VBL icon (GM only): not sure which tabler icon to use. Enters VBL mode. Sub-palette:
        • Lighting mode (disabled, indoor, outdoor)
        • Add light source tool: same as existing feature
        • VBL shape tools: similar to the fog-of-war reveal tools, there is an existing UI for this that should be integrated into the new sub-palette.
    • Note: "GM" is the campaign owner

Character Sheet

  • [x] In the extended options menu (share character, export to YAML, etc), add Transfer Ownership, which allows the user to select another user with whom the character is already shared. If they click 'transfer ownership' and confirm, the character enters a state where it is transferring. The new owner gets a notification badge on the Characters menu item, and on the /characters route, a full notification appears at the top showing the transfer request. They can confirm, which permanently assigns them as the owner, removing the original user, or reject.
  • [x] Add a dropdown to assign a character to a campaign and another to a party on the Build mode tab in the character sheet.
  • [ ] When viewing the detail for a power in System 8, there are links to the power's actions in the form /actions/powers/rogue/steal-spell.md. These links currently do not work as the hostname is this app, not the system 8 wiki. When rendering these links, add the wikiroot for the system 8 wiki (specified in env config) to the front of the URL so that they point to the correct location. This applies to all relative links to system 8 wiki content, such as classes, powers, feats, etc. Links with the right hostname are fine as is.
  • [ ] In the character list page, the ... menu should include Add to Map

Attributes Extended

  • [x] Implement Hit Points in the character sheet, below the ability scores in the Attributes section.
    • For 5e, use the standard HP calculation based on class and level, plus Constitution modifier. In Play or Build mode, current HP can be changed (Max HP stays the same), and temporary HP can be added. Use the same + and - buttons as token properties (click to add/subtract 1, shift-click to add/subtract 10, ctrl-click to input a custom number). The numeric input can be modified directly as well.
    • For System 8, the classes.json (wikiroot/character/classes.json) contains all class metadata, including "hp_per_level". Each level of this class grants that many HP, plus the Constitution modifier. The character sheet should calculate max HP based on this formula, and allow the user to modify current HP and add temporary HP in the same way as described for 5e.
  • [ ] Implement AC in the character sheet, below the ability scores in the Attributes section.
    • In build mode, this can be edited directly. The user can choose between a simple numeric input, or a calculated AC based on user-inputted armor and dexterity. If they choose the calculated AC, show dropdowns to select armor type and whether to include dexterity, and calculate the AC based on standard 5e rules. System 8 uses the same AC rules.
    • In play mode, AC is displayed as a read-only field calculated based on the user's choices in build mode, but there is a "modifier" input that can temporarily change AC.
  • [x] Implement walking speed in the character sheet, below the ability scores in the Attributes section.
    • In build mode, this can be edited directly. It is a simple numeric input, defaulting to 6.
    • In play mode, speed is displayed as a read-only field calculated based on the user's choices in build mode, but there is a "modifier" input that can temporarily change speed.
  • [x] For 5e only, implement Saving Throws. This takes the form of a checkbox to enable proficiency for each ability score (pre-populated based on class, but editable), and in Play mode, the saving throw value is shown alongside the raw ability score modifier. When Importing a Character, ensure that saving throw actions are generated alongside the regular ability score actions (this may already be implemented).
  • [x] For 5e only, implement Passive Perception. This is calculated as 10 + the character's Perception skill modifier (which is either the Wisdom modifier or the Wisdom modifier plus proficiency, depending on whether the character is proficient in Perception). The character sheet should show this value in Play mode.
  • [x] For 5e only, implement Spellcasting DC. This is calculated as 8 + the character's proficiency bonus (based on level) + the relevant ability score modifier (based on class). The character sheet should show this value in Play mode. Should only show for characters with at least 1 level in a spellcasting class.