@opencharacter/orc-sf-2e 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/README.md +54 -5
  2. package/content/classes/envoy.yaml +2 -52
  3. package/content/classes/mystic/connections/akashic.yaml +1 -1
  4. package/content/classes/mystic/connections/elemental.yaml +62 -1
  5. package/content/classes/mystic/connections/healing.yaml +1 -1
  6. package/content/classes/mystic/connections/rhythm.yaml +1 -1
  7. package/content/classes/mystic/connections/shadow.yaml +1 -1
  8. package/content/classes/mystic.yaml +2 -51
  9. package/content/classes/operative.yaml +1 -44
  10. package/content/classes/solarian.yaml +1 -44
  11. package/content/classes/soldier.yaml +2 -51
  12. package/content/classes/witchwarper/anchors/core-memories.yaml +1 -1
  13. package/content/classes/witchwarper/anchors/focal-point.yaml +1 -1
  14. package/content/classes/witchwarper/anchors/tangible-object.yaml +1 -1
  15. package/content/classes/witchwarper/paradoxes/analyst.yaml +1 -1
  16. package/content/classes/witchwarper/paradoxes/anomaly.yaml +1 -1
  17. package/content/classes/witchwarper/paradoxes/lost-history.yaml +1 -1
  18. package/content/classes/witchwarper/paradoxes/precog.yaml +1 -1
  19. package/content/classes/witchwarper.yaml +3 -55
  20. package/content/effects/treated-disease.yaml +4 -0
  21. package/content/effects/treated-poison.yaml +4 -0
  22. package/content/feats/ancestry/fixation.yaml +11 -49
  23. package/content/feats/ancestry/harmonic-sensitivity.yaml +16 -6
  24. package/content/feats/ancestry/lashunta-lore.yaml +6 -0
  25. package/content/feats/archetype/envoy/envoy-dedication.yaml +2 -88
  26. package/content/feats/mystic/new-epiphany.yaml +1 -1
  27. package/content/feats/mystic/realized-epiphany.yaml +1 -1
  28. package/content/feats/mystic/syncretic-epiphany.yaml +1 -1
  29. package/content/feats/skill/additional-lore.yaml +54 -391
  30. package/content/feats/skill/assurance.yaml +3 -57
  31. package/content/feats/skill/skill-training.yaml +1 -57
  32. package/content/features/envoy/style/from-the-front.yaml +1 -1
  33. package/content/features/envoy/style/from-the-shadows.yaml +1 -1
  34. package/content/features/envoy/style/guns-blazing.yaml +1 -1
  35. package/content/features/envoy/style/in-the-spotlight.yaml +1 -1
  36. package/content/features/envoy/style/infosphere-director.yaml +1 -1
  37. package/content/features/envoy/style/through-desperate-times.yaml +1 -1
  38. package/content/features/soldier/style/action-hero.yaml +1 -1
  39. package/content/features/soldier/style/armor-storm.yaml +1 -1
  40. package/content/features/soldier/style/bombard.yaml +1 -1
  41. package/content/features/soldier/style/close-quarters.yaml +1 -1
  42. package/content/features/soldier/style/erudite-warrior.yaml +1 -1
  43. package/content/gear/comm-unit.yaml +1 -0
  44. package/content/spells/elemental-barrier.yaml +2 -1
  45. package/content/spells/elemental-weapon.yaml +10 -1
  46. package/content/spells/guidance.yaml +2 -0
  47. package/content/spells/sure-strike.yaml +8 -1
  48. package/content/spells/true-target.yaml +2 -0
  49. package/content/templates/elemental/air.yaml +6 -0
  50. package/content/templates/elemental/earth.yaml +6 -0
  51. package/content/templates/elemental/fire.yaml +6 -0
  52. package/content/templates/elemental/metal.yaml +6 -0
  53. package/content/templates/elemental/water.yaml +6 -0
  54. package/content/templates/elemental/wood.yaml +6 -0
  55. package/dist/i18n/en.js +1 -1
  56. package/dist/i18n/en.json +50 -59
  57. package/dist/index.js +1 -1
  58. package/dist/release.json +5419 -3339
  59. package/i18n/en/ancestry-feats.yaml +4 -40
  60. package/i18n/en/archetypes.yaml +2 -2
  61. package/i18n/en/core.yaml +8 -2
  62. package/i18n/en/headline.yaml +4 -0
  63. package/i18n/en/mystic.yaml +12 -0
  64. package/i18n/en/sf-core.yaml +0 -11
  65. package/i18n/en/skills.yaml +6 -3
  66. package/i18n/en/tags.yaml +2 -0
  67. package/i18n/en/types.yaml +1 -0
  68. package/i18n/en.yaml +14 -1
  69. package/pack.yaml +2 -2
  70. package/package.json +2 -2
  71. package/rules/advancement.yaml +1 -0
  72. package/rules/afflictions.yaml +4 -5
  73. package/rules/archetypes.yaml +1 -0
  74. package/rules/building.yaml +7 -1
  75. package/rules/checks.yaml +1 -1
  76. package/rules/conditions.yaml +1 -0
  77. package/rules/core.yaml +1 -0
  78. package/rules/creation.yaml +18 -0
  79. package/rules/equipment.yaml +7 -2
  80. package/rules/heritages.yaml +1 -1
  81. package/rules/layout.yaml +62 -4
  82. package/rules/mystic.yaml +24 -1
  83. package/rules/skill-actions-stealth.yaml +1 -1
  84. package/rules/skills.yaml +254 -81
  85. package/rules/solarian.yaml +1 -2
  86. package/rules/spellcasting.yaml +89 -21
  87. package/rules/spells-high.yaml +3 -3
  88. package/rules/strikes.yaml +3 -1
  89. package/rules/tags.yaml +6 -0
  90. package/rules/witchwarper.yaml +7 -7
  91. package/upgrades/0.2.0-to-0.3.0.yaml +12 -0
