Advanced Race Creation Guide

From Wiki for The Only Sheet
Jump to navigation Jump to search

[this page is under heavy construction!]

Advanced Race Creation Guide

A step-by-step journey through creating custom races, feats, class archetypes, spells, items, and gear to implement a complete race from the ARG

INTRODUCTION

TOS+ lets you create almost any custom 3.5 OGL or Pathfinder feature imaginable! But in order delve into the details, we have to cover a few concepts.

The rules for characters basically consist of two parts, the Description and the Effect. For example, the Description for Aasimar movement speed is: "Base Speed: Aasimars have a base speed of 30 feet." The Effect value 30' can be different from race to race. It can also change if the character is encumbered or wearing armor.

TOS+ is divided into essentially Text (descriptions) and Effects. Text is what is displayed in the INFO and Stats sections, regarding abilities, conditional effects, and error messages. Don't dismiss the importance of Errors! Error messages are a huge part of making various features work "right," especially in helping the user (that's YOU!) be able to get the most benefit from the available features.

Your formulas for the Text sections will display different messages depending on what options are chosen for your race or class, and there are a lot of places where TOS+ has blanks (or good starting data) that automatically activate at the right level (for example, Oracle revelations are organized by the level at which they become available, and TOS+ automatically shows them as available options at the right time).

The other part is Effects. Effects are a powerful way to modify nearly every value and condition in play, on the fly. The formulas in the Effects you configure will let the user see the specific (and current!) values of their various abilities, with all the different conditions accounted for, and all the stacking rules applied... automatically and on-the-fly.

The real power of the sheet comes to life when you begin using the values from the Effects live in the Text! That way as the user updates their character, the abilities listed in the INFO section can be up-to-date with the current values for their level, including effects from magic items, feats, and "live" effects on the LapTop sheet.

This article will show you how I implemented the complete Aasimar race from the Pathfinder Advanced Race Guide.

Making a new Race

So I was working on a new 8th level Cleric for my Pathfinder game, and my friend suggested I look at the Aasimar race, because of the racial stat bonuses. Well, as I looked at some of the features, I realized many of them were not in TOS+ yet, so I decided to try my hand at creating a race... firstly, to play my Aasimar cleric exactly the way I wanted, but also with the intent of bringing you this overview, so that others can contribute Races or Classes of their own... or any other interesting ideas!

OVERVIEW

Handling Optional Features

First of all, almost everything that is true for building a Race in TOS+ is also true for building a Class, so reading this article will help you understand the process as a whole.

Building a race (or class) that has no alternative options is simple: Just enter all the descriptions and effects listed for the race.

But some races aren't that simple.

In order to implement all the different features in a race, we need a way for the user to select from the various options that the race (or class) offers, and then we can use Excel formulas to activate each option (and de-activate the replaced option(s)) on the fly.

The Race sheet has the blanks for you to begin filling in these options at the very top left corner (when building a Class, you will find these option slots on the left, but a little further "down" in the first few columns).

On the left side, are blanks for the option Labels. They are non-obvious because they have a grey background color, like much of the rest of this section. We will fill these in with the feature names from the rulebook. When you type anything in these cells, the matching cell to the right (under the heading "Player selection:") automatically turns yellow, indicating a place for the user to enter their own input.

The Player Selection cells can take any value the user wishes to enter. However, since it is not always obvious (to the user) exactly what Race options are available, we want to offer a dropdown list of valid choices. Using the power of Excel, we can enter a list of options in the right place, and TOS+ will automatically use that list to fill in the options for the selection. Or, should a Race feature require a choice from an existing list (like, Skills, for example, to handle "Choose a specific Skill to receive the bonus"), you can direct the sheet to use *that* list instead. This is the "source" list.

Once the user has made an alternative choice, the rules usually say this will deactivate some existing option, and activate a new one. We are going to use Excel formulas to activate different options to the user (both descriptions and effects) depending on which Race options are selected.

A word about Excel

If you're feeling utterly bewildered by the idea of building Excel formulas, don't feel bad! We will only need to use a small handful of the available Excel functions to handle almost everything we want TOS+ to do.

Formulas

If you type most anything into a cell in Excel, the value of that cell is simply the string of letters, numbers, and so forth that was entered. If referred to by another formula, that formula will get that string to work with.

However, if your text begins with a number, like "+2 bonus to Diplomacy", Excel will complain about an error in your function. In this case, put a ' character at the beginning, like so:

'+2 bonus to Diplomacy

But if you want the value to depend on something else, you enter a formula, by making the first character of the string an equals sign, =. The simplest formula has a string in double quotes:

="+2 bonus to Diplomacy"

There is a maximum limit on a quoted string of 255 characters in length. If your string is too long, you can break it into multiple strings, joined with the & character:

="One string is joined"&" to another one."

This formula will show the value:

One string is joined to another one.

But other formulas can lead to much more interesting results.


IF()

IF() is the most commonly used function for dynamic values. IF() takes three parameters: a test, the result if the test is true, and the result if the test is false.

=IF(tSel_Race_Opt1="Celestial Crusader","Celestial Crusaders get a bonus to...","")

You can have up to 7 nested levels of IF(), if you need to.

=IF(tSel_Race_Opt1="Celestial Crusader",
    IF(tSel_SOME_OTHER_OPTION<>"",
       "Both options are selected",
       tSel_SOME_OTHER_OPTION),
    "")

OR() and AND()

Sometimes you need test whether ANY of a list of conditions is true, or if ALL of them are true.

OR() takes up to 255 parameters, each of which is a condition test, expected to return true or false. If ANY of the conditions are true, OR() returns true, otherwise it returns false.

AND() takes up to 255 parameters, each of which is a condition test, expected to return true or false. If ALL of the conditions are true, AND() returns true, otherwise it returns false.

OFFSET()

The are times when you want to refer to a value that is part of your custom race or ability, on the same row, and rather than re-type the formula, or do a VLOOKUP() (and have to type the ability name again), we can use OFFSET().

=OFFSET($A$1,ROW()-1,COLUMN()-1)

This formula as it stands doesn't do anything useful, because it refers to itself. However, if we change it just slightly, by adding numbers to the -1 values, we can refer to OTHER cells, relative to the current one. For example, one cell the LEFT of the current cell is:

=OFFSET($A$1,ROW()-1,COLUMN()-2)

And one cell to the right is:

