Advanced Race Creation Guide: Difference between revisions

From Wiki for The Only Sheet
Jump to navigation Jump to search
Line 445: Line 445:
; 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!''
; 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, <tt>i_CharacterLevel+1</t>
- also note the dynamic value for Heavenborn, <tt>i_CharacterLevel+1</tt>


So our values for CHOOSE() are:
So our values for CHOOSE() are:

Revision as of 02:20, 30 January 2013

[this page is under heavy construction!]

Advanced Race Creation Guide:

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

INTRODUCTION

TOS+ lets you create almost any custom D&D 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 Classes.

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

But very few races are 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").

On the left side, are blanks for the option Labels. 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 heaing "Player selection:") 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 what Race options are available, we want to offer the user a dropdown list of valid choices. Using the magic 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 Names

Every place in TOS+ that takes user input has both an Address on the individual sheet and a Name. 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.

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 & " replaces " & tSel_Race_OptDesc1 (the name of the option slot)

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:

Item						Name			Type		Value
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 the stacking rules are handled automatically!

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

Name						Type		Value
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 page, 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 Guild 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
  • Truspeaker: 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"

  • 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"!

Now we look at the other Racial traits, that 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.)

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, an 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 type. But these blanks are "magic" in that if we put a list of alternatives in the right spot, the blanks will become dropdowns with the available options filled in. 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
CRT		Carriage Return and indent
BULLETA 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.

  • 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.

- So we 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 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.", "Deathless Spirit: resistance 5 against negative energy damage. Do not lose hit points when  gaining a negative level, and +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.")
=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.

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.

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 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:

=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

-: > 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 options 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 Abilities of its own. 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 "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:

strings in t_Race_SetupList10


Our final ability is somewhat exceptional, as not only is the visible string 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.","")

  1. 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_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 Effects:

- Now we get into the EFFECTS!!!

About Effects

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

  • Effect Name: If the NAME is empty, the effect isn't processed -- We'll use this a lot!
  • Text for Conditional Effects: anything here will show up in INFO under Conditional effects for (where the effect is defined).
  • Perm Effect:
  • If the "Perm Effect" value is "Yes", the effect processed and live!
  • If the "Perm Effect" value is "No" or empty, then the effect is only active when it's activated on the LapTop sheet.
  • Advice: whatever is listed here will show on the LapTop screen when an effect is selected.

MODIFIERS: Each effect can have up to 6 different modifiers. Each modifier has 3 parts:

  • Name:

This is the EFFECT name. Known effects are listed on the Effects sheet that can be opened by control It is OK to make up your own effect names, but they will be ignored by the sheet unless YOU use them We'll show an example of this later!!

  • Type: This is used for stacking purposes. This is often the most important part!
Unnamed, Racial, Dodge, and Circumstance bonuses always stack (add together)
All other numneric types use only the highest (or lowest) value:
like Deflection, Sacred, or Insight
there are also "Min Value" and "Max Value"
and finally String types:
String (and Class Skill, Caster, and Manifester) types join all the values found together into a comma separated list
  • Mod: The actual modifier value
Example:
A MODIFIER that gives a +1 Enhancement bonus to all melee attacks would look like: >
All Melee Attacks | Enhancement | 1

About Racial Effects

- Racial Effects are controlled from the "RACIAL EFFECTS" section (currently J5) - If the NAME is blank (even because of a formula), the effect is disabled - If the NAME already exists as an Ability, the Status column will show "Using existing" and the rest of the effect values will be ignored (and can be left blank) - You can put formulas in the Mod values, to show different values under different conditions!

"Aasimar (ARG) race" EFFECT

- The sheet already has an effect 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":

Darkvision
Darkvision (Ex) | Max Value | 60
Celestial Resistance
Resistance to Acid (Ex) Max Value | 5 | Resistance to Electricity (Ex) | Max Value | 5 | Resistance to Cold (Ex) | Max Value | 5
Skilled
Diplomacy-p | Racial | 2 | 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 gives Darkvision for free!

  • 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 modifiers:

(Celestial Resistance trait)

  1. Resistance to Acid (Ex) | Max Value | =IF(tSel_Race_Opt1="",5,0)
  2. Resistance to Electricity (Ex) | Max Value | =IF(tSel_Race_Opt1="",5,0)
  3. Resistance to Cold (Ex) | Max Value | =IF(tSel_Race_Opt1="",5,0)

(Skilled trait)

  1. Diplomacy-p | Racial | =IF(AND(tSel_Race_Opt2="",tSel_Race_Opt1<>tSel_Race_Setup1Opt2),2,0)
  2. Perception-p | Racial | =IF(AND(tSel_Race_Opt2="",tSel_Race_Opt1<>tSel_Race_Setup1Opt2),2,0)

