Dashboard (Savage)

From HLKitWiki
Jump to navigationJump to search

Context: HL Kit … Authoring Examples … Savage Worlds Walk-Through 

Overview

All of the critical mechanics for individual characters are now in place. It's time to turn our attention to managing multiple characters effectively. The first piece in that process is the Dashboard.

Determine the Display Content

The Skeleton files provide a basic framework for the Dashboard. The character name is shown at the top. Various mouse-over icons are arrayed across the bottom. Buttons to switching between actors and move gear are down the right side. We need to figure out what additional information we want to show to the user. We don't have much space, so we need to choose carefully. The most frequently referenced information should be given priority and shown.

Looking closely at the make-up of Savage Worlds characters, there are five basic pieces of information that seem most important. These are listed below.

  • Health Status - The number of wounds and fatigue level are important, as is whether the character is shaken.
  • Parry - In a game with lots of combat, the Parry trait will be referenced frequently.
  • Toughness - The rationale for Toughness is similar to the Parry trait.
  • Power Points - It's also valuable to know how many power points remain for a character with an arcane background.
  • Bennies - Bennies are an important resource that need to be managed by the player, so knowing how many you have left at-a-glance can be extremely useful.

It's possible that we won't be able to squeeze all of this information into the limited space we have for each actor on the Dashboard. So we need to assess each one and determine both how to display it and where it might fit. At the end, if don't have room, we need to drop the lower priority piece(s) of information.

Health is probably the most important piece, although it also requires significant space. If a character is wounded, fatigued, and shaken, all three facets must be indicated in some way. We already use a very compact representation for this within the static form at the top of the main window, but it still consumes a fair bit of space. If we can't think of a more compact representation, we'll be hard-pressed to show all the other information on the Dashboard. The primary use for the Health as a quick-reference during play is to show the net impact on the character. As such, we could display a shaken indicator and only the total negative adjustment for the character. This would cut the required space in half.

Since combat tends to factor prominently in many Savage Worlds games, the Parry and Toughness traits are probably the next most important. These traits are simple values, so they don't require much space to display on the Dashboard. The Power Points are likely more important than the Bennies. Showing the Power Points can be done in two different ways. One option is to show them as we do on the static form at the top, with both the current and maximum values, but we could also just show the current value for space efficiency. The same two options apply for Bennies.

Let's consider how and where we can squeeze everything in now. The default behavior for the Dashboard is to reserve two lines of space for the actor name. The primary reason for this is to be able to show the associations for minions and masters. Since allies often play a significant role in Savage Worlds games, and since they can best be modeled as minions of the PCs, it would be nice to retain this space on the Dashboard.

If we retain that space, though, we're left with some hard decisions. Beneath the name, there really isn't enough space to show more than one line of information. Based on our prioritization above, this leaves us with the character's Health (in a compressed format) and room for probably only two traits (Parry and Toughness). We'll go with this design for now and see if there's a way we can squeeze in the Power Points at the end.

New Health Format

In the previous section, we decided on a more compact format for showing Health on the Dashboard. Now we need to synthesize that format appropriately. The current format is generated through a field on the "Actor" component. Probably the best method for us to generate the new format is via an alternate field on the same component.

We can start by cloning the existing "acDmgSumm" field and giving it a new id. We'll use "acDmgTac", since we'll be using this format on both the Tactical Console and Dashboard. Then we can revise the Finalize script to correctly synthesize the new format. The resulting new field is shown below.

<field
  id="acDmgTac"
  name="Health for Dashboard/TacCon"
  type="derived"
  maxfinal="100">
  <!-- Calculate a value that is based on all the fields referenced by the
        "finalize" script. This ensures that the field always changes if any of
        its pieces changes, which triggers the finalized value to be updated.
  -->
  <calculate phase="Render" priority="1000"><![CDATA[
    ~make sure this value consists of the elements that could cause the summary to change
    @value = field[acShaken].value * 10000 + field[acWounds].value * 100 + field[acFatigue].value
    ]]></calculate>
  <!-- Final value for display shows the shaken state, current wounds, and any
        penalty value.
  -->
  <finalize><![CDATA[
    ~if we're not shaken and have incurred no negative effects, all is good
    var net as number
    net = field[acWounds].value + field[acFatigue].value
    if (field[acShaken].value + net = 0) then
      @text = "-"
      done
      endif

    ~if we're shaken, signal it with a special indicator
    @text = ""
    if (field[acShaken].value <> 0) then
      @text &= "{font wingdings}v{revert}"
      endif

    ~get the current wounds and fatigue for use below
    var wounds as number
    var fatigue as number
    wounds = field[acWounds].value
    fatigue = field[acFatigue].value

    ~if we're incapacitated, report it
    var state as string
    if (wounds >= 4) then
        state = "Inc"
    elseif (fatigue >= 3) then
        state = "Inc"

    ~otherwise, report our total negative influence
    elseif (net > 0) then
      state = "-" & net
      endif

    ~if we have a state to report, append it
    if (empty(state) = 0) then
      if (empty(@text) = 0) then
        @text &= "/"
        endif
      @text &= state
      endif

    ~anything we output must be in red to highlight the penalty
    @text = "{text ff0000}" & @text
    ]]></finalize>
  </field>

Implement the Display

It's now time to implement the changes to the Dashboard. Open the file "form_dashboard.dat" and locate the "dashboard" template. The first thing we need to do is integrate our new field for showing the Health. The "health" portal already exists, so all we need to do is change the field it displays to the new "acDmgTac" field. This results in the revised portal below.

<portal
  id="health"
  style="lblSmall">
  <label>
    <labeltext><![CDATA[
      @text = field[acDmgTac].text
      ]]></labeltext>
    </label>
  </portal>

The "power" portal is being eliminated, but we'll want to do something similar for showing the "Parry" and "Toughness" traits. We can adapt the portal for the "Parry" trait, then we can clone it and revise it for the "Toughness" trait. The following two portals should result, along with the effective deletion of the "power" portal.

<portal
  id="parry"
  style="lblSmall">
  <label>
    <labeltext><![CDATA[
      @text = "{size 30}Pa: {size 36}" & #trait[trParry]
      ]]></labeltext>
    </label>
  </portal>

<portal
  id="toughness"
  style="lblSmall">
  <label>
    <labeltext><![CDATA[
      @text = "{size 30}To: {size 36}" & #trait[trTough]
      ]]></labeltext>
    </label>
  </portal>

Mouse-Over Information