=OFFSET($A$1,ROW()-1,COLUMN()+0)

VLOOKUP()

TOS+ has a lot of tables of raw data, on everything like feats, classes, items, and so on. These tables all have names, and can be accessed in your formulas to look up specific values.

The parameters, in order, are the item searched for, the table to search in, which column of the result to return, and FALSE to perform an exact match. For example:

=VLOOKUP("Touch of Serenity",t_Feats,index_Feat_Desc,FALSE)

This formula returns the Description string for the feat Touch of Serenity, from the Feats table.

A word about Names

Almost every place in TOS+ that takes user input has both an Address on the individual sheet and a Name (a very few don't have a special name, but we can usually use OFFSET() for those). The Address is the location on the Excel sheet (like Front!B4), and is subject to change at any time. The Name, however, is a label (like tSel_Race_Name) that will stay the same from version to version of TOS+, and can be referred to in formulas to read that value and either display it (e.g. for this project, tSel_Race_Name = "Aasimar (ARG)") or make a choice based on that value. When you click on any cell, its value or formula shows in the top bar of the screen. The Name shows in the top left corner. If the cell has no designated Name, then you'll see the address here, like C41. But if it instead shows something like, tSel_Race_Name, that's what we're referring to. You can see a list of names in Excel (and browse and search) by pressing Alt-M, then N (the Name Manager on the forMula menu).

We are going to make extensive use of the internal names. The first reason is, to avoid typing the same value (like a quoted string) over and over again. The second is almost the same as the first, to avoid typing ERRORS in the value. And the third is simply to be able to use the various values together "automatically," so that TOS+ can do as much as possible FOR you (and the user). One particularly useful way to take advantage of this is for error messages:

=tSel_Race_Opt1&                           # the selected option
 " can't be used when " & tSel_Race_Opt2 & # the conflicting option
 " replaces " & tSel_Race_OptDesc1         # the name of the option slot

A word about Abilities

Abilities are at the very heart of how TOS+ works. They combine Descriptions, Conditional text, LapTop advice, and of course, Effects! We'll cover effects in more detail in a moment.

But abilities are present in more than just abilities... most of the other major features on the sheet, including Feats, Items, Gear, Domains, Powers, Races, Classes, Conditions, Weapons, Armor and Spells, all have the complete set of "Ability" columns, with extras fields as necessary. Almost any power, condition, bonus, penalty, or skill can be adjusted with abilities, not only because they can show different rules to the player, but because they also have up to 6 Effects per ability!

A word about Effects

Dynamic Effects are the core of the functionality of the sheet. Some examples of effects are:

  • Strength Bonus
  • Number of Spells/day
  • Channel Energy level
  • Damage Reduction
  • Armor Class
  • Movement Penalties
  • Reflex Save Bonus

... and so on

All of these are automatically added up by TOS+ whenever anything changes. The Effects system also understands stacking rules, by giving each Effect a Type. The most common Type is "Unnamed", which simply adds effect values together and returns the total. But some effects do NOT stack. For example, multiple effects that give a Deflection bonus to AC only contribute the highest value to the total:

Example: Effects from two Rings of Protection
Item Name Effect Name Effect Type Effect Modifier
Ring of Protection +1 Armor Class Deflection 1
Ring of Protection +2 Armor Class Deflection 2

Here, TOS+ will only add 2 to the overall armor class, because Deflection bonuses do NOT stack, and only the highest bonus applies. As long as you are careful with your types, the stacking rules are handled automatically!

An example of an effect that gives Resistance 5 to fire damage is:

Example: Effects granting Resistance to Fire
Effect Name Effect Type Effect Modifier
Resistance to Fire (Ex) Max Value 5


Notice that we chose Max Value for the Type here... that's another reflection of the stacking rules in Pathfinder and D&D. If another effect (say, a spell or racial ability) gave Resistance 10 to Fire, the final value would be the "Max Value" of the two, which is 10, instead of the sum, which would be 15 (and would be an error!).

You can actually see all the active effects for your current character by unhiding and viewing the worksheet named Integration. Every live effect being tracked by TOS+ will appear on this sheet, and if you scroll over to the right a bit, you can see the same data with all the blank lines removed.

IMPLEMENTATION

1. Planning your approach

TOS+ is designed to support RPG character rules. Our intent here is to add the new rules for the Aasimar race. In order to do that, we should start with the rules themselves! I visited the Paizo.com website and found the page from the Advanced Race Guide that listed the Aasimar rules, copied the text, and pasted it into an editor.

Next, I went down the list and turned it into a checklist, like so:

  • Standard Racial Traits:
    • Ability Score Racial Traits: Aasimars are insightful, confident, and personable. They gain +2 Wisdom and +2 Charisma.
    • Type: Aasimars are outsiders with the native subtype.
    • Size: Aasimars are Medium creatures and thus have no bonuses or penalties due to their size.
    • Base Speed: Aasimars have a base speed of 30 feet.
    • Languages: Aasimars begin play speaking Common and Celestial. Aasimars with high Intelligence scores can choose from the following languages: Draconic, Dwarven, Elven, Gnome, Halfling, and Sylvan. See the Linguistics skill page for more information about these languages.

As I finish adding each rule into the custom Race, I put a * in front of its name:

  • *Ability Score Racial Traits: ...

That way I can clearly see my progress.

Alternative Racial Traits

For any race with multiple options (and the Aasimar is no exception), each of the different choices replaces one or more default features (and effects!) for that race. It is important to map out the various combinations, and which abilities they replace. With this in hand, you can correctly account for the currently active Descriptions and Effects, as well as informing the user if they have chosen an invalid combination. Specifically, when the user picks an option that has already been replaced by another choice.

The keywords to look for at the end of each alternative trait are: "This racial trait replaces <>". Scanning down the list of Alternative traits for Aasimar, we find this set of replacements:

  • Celestial Crusader
    This racial trait replaces celestial resistance and skilled
    Deathless Spirit, Exalted Resistance
    This racial trait replaces celestial resistance
    Heavenborn, Immortal Spark
    This racial trait replaces the skilled and spell-like ability racial traits
    Truespeaker
    This racial trait replaces skilled
    Incorruptible
    This racial trait replaces the spell-like ability racial trait
    Halo
    This racial trait replaces the darkvision standard racial trait
    Scion of Humanity
    This racial trait replaces the Celestial language and alters the native subtype

So we can see that we will need options for:

  • Celestial Resistance
    • Celestial Crusader
    • Deathless Spirit
    • Exalted Resistance
  • Skilled
    • Heavenborn
    • Immortal Spark
    • Truespeaker
  • Spell-Like Ability
    • Incorruptible
  • Darkvision
    • Halo
  • Celestial Language
    • Scion of Humanity

We will also need to account for what happens when the user selects an option that has already been replaced. For example, if an option, like "Heavenborn", replaces both the Skilled and Spell-Like Ability options, it is incorrect to ALSO choose the "Incorruptible" option to replace the Spell-Like Ability at the same time.

A feature that is often present, but not something we have to handle for the Aasimar race, is selecting a custom Feat or Skill to apply a bonus to. In this situation, we would use the link to "List Setup" to change the "Race Source List" for the given option. For example, the source list to select a feat is t_Feats.

2. Getting Started

In this case, I started with the existing "Aasimar (P)" race to get the basic details loaded.

Open the Race sheet, and right in the front (top left) is a spot called "Target Race". I selected "Aasimar (P)" from the dropdown, and then clicked "Add Race". I paged down, and replaced the name "Aasimar (P)" with "Aasimar (ARG)".


Careful! Aasimars are not "Humanoid" so they will keep their racial HD unless you uncheck the Off-Print checkbox on Front labeled: "Only Humanoids lose their 1HD when they gain Class levels"

- Congratulations! We have a working race! :) Now let's make it behave the way WE want!