@@ -148,6 +148,9 @@ feats.ancestry.psychic-paragon.name: Psychic Paragon
148
148
  feats.ancestry.psychic-paragon.prerequisites.feat: Psychic Mastery
149
149
  feats.ancestry.competitive-spirit.name: Competitive Spirit
150
150
  feats.ancestry.harmonic-sensitivity.name: Harmonic Sensitivity
151
+ feats.ancestry.harmonic-sensitivity.choices.harmonic.prompt: Performance
152
+ feats.ancestry.harmonic-sensitivity.choices.harmonic.options.training.name: Trained in Performance
153
+ feats.ancestry.harmonic-sensitivity.choices.harmonic.options.assurance.name: Assurance (Performance)
151
154
  feats.ancestry.long-whiskered.name: Long Whiskered
152
155
  feats.ancestry.pahtra-lore.name: Pahtra Lore
153
156
  feats.ancestry.predatory.name: Predatory
@@ -189,46 +192,6 @@ feats.ancestry.clinging-bite.name: Clinging Bite
189
192
  feats.ancestry.clinging-bite.prerequisites.heritage: Everwhelp Skittermander heritage
190
193
  feats.ancestry.dauntless.name: Dauntless
191
194
  feats.ancestry.fixation.name: Fixation
192
- feats.ancestry.fixation.choices.topic.prompt: Your fixation (a Lore)
193
- feats.ancestry.fixation.choices.topic.options.academia.name: Academia Lore
194
- feats.ancestry.fixation.choices.topic.options.alcohol.name: Alcohol Lore
195
- feats.ancestry.fixation.choices.topic.options.android.name: Android Lore
196
- feats.ancestry.fixation.choices.topic.options.animal.name: Animal Lore
197
- feats.ancestry.fixation.choices.topic.options.art.name: Art Lore
198
- feats.ancestry.fixation.choices.topic.options.augmentation.name: Augmentation Lore
199
- feats.ancestry.fixation.choices.topic.options.barathu.name: Barathu Lore
200
- feats.ancestry.fixation.choices.topic.options.borai.name: Borai Lore
201
- feats.ancestry.fixation.choices.topic.options.business.name: Business Lore
202
- feats.ancestry.fixation.choices.topic.options.cooking.name: Cooking Lore
203
- feats.ancestry.fixation.choices.topic.options.corporate.name: Corporate Lore
204
- feats.ancestry.fixation.choices.topic.options.games.name: Games Lore
205
- feats.ancestry.fixation.choices.topic.options.genealogy.name: Genealogy Lore
206
- feats.ancestry.fixation.choices.topic.options.history.name: History Lore
207
- feats.ancestry.fixation.choices.topic.options.hyperspace.name: Hyperspace Lore
208
- feats.ancestry.fixation.choices.topic.options.infosphere.name: Infosphere Lore
209
- feats.ancestry.fixation.choices.topic.options.kasatha.name: Kasatha Lore
210
- feats.ancestry.fixation.choices.topic.options.labor.name: Labor Lore
211
- feats.ancestry.fixation.choices.topic.options.lashunta.name: Lashunta Lore
212
- feats.ancestry.fixation.choices.topic.options.legal.name: Legal Lore
213
- feats.ancestry.fixation.choices.topic.options.life-science.name: Life Science Lore
214
- feats.ancestry.fixation.choices.topic.options.media.name: Media Lore
215
- feats.ancestry.fixation.choices.topic.options.mining.name: Mining Lore
216
- feats.ancestry.fixation.choices.topic.options.pahtra.name: Pahtra Lore
217
- feats.ancestry.fixation.choices.topic.options.physical-science.name: Physical Science Lore
218
- feats.ancestry.fixation.choices.topic.options.piracy.name: Piracy Lore
219
- feats.ancestry.fixation.choices.topic.options.plant.name: Plant Lore
220
- feats.ancestry.fixation.choices.topic.options.prismeni.name: Prismeni Lore
221
- feats.ancestry.fixation.choices.topic.options.shirren.name: Shirren Lore
222
- feats.ancestry.fixation.choices.topic.options.skittermander.name: Skittermander Lore
223
- feats.ancestry.fixation.choices.topic.options.sports.name: Sports Lore
224
- feats.ancestry.fixation.choices.topic.options.underworld.name: Underworld Lore
225
- feats.ancestry.fixation.choices.topic.options.vesk.name: Vesk Lore
226
- feats.ancestry.fixation.choices.topic.options.vidgame.name: Vidgame Lore
227
- feats.ancestry.fixation.choices.topic.options.warfare.name: Warfare Lore
228
- feats.ancestry.fixation.choices.topic.options.ysoki.name: Ysoki Lore
229
- feats.ancestry.fixation.choices.topic.options.custom1.name: A Lore of your choice (1)
230
- feats.ancestry.fixation.choices.topic.options.custom2.name: A Lore of your choice (2)
231
- feats.ancestry.fixation.choices.topic.options.custom3.name: A Lore of your choice (3)
232
195
  feats.ancestry.hug-master.name: Hug Master
233
196
  feats.ancestry.hyper.name: Hyper
234
197
  feats.ancestry.skittermander-lore.name: Skittermander Lore