(Spell-Like Ability)

  1. Nbr of Daylight Uses
    | Unnamed | =IF(OR(tSel_Race_Opt2=tSel_Race_Setup2Opt2,tSel_Race_Opt2=tSel_Race_Setup2Opt3,tSel_Race_Opt3<>""),0,1)

- I made up this effect! - We'll explain in full detail when we reach FEATS. - Nbr of Daylight Uses = 0 if: ("Heavenborn" or "Immortal Spark" in Skilled slot), or (Spell-Like Ability slot is not empty) =IF(OR(tSel_Race_Opt2=tSel_Race_Setup2Opt2,tSel_Race_Opt2=tSel_Race_Setup2Opt3,tSel_Race_Opt3<>""),0,1)

your table stuff

- So, the full Effect looks like this:

  • Name: Aasimar (ARG) race
  • Conditional text:
  • Perm: Yes
  • Advice:
  • 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" EFFECT

- First of all, the rule text: > 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.

- since tSel_Race_Setup1Opt2 = "Celestial Crusader":

Name: =IF(tSel_Race_Opt1="Celestial Crusader",tSel_Race_Opt1,"") Perm: Yes Effect 1: Conditional Knowledge: Planes-p | Racial | 2 Effect 2: Conditional Spellcraft-p | Racial | 2 - and, if we are doing it the simple way: 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, ignore "Effect 3" above and add a NEW Effect row: "Celestial Crusader Attack" EFFECT (LapTop effect)


Name: =IF(tSel_Race_Opt1="Celestial Crusader","Celestial Crusader Attack","") Perm: No Advice: '+1 insight bonus to attack vs. evil outsiders Effect 1: All Attacks | Insight | 1 Effect 2: Armor Class | Insight | 1

"Deathless Spirit" EFFECT

- Rule text: > 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.

since tSel_Race_Setup1Opt3 = "Deathless Spirit":

Name: =IF(tSel_Race_Opt1="Deathless Spirit",tSel_Race_Opt1,"") Perm: Yes (note, I made up the resisitance effect, based on other effect names, but it's not currently implemented by the sheet) 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)

- 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:

  1. returns 1 or more, a true value, if it's selected)

- COUNTIF(t_ActiveEffectNames,"Energy Drained")

  1. 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

  1. LAPTOP tracked effect value:
  2. If Effectnames has has it, and vlookup (time) <> "off", then read the HP off of it to cancel the effect!!

=IF(AND(COUNTIF(t_ActiveEffectNames,"Energy Drained"),VLOOKUP("Energy Drained",t_ActiveEffects,index_LapTop_AETime,FALSE)<>"off"), VLOOKUP("Energy Drained",t_ActiveEffects,index_AEMod,FALSE)*5 0)

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

"Truespeaker" EFFECT

-: > 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.

Name: =IF(tSel_Race_Opt2="Truespeaker",tSel_Race_Opt2,"") Perm: Yes Effect 1: Linguistics-p | Unnamed | 2 Effect 2: Sense Motive-p | Unnamed | 2 Effect 3: Languages | Unnamed | =rankp_Linguistics


"Heavenborn" EFFECT

-: >

  • 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.

Name: =IF(tSel_Race_Opt2="Heavenborn",tSel_Race_Opt2,"") Perm: Yes 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" EFFECT

-: > 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.

Name: =IF(tSel_Race_Opt2="Heavenborn",tSel_Race_Opt2,"") Perm: Yes Effect 1: Knowledge: History-p | Unnamed | 2 Effect 2: All Conditional Saves | Unnamed | 2


"Halo" EFFECT

-: > 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 tricky issue: - The "Outsider" type already grants Darkvision 60 - which is a Max Value - But with this ability selected, we want to LOST Darkvision - So, set the value to -60

Name: =IF(tSel_Race_Opt4="Halo",tSel_Race_Opt4,"") Conditional Text: '+2 circumstance bonus on Intimidate checks vs evil creatures and saving throws to become blinded or dazzled, when active (Halo) Perm: Yes Effect 1: Darkvision (Ex) | Unnamed | 60 Effect 2: Conditional Intimidate-p | Circumstance | 2 Effect 3: All Conditional Saves | Circumstance | 2


"Exalted Resistance" EFFECT

-: > 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.

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

Name: =IF(tSel_Race_Opt1="Exalted Resistance",tSel_Race_Opt1,"") Perm: Yes Effect 1: Conditional Spell Resistance (Ex) | Unnamed | Yes


That's all for the Class... next up, FEATS!

- 01-29-13-16-26