3. Set the core Racial Traits

At this point we're going to set up the selectable options for the race. We first review the section on "Standard Racial Traits"


Standard Racial Traits

Ability Score Racial Traits
Aasimars are insightful, confident, and personable. They gain +2 Wisdom and +2 Charisma.
Type
Aasimars are outsiders with the native subtype.
Size
Aasimars are Medium creatures and thus have no bonuses or penalties due to their size.
Base Speed
Aasimars have a base speed of 30 feet.
Languages
Aasimars begin play speaking Common and Celestial. Aasimars with high Intelligence scores can choose from the following languages: Draconic, Dwarven, Elven, Gnome, Halfling, and Sylvan. See the Linguistics skill page for more information about these languages.


Reviewing the rules, the only one of these abilities that changes is that one trait replaces the Celestial language... so we will make sure to include a trait called "Celestial Language"!

Other Racial Traits

Now we look at the other Racial traits, that all have alternatives:

Celestial Resistance
Aasimars have acid resistance 5, cold resistance 5, and electricity resistance 5.
Skilled
Aasimar have a +2 racial bonus on Diplomacy and Perception checks.
Spell-Like Ability (Sp)
Aasimars can use daylight once per day as a spell-like ability (caster level equal to the aasimar's class level).
Darkvision
Aasimar have darkvision 60 ft. (they can see perfectly in the dark up to 60 feet.)

Creating Options and Option Lists

So we will go to the Race sheet, and fill in the following Racial Options, starting at Class!B3, which is labelled Racial Option 1, and has the cell name tSel_Race_OptDesc1:

  • Celestial Resistance
  • Skilled
  • Spell-Like Ability
  • Darkvision
  • Celestial Language

As each one is typed in, the blank to its right turns yellow. This means it's a place we can enter options. But these blanks are "magic" in that if we put a list of alternatives in the right spot, the blanks will become dropdown selection lists with that list of options. The "right spot" for list 1 has a convenient link right here. To set up our first list, click on the link "setup 1." This directs you to the blank list t_Race_SetupList1.

Since this list is the options for Ability 1, we put the options that can replace "Celestial Resistance" here.

A note about description strings in Excel formulas
Complex formulas can have multiple sections which each return different strings. They can be joined together with the & character like so: "string 1"&"string 2" = "string 1string 2" There are a number of helper values available for formatting, including
CR		Carriage Return
CRB		Carriage Return and bullet
CRT		Carriage Return and indent
BULLET		A bullet point

in this list, we put the following values:

Title:	=LFrame&"Alternate Traits"&RFrame  # this is just cosmetic
1:	Celestial Crusader
2:	Deathless Spirit
3:	Exalted Resistance


We can see the next ability, "Skilled", can be replaced by these options, which go into RACE OPTIONS SETUP 2:

Title:	=LFrame&"Alternate Traits"&RFrame
1:	Heavenborn
2:	Immortal Spark
3:	Truespeaker


"Spell-Like Ability" has only one direct substitute RACE OPTIONS SETUP 3:

Title:	=LFrame&"Alternate Traits"&RFrame
1:	Incorruptible

"Darkvision" also has one alternative RACE OPTIONS SETUP 4:

Title:	=LFrame&"Alternate Traits"&RFrame
1:	Halo

Now to make them work

At this stage, we are going to set up the display of actual rules from the book, depending on what is selected. The existing Racial Traits (or Abilities) of the race we started with are already filled in. But we can freely replace any we want... they're just strings. So we'll start with the literal text for our descriptions, making little changes as necessary, to fill in our descriptions, replacing features that are different from the "stock" values, and altering the ones that like the original but with modifications.

Note
Play with these as you go along. Set and unset options, and see what happens. Do it a lot. Do it after every change. You will mess up... that's OK, you can fix it! If something specific is hard, and driving you nuts, then leave that feature without the "complete" mark, move on, and come back later.

Racial Trait 1: Celestial Resistance

Original Rules:

Celestial Resistance
Aasimars have acid resistance 5, cold resistance 5, and electricity resistance 5.
Celestial Crusader
Some aasimars follow their destiny to war against the powers of ultimate evil. These individuals gain a +1 insight bonus on attack rolls and to AC against evil outsiders and a +2 racial bonus on Knowledge (planes) and Spellcraft checks to identify evil outsiders or items or effects created by evil outsiders; they may use these skills untrained for this purpose.
Deathless Spirit
Particularly strong-willed aasimars possess celestial spirits capable of resisting the powers of death. They gain resistance 5 against negative energy damage. They do not lose hit points when they gain a negative level, and they gain a +2 racial bonus on saving throws against death effects, energy drain, negative energy, and spells or spell-like abilities of the necromancy school.
Exalted Resistance
An aasimar with this racial trait gains spell resistance (SR) equal to 5 + her level against spells and spell-like abilities with the evil descriptor, as well as any spells and spell-like abilities cast by evil outsiders.

We'll use the blank "Racial Trait 1" to show the description of the Celestial Resistance ability (or the description of any alternative ability that has been chosen to replace it).

An intro to CHOOSE()

We'll use the CHOOSE() to select which ability string is displayed, depending on what options are selected.

So for example, if the option for "Celestial Resistance" is empty (default) then display the first string "Celestial Resistance: Acid resistance 5, cold resistance 5, and electricity resistance 5"

However, if the user has chosen "Celestial Crusader", the string becomes the text for "Celestial Crusader", and so on. We can use SUM() to decide which one to show:

=CHOOSE(SUM(IF(tSel_Race_Opt1="Celestial Crusader",1,0),
            IF(tSel_Race_Opt1="Deathless Spirit",2,0),
            IF(tSel_Race_Opt1="Exalted Resistance",3,0), 
            1),
        "Celestial Resistance: Acid resistance 5, cold resistance 5, and electricity resistance 5",
        "Celestial Crusader: +1 insight bonus on attack rolls and to AC against evil outsiders and a +2 racial bonus on Knowledge: Planes and Spellcraft checks to identify evil outsiders or items or effects created by evil outsiders. May use these skills untrained for  this purpose",
        "Deathless Spirit: Negative energy resistance 5. Does not lose hit points when gaining a negative level. +2 racial bonus on saving throws against death effects, energy drain, negative energy, and spells or spell-like abilities of the necromancy school",
        "Exalted Resistance: SR"&5+i_CharacterLevel&" against spells and spell-like abilities with the evil descriptor, as well as any spells and spell-like abilities cast by evil outsiders"
)

if we look at the possible values for SUM() there, there's a 1 that's always in the list, which picks string 1 (the default). the other values ADD 1, 2, or 3, so the pick is a value from 1-4.

Note
Excel formulas must be entered with out any newlines! I've indented them in my examples to make the easier to understand, but they don't have the embedded space in the actual code.

Special Trick

That's a lot of typing in that formula, especially if you make a typo and have to go back and change it later and it can be hard to manage your strings, quotes, and commas. As we covered in the section on Names, if there is a place where data is entered, it has a specific name. So we will take advantage of the setup option lists that we didn't use (6-10) as a storage for our (long) status strings and instead of typing all of possible options directly into the a single race trait box, we'll enter them into a previously unused list, and then just display the right message (by referring to its cell name) after we decide what option(s) are active. Each of the options has a Name, so we can specify that in the decision-making formulas, making them much shorter and easier to manage.

Put these values in Setup Option list 6:

Title: Celestial Resistance: Acid resistance 5, cold resistance 5, and electricity resistance 5
    1: Celestial Crusader: +1 insight bonus on attack rolls and to AC against evil outsiders and a +2 racial bonus on 
       Knowledge: Planes and Spellcraft checks to identify evil outsiders or items or effects created by evil outsiders. May
       use these skills untrained for this purpose
    2: Deathless Spirit: Negative energy resistance 5. Does not lose hit points when gaining a negative level. +2 racial bonus
       on saving throws against death effects, energy drain, negative energy, and spells or spell-like abilities of the 
       necromancy school
    3: ="Exalted Resistance: SR"&5+i_CharacterLevel&" against spells and spell-like abilities with the evil descriptor, as 
       well as any spells and spell-like abilities cast by evil outsiders"
A note about dynamic values
Notice the formula in string 3, where the correct value of the bonus is calculated and inserted directly into the string, replacing the text from the book that says "equal to 5 + her level" with the computed value 5+i_Characterlevel. This is your first glimpse of where the dynamic nature of using TOS can really begin to shine, as far as the text side.

Now, back to Racial Trait 1:

Here is the same formula we just had with CHOOSE(), only with cell names replacing the strings:

=CHOOSE(SUM(IF(tSel_Race_Opt1="Celestial Crusader",1,0),
            IF(tSel_Race_Opt1="Deathless Spirit",2,0),
            IF(tSel_Race_Opt1="Exalted Resistance",3,0), 
            1)
           ),
        tSel_Race_Setup6Opt1,
        tSel_Race_Setup6Opt2,
        tSel_Race_Setup6Opt3,
        tSel_Race_Setup6Opt4)