@@ -278,6 +241,7 @@ feats.ancestry.quick-stow.name: Quick Stow
278
241
  feats.ancestry.quick-stow.prerequisites.feat: Cheek Pouches
279
242
  feats.ancestry.big-mouth.name: Big Mouth
280
243
  feats.ancestry.big-mouth.prerequisites.feat: Cheek Pouches
244
+ feats.ancestry.lashunta-lore.prerequisites.lore: Not Additional Lore for Lashunta Lore already
281
245
  feats.ancestry.overcrowd.name: Overcrowd
282
246
  feats.ancestry.underfoot.name: Underfoot
283
247
  feats.ancestry.underfoot.prerequisites.heritage: Shipborn Ysoki heritage or Tunnel Ysoki heritage
@@ -2,7 +2,7 @@ archetypes.envoy.name: Envoy
2
2
  archetypes.envoy.description: 'Multiclass archetype: some of the envoy class through class feats.'
3
3
  feats.archetype.envoy.envoy-dedication.name: Envoy Dedication
4
4
  feats.archetype.envoy.envoy-dedication.prerequisites.attribute: Charisma +2
5
- feats.archetype.envoy.envoy-dedication.prerequisites.requirement: Not a envoy
5
+ feats.archetype.envoy.envoy-dedication.prerequisites.requirement: Not an envoy
6
6
  feats.archetype.envoy.envoy-dedication.choices.skill.prompt: 'Deception, Diplomacy or Intimidation'
7
7
  feats.archetype.envoy.envoy-dedication.choices.other.prompt: Another skill
8
8
  feats.archetype.envoy.basic-leadership.name: Basic Leadership
@@ -64,7 +64,7 @@ archetypes.operative.name: Operative
64
64
  archetypes.operative.description: 'Multiclass archetype: some of the operative class through class feats.'
65
65
  feats.archetype.operative.operative-dedication.name: Operative Dedication
66
66
  feats.archetype.operative.operative-dedication.prerequisites.attribute: Dexterity +2
67
- feats.archetype.operative.operative-dedication.prerequisites.requirement: Not a operative
67
+ feats.archetype.operative.operative-dedication.prerequisites.requirement: Not an operative
68
68
  feats.archetype.operative.basic-gunner.name: Basic Gunner
69
69
  feats.archetype.operative.basic-gunner.prerequisites.feat: Operative Dedication
70
70
  feats.archetype.operative.basic-gunner.choices.feat.prompt: Operative feat (1st or 2nd level)
package/i18n/en/core.yaml CHANGED
@@ -59,6 +59,13 @@ actions.cast-spell.params.damageType.values.sonic.name: Sonic
59
59
  actions.cast-spell.params.damageType.values.spirit.name: Spirit
60
60
  actions.cast-spell.params.damageType.values.vitality.name: Vitality
61
61
  actions.cast-spell.params.damageType.values.void.name: Void
62
+ actions.cast-spell.params.element.name: Element
63
+ actions.cast-spell.params.element.values.air.name: Air
64
+ actions.cast-spell.params.element.values.earth.name: Earth
65
+ actions.cast-spell.params.element.values.fire.name: Fire
66
+ actions.cast-spell.params.element.values.metal.name: Metal
67
+ actions.cast-spell.params.element.values.water.name: Water
68
+ actions.cast-spell.params.element.values.wood.name: Wood
62
69
  actions.cast-spell.params.form.name: Battle form
63
70
  actions.cast-spell.params.rank.name: Rank
64
71
  actions.cast-spell.params.source.name: Repertoire
@@ -297,7 +304,6 @@ effects.speed-circumstance-penalty.name: Speed penalty (circumstance)
297
304
  effects.speed-status-penalty.name: Speed penalty (status)
298
305
  effects.treated-disease.name: Treated for disease
299
306
  effects.treated-poison.name: Treated for poison
300
- fields.conditions.drainedOffset.name: Drained counted lower by
301
307
  fields.creature.size.values.gargantuan.name: Gargantuan
302
308
  fields.creature.size.values.huge.name: Huge
303
309
  fields.creature.size.values.large.name: Large
@@ -355,7 +361,6 @@ fields.spellcasting.tradition.values.occult.name: Occult
355
361
  fields.spellcasting.tradition.values.primal.name: Primal
356
362
  fields.spells.autoRank.name: Cantrip rank
357
363
  fields.spells.extraSlot.name: Spells the extra slot casts
358
- groups.afflictions.label: Afflictions
359
364
  groups.class-actions.label: Class and feat actions
360
365
  groups.effects.label: Effects
361
366
  groups.exploration-actions.label: Exploration and downtime
@@ -684,6 +689,7 @@ types.feat.fields.heritage.name: Heritage
684
689
  types.feat.fields.level.name: Level
685
690
  types.feat.fields.skills.name: Skills
686
691
  types.feature.fields.level.name: Level
692
+ types.feature.fields.classOption.name: Class option
687
693
  types.gear.fields.bulk.name: Bulk
688
694
  types.gear.fields.price.name: Price (gp)
689
695
  types.held.fields.activation.name: Activation
@@ -0,0 +1,4 @@
1
+ # The character's headline: the level once a class is picked, the ancestry and the class. "Level 1
2
+ # Vesk Soldier"; "Vesk" before a class.
3
+ headline: >-
4
+ {has_type_class, select, true {Level {field_level}} other {}} {type_ancestry} {type_class}
@@ -4,6 +4,18 @@ classes.mystic.connections.akashic.perfectHarmony: 'You can open a door (1 minut
4
4
  classes.mystic.connections.elemental.name: Elemental
