Skill Cost and CSKILL Overhaul

From PCGen
Jump to: navigation, search

Introduction

Pathfinder does not have the concept of "Cross-Class" skills, instead it has a Class skills and "Non Class" skills, with equal cost, but Class skills getting a bonus. Display name of Non Class skills is important, since the Cost of both Class and Non Class skills is the same.

In order to accomplish this, and remove hardcoding for future game systems, this is a proposal to move much of the back-bone framework of class skill lists into GameMode defined terms. The other major goal is to remove ambiguity, especially in the global vs. class-only tags "CSKILL" and "CCSKILL".

Current discussion notes

So I've thought about the ADDTOLEVEL issues, and I don't think that works well as proposed. The challenge in what was proposed is that CL has a specific meaning in formula, and we don't want to change that based on the context - meaning in this formula and not in others. That's very difficult to get correct... I ran through about 4 alternatives only to find they have some other problem, so it's easiest to just define a new variable (I use CSL - that's open for discussion), and keep the concept of ADDTOLEVEL as Tir defined it.

This is an updated proposal based on the discussions - can we have someone wikify this, please? (Done, that is this page. :p - Tir)

Note there are still 4 open issues, some with "R1" "R2" (response 1, response 2) showing the ongoing discussion that is not resolved. I left "D" open due to the SpellList discussions that took place and just wanted to double check on what this should be.

Game Mode Level file changes

  1. Deprecate CSKILLMAX {value placed into SKILLCOSTGROUP:
    MAXRANKBASE and MAXRANKINCREMENT, 2h, 2i}
  2. Deprecate CCSKILLMAX {value placed into SKILLCOSTGROUP:
    MAXRANKBASE and MAXRANKINCREMENT, 2h, 2i}

Game Mode Misc Info File changes

(2a) Deprecate SKILLCOST_CLASS [default is 1 if not used in Game Mode Misc Info file] {value placed into COST, 2f}
(2b) Deprecate SKILLCOST_CROSSCLASS [default is 2 if not used in Game Mode Misc Info file] {value placed into COST, 2f}
(2c) Deprecate SKILLCOST_EXCLUSIVE [default is 0 (illegal to "buy") if not used in Game Mode Misc Info file] {value placed into COST, 2f}
(2d) Create a new line Tag SKILLCOSTGROUP: in Game Mode Misc Info
(2e) Create a new token in SKILLCOSTGROUP: line, called DISPLAY, is display name
(2f) Create a new token in SKILLCOSTGROUP: line, called COST, special value PROHIBITED (for SRD EXCLUSIVE cost), takes an integer
(2g) Create a new variable called CSL (Class Skill Level), controlled by the ADDTOLEVEL item {see 2h}. This variable must be resolved in context to a ClassSkillList (if you don't understand what this means, it's a code thing {the source argument to getVariableValue}, not a data thing)
(2h) Create a new token in SKILLCOSTGROUP: line, called ADDTOLEVEL, controls CSL variable
(2i) Create a new token in SKILLCOSTGROUP: line, called MAXRANK, takes a Formula.
(2j) Create a new token in SKILLCOSTGROUP: line, called MODIFIER, defines how the base formula for a skill is derived. (assists Pathfinder.)
(2j1 - ISSUE A) MODIFIER cannot be used if COST is PROHIBITED? R1- why not? I don't think it will do anything... R2- Because if it doesn't perform a function, there isn't need to let a user do it - leads to false expectations of behavior.
(2k - ISSUE B) Looking at the docs, spotted a UI Change. Right now, there is Max Ranks for Class and Cross class skills. I think that will need to be dynamically set up from the GameMode defines? Would that require another tag in the SKILLCOSTGROUP line, or should we just show them all? R1 - where is this in the UI?
(2l) Create a new token in SKILLCOSTGROUP: line, called DEFAULTCOST: takes argument YES. Is allowed on one (and only one) SKILLCOSTGROUP line.