We can even go 1 step further, and replace the ability names like "Celestial Crusader" with the cell names on the option lists that hold those strings:

=CHOOSE(SUM(IF(tSel_Race_Opt1=tSel_Race_Setup1Opt2,1,0),
            IF(tSel_Race_Opt1=tSel_Race_Setup1Opt3,2,0),
            IF(tSel_Race_Opt1=tSel_Race_Setup1Opt4,3,0),
            1)
           ),
        tSel_Race_Setup6Opt1,
        tSel_Race_Setup6Opt2,
        tSel_Race_Setup6Opt3,
        tSel_Race_Setup6Opt4)

Racial Trait 2: Skilled

These are the options for the Skilled racial trait

Rules:

Skilled
Aasimar have a +2 racial bonus on Diplomacy and Perception checks.
Heavenborn
Born in the celestial realms, aasimars with this racial trait gain a +2 bonus on Knowledge (planes) checks and they cast spells with the good or light descriptor at +1 caster level.
Immortal Spark
Aasimars with this racial trait defy the powers of death. They gain a +2 bonus on Knowledge (history) checks and saving throws against death effects and can use lesser age resistance once per day as a spell-like ability.
Truespeaker
There are some aasimars whose language transcends all boundaries. They gain a +2 bonus on Linguistics and Sense Motive checks, and they learn two languages each time they gain a rank in Linguistics.


This trait will be a little more complicated, because the rules say that one of the traits that replaces "Celestial Resistance" ("Celestial Crusader") ALSO replaces "Skilled". This means, first of all, that we want to show an empty string for the "Skilled" trait when that option is selected. It also means that we want to show an ERROR to the user when they have chosen any option for Skilled at the same time as the conflicting "Celestial Crusader" option.

So our list of strings becomes (enter these into RACE OPTIONS SETUP 7):