5
5
  classes.mystic.connections.elemental.description: "You channel the primordial elements that make up the universe. You gain the Shield Block general feat. Your wall of fire and absolute zero take the elemental trait and damage type of your active elemental weapon or elemental barrier. Tradition: primal. Connection skill: Nature. Initial epiphany: elemental weapon; advanced: elemental barrier; greater: elemental nova. Harmony: When you Transfer Vitality, choose an element (air, earth, fire, metal, water or wood; the one of your active elemental epiphanies, if any). Until the end of its next turn, the target's next Strike deals a damage type of that element instead: electricity or sonic (air), bludgeoning or piercing (earth), acid or slashing (metal), fire (fire), bludgeoning or cold (water), piercing or poison (wood)."
6
6
  classes.mystic.connections.elemental.perfectHarmony: 'During daily preparations, choose an element as for your harmony: you gain resistance equal to half your level to both its damage types (and to cold, for fire). A bonded ally you heal with Transfer Vitality gains these resistances until the start of your next turn.'
7
+ templates.elemental.air.name: '{base} (air)'
8
+ templates.elemental.air.description: 'Your active elemental weapon or elemental barrier is air: the spell takes the air trait and its damage type.'
9
+ templates.elemental.earth.name: '{base} (earth)'
10
+ templates.elemental.earth.description: 'Your active elemental weapon or elemental barrier is earth: the spell takes the earth trait and its damage type.'
11
+ templates.elemental.fire.name: '{base} (fire)'
12
+ templates.elemental.fire.description: 'Your active elemental weapon or elemental barrier is fire: the spell takes the fire trait and its damage type.'
13
+ templates.elemental.metal.name: '{base} (metal)'
14
+ templates.elemental.metal.description: 'Your active elemental weapon or elemental barrier is metal: the spell takes the metal trait and its damage type.'
15
+ templates.elemental.water.name: '{base} (water)'
16
+ templates.elemental.water.description: 'Your active elemental weapon or elemental barrier is water: the spell takes the water trait and its damage type.'
17
+ templates.elemental.wood.name: '{base} (wood)'
18
+ templates.elemental.wood.description: 'Your active elemental weapon or elemental barrier is wood: the spell takes the wood trait and its damage type.'
7
19
  classes.mystic.connections.healing.name: Healing
8
20
  classes.mystic.connections.healing.description: "You're connected to the vitality and void energy that flow through all living things, healing allies and harming foes. Tradition: divine. Connection skill: Medicine. Initial epiphany: infusion; advanced: vitality nova; greater: vital rebirth. Harmony: When you Transfer Vitality, attempt to counteract one affliction on the target, or one effect giving it blinded, clumsy, dazzled, deafened, enfeebled or sickened."
9
21
  classes.mystic.connections.healing.perfectHarmony: "Your harmony can also counteract doomed, drained, paralyzed and stunned; an effect you fail to counteract but would have at a counteract rank 2 lower is suppressed until the start of your next turn (its duration doesn't elapse meanwhile)."
@@ -40,17 +40,10 @@ constraints.implant-limit: 'More augmentations implanted ({implanted}) than the
40
40
  constraints.one-apex: More than one apex augmentation raising its attribute
41
41
  constraints.upgrade-limits: 'An item has more upgrades than upgrade slots, or two grades ({items})'
42
42
  constraints.dedication-lock: 'A dedication feat taken before two other feats of an earlier archetype: {open} archetypes are open'
43
- fields.armor.bulwark.name: Bulwark modifier to Reflex saves
44
- fields.armor.allBulwark.name: All armor has bulwark
45
- fields.attacks.trainedWeapons.name: Weapons trained with
46
43
  fields.senses.telepathyRange.name: Limited telepathy range
47
- fields.armor.strength.name: Strength for armor
48
- fields.attacks.areaDc.name: Area attack DC
49
44
  fields.attacks.familiar.name: Familiar weapons
50
- fields.attacks.kickbackStrength.name: Strength that ignores kickback
51
45
  fields.augmentations.count.name: Augmentations implanted
52
46
  fields.augmentations.limit.name: Implant limit
53
- fields.heritage.size.name: "Heritage's size"
54
47
  fields.money.credits.name: Credits
55
48
  fields.money.upbs.name: UPBs
56
49
  fields.money.total.name: Total wealth (credits)
@@ -58,8 +51,6 @@ situational.againstRadiation.name: Against radiation
58
51
  situational.naturalEnvironment.name: 'In a natural, undeveloped environment'
59
52
  situational.telepathicContact.name: It communicates with you telepathically
60
53
  types.consumable.options.spell-gem.name: Use the spell gem
61
- fields.proficiency.level.name: Level added to proficiency
62
- fields.proficiency.untrained.name: Untrained proficiency bonus
63
54
  fields.spellcasting.archetype.mystic.tradition.name: Mystic archetype tradition
64
55
  fields.spellcasting.archetype.mystic.tradition.values.none.name: None
65
56
  fields.spellcasting.archetype.mystic.tradition.values.arcane.name: Arcane
@@ -120,10 +111,8 @@ fields.spellSlots.archetype.witchwarper.rank8.max.name: '8th-rank witchwarper ar
120
111
  fields.spellSlots.archetype.witchwarper.rank8.used.name: '8th-rank witchwarper archetype slots spent'
121
112
  situational.againstArea.name: Against an area effect
122
113
  situational.improvisedMastery.name: Improvised Mastery
123
- fields.conditions.suppressed.name: Suppressed
124
114
  situational.bySuppressed.name: From an attack by a suppressed creature