Potential Examples of gamemode tags (3.5e doesn't have Exclusive, but you get the idea, separate lines in the LST file are separated by blank lines in this message)

<gamemode 3.0/3.5> SKILLCOSTGROUP:CLASS DISPLAY:Class COST:1
ADDTOLEVEL:YES MAXRANK:CSL+3 MODIFIER:min(RANK,MAXRANK)+KEYSTAT

SKILLCOSTGROUP:CROSSCLASS DISPLAY:Cross Class COST:2
ADDTOLEVEL:YES MAXRANK:(CSL+3)/2 MODIFIER:min(RANK,MAXRANK)+KEYSTAT

SKILLCOSTGROUP:EXCLUSIVE DISPLAY:Exclusive COST:PROHIBITED
ADDTOLEVEL:NO MAXRANK:0 MODIFIER:KEYSTAT

<pathfinder> SKILLCOSTGROUP:CLASS DISPLAY:Class COST:1
ADDTOLEVEL:YES MAXRANK:CSL MODIFIER:min(RANK,MAXRANK)+KEYSTAT+if(RANK>=1,TrainedBonus,0)

SKILLCOSTGROUP:NONCLASS DISPLAY:Non-Class COST:1
ADDTOLEVEL:YES MAXRANK:CSL MODIFIER:min(RANK,MAXRANK)+KEYSTAT

Global LST changes

Deprecations

(3a) Deprecate CSKILL, CCSKILL {replaced by SKILLCOST, 3c}

For CSKILL outside of CLASS LST files, just use SKILLCOST: SKILLCOST:CLASS|ALL|Knowledge (Arcana)

NOTE: SKILLCOST does not behave differently in CLASS files, if you want the effect of CSKILL in a Class LST file, you must use the Class as an argument to SKILLCOST, see below.

(3b) Deprecate MONCSKILL, MONCCSKILL {replaced by SKILLCOST, 3c}

MONCSKILL changes to look like: SKILLCOST:CLASS|TYPE=Monster|Knowledge (Arcana)

SKILLCOST Global tag

(3c) Create SKILLCOST

Syntax:
SKILLCOST:x|[CLASSLIST=y|]z,z
SKILLCOST:.CLEARALL

Variables Used (x): Skill Cost from Game Mode File 
  (COST in Game Mode file for this Skill Cost must NOT be PROHIBITED)

Variables Used (y): CLASSLIST=ALL (Default)
Variables Used (y): CLASSLIST=Text (Class Name)
Variables Used (y): CLASSLIST=TYPE.Text (Class Type) (Alternate CLASSLIST=TYPE=Text)
Variables Used (y): CLASSLIST=CLASSLIST 
  (usable only in CLASS objects, for ease of .COPY, refers to containing class name)
Variables Used (y): CLASSLIST=PARENTCLASS
  (usable only in Domain objects, adds to class that grants domain object)
Variables Used (z): Text (Skill name)
Variables Used (z): TYPE=Text (Skill type)
Variables Used (z): ALL (all skills)
Variables Used (z): LIST (pulls from items selected in the CHOOSE: token in the object)

Examples:
SKILLCOST:CLASS|Spot,Listen
  Add Spot and Listen to Class skills for all of character's classes
SKILLCOST:CROSSCLASS|CLASSLIST=Spy|Read Lips
  Add Read Lips as a Cross Class from Exclusive for the "Spy" class.
SKILLCOST:CLASS|CLASSLIST=CLASSLIST|Use Magic Device
  Add Use Magic Device to current Class object (in class.lst)
SKILLCOST:CLASS|CLASSLIST=PARENTCLASS|Knowledge (History)
  Knowledge (History) becomes a class skill for class granting domain

(3d - ISSUE D)

There are some interactions we need to resolve:

CLASS:Foo SKILLCOST:CLASS|CLASS|Sk1 SKILLCOST:CLASS|Foo|Sk2 SKILLCOST:CLASS|ANY|Sk3

CLASS:Bar=Foo.COPY SKILLLIST:1,Foo

So what does Bar's Class Skill List look like? Does it contain Sk1, Sk2, and/or Sk3?

CLASS:BooHoo SKILLLIST:1,Foo

So what does BooHoo's Class Skill List look like? Does it contain Sk1, Sk2, and/or Sk3?

CLASS:Goo=Foo.COPY SKILLLIST:1,Ranger

So what does Goo's Class Skill List look like? Does it contain Sk1, Sk2, and/or Sk3?

The key questions center around whether CLASS in this case is a "special" entry that places the item on to a "Class Skill List" (like the CLASSES token in the Skill file does)... and whether other entries that assign directly to the class from within the class perform the same special function, etc.

Examples using Syntax option #2:

in class.lst, CSKILL goes to: SKILLCAT:CLASS|CLASS|<skill1>,<skill2>

in other object files, CSKILL goes to: SKILLCAT:CLASS|ALL|<skill1>,<skill2>

CCSKILL in class goes to SKILLCAT:CROSSCLASS|CLASS|<skill1>,<skill2>

MONCSKILL goes to: SKILLCAT:CLASS|TYPE=Monster|<skill1>,<skill2>

Global CHOOSE changes

(4a) Deprecate CHOOSE:CCSKILLLIST, CHOOSE:CSKILLS, CHOOSE:NONCLASSSKILLLIST, CHOOSE:SKILLS, CHOOSE:SKILLSNAMED, CHOOSE:SKILLSNAMEDTOCCSKILL, CHOOSE:SKILLSNAMEDTOCSKILL {replaced by a combination of 3c [LIST] and 4b}

CHOOSE:SKILLS [currently has no args] would change to:

CHOOSE:SKILLS|USEUNTRAINED=YES|MINRANK=1

CHOOSE:SKILLSNAMEDTOCSKILL|CROSSCLASS would change to:

CHOOSE:SKILLS|SKILLCOST=CROSSCLASS SKILLCOST:CLASS|LIST

others have similar changes

(4b) Rebuild CHOOSE:SKILLS similar to the CHOOSE:SPELLS in 5.14

Tag Name: CHOOSE:SKILLS|x,y|x|y Variables Used (x): Text (Skill name) Variables Used (x): Text% (Skill name pattern) Variables Used (x): TYPE=Text (Skill type) Variables Used (y): ALL Variables Used (y): CLASSLIST=Text (Class name) Variables Used (y): SKILLCOST=Text (Skill Cost from Game Mode File) Variables Used (y): !SKILLCOST=Text (Skill Cost from Game Mode File) Variables Used (y): MINRANK=Number (Mininum Number of Ranks) Variables Used (y): MAXRANK=Number (Maximum Number of Ranks) Variables Used (y): USEUNTRAINED=Text ("YES" or "NO")

, is AND | is OR

CHOOSE:SKILLS|MINRANK=1,MAXRANK=4|TYPE=Knowledge,MAXRANK=4

List all skills where - the PC has at least one rank and at most 4 ranks OR - the Skill is TYPE=Knowledge and the PC has <= 4 ranks

Global ADD Changes

(5a) Deprecate ADD:CLASSSKILLS (5b) Build ADD:SKILLCOST

Tag Name: ADD:SKILLCOST:v|w|u|x,y Variables Used (v): Skill Cost from Game Mode File (COST in Game Mode file for this Skill Cost must NOT be PROHIBITED) Variables Used (w): Number, Variable or Formula (Number of choices granted. Optional) Variables Used (x): Text (Name of skill) Variables Used (x): TYPE=Text (Type of skill) Variables Used (y): ANY Variables Used (y): CLASSLIST=Text (Class name) Variables Used (y): SKILLCOST=Text (Skill Cost from Game Mode File) Variables Used (y): SKILLCOST!=Text (Skill Cost from Game Mode File) Variables Used (y): USEUNTRAINED=Text ("YES" or "NO") Variables Used (u): [OPTIONAL] AUTORANK=Number (Number of free ranks granted to selections)

Global PRExxx changes

(6a) Deprecate PRECSKILL

(6b) Build PRESKILLCOST

Syntax: PRESKILLCOST:x,y,z,z

x is a number y is a Skill Cost from the Game Mode File z is a skill or TYPE=Text

Skill LST Changes

(7a) Deprecate EXCLUSIVE:YES {replaced by 7b, DEFAULTSKILLCOST:EXCLUSIVE}

(7b) Create a new SKILL token, DEFAULTSKILLCOST, can take any SKILLCOSTGROUP as the argument

DEFAULTSKILLCOST:EXCLUSIVE replaces EXCLUSIVE:YES in Skills for those that start as "EXCLUSIVE" rather than CROSSCLASS.