Races and Racial Abilities (Savage)
Context: HL Kit … Authoring Examples … Savage Worlds Walk-Through
Overview
The next thing we should probably address is support for races and racial abilities. The original core rulebook for Savage Worlds included a variety of different races, but the Explorer's Edition simply offers the "Human" race. Since races will be a factor in various settings, we'll address them here and focus on the races from the original core rulebook.
Component and Component Set
The Skeleton files already have a suitable component and component set in place for managing races ("Race"), as well as an "Ability" component and component set that can be used for racial abilities. The only change we should consider is that the "Ability" component set includes the "Trait" component, and racial abilities in Savage Worlds don't have any need for those mechanics. Consequently, we can readily delete the "Trait" component from the "Ability" component set in the file "traits.str", eliminating the unnecessary overhead.
<compset id="Ability"> <compref component="Ability"/> <compref component="SpecialTab"/> </compset>
Adding a Race
Since everything is now in place, we can begin adding the various races and their abilities. In the interest of keeping everything conveniently grouped in a single place, we'll define both races and their abilities in the "thing_races.dat" file. Each race will simply bootstrap all of the abilities that it confers. Those abilities will then possess scripts, as necessary, to apply the appropriate changes to the character.
We'll start with a race that is relatively simple, the "Atlanteans". This race has two abilities, with one ability conferring a bonus that is applied via an Eval script. Since the "Aquatic" ability is specially tailored for the race, we have to anticipate the need for a different "Aquatic" ability for a different race, so the unique id should be tied to the race. A generalized ability like "Tough" should have a generic id that can be readily re-used by another race. The three pieces should look something like below:
<thing id="racAtlant" name="Atlantean" compset="Race" isunique="yes" description="Description goes here"> <bootstrap thing="abAquaAtl"/> <bootstrap thing="abTough"/> </thing> <thing id="abAquaAtl" name="Aquatic" compset="Ability" isunique="yes" description="Description goes here"> </thing> <thing id="abTough" name="Tough" compset="Ability" isunique="yes" description="Description goes here"> <eval index="1" phase="PreTraits" priority="5000"> <before name="Calc trtFinal"/><![CDATA[ ~add +1 die to the Vigor attribute #traitbonus[attrVig] += 1 ]]></eval> </thing>
Special Case Situations
Among all of the races outlined in the Savage Worlds rulebook, there are a handful of special case situations that warrant specific commentary. Each of these is outlined in this section. Except for these special cases, the races are rather straightforward.
For the "Dwarves" race, there is the "Slow" ability, which sets the base "Pace" value for the Dwarf to five instead of the normal six. In order for this to work properly, be sure to set the appropriate value for "Pace" using the conventions established earlier in this walk-through. An example of the "Slow" ability is presented below.
<thing id="abSlow" name="Slow" compset="Ability" isunique="yes" description="Description goes here"> <!-- Dwarves have a base Pace of 5 NOTE! Since we're setting the Pace to a fixed value, do it early, before any adjustments are applied. --> <eval index="1" phase="Setup" priority="1000"><![CDATA[ #traitbonus[trPace] = 5 ]]></eval> </thing>
The "Elves" race possesses the "All Thumbs" ability, which is actually the "All Thumbs" hindrance. There are two options for how we can handle this properly. The first option is to duplicate the behaviors of the "All Thumbs" hindrance as a separate ability, and the second is to automatically bootstrap the "All Thumbs" hindrance from the ability. The latter approach requires that the bootstrapped hindrance be specially implemented so that it does not confer bonus points that can be traded in for edges or other benefits. That extra handling is more work, so it's simpler to just duplicate the "All Thumbs" hindrance as a racial ability.
Unfortunately, having a separate "All Thumbs" ability introduces another wrinkle that needs to be resolved. Since the "All Thumbs" ability is equivalent to the "All Thumbs" hindrance, it's important that the user not be allowed to take the hindrance when the "Elves" race is selected for a character, and vice versa. Actually precluding this is a bit of work, but it's relatively easy to detect when the user has done it and report a validation error, so that's the method we'll employ. Sadly, we can't implement our solution yet, since we don't have the hindrance in place yet, so we'll make a note to come back and deal with this later.
Next on the list of special cases is the "Heritage" ability of Half-Elves. This ability gives the character the ability to choose one of two different options: the "Agile" ability of Elves or a free edge of the player's choice. A variety of different methods could be employed to solve this, ranging from simple to complex. We're going to keep things simple, so we'll create two separate versions of the race, with each conferring a different option. This way, the user simply selects the version he wants and everything works easily. The names of each race must include an indication of the benefit being granted, such as "Half-Elven (Edge)", which is shown below.
<thing id="racHfElf1" name="Half-Elven (Edge)" compset="Race" isunique="yes" description="Description goes here"> <bootstrap thing="abHeritage"/> <bootstrap thing="abFreeEdge"/> <bootstrap thing="abLowLight"/> <bootstrap thing="abOutHE"/> </thing>
Although a few different races have the "Outsider" ability, each instance of the ability is a bit different from the others. As such, we can't just have a single "Outsider" ability that can be re-used. We must instead have multiple abilities that all have the same name yet differ in their details.
The final special case is that a couple of races grant a natural weapon of some sort. The Rakashans have a "Claws" ability that behaves as a natural weapon, while the Saurians have an explicit "Natural Weapon" ability. We aren't able to add weapons yet, so we need to make a note about these and come back to implement them later.
Humans As Default
The Explorer's Handbook centers solely on humans. Consequently, we have to assume most players will be starting with human characters. We could make the player always select a race, or we could select "Human" as the default race and let the player change it if he wants. We'll opt for the latter approach.
Defaults choices are generally quite easy to handle with the Kit. You can automatically add a thing to table or set up a chooser with a default selection. This is achieved via an "autoadd" element and is performed within the file "bootstrap.1st". The element specifies both a thing to be added and the portal it must be added to. The Kit handles everything else. Auto-selecting the "Human" race results in the following XML element being added to the file.
<autoadd thing="racHuman" portal="stRace"/>
That's all there is to it. Whenever a new character is created, it will begin with the "Human" race as the default selection.