125
115
  situational.suppressedTarget.name: Against a suppressed foe
126
- fields.features.held.name: Class features
127
116
  situational.shieldSpellBlock.name: Block with the shield spell
128
117
  actions.access-infosphere.name: Access Infosphere
129
118
  actions.access-infosphere.description: 'Search a local network for information on a topic (usually 10 minutes), like Recalling Knowledge; a critical failure finds misleading information.'
@@ -268,19 +268,22 @@ fields.skills.lore.ysoki.rank.name: 'Ysoki Lore proficiency'
268
268
  fields.skills.lore.ysoki.increases.name: 'Ysoki Lore increases'
269
269
  fields.skills.lore.ysoki.trainedByIncrease.name: 'Ysoki Lore trained by a skill increase'
270
270
  tags.skill.lore.ysoki.name: 'Ysoki Lore'
271
- fields.skills.lore.custom1.subject.name: Lore of your choice (1), its subject
271
+ fields.skills.lore.custom1.subject.name: Custom Lore subject (1)
272
+ fields.skills.lore.custom1.subject.short: Subject
272
273
  fields.skills.lore.custom1.mod.name: '{name} Lore'
273
274
  fields.skills.lore.custom1.rank.name: '{name} Lore proficiency'
274
275
  fields.skills.lore.custom1.increases.name: '{name} Lore increases'
275
276
  fields.skills.lore.custom1.trainedByIncrease.name: '{name} Lore trained by a skill increase'
276
277
  tags.skill.lore.custom1.name: '{name} Lore'
277
- fields.skills.lore.custom2.subject.name: Lore of your choice (2), its subject
278
+ fields.skills.lore.custom2.subject.name: Custom Lore subject (2)
279
+ fields.skills.lore.custom2.subject.short: Subject
278
280
  fields.skills.lore.custom2.mod.name: '{name} Lore'
279
281
  fields.skills.lore.custom2.rank.name: '{name} Lore proficiency'
280
282
  fields.skills.lore.custom2.increases.name: '{name} Lore increases'
281
283
  fields.skills.lore.custom2.trainedByIncrease.name: '{name} Lore trained by a skill increase'
282
284
  tags.skill.lore.custom2.name: '{name} Lore'
283
- fields.skills.lore.custom3.subject.name: Lore of your choice (3), its subject
285
+ fields.skills.lore.custom3.subject.name: Custom Lore subject (3)
286
+ fields.skills.lore.custom3.subject.short: Subject
284
287
  fields.skills.lore.custom3.mod.name: '{name} Lore'
285
288
  fields.skills.lore.custom3.rank.name: '{name} Lore proficiency'
286
289
  fields.skills.lore.custom3.increases.name: '{name} Lore increases'
package/i18n/en/tags.yaml CHANGED
@@ -51,6 +51,8 @@ tags.strike.lead-by-example.name: Strike lead by example
51
51
  tags.trait.aberration.name: Aberration
52
52
  tags.trait.aeon.name: Aeon
53
53
  tags.trait.analog.name: Analog
54
+ tags.tool.name: Tool
55
+ tags.tool.compass.name: Compass
54
56
  tags.trait.anchoring.name: Anchoring
55
57
  tags.trait.android.name: Android
56
58
  tags.trait.arc.name: Arc
@@ -298,6 +298,7 @@ types.spell.state.value.name: Value
298
298
  types.spell.state.damageType.name: Damage type
299
299
  types.spell.state.copy.name: Copy
300
300
  types.spell.state.form.name: Form
301
+ types.spell.state.element.name: Element
301
302
  types.weapon.fields.group.values.corrosive.name: Corrosive
302
303
  types.weapon.fields.group.values.cryo.name: Cryo
303
304
  types.weapon.fields.group.values.flame.name: Flame
package/i18n/en.yaml CHANGED
@@ -9,6 +9,7 @@ actions.create-character.name: Build a character
9
9
  actions.create-character.steps.ancestry.prompt: Choose an ancestry
10
10
  actions.create-character.steps.background.prompt: Choose a background
11
11
  actions.create-character.steps.class.prompt: Choose a class
12
+ actions.create-character.steps.freeBoosts.prompt: Choose four free attribute boosts
12
13
  actions.create-character.steps.heritage.prompt: Choose a heritage
13
14
  actions.random-character.name: Build a random character
14
15
  actions.random-character.steps.ancestry.prompt: Choose an ancestry
@@ -223,6 +224,13 @@ groups.feats.sections.skill.name: Skill feats
223
224
  groups.gear.label: Gear
224
225
  groups.heritage.label: Heritage
225
226
  groups.consumables.label: Consumables
227
+ groups.consumables.sections.grenade.name: Grenades
228
+ groups.consumables.sections.medical.name: Medical
229
+ groups.consumables.sections.serum.name: Serums
230
+ groups.consumables.sections.spell-amp.name: Spell amps
231
+ groups.consumables.sections.spell-gem.name: Spell gems
232
+ groups.consumables.sections.ammunition.name: Ammunition
233
+ groups.consumables.sections.other.name: Other consumables
226
234
  groups.rituals.label: Rituals
227
235
  groups.boost-picks.label: Attribute boosts picked
228
236
  groups.language-picks.label: Languages picked
@@ -231,7 +239,6 @@ groups.reactions.label: Reactions and shields
231
239
  groups.saves.label: Saving throws and Perception
232
240
  groups.shields.label: Shields
233
241
  groups.skill-increases.label: Skill increases
234
- groups.skill-ranks.label: Skill proficiency
235
242
  groups.skills.label: Skills
236
243
  groups.strikes.label: Strikes
237
244
  groups.summary.label: Character
@@ -433,6 +440,11 @@ tags.feat-action.name: 'Feat action'
433
440
  tags.class-dc.name: 'Class DC'
434
441
  tags.condition.name: 'Condition'
435
442
  tags.creation.name: 'Creation'
443
+ tags.creation.ancestry.name: 'Creation: ancestry'
444
+ tags.creation.heritage.name: 'Creation: heritage'
445
+ tags.creation.background.name: 'Creation: background'
446
+ tags.creation.class.name: 'Creation: class'
447
+ tags.creation.finish.name: 'Creation: finish'
436
448
  tags.d20.name: 'd20 roll'
437
449
  tags.damage.name: 'Damage'
438
450
  tags.damage.acid.name: 'Acid damage'
@@ -469,6 +481,7 @@ tags.group.shield.name: 'Shield group'
469
481
  tags.group.spear.name: 'Spear group'
470
482
  tags.group.sword.name: 'Sword group'
471
483
  tags.level-up.name: 'Level up'
484
+ tags.level-up.gain.name: 'Level up: gain'
472
485
  tags.lore.name: 'Lore'
473
486
  tags.perception.name: 'Perception'
474
487
  tags.persistent-damage.name: 'Persistent damage'
package/pack.yaml CHANGED
@@ -1,6 +1,6 @@
1
1
  id: orc-sf-2e
2
- version: 0.2.0
3
- specVersion: 0.2.0
2
+ version: 0.3.0
3
+ specVersion: 0.3.0
4
4
  license: ORC
5
5
  credit: >-
6
6
  This product is based on the following Licensed Material: Starfinder Player Core © 2025 Paizo
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opencharacter/orc-sf-2e",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "Open Character Format pack: Second Edition science-fantasy rules (Player Core) under the ORC License.",
5
5
  "keywords": [
6
6
  "character-sheet",
@@ -51,7 +51,7 @@
51
51
  "access": "public"
52
52
  },
53
53
  "devDependencies": {
54
- "@opencharacter/engine": "0.2.0"
54
+ "@opencharacter/engine": "0.3.0"
55
55
  },
56
56
  "engines": {
57
57
  "node": ">=22"
@@ -13,6 +13,7 @@ actions:
13
13
  available: '!character.creating && level < 20'
14
14
  steps:
15
15
  - id: gain
16
+ tags: [level-up.gain]
16
17
  kind: changes
17
18
  changes:
18
19
  - { type: adjust, field: level, by: 1 }
@@ -12,6 +12,7 @@ contentTypes:
12
12
  dc: { type: integer, min: 0 }
13
13
  stages: { type: integer, required: true, min: 1, max: 7 }
14
14
  damageType:
15
+ open: true
15
16
  type: enum
16
17
  values:
17
18
  [
@@ -37,6 +38,7 @@ contentTypes:
37
38
  stage5Damage: { type: dice }
38
39
  stage6Damage: { type: dice }
39
40
  damage2Type:
41
+ open: true
40
42
  type: enum
41
43
  values: [acid, cold, electricity, fire, mental, poison, sonic, spirit, vitality, void]
42
44
  default: poison
@@ -160,12 +162,9 @@ actions:
160
162
  stage: flags.stage
161
163
  damage: 'has(steps.damage) ? steps.damage.total : 0'
162
164
 
165
+ # The pack has no afflictions of its own, so no group holds them: a homebrew affliction applied to
166
+ # the character shows in "Other".
163
167
  display:
164
- groups:
165
- - id: afflictions
166
- kind: content
167
- priority: 1
168
- members: { type: affliction, from: applied }
169
168
  types:
170
169
  affliction:
171
170
  state:
@@ -17,6 +17,7 @@ tags:
17
17
 
18
18
  contentTypes:
19
19
  archetype:
20
+ grantOnly: true
20
21
  copies: { max: 0 }
21
22
  fields:
22
23
  dedication: { type: id, of: feat, required: true }
@@ -20,6 +20,7 @@ contentTypes:
20
20
  - { target: ancestry.held, op: grant, value: { formula: item.id } }
21
21
 
22
22
  heritage:
23
+ grantOnly: true
23
24
  fields:
24
25
  ancestry: { type: id, of: ancestry }
25
26
  versatile: { type: boolean, default: false }
@@ -39,15 +40,20 @@ contentTypes:
39
40
  - { target: hp.class, op: add, value: item.hp }
40
41
 
41
42
  feature:
43
+ grantOnly: true
42
44
  fields:
43
45
  level: { type: integer, required: true, min: 1, max: 20 }
46
+ # The class option a subclass-like feature is, `<class>.<choice>`, which the class's choice
47
+ # offers: add-on instincts, muses and the like set it too.
48
+ classOption: { type: string, default: '' }
44
49
  effects:
45
50
  - { target: features.held, op: grant, value: { formula: item.id } }
46
51
 
47
52
  feat:
48
53
  fields:
49
54
  level: { type: integer, required: true, min: 1, max: 20 }
50
- category: { type: enum, values: [ancestry, class, general, skill], required: true }
55
+ category:
56
+ { type: enum, values: [ancestry, class, general, skill], required: true, open: true }
51
57
  ancestry: { type: id, of: ancestry }
52
58
  heritage: { type: id, of: heritage }
53
59
  class: { type: id, of: class }
package/rules/checks.yaml CHANGED
@@ -23,7 +23,7 @@ resultBands:
23
23
  when: >-
24
24
  roll.value == 3 || (roll.value == 2 && (roll.tallies.successToCrit > 0
25
25
  || (roll.tallies.successToCritOn19 > 0 && size(roll.kept) > 0 && roll.kept[0] == 19)))
26
- - { id: success, when: roll.value == 2 }
26
+ - { id: success, when: roll.value == 2, success: true }
27
27
  - id: failure
28
28
  when: >-
29
29
  (roll.value == 1 && roll.tallies.failToCritFail == 0)
@@ -5,6 +5,7 @@ contentTypes:
5
5
  by: { type: string, default: '' }
6
6
  damage: { type: dice, default: 1d6 }
7
7
  damageType:
8
+ open: true
8
9
  type: enum
9
10
  values:
10
11
  [
package/rules/core.yaml CHANGED
@@ -58,6 +58,7 @@ contentTypes:
58
58
  - { target: languages, op: grant, value: { formula: item.id } }
59
59
 
60
60
  boost:
61
+ grantOnly: true
61
62
  fields:
62
63
  attribute: { type: enum, values: [str, dex, con, int, wis, cha], required: true }
63
64
 
@@ -18,12 +18,14 @@ actions:
18
18
  available: character.creating
19
19
  steps:
20
20
  - id: ancestry
21
+ tags: [creation.ancestry]
21
22
  kind: choice
22
23
  options: { content: { type: ancestry } }
23
24
  changes:
24
25
  - type: addItem
25
26
  entry: { id: ancestry, item: picked.id }
26
27
  - id: heritage
28
+ tags: [creation.heritage]
27
29
  kind: choice
28
30
  options:
29
31
  content:
@@ -32,12 +34,14 @@ actions:
32
34
  changes:
33
35
  - { type: choose, path: { entry: ancestry, choice: [heritage] }, option: picked.id }
34
36
  - id: background
37
+ tags: [creation.background]
35
38
  kind: choice
36
39
  options: { content: { type: background } }
37
40
  changes:
38
41
  - type: addItem
39
42
  entry: { id: background, item: picked.id }
40
43
  - id: class
44
+ tags: [creation.class]
41
45
  kind: choice
42
46
  options: { content: { type: class } }
43
47
  changes:
@@ -49,6 +53,14 @@ actions:
49
53
  - id: backgroundPicks
50
54
  kind: choice
51
55
  options: { pending: { entry: "'background'" } }
56
+ # The four free boosts come before the class's choices, whose trained skills count the final
57
+ # Intelligence modifier.
58
+ - id: freeBoosts
59
+ kind: choice
60
+ options: { content: { type: boost, where: picks == 0 } }
61
+ repeat: { max: 4, min: 4 }
62
+ changes:
63
+ - { type: choose, path: { choice: [free-boosts] }, option: picked.id }
52
64
  - id: classPicks
53
65
  kind: choice
54
66
  options: { pending: { entry: "'class'" } }
@@ -56,6 +68,7 @@ actions:
56
68
  kind: choice
57
69
  options: { pending: {} }
58
70
  - id: finish
71
+ tags: [creation.finish]
59
72
  kind: changes
60
73
  sheet: proposed
61
74
  changes:
@@ -67,6 +80,7 @@ actions:
67
80
  available: character.creating
68
81
  steps:
69
82
  - id: ancestry
83
+ tags: [creation.ancestry]
70
84
  kind: choice
71
85
  options: { content: { type: ancestry } }
72
86
  random: true
@@ -74,6 +88,7 @@ actions:
74
88
  - type: addItem
75
89
  entry: { id: ancestry, item: picked.id }
76
90
  - id: heritage
91
+ tags: [creation.heritage]
77
92
  kind: choice
78
93
  options:
79
94
  content:
@@ -83,6 +98,7 @@ actions:
83
98
  changes:
84
99
  - { type: choose, path: { entry: ancestry, choice: [heritage] }, option: picked.id }
85
100
  - id: background
101
+ tags: [creation.background]
86
102
  kind: choice
87
103
  options: { content: { type: background } }
88
104
  random: true
@@ -90,6 +106,7 @@ actions:
90
106
  - type: addItem
91
107
  entry: { id: background, item: picked.id }
92
108
  - id: class
109
+ tags: [creation.class]
93
110
  kind: choice
94
111
  options: { content: { type: class } }
95
112
  random: true
@@ -140,6 +157,7 @@ actions:
140
157
  random: *random
141
158
  recommend: *pick
142
159
  - id: finish
160
+ tags: [creation.finish]
143
161
  kind: changes
144
162
  sheet: proposed
145
163
  changes:
@@ -50,6 +50,7 @@ contentTypes:
50
50
  {
51
51
  type: enum,
52
52
  values: [cloth, leather, composite, chain, plate, skeletal, ceramic, polymer],
53
+ open: true,
53
54
  }
54
55
  upgradeSlots: { type: integer, default: 1, min: 0, max: 4 }
55
56
  bulk: { type: decimal, default: 0, min: 0 }
@@ -197,7 +198,7 @@ contentTypes:
197
198
  ammunition:
198
199
  carried: true
199
200
  fields:
200
- kind: { type: enum, values: [rounds, charges, chems], required: true }
201
+ kind: { type: enum, values: [rounds, charges, chems], required: true, open: true }
201
202
  level: { type: integer, default: 0, min: 0, max: 30 }
202
203
  charges: { type: integer, default: 0, min: 0 }
203
204
  bulk: { type: decimal, default: 0, min: 0 }
@@ -241,6 +242,7 @@ contentTypes:
241
242
  carried: true
242
243
  fields:
243
244
  category:
245
+ open: true
244
246
  type: enum
245
247
  values: [grenade, medical, serum, spell-amp, spell-gem, ammunition, other]
246
248
  required: true
@@ -254,6 +256,7 @@ contentTypes:
254
256
  family: { type: id, of: consumable }
255
257
  damage: { type: dice }
256
258
  damageType:
259
+ open: true
257
260
  type: enum
258
261
  values:
259
262
  [
@@ -272,7 +275,8 @@ contentTypes:
272
275
  default: none
273
276
  areaSize: { type: integer, default: 0, min: 0 }
274
277
  persistent: { type: dice }
275
- persistentType: { type: enum, values: [none, acid, bleed, electricity, fire], default: none }
278
+ persistentType:
279
+ { type: enum, values: [none, acid, bleed, electricity, fire], default: none, open: true }
276
280
  itemBonus: { type: integer, default: 0, min: 0, max: 4 }
277
281
  save: { type: enum, values: [reflex, fortitude, will], default: reflex }
278
282
  basic: { type: boolean, default: true }
@@ -526,6 +530,7 @@ actions:
526
530
  - { type: set, field: shield.raised, value: true }
527
531
 
528
532
  tags:
533
+ - tool.compass
529
534
  - trait.analog
530
535
  - trait.tech
531
536
  - trait.area
@@ -15,5 +15,5 @@ situational:
15
15
 
16
16
  display:
17
17
  fields:
18
- speed.swim: { groups: [summary], priority: 2, unit: ft }
18
+ speed.swim: { groups: [summary], priority: 2, unit: ft, showWhen: speed.swim > 0 }
19
19
  speed.swim.base: { hidden: true }
package/rules/layout.yaml CHANGED
@@ -9,12 +9,10 @@ display:
9
9
  priority: 0
10
10
  - id: saves
11
11
  priority: 0
12
+ # A skill's rank is its modifier's companion, so it has no tile of its own here.
12
13
  - id: skills
13
14
  priority: 1
14
- members: { type: field, where: "'skill' in item.tags" }
15
- - id: skill-ranks
16
- priority: 2
17
- members: { type: field, where: "'skill-rank' in item.tags" }
15
+ members: { type: field, where: "'skill' in item.tags || 'skill-rank' in item.tags" }
18
16
  - id: skill-increases
19
17
  priority: 3
20
18
  visibility: background
@@ -201,6 +199,8 @@ display:
201
199
  class.traits: { hidden: true }
202
200
  skills.maxRank: { hidden: true }
203
201
  skills.trained: { hidden: true }
202
+ skills.offered: { hidden: true }
203
+ skills.lores: { hidden: true }
204
204
  skills.trainings: { hidden: true }
205
205
  skills.chosen: { hidden: true }
206
206
  assurance.skills: { hidden: true }
@@ -233,6 +233,64 @@ display:
233
233
  conditions.doomed: { hidden: true }
234
234
  conditions.slowed: { hidden: true }
235
235
  conditions.stunned: { hidden: true }
236
+ conditions.drainedOffset: { hidden: true }
237
+ conditions.suppressed: { hidden: true }
238
+ features.held: { hidden: true }
239
+ heritage.size: { hidden: true }
240
+ proficiency.level: { hidden: true }
241
+ proficiency.untrained: { hidden: true }
242
+ armor.strength: { hidden: true }
243
+ armor.bulwark: { hidden: true }
244
+ armor.allBulwark: { hidden: true }
245
+ attacks.trainedWeapons: { hidden: true }
246
+ attacks.areaDc: { hidden: true }
247
+ attacks.kickbackStrength: { hidden: true }
248
+ immunities.damage: { groups: [defenses], priority: 2, showWhen: size(immunities.damage) > 0 }
249
+ parry.weapon:
250
+ { groups: [defenses], priority: 2, input: { widget: checkbox }, showWhen: parry.weapon }
251
+ attacks.simpleGun.rank:
252
+ {
253
+ groups: [proficiencies],
254
+ priority: 1,
255
+ format: { bands: rank },
256
+ showWhen: attacks.simpleGun.rank > 0,
257
+ }
258
+ attacks.martialGun.rank:
259
+ {
260
+ groups: [proficiencies],
261
+ priority: 1,
262
+ format: { bands: rank },
263
+ showWhen: attacks.martialGun.rank > 0,
264
+ }
265
+ attacks.advancedGun.rank:
266
+ {
267
+ groups: [proficiencies],
268
+ priority: 1,
269
+ format: { bands: rank },
270
+ showWhen: attacks.advancedGun.rank > 0,
271
+ }
272
+ attacks.agileMelee.rank:
273
+ {
274
+ groups: [proficiencies],
275
+ priority: 1,
276
+ format: { bands: rank },
277
+ showWhen: attacks.agileMelee.rank > 0,
278
+ }
279
+ attacks.solar.rank:
280
+ {
281
+ groups: [proficiencies],
282
+ priority: 1,
283
+ format: { bands: rank },
284
+ showWhen: attacks.solar.rank > 0,
285
+ }
286
+ attacks.familiar: { groups: [proficiencies], priority: 2, showWhen: size(attacks.familiar) > 0 }
287
+ augmentations.count:
288
+ {
289
+ groups: [bulk],
290
+ priority: 2,
291
+ showWhen: augmentations.count > 0,
292
+ with: [{ field: augmentations.limit, as: max }],
293
+ }
236
294
 
237
295
  types:
238
296
  weapon: