Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -28,5 +28,12 @@
"statusBar.debuggingForeground": "#e7e7e7"
},
"peacock.color": "#643312",
"cSpell.words": ["ageorgedev", "Halfling", "Halflings", "Khorvaire"]
"cSpell.words": [
"ageorgedev",
"Halfling",
"Halflings",
"Khorvaire",
"spellcasting",
"Warforged"
]
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,3 +17,9 @@ export const SAVAGE_ATTACKER: Feature = {
description:
"Once per turn, you may roll a weapon's damage dice twice and use either rolls.",
};

export const SKILLED: Feature = {
name: 'Skilled',
description:
'You have additional proficiency in any combination of 3 skills or tools (already considered in this sheet)',
};
1 change: 1 addition & 0 deletions apps/game-tools/src/data/dnd-characters/common/index.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
export * from './common-class-features';
export * from './common-feats';
export * from './common-species-traits';
export * from './species-traits';
29 changes: 29 additions & 0 deletions apps/game-tools/src/data/dnd-characters/common/species-traits.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import type { Feature } from '@ageorgedev/dnd-character-sheet';

export const WarforgedTraits: Feature[] = [
{
name: 'Construct resilience',
description:
'You have Resistance to Poison damage. You also have Advantage on saving throws you make to avoid or end the <em>Poisoned</em> condition.',
},
{
name: 'Integrated Protection',
description:
"You have +1 AC (already considered in this sheet). Your armour can't be removed against your will",
},
{
name: "Sentry's Rest",
description:
"You don't need to sleep, and magic can't put you to sleep. You can finish a Long Rest in 6hrs if you spend that time inactive and motionless. You appear inert but are still conscious.",
},
{
name: 'Specialized Design',
description:
'You gain one skill proficiency and one tool proficiency of your choice (already considered in this sheet)',
},
{
name: 'Tireless',
description:
"You don't need to consume water, food, and don't need to breathe",
},
];
16 changes: 15 additions & 1 deletion apps/game-tools/src/data/dnd-characters/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ import { ElnorinData } from './elnorin-lunarrest/elnorin-lunarrest';
import ElnorinSpellBook from './elnorin-lunarrest/elnorrin-spellbook.pdf?url';
import { GonvarData } from './gonvar-feathertide/gonvar-feathertide';
import { OmarinData } from './omarin-kenate/omarin-kenate';
import { RustyData } from './rusty/rusty';
import RustySpellBook from './rusty/rusty-spellbook.pdf';
import { SaoraData } from './saora-embervale/saora-embervale';
import SaoraSpellBook from './saora-embervale/saora-spellbook.pdf?url';
import { SplitterData } from './splitter/splitter';
Expand Down Expand Up @@ -46,7 +48,14 @@ const characters: BasePack[] = [
{ data: ElnorinData, spellBook: ElnorinSpellBook },
{ data: GonvarData },
{ data: ClawData, spellBook: ClawSpellBook },
{ data: OmarinData },
{
data: OmarinData,
visualAdjustments: {
classFeaturesFontSize: 'small',
speciesAndFeatsFontSize: 'small',
speciesAndFeatsCombinedPanel: true,
},
},
{
data: SplitterData,
visualAdjustments: {
Expand All @@ -64,6 +73,11 @@ const characters: BasePack[] = [
notesRows: 0,
},
},
{
data: RustyData,
spellBook: RustySpellBook,
// TODO: alternate title for spellbook
},
];

const processAndGroup = compose(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,14 @@ export const OmarinData: Character = {
notes: 'Ammo (80/20, Bolt), Loading, 2-handed',
},
],
equipment: ['Bedroll, Backpack, Lantern', 'Flasks of oil (x4)'],
equipment: [
"Backpack, Bedroll, Iron Pot, Shovel, Traveller's clothes, Rope, Tinderbox, Waterskin",
"Carpenter's Tools, Tinker's Tools",
'Oil flasks = 4',
'Torches = 10',
'Ration (days) = 10',
"Healer's Kit charges = 10",
],
armorProficiencies: [
ArmorProficiency.LightArmor,
ArmorProficiency.MediumArmor,
Expand Down Expand Up @@ -156,7 +163,6 @@ export const OmarinData: Character = {
SECOND_WIND,
TACTICAL_MIND,
ACTION_SURGE,
// TODO: the actual manuevers
COMBAT_SUPERIORITY,
{
name: 'Uncanny Metabolism',
Expand All @@ -169,6 +175,27 @@ export const OmarinData: Character = {
refresh: { kind: 'long-rest' },
},
},
{
name: 'Pushing Attack',
cost: '1 Superiority dice',
description: `
<em>on Hit</em>, add Superiority Dice to damage. If target size is Large or smaller, they make a Str. save (DC <%= abilitySaveDCs.DEX %>); on failure be pushed 15 ft directly away from you.
`,
},
{
name: 'Goading Attack',
cost: '1 Superiority dice',
description: `
<em>on Hit</em>, add Superiority Dice to damage. Target must succeed on Wis. save (DC <%= abilitySaveDCs.DEX %>); on failure, have Disadvantage on attack rolls against any target other than you, until the end of your next turn
`,
},
{
name: 'Maneuvering Attack',
cost: '1 Superiority dice',
description: `
<em>on Hit</em>, add Superiority Dice to damage. Choose a willing creature who can see or hear you; they can use their Reaction immediately to move half their speed without provoking Opportunity attacks.
`,
},
],
speciesTraits: [
darkvision('120ft'),
Expand Down Expand Up @@ -208,9 +235,5 @@ export const OmarinData: Character = {
numberOfCantrips: 0,
numberOfPreparedSpells: 0,
},

backstory: `
<p>This is the story of Omarin</p>
<p><strong>Early years</strong> Had a lot of fun</p>
`,
// TODO: work on the backstory and appearance
};
Binary file not shown.
175 changes: 175 additions & 0 deletions apps/game-tools/src/data/dnd-characters/rusty/rusty.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,175 @@
import {
Ability,
type Character,
Skill,
SPELL,
withSpellMods,
} from '@ageorgedev/dnd-character-sheet';
import { SKILLED, WarforgedTraits } from '../common';

export const RustyData: Character = {
name: 'Rusty',
species: 'Warforged',
background: 'Archaeologist',
classes: [
{
name: 'Artificer',
level: 3,
subclass: 'Artillerist',
},
],
abilities: {
[Ability.Strength]: 8,
[Ability.Dexterity]: 16,
[Ability.Constitution]: 14,
[Ability.Intelligence]: 17,
[Ability.Wisdom]: 10,
[Ability.Charisma]: 8,
},
savingThrowProficiencies: [Ability.Constitution, Ability.Intelligence],
skillProficiencies: [
Skill.Athletics,
Skill.Acrobatics,
Skill.Arcana,
Skill.History,
Skill.Investigation,
Skill.Perception,
Skill.Survival,
Skill.Intimidation,
],
skillExpertise: [],
baseArmorClass: 16,
speed: 30,
hitPoints: {
maximum: 27,
},
armorProficiencies: ['Light Armor', 'Medium Armor', 'Shield'],
weaponProficiencies: [],
toolProficiencies: [
"Cartographer's Tools",
"Thieves' Tools",
"Tinker's Tools",
"Smith's Tools",
"Navigator's Tools",
"Woodcarver's Tools",
],
languages: ['Common', 'Elvish'],
attacks: [
{
kind: 'weapon',
name: 'Heavy Crossbow',
ability: Ability.Dexterity,
damage: [{ dice: '1d10', type: 'Piercing' }],
notes: 'Ammunition (80/320 bolt), 2-handed, Loading',
},
{
kind: 'weapon',
name: 'Dagger',
ability: Ability.Dexterity,
damage: [{ dice: '1d4', type: 'Piercing' }],
notes: 'Finesse, Light, Thrown (range 20/60)',
},
{
kind: 'spell-with-attack',
name: 'Fire Bolt',
damage: [{ dice: '1d10', type: 'Fire' }],
notes: '120 ft range',
},
],
features: [
{
name: "Tinker's Magic",
castingTime: 'Action',
description:
"While holding Tinker's Tools, you can create one item in an unoccupied space within 5 ft of yourself. Choose the item from the Tinker's Magic List (find them in the next sheet). The items last until you finish a Long Rest",
resource: {
id: 'TinkerMagic',
name: "Tinker's Magic",
count: {
kind: 'fixed',
value: 2,
},
refresh: {
kind: 'long-rest',
},
},
},
{
name: 'Replicate Magic Item',
description: `
You have learned arcane plans that you use to make magic items.
On finishing a Long Rest, you can create 1 or 2 different magic items from these plans. The items last until you die. You can only have 2 such created magic items at any given point, creating another one will make the oldest one vanish.
You know the following plans:
<ol>
<li>Rope of Climbing</li>
<li>Goggles of Night</li>
<li>Wand of Secrets</li>
<li>Repeating Shot</li>
</ol>
`,
},
{
name: 'Wand Crafting',
description:
'When you craft a magic Wand, the amount of time required to craft is halved',
},
{
name: 'Eldritch Canon',
castingTime: 'Action',
description: `
<em>Once per Long Rest or spend spell slots for additional invocations.</em>
Using Smith's Tools, or Woodcarver's Tools, you create a Small or Tiny Eldritch Canon in an unoccupied space on a horizontal surface within 5 ft.
(Cannon's stats in additional sheet). You determine its appearance and whether you carry it or not (and your choice of legs or wheels for it in that case).
It disappears if reduced to 0 Hit Points or after 1 hour, or if you decide early with an Action. You can have only one canon alive at a time.
`,
resource: {
name: 'Invoke cannon',
id: 'InvokeCannon',
count: {
kind: 'free-then-spell-slots',
numberOfFreeUses: 1,
},
refresh: {
kind: 'long-rest',
},
},
},
],
speciesTraits: WarforgedTraits,
feats: [SKILLED],
spellcasting: {
ability: Ability.Intelligence,
// TODO: pull up spell change traits
slots: { 1: 3 },
numberOfCantrips: 3,
numberOfPreparedSpells: 4,
spells: [
SPELL.Mending,
SPELL.ShockingGrasp,
SPELL.FireBolt,
withSpellMods(SPELL.Shield, { alwaysPrepared: true }),
withSpellMods(SPELL.Thunderwave, { alwaysPrepared: true }),
SPELL.Alarm,
SPELL.Grease,
SPELL.FalseLife,
SPELL.FeatherFall,
],
},
appearance: `
Warforged are mechanical beings built as weapons to fight in the Last War.
You comprise a blend of organic and inorganic materials.
Rootlike chords infused with alchemical fluids serve as your muscles, wrapped around a framework of steel, darkwood, or stone
`,
backstory: `
<p><strong>Archaeologist.</strong> You've made a lifelong study of the lost and fallen cultures of the past. Perhaps you have studied at Morgrave University or similar institutions. Or perhaps you have made it your mission to dig through the remains of the Last War</p>
`,
equipment: [
'Backpack, Caltrops, Crowbar, Rope, Tinderbox',
"Navigator's Tools, Tinker's Tools, Woodcarver's Tools",
'Studded Leather Armour',
'Light Crossbow, Dagger',
'Crossbow bolts = 20',
'Oil flasks = 2',
'Torches = 10',
],
};
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import {
SPELL,
} from '@ageorgedev/dnd-character-sheet';
import { mapObjIndexed } from 'ramda';
import { expertise } from '../common';
import { expertise, SKILLED } from '../common';

export const SaoraData: Character = {
name: 'Saora Embervale',
Expand Down Expand Up @@ -166,13 +166,7 @@ export const SaoraData: Character = {
'You can take the <em>Hide</em> action when you are obscured by a creature larger than you.',
},
],
feats: [
{
name: 'Skilled',
description:
'You have additional proficiency in any combination of 3 skills or tools (already considered in this sheet)',
},
],
feats: [SKILLED],
spellcasting: {
ability: Ability.Charisma,
slots: {
Expand Down
Loading