tSel_Race_Setup7Opt1: Skilled: +2 racial bonus on Diplomacy and Perception checks
tSel_Race_Setup7Opt2: ="Heavenborn: +2 bonus to Knowledge: Planes"&CRT&"Cast spells with the good or light descriptor at CL"&i_CharacterLevel+1
tSel_Race_Setup7Opt3: ="Immortal Spark: +2 bonus on Knowledge: History checks"&CRT&"+2 bonus to saving throws against death effects"
tSel_Race_Setup7Opt4: Truespeaker: +2 bonus on Linguistics and Sense Motive checks. Learns two languages for each rank in Linguistics
tSel_Race_Setup7Opt5: =ErrStart&tSel_Race_Opt2&" can't be selected when "&tSel_Race_Opt1&" replaces "&tSel_Race_OptDesc1&ErrEnd   
a note about the error message
Notice the it reads the current and selected values, to give a message that describes EXACTLY what option has a problem, based on the user input!

- also note the dynamic value for Heavenborn, i_CharacterLevel+1

So our values for CHOOSE() are:

  • strings 1-4 are strings describing the above 4 options
  • string 5 is the error string, shown if "Celestial Crusader" is picked and the Skilled option isn't blank
  • string 6 is empty, shown if "Celestial Crusader" is picked in the first option slot
=CHOOSE(IF(AND(tSel_Race_Opt1=tSel_Race_Setup1Opt2,tSel_Race_Opt2<>""),5, # Option 5, error
           SUM(IF(tSel_Race_Opt2=tSel_Race_Setup2Opt2,1,0), # Option 2 = Heavenborn
               IF(tSel_Race_Opt2=tSel_Race_Setup2Opt3,2,0), # Option 2 = Immortal Spark
               IF(tSel_Race_Opt2=tSel_Race_Setup2Opt4,3,0), # Option 2 = Truespeaker
               IF(tSel_Race_Opt1=tSel_Race_Setup1Opt2,5,0), # Option 1 = Celestial Crusader
               1)), # nothing else is picked
        tSel_Race_Setup7Opt1,
        tSel_Race_Setup7Opt2,
        tSel_Race_Setup7Opt3,
        tSel_Race_Setup7Opt4,
        tSel_Race_Setup7Opt5,
        "")

Racial Trait 3: Spell-Like Ability

This is our most complicated option, for several reasons:

  • Two of the "Skilled" abilities override it
  • One of them ("Immortal Spark") has a replacement Spell-Like Ability, also. We'll show that here, at the appropriate time.
  • The value for uses/day for Daylight (the default ability) has a numeric value that needs special processing
  • Fortunately, it only has one explicit alternative option, so we have fewer menu options to deal with.


="Daylight (Sp): 1/day, as the spell, CL"&i_CharacterLevel&IF(t_CM="",""," <"&t_CM&"> ")

this is the initial version, the final version is listed below

... later version is:

tSel_Race_Setup8Opt1: ="Daylight (Sp): "&ParseEffect("Nbr of Daylight Uses")&"/day, as the spell, CL"&i_CharacterLevel&IF(t_CM="",""," <"&REPT(t_CM,ParseEffect("Nbr of Daylight Uses"))&"> ")&IF(ParseEffect("Daylight Bonus Spell")=0,"",CRT&"Can alternatively cast: "&ParseEffect("Daylight Bonus Spell"))
tSel_Race_Setup8Opt2: ="Corruption Resisitance (Sp): 1/day against evil, as the spell, CL"&i_CharacterLevel&IF(t_CM="",""," <"&t_CM&"> ")&CRT&"If used on self, duration increases to 1 hour"
tSel_Race_Setup8Opt3: ="Lesser Age Resistance (Sp): 1/day, as the spell, CL"&i_CharacterLevel&IF(t_CM="",""," <"&t_CM&"> ")
tSel_Race_Setup8Opt4: =ErrStart&tSel_Race_Opt3&" can't be selected when "&tSel_Race_Opt2&" replaces the "&tSel_Race_OptDesc3&" trait"&ErrEnd


tSel_Race_RacialTrait3:

  1. no value option selected, default string
  2. Incorruptible selected in Option 3 (tSel_Race_Opt3), show replacement "Corruption Resistance" SLA it provides
  3. Heavenborn selected in Option 2 (tSel_Race_Opt2), show "" (Heavenborn provides no replacement power)
  4. Immortal Spark selected in Option 2, show replacement "Lesser Age Resistance" SLA it provides.
  5. tSel_Race_Opt3 <> "" AND (tSel_Race_Opt2 = "Heavenborn" OR tSel_Race_Opt2 = "Immortal Spark"), show error
=CHOOSE(IF(AND(OR(tSel_Race_Opt2=tSel_Race_Setup2Opt2,
                  tSel_Race_Opt2=tSel_Race_Setup2Opt3),
               tSel_Race_Opt3<>""),5,
           SUM(IF(tSel_Race_Opt3=tSel_Race_Setup3Opt2,1,0),
               IF(tSel_Race_Opt2=tSel_Race_Setup2Opt2,2,0),
               IF(tSel_Race_Opt2=tSel_Race_Setup2Opt3,3,0),
               1)
           ),
        tSel_Race_Setup8Opt1,
        tSel_Race_Setup8Opt2,
        "",
        tSel_Race_Setup8Opt3,
        tSel_Race_Setup8Opt4)

Racial Trait 4: Halo

strings in t_Race_SetupList9

Darkvision is already provided by the Outsider Type. It is already displayed as an ability on the INFO sheet. But it is not obvious that it is a Racial trait!

Strings for Race Options Setup 9:

tSel_Race_Setup9Opt1: Darkvision: Aasimar have darkvision 60 ft.
tSel_Race_Setup9Opt2: Halo (Sp): Can create light centered on the head at will. When active, +2 circumstance bonus on Intimidate checks vs evil creatures and saves vs. becoming blind or dazzled

tSel_Race_RacialTrait4:

=IF(tSel_Race_Opt4="Halo","Halo (Sp): Can create light centered on the head at will as the 'Light' spell. When active, +2 circumstance bonus on Intimidate checks vs evil creatures and saving throws to become blinded or dazzled","")

We have a couple of choices here. Since it's already provided by default, we can show an Empty string and let the user see it listed but not its source. Or, we can show the Darkvision special ability by default, and REPLACE it with the description for its alternative (Halo) when it's active.

This version shows a blank string for Darkvision:

=IF(tSel_Race_Opt4=tSel_Race_Setup4Opt2,tSel_Race_Setup9Opt2,"")

and this one the Darkvision string from the ARG:

=IF(tSel_Race_Opt4=tSel_Race_Setup4Opt2,tSel_Race_Setup9Opt2,tSel_Race_Setup9Opt1)
NOTE
We will be dealing with the EFFECTS for Darkvision in a bit.

Racial Trait 5: Scion of Humanity

strings in t_Race_SetupList10


Our final ability is somewhat exceptional, as not only is the visible string for languages based on a formula (which we've already done a bunch of times), but the dynamic values that change are right in the main Race definition.

tSel_Race_RacialTrait5:

=IF(tSel_Race_Opt5="Scion of Humanity","Scion of Humanity: Also counts as Human(humanoid) for any effects related to race.","")
# with strings in Setup 10
=IF(tSel_Race_Opt5=tSel_Race_Setup5Opt2,tSel_Race_Setup10Opt2,"")

In the main racial details, set the formula Subtype #2 (cell C64 in the current version) to:

=IF(tSel_Race_Opt5=tSel_Race_Setup5Opt2,"Human","")

The "Scion of Humanity" ability also changes the languages known, so in tSel_Race_NbrLang (Cell C87) we put this formula:

=IF(tSel_Race_Opt5="",2,1)

and in tSel_Race_Languages (Cell C88), we change the string "Common, Celestial" to the following formula:

="Common"&IF(tSel_Race_Opt5="",", Celestial","")


Congratulations, we've handled the text part!

Racial Abilities:

- Now we get into the EFFECTS!!!

About Abilities and Effects

Abilities are the core of how TOS+ handles character stats and rules. All abilities have space to put descriptive text for various situations, as well as up to 6 Effects. An EFFECT is anything that changes something on the sheet. The list of known effects on on the Effects sheet, and any known effect you add to a custom ability will be automatically added to the overall profile of your character (if it's active)! You can also add custom effects, but then you are responsible for processing them yourself. This is quite simple, and we'll see an example of this with the Spell-Like Ability trait and the Heavenly Radiance feat.

All abilities have a number of things in common. The columns are:

Columns for an Ability row
Column Function
Name If the NAME is empty, the ability isn't processed -- We'll take advantage of this a lot!
Text for Conditional Effects any text here will show up in the INFO box on the BACK sheet under a Conditional effects section. Whenever an effect grants a conditional effect (like, "All Conditional Saves", or "Conditional AC"), we put a description of the conditions where the bonus applies here, followed by the effect name in parentheses, like "+2 to swim checks and +1 AC when underwater (Underwater Fighter)"
Perm Effect
  • If the "Perm Effect" value is "Yes", the ability processed and live!
  • If the "Perm Effect" value is "No" or empty, then the ability is only active when it's activated on the LapTop sheet.
Advice whatever is listed here will show on the LapTop screen when an ability is selected as an active effect.


EFFECTS
Each Ability can have up to 6 different Effects.
Each Effect has 3 parts:
Column Function
Name This is the Effect name. Known effects are listed on the Effects sheet that can be opened from the Control sheet. Effect names are all matched by exact string comparison, so check your spelling. If blank, this effect is ignored.
Type This is used for stacking purposes. This is often the most important part! First, the numeric types:
  • Unnamed, Racial, Dodge, and Circumstance bonuses always stack (add together)
  • All other numeric types use only the highest (or lowest) value of that type. Examples: Deflection, Sacred, or Insight
  • There are also "Min Value" and "Max Value"
    • These values are often used for resistances and other abilities where the largest (or smallest) value is kept. But for an effect YOU are making, you needn't use Max Value if you want to change an existing effect with YOUR effect! In fact, you can cancel a Max Value effect completely by making an Unnamed effect negate its modifier value. See the Halo effect for an example.

If an effect has multiple types of bonus, then all the bonuses are first added by type, using the stacking rules, then the final values for each type are all added together.

  • and finally String types:
    • String (and Class Skill, Caster, and Manifester) types join all the values found together into a comma separated list

Be careful not to mix numeric and string type effects! The results are not predictable or guaranteed. :-)

If blank or an unrecognized Type, the effect is ignored.

Mod The actual modifier value. If blank or 0, the effect is ignored.
Example:
An EFFECT that gives a +1 Enhancement bonus to all melee attacks would look like:
Example: Effect granting +1 enhancement bonus to all Melee Attacks
Effect Name Effect Type Effect Modifier
All Melee Attacks Enhancement 1

About Racial Abilities

Racial Abilities are controlled from the "RACIAL EFFECTS" section (currently J5)

  • If the NAME is blank (even because of a formula), the ability is disabled and its effects are ignored.
  • If the NAME already exists as an Ability, the Status column will show "Using existing", the existing ability will be applied, and the rest of the values on this line will be ignored (and can be left blank). This is a great way to re-use an existing ability that already has the effects you want.
  • You can put formulas in the Mod values, to show different values under different conditions!
Aasimar (ARG) race ABILITY

The sheet already has an ability called "Aasimar race." It's a good start, but we're going to want to customize it, so we'll use it as a starting point.

Aasimar race
Racial trait Effect Name Effect Type Effect Modifier
Darkvision Darkvision (Ex) Max Value 60
Celestial Resistance Resistance to Acid (Ex) Max Value 5
Celestial Resistance Resistance to Electricity (Ex) Max Value 5
Celestial Resistance Resistance to Cold (Ex) Max Value 5
Skilled Diplomacy-p Racial 2
Skilled Perception-p Racial 2

We see a number of things here:

  • The first effect gives darkvision 60'. The "Max Value" works so that if something ELSE

gives Darkvision 60', then the value will be 60, not 120 (60+60). As it turns out, we don't need this effect at all! The "Outsider" race type already includes the identical effect, which gives us Darkvision for free! It also means we don't need to include the effect for it in our racial ability.

  • However, the Race *loses* darkvision if the Halo trait is picked. We'll handle that in the effect for Halo
  • The next 3 effect give the resistance mentioned in "Celestial Resistance": 5 acid, 5 electricity, 5 cold.
  • The next 2 effects give the skill bonuses for "Skilled": +2 each to Diplomacy and Perception.

My version is almost the same thing but with dynamic Modifier values. for example, for "Celestial Resistance," the resistance values are 0 when another trait is selected:

=IF(tSel_Race_Opt1="",5,0)

e.g. if a different Race Option is chosen instead of "Celestial Resistance" (which applies to all the resistance values) then the bonus for the original race trait is 0.

And now the effects:


Celestial Resistance effects
Effect Name Effect Type Effect Modifier
Resistance to Acid (Ex) Max Value
=IF(tSel_Race_Opt1="",5,0)
Resistance to Electricity (Ex) Max Value
=IF(tSel_Race_Opt1="",5,0)
Resistance to Cold (Ex) Max Value
=IF(tSel_Race_Opt1="",5,0)

Here again, we see the Modifier values becoming false if an alternative racial trait replaces this ability. Ths formula means: "TRUE if the Skilled alternative is empty, and the Celestial Resistance alternative is NOT Celestial Crusader" (because, remember, Celestial Crusader replaces both Celestial Resistance AND Skilled)

Skilled effects
Effect Name Effect Type Effect Modifier
Diplomacy-p Racial
=IF(AND(tSel_Race_Opt2="",
        tSel_Race_Opt1<>tSel_Race_Setup1Opt2
       ),2,0)
Perception-p Racial
=IF(AND(tSel_Race_Opt2="",
        tSel_Race_Opt1<>tSel_Race_Setup1Opt2
       ),2,0)

This value is 0 when: Skilled is either Heavenborn or Immortal Spark, or the Spell-Like Ability option is non-blank

Spell-Like Ability effect
Effect Name Effect Type Effect Modifier
Nbr of Daylight Uses Unnamed
=IF(OR(tSel_Race_Opt2=tSel_Race_Setup2Opt2,
       tSel_Race_Opt2=tSel_Race_Setup2Opt3,
       tSel_Race_Opt3<>""),
    0,1)

"Nbr of Daylight Uses" is not already in the sheet. I made up this effect! We'll explain in full detail when we reach FEATS.


- So, the full Ability looks like this:

Aasimar (ARG) race
Column Value
Name Aasimar (ARG) race
Perm Yes
Column Effect Name Effect Type Effect Modifier
Effect 1 Resistance to Acid (Ex) Max Value
=IF(tSel_Race_Opt1="",5,0)
Effect 2 Resistance to Electricity (Ex) Max Value
=IF(tSel_Race_Opt1="",5,0)
Effect 3 Resistance to Cold (Ex) Max Value
=IF(tSel_Race_Opt1="",5,0)
Effect 4 Diplomacy-p Racial
=IF(AND(tSel_Race_Opt2="",
        tSel_Race_Opt1<>tSel_Race_Setup1Opt2
       ),2,0)
Effect 5 Perception-p Racial
=IF(AND(tSel_Race_Opt2="",
        tSel_Race_Opt1<>tSel_Race_Setup1Opt2
       ),2,0)
Effect 6 Nbr of Daylight Uses Unnamed
=IF(OR(tSel_Race_Opt2=tSel_Race_Setup2Opt2,
       tSel_Race_Opt2=tSel_Race_Setup2Opt3,
       tSel_Race_Opt3<>""),0,1)

OPTIONAL TRAIT EFFECTS:

We make the names of these optional effects appear BLANK unless they are selected in the Traits. This disables them until they're active.

Celestial Crusader ABILITY
Rule
Some aasimars follow their destiny to war against the powers of ultimate evil. These individuals gain a +1 insight bonus on attack rolls and to AC against evil outsiders and a +2 racial bonus on Knowledge (planes) and Spellcraft checks to identify evil outsiders or items or effects created by evil outsiders; they may use these skills untrained for this purpose.

We have 2 things going on here:

  • some conditional skills
  • The conditional skills apply all the time (and are shown in INFO), so Perm: YES
  • a conditional AC and attack bonus.
  • the sheet has support for conditional AC, but not conditional Attacks. this gives us two possible approaches:
    • Set Conditional AC (which will show as a +1 next to the armor class, and "Celestial Crusader" on the tooltip) and let the user add the +1 themselves when fighting evil outsiders.
    • Make a DIFFERENT, non-permanent effect for the AC & Attack bonus, that will be selectable on the LapTop sheet.


Celestial Crusader
Column Value
Name
=IF(tSel_Race_Opt1="Celestial Crusader",tSel_Race_Opt1,"")
Text for Conditional Effects '+2 racial bonus on Knowledge: Planes and Spellcraft checks to identify evil outsiders or items or effects created by evil outsiders; May use these skills untrained for this purpose (Celestial Crusader)
Perm Yes
Column Effect Name Effect Type Effect Modifier
Effect 1 Conditional Knowledge: Planes-p Racial 2
Effect 2 Conditional Knowledge: Spellcraft-p Racial 2
Effect 3 Conditional Armor Class Insight 1


Remember: this effect replaces the standard "Celestial Resistance" values... but those automatically become 0 when this option is selected!

but if we want a laptop effect, remove Ability 3 above and add a NEW Ability row:

Celestial Crusader vs. evil outsiders ABILITY
Column Value
Name
=IF(tSel_Race_Opt1="Celestial Crusader","Celestial Crusader vs. evil outsiders","")
Text for Conditional Effects '+1 insight bonus to attack vs. evil outsiders (Celestial Crusader)
Perm No
Advice: '+1 insight bonus to attack vs. evil outsiders
Column Effect Name Effect Type Effect Modifier
Effect 1 All Attacks Insight 1
Effect 2 Armor Class Insight 1

Congratulations! You've just created your first Dynamic Effect!

If the user switches the the LapTop sheet, and the List for Active Effects is set to "Class/Race Abilities", then at the bottom of the list will be a section for Aasimar (ARG) Race, with the option "Celestial Crusader vs. evil outsiders" available. When selected, the text from the Advice column above will show next to the effect name, and the AC and attack bonuses will update. If you click on the [Details] button, or look at the INFO section on the back, you will see a section for "---| Conditional Bonus - Active Effects |---" and our conditional text above. The Active Effects sheet is pretty smart... of you put "off" in the right-hand column, for duration, the effect description will show that, and the bonuses will go away.

All by setting Perm = "No"!

Deathless Spirit ABILITY

Rule
They gain resistance 5 against negative energy damage. They do not lose hit points when they gain a negative level, and they gain a +2 racial bonus on saving throws against death effects, energy drain, negative energy, and spells or spell-like abilities of the necromancy school.


Deathless Spirit
Column Value
Name
=IF(tSel_Race_Opt1="Deathless Spirit",tSel_Race_Opt1,"")
Text for Conditional Effects '+2 racial bonus on saves vs. death effects, energy drain, negative energy, and spells or spell-like abilities of the necromancy school (Deathless Spirit)
Perm Yes
Column Effect Name Effect Type Effect Modifier
Effect 1 Resistance to Negative Energy (Ex) Max Value 5
Effect 2 All Conditional Saves Racial 2
Effect 3 Hit Points Unnamed
=IF(COUNTIF(t_ActiveEffectNames,"Energy Drained"),
    IF(VLOOKUP("Energy Drained",t_ActiveEffects,index_LapTop_AETime,FALSE)<>"off", 
       VLOOKUP("Energy Drained",t_ActiveEffects,index_AEMod,FALSE)*5,
       0),
    0)
Note
I made up the resistance effect, based on other effect names, but it's not currently implemented by the sheet. I could leave it out, because it "doesn't do anything," but if the sheet ever supports it, then it's already implemented. It does no harm to have "extra" effects enabled, even if they don't do anything...

Let's see what this formula for hit points is about:

  • "They do not lose hit points when they gain a negative level"
  • The Sheet tracks lost levels with "Energy Drained"
  • Each level of Energy Drained gives a -5 Hit Points
  • We want to give a +5 hit points for each level when Energy Drain is enabled
  • The check for Energy Drained being active is twofold:
    # returns 1 or more, a true value, if it's selected)
    COUNTIF(t_ActiveEffectNames,"Energy Drained")
    # And the TIME column is NOT set to "off"
    VLOOKUP("Energy Drained",t_ActiveEffects,index_LapTop_AETime,FALSE)<>"off"
    The value for the number of levels drained is in:
    VLOOKUP("Energy Drained",t_ActiveEffects,index_AEMod,FALSE)
    • so the number of hitpoints is that value * 5
LAPTOP tracked effect value
If EffectNames has "Energy Drained", and VLOOKUP({ the time value }) for that effect <> "off" , then read the number of drained levels from it of it and multiply by 5 hit points.
=IF(COUNTIF(t_ActiveEffectNames,"Energy Drained"),
    IF(VLOOKUP("Energy Drained",t_ActiveEffects,index_LapTop_AETime,FALSE)<>"off", 
       VLOOKUP("Energy Drained",t_ActiveEffects,index_AEMod,FALSE)*5,
       0),
    0)
Remember
this effect replaces the standard "Celestial Resistance" values... but those automatically become 0 when this option is selected!
Truespeaker ABILITY
Rule
There are some aasimars whose language transcends all boundaries. They gain a +2 bonus on Linguistics and Sense Motive checks, and they learn two languages each time they gain a rank in Linguistics.

- Since the rules say, gain 1 language for each rank of Linguistics, and we want to double that, we're just going to add the same amount again to Languages.

Truespeaker
Column Value
Name
=IF(tSel_Race_Opt2="Truespeaker",tSel_Race_Opt2,"")
Perm Yes
Column Effect Name Effect Type Effect Modifier
Effect 1 Linguistics-p Unnamed 2
Effect 2 Sense Motive-p Unnamed 2
Effect 3 Languages Unnamed
=rankp_Linguistics
Heavenborn ABILITY
Rule
Born in the celestial realms, aasimars with this racial trait gain a +2 bonus on Knowledge (planes) checks and they cast spells with the good or light descriptor at +1 caster level.
Heavenborn
Column Value
Name
=IF(tSel_Race_Opt2="Heavenborn",tSel_Race_Opt2,"")
Perm Yes
Column Effect Name Effect Type Effect Modifier
Effect 1 Knowledge: Planes-p Unnamed 2
Effect 2 Good Caster Level (Spell Effects) Unnamed 1
Effect 3 Light Caster Level (Spell Effects) Unnamed 1
Immortal Spark ABILITY
Rule
Aasimars with this racial trait defy the powers of death. They gain a +2 bonus on Knowledge (history) checks and saving throws against death effects and can use lesser age resistance once per day as a spell-like ability.
Immortal Spark
Column Value
Name
=IF(tSel_Race_Opt2="Immortal Spark",tSel_Race_Opt2,"")
Perm Yes
Conditional Text '+2 to saves vs. death effects (Immortal Spark)
Column Effect Name Effect Type Effect Modifier
Effect 1 Knowledge: History-p Unnamed 2
Effect 2 All Conditional Saves Unnamed 2
Halo ABILITY
Rule
Some aasimars possess the ability to manifest halos. An aasimar with this racial trait can create light centered on her head at will as a spell-like ability. When using her halo, she gains a +2 circumstance bonus on Intimidate checks against evil creatures and on saving throws against becoming blinded or dazzled.

This ability presents an issue:

  • The "Outsider" type already has the effect Darkvision | Max Value | 60
  • But with this ability selected, we want to LOSE Darkvision
  • After adding values by type (with the right stacking rules applied), all the different bonuses are added.
  • So, set our effect to Darkvision | Unnamed | -60
Immortal Spark
Column Value
Name
=IF(tSel_Race_Opt4="Halo",tSel_Race_Opt4,"")
Perm Yes
Conditional Text '+2 circumstance bonus on Intimidate checks vs evil creatures and saving throws to become blinded or dazzled, when active (Halo)
Column Effect Name Effect Type Effect Modifier
Effect 1 Darkvision (Ex) Unnamed -60
Effect 2 Conditional Intimidate-p Circumstance 2
Effect 3 All Conditional Saves Circumstance 2
Exalted Resistance ABILITY
Rule
An aasimar with this racial trait gains spell resistance (SR) equal to 5 + her level against spells and spell-like abilities with the evil descriptor, as well as any spells and spell-like abilities cast by evil outsiders.
Immortal Spark
Column Value
Name
=IF(tSel_Race_Opt1="Exalted Resistance",tSel_Race_Opt1,"")
Perm Yes
Conditional Text
="SR"&i_CharacterLevel+5&" vs. spells and spell-like abilities with the evil descriptor, "&
 "as well as any spells and spell-like abilities cast by evil outsiders (Exalted Resistance)"
Column Effect Name Effect Type Effect Modifier
Effect 1 Conditional Spell Resistance (Ex) Circumstance
=i_CharacterLevel+5
Remember
this effect replaces the standard "Celestial Resistance" values... but those automatically become 0 when this option is selected!


That's all for the Race... next up, Feats!