Basics of Arcane Backgrounds (Savage)
Arcane backgrounds are a rather fundamental aspect of the Savage Worlds game system. As such, we should setup handling of the basics for arcane backgrounds early on in our development. We don't need to fully implement them until later, but we do need to handle the basics, as there are a variety of edges and potentially other game elements that influence arcane backgrounds for a character.
Arcane Background Types
The first thing we need to track is the different types of arcane backgrounds. The core book defines an initial set of five, and supplements define a number more. Since there will be lots of dependencies on the various arcane disciplines, we need maximum flexibility and the ability to associate the power type with various kinds of things. So we need to define a new tag group for this purpose, with separate tags for each arcane background. We should also make the tag group dynamic so that the material from supplements can extend this list of arcane backgrounds externally. The net result is a tag group that we can add to the "tags.1st" file and that looks like the following:
<group id="Arcane" dynamic="yes"> <value id="Magic"/> <!-- arcane background is Magic --> <value id="Miracles"/> <!-- arcane background is Miracles --> <value id="Psionics"/> <!-- arcane background is Psionics --> <value id="SuperPower"/> <!-- arcane background is Super Powers --> <value id="WeirdSci"/> <!-- arcane background is Weird Science --> </group>
Resources to Track
Arcane backgrounds introduce two new resources that need to be managed for each character - the number of arcane powers granted and the pool of power points that can be used to activate the powers. The number of arcane powers available is dictated by the arcane background and edges selected, with the resource decreased as powers are selected by the user. Consequently, the number of powers is best modeled using a "Resource", which we'll call "resPowers". Since every character can have an arcane background, the resource should always be bootstrapped for each character. This resource is very similar to the ones we've already shown in the examples above, so we won't duplicate it here. You can take a look at the completed Savage Worlds data files if you wish to see the specifics.
In contrast, the number of power points will be managed by the user. The total number of power points available will be dictated by the arcane background and edges selected, but the expenditure and recovery of power points will occur during game play. As such, power points are best modeled using a "Tracker". Like the number of powers, every character should always have this tracker bootstrapped. The Skeleton files include a "trkPower" tracker that is perfect for our needs, so we can simply re-purpose it. Since each character starts with zero power points and other sources will influence that number, we can eliminate the script and let the tracker default to values of zero.
Arcane Backgrounds and Skills
The final thing we need to deal with to get the basics of arcane backgrounds setup is adding the various backgrounds and arcane skills. Edges confer access to the different backgrounds, and certain edges are dependent upon the arcane skills, so we need to get arcane backgrounds and skills into place first. In order to keep everything conveniently located in a centralized place, we opt to create a new "thing_arcane.dat" file for all things related to arcane backgrounds.
Before we can do that, though, we first need to define a suitable component and component set to represent arcane backgrounds. We don't need to worry much about how arcane backgrounds work for now, so we'll setup the obvious mechanics and worry about the rest later on. There are three facets of each arcane background that are fundamental: the arcane skill, the starting number of powers, and the starting number of power points. The proper skill will be controlled via each arcane background, so we don't need to deal with that in the component, and the two starting values can be defined as static fields. Since arcane backgrounds don't really fit anywhere else, we'll put the new component and component set in "miscellaneous.str". The two new elements can be handled quite simply for now, and they should look similar to the following:
<component id="Arcane" name="Arcane Background" autocompset="no"> <field id="arcPowers" name="Number of Powers" type="static"> </field> <field id="arcPoints" name="Number of Power Points" type="static"> </field> </component> <compset id="Arcane"> <compref component="Arcane"/> </compset>
Now that the component set is in place, we can define the individual arcane backgrounds and skills. As outlined above, each background needs to specify the proper fields and assign a suitable tag for the background. In addition, the corresponding arcane skill must be defined for each background. Each skill works just like the standard skills we added earlier. The net result is something that looks like below for the "Magic" arcane background and skill.
<thing id="arcMagic" name="Magic" compset="Arcane" isunique="yes" description="Description goes here"> <fieldval field="arcPowers" value="3"/> <fieldval field="arcPoints" value="10"/> <tag group="Arcane" tag="Magic"/> </thing> <thing id="skSpellcst" name="Spellcasting" compset="Skill" isunique="yes" description="Description goes here"> <fieldval field="trtAbbrev" value="Spl"/> <tag group="Arcane" tag="Magic"/> <link linkage="attribute" thing="attrSma"/> </thing>
Each arcane background defines the appropriate number of starting powers and power points, but we aren't doing anything with those values yet. We need to add the values to the resource and tracker that we just defined above, as they actually manage powers and power points, respectively. This can be accomplished by defining an Eval script on the component for the purpose. All the script needs to do is add the two values to the proper places, which yields something that looks like the example below.
<eval index="1" phase="Setup" priority="5000"><![CDATA[ #resmax[resPowers] += field[arcPowers].value #trkmax[trkPower] += field[arcPoints].value ]]></eval>
There is one last detail that we need to address. When a character has an arcane background, it needs to be known at the top-level in a way that everything within the data files can check on it and base behaviors on it. This means having a tag on the actor that corresponds to the arcane background. Since each background will have a suitable "Arcane.?" tag, the component can forward the tag to the actor. This can be accomplished by adding the Eval script below to the "Arcane" component.
<eval index="2" phase="Setup" priority="5000"><![CDATA[ perform forward[Arcane.?] ]]></eval>