Race Racial Trait Swapping

From PCGen Wiki
Revision as of 03:22, 9 March 2018 by Tom Parker (talk | contribs) (Considerations)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search


Background

Note that the basics for Replacing Archetype Controls is available

Challenge

Race is granted 'default' traits as a standard. Paizo has introduced two systems of concern:

  1. "Race Package" where a race is granted specific non-default traits
  2. "Race Package" where a race if granted a choice between two or more additional choices
  3. Racial Trait that is chosen by the player actually removes 2 or more existing default traits

Potential Solutions Challenge #1

This seems straight-forward to me. The Race Package can simply have:

MODIFYOTHER:RACE|Elf|Feature_Good|SET|DifferentFeature|PRIORITY=400

The variable assignments are very similar to what is shown in Replacing Archetype Controls.

Potential Solutions Challenge #2

This involves a choice, thus interacts with SELECTION - A CHOOSE Replacement. This section is deferred until some changes and clarifications are made on that page with respect to how instances will work (there are multiple methods of causing instances and that is not currently clear).

Potential Solutions Challenge #3

I'm not sure there are multiple possible solutions here. I think this is straightforward.

Filler Object

Let's assume we have a Racial Trait "Super" that replaces "Good" and "Lucky".

This presumes we have done:

DYNAMICSCOPE:RACEFEATURE

In VARIABLE file:

LOCAL:RACE|RACEFEATURE=Feature_Lucky
LOCAL:RACE|RACEFEATURE=Feature_Good

So on our race we had:

MODIFY:Feature_Lucky|SET|Default_Feature_Lucky
MODIFY:Feature_Good|SET|Default_Feature_Good

On our Trait we can do:

MODIFYOTHER:RACE|Elf|Feature_Good|SET|SuperFeature|PRIORITY=400

Then we need to remove Default_L3_Feature_Lucky. I would probably recommend something like:

MODIFYOTHER:RACE|Elf|Feature_Lucky|SET|EmptyFeature|PRIORITY=400

EmptyFeature would then be an object with nothing in it.

Justification

Keep in mind if we have a DYNAMIC of RACEFEATURE (which Default_Feature_Lucky is one implementation) then we need a default value for that object type. So it's already likely that we have an "EmptyFeature" set up to be the default value for a variable of the RACEFEATURE FORMAT.

Array

One possible alternative would be to have an ARRAY[RACEFEATURE] that contains all of the traits for a given level.

In VARIABLE file:

LOCAL:RACE|ARRAY[RACEFEATURE]=Features

So on our race we had:

MODIFY:Features|ADD|Default_Feature_Lucky+Default_Feature_Good

On our Trait we can do:

MODIFYOTHER:RACE|Elf|Features|SET|SuperFeature|PRIORITY=400

Considerations

In this case, we need to look at what it would be like for a class to replace only one of the features.

On our Trait we can do:

MODIFYOTHER:RACE|Elf|Features|SET|value()-Default_Feature_Good+Default_Feature_Better|PRIORITY=400

or alternatively:

MODIFYOTHER:RACE|Elf|Features|ADD|Default_Feature_Better|PRIORITY=400
MODIFYOTHER:RACE|Elf|Features|REMOVE|Default_Feature_Good|PRIORITY=400

Considerations:

  1. We have avoided adding an empty shell to the PC
  2. We are making (risky?) assumptions of what we are replacing
  3. We start to get into order of operations problems between features that touch different features (think of this more broadly in terms of Archetypes that can impact different items at the same level both being usable together), so it increases the cross-data interaction

In general, I think this is a bad idea due to the built-in assumptions.