Dashboard (Savage): Difference between revisions
Line 136: | Line 136: | ||
</portal> | </portal> | ||
</pre> | </pre> | ||
The portals are now in place, so we need to position everything properly. We'll position the "toughness" portal adjacent to the "gear" portal, then we'll place the "parry" portal on the left of that. The "health" portal will then be influenced by the "parry" portal. We can also introduce a little bit more spacing to make things look good. This results in the following revised script code for positioning the three portals. | |||
<pre> | |||
~position toughness details next to the "gear" portal | |||
perform portal[toughness].centeron[vert,gear] | |||
perform portal[toughness].alignrel[rtol,gear,-6] | |||
~position parry details next to the "toughness" portal | |||
perform portal[parry].centeron[vert,toughness] | |||
perform portal[parry].alignrel[rtol,toughness,-6] | |||
~position health details parallel to the "parry" portal | |||
perform portal[health].centeron[vert,parry] | |||
portal[health].width = portal[parry].left - 4 | |||
</pre> | |||
The final thing we need to do is handle the vertical adjustment to our new portals if the name requires two lines. The revised script code should look as follows. | |||
<pre> | |||
~shift the health and related portals down slightly to make more room | |||
portal[health].top += 2 | |||
portal[parry].top += 2 | |||
portal[toughness].top += 2 | |||
</pre> | |||
If we reload the data files and take a look at the Dashboard, it looks reasonable. Unfortunately, there just isn't any space to squeeze in the Power Points, so we'll just have to leave them out. | |||
===Mouse-Over Information=== | ===Mouse-Over Information=== |
Revision as of 00:26, 25 January 2009
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>
The portals are now in place, so we need to position everything properly. We'll position the "toughness" portal adjacent to the "gear" portal, then we'll place the "parry" portal on the left of that. The "health" portal will then be influenced by the "parry" portal. We can also introduce a little bit more spacing to make things look good. This results in the following revised script code for positioning the three portals.
~position toughness details next to the "gear" portal perform portal[toughness].centeron[vert,gear] perform portal[toughness].alignrel[rtol,gear,-6] ~position parry details next to the "toughness" portal perform portal[parry].centeron[vert,toughness] perform portal[parry].alignrel[rtol,toughness,-6] ~position health details parallel to the "parry" portal perform portal[health].centeron[vert,parry] portal[health].width = portal[parry].left - 4
The final thing we need to do is handle the vertical adjustment to our new portals if the name requires two lines. The revised script code should look as follows.
~shift the health and related portals down slightly to make more room portal[health].top += 2 portal[parry].top += 2 portal[toughness].top += 2
If we reload the data files and take a look at the Dashboard, it looks reasonable. Unfortunately, there just isn't any space to squeeze in the Power Points, so we'll just have to leave them out.