From 156b15c5e5355b5249ccfe198e2ad24dc75c07de Mon Sep 17 00:00:00 2001 From: Matthias Puchstein Date: Sun, 22 Jun 2025 20:05:31 +0200 Subject: [PATCH] parsed skills, combattechniques and improvements from the sources --- src/assets/combattechniques.json | 0 src/assets/improvementcosttable.json | 154 ------- src/assets/skills.json | 0 .../{CharacterSheet.ts => Character.ts} | 28 +- src/classes/DSAImprovementsTable.ts | 26 ++ src/classes/Skill.ts | 25 -- src/classes/Skills.ts | 26 ++ src/data/combattechniques.json | 91 +++++ src/data/improvementcosttable.json | 87 ++++ src/data/skills.json | 381 ++++++++++++++++++ src/types/baseAbilities.ts | 19 - 11 files changed, 630 insertions(+), 207 deletions(-) delete mode 100644 src/assets/combattechniques.json delete mode 100644 src/assets/improvementcosttable.json delete mode 100644 src/assets/skills.json rename src/classes/{CharacterSheet.ts => Character.ts} (78%) create mode 100644 src/classes/DSAImprovementsTable.ts delete mode 100644 src/classes/Skill.ts create mode 100644 src/classes/Skills.ts create mode 100644 src/data/combattechniques.json create mode 100644 src/data/improvementcosttable.json create mode 100644 src/data/skills.json delete mode 100644 src/types/baseAbilities.ts diff --git a/src/assets/combattechniques.json b/src/assets/combattechniques.json deleted file mode 100644 index e69de29..0000000 diff --git a/src/assets/improvementcosttable.json b/src/assets/improvementcosttable.json deleted file mode 100644 index 9aab998..0000000 --- a/src/assets/improvementcosttable.json +++ /dev/null @@ -1,154 +0,0 @@ -{ - "steigerungsfaktoren": [ - { - "aktivierung": "0", - "faktoren": { - "A": 1, - "B": 2, - "C": 3, - "D": 4, - "E": null - } - }, - { - "aktivierung": "1-12", - "faktoren": { - "A": 1, - "B": 2, - "C": 3, - "D": 4, - "E": 15 - } - }, - { - "aktivierung": "13", - "faktoren": { - "A": 2, - "B": 4, - "C": 6, - "D": 8, - "E": 15 - } - }, - { - "aktivierung": "14", - "faktoren": { - "A": 3, - "B": 6, - "C": 9, - "D": 12, - "E": 15 - } - }, - { - "aktivierung": "15", - "faktoren": { - "A": 4, - "B": 8, - "C": 12, - "D": 16, - "E": 30 - } - }, - { - "aktivierung": "16", - "faktoren": { - "A": 5, - "B": 10, - "C": 15, - "D": 20, - "E": 45 - } - }, - { - "aktivierung": "17", - "faktoren": { - "A": 6, - "B": 12, - "C": 18, - "D": 24, - "E": 60 - } - }, - { - "aktivierung": "18", - "faktoren": { - "A": 7, - "B": 14, - "C": 21, - "D": 28, - "E": 75 - } - }, - { - "aktivierung": "19", - "faktoren": { - "A": 8, - "B": 16, - "C": 24, - "D": 32, - "E": 90 - } - }, - { - "aktivierung": "20", - "faktoren": { - "A": 9, - "B": 18, - "C": 27, - "D": 36, - "E": 105 - } - }, - { - "aktivierung": "21", - "faktoren": { - "A": 10, - "B": 20, - "C": 30, - "D": 40, - "E": 120 - } - }, - { - "aktivierung": "22", - "faktoren": { - "A": 11, - "B": 22, - "C": 33, - "D": 44, - "E": 135 - } - }, - { - "aktivierung": "23", - "faktoren": { - "A": 12, - "B": 24, - "C": 36, - "D": 48, - "E": 150 - } - }, - { - "aktivierung": "24", - "faktoren": { - "A": 13, - "B": 26, - "C": 39, - "D": 52, - "E": 165 - } - }, - { - "aktivierung": "25", - "faktoren": { - "A": 14, - "B": 28, - "C": 42, - "D": 56, - "E": 180 - } - } - ] -} diff --git a/src/assets/skills.json b/src/assets/skills.json deleted file mode 100644 index e69de29..0000000 diff --git a/src/classes/CharacterSheet.ts b/src/classes/Character.ts similarity index 78% rename from src/classes/CharacterSheet.ts rename to src/classes/Character.ts index 08254a0..e4a09c8 100644 --- a/src/classes/CharacterSheet.ts +++ b/src/classes/Character.ts @@ -1,28 +1,27 @@ import type {DSAAttributes, DSAExperienceLevel, DSAPersonalData, DSAStats} from "../types/baseCharacter.ts"; -import type {DSACalculatedValue, DSAImprovements} from "../types/baseDSA.ts"; +import type {DSACalculatedValue} from "../types/baseDSA.ts"; import type {DSABaseEquiment} from "../types/baseEquiment.ts"; import type {DSAArmor, DSAMeleeWeapon, DSARangedWeapon, DSAShieldParryWeapon} from "../types/equiment.ts"; import type {DSASpell} from "../types/character.ts"; -import Skill from "./Skill.ts"; +import Skills from "./Skills.ts"; // TODO // === LOGIC === // Skillpoint <-> QualityLevel -export default class CharacterSheet extends Skill { +export default class Character{ public id: string personalData: DSAPersonalData attributes: DSAAttributes stats: DSAStats - fatePoints: DSACalculatedValue; + fatePoints: DSACalculatedValue experienceLevel: DSAExperienceLevel advantanges: string[] // TODO disadvantanges: string[] // TODO generalSpecialAbilities: string[] // TODO - skills: string[] // TODO: {physical, social, nature, knowledge, craft} generated by GPT - attributeModifiers: string[] + skills: Skills[] // TODO: {physical, social, nature, knowledge, craft} generated by GPT languages: string[] scripts: string[] @@ -80,9 +79,20 @@ export default class CharacterSheet extends Skill { spells?: DSASpell[] } - constructor(name: string) { - super() + constructor() { this.id = crypto.randomUUID() - this.personalData.name = name + this.personalData = { + name: "", age: "", culture: "", family: "", hometown: "", profession: "", socialStanding: "", species: "" + } + this.attributes = { + agility: 8, + charisma: 8, + cleverness: 8, + constitution: 8, + courage: 8, + dexterity: 8, + intuition: 8, + strength: 8 + } } } diff --git a/src/classes/DSAImprovementsTable.ts b/src/classes/DSAImprovementsTable.ts new file mode 100644 index 0000000..e67a007 --- /dev/null +++ b/src/classes/DSAImprovementsTable.ts @@ -0,0 +1,26 @@ +import improvementCostTable from '../data/improvementcosttable.json' +import type {DSAImprovements} from "../types/baseDSA.ts"; + +export default class DSAImprovementsTable { + + private static readonly improvementCostTable = improvementCostTable; + + + static getCost(improvement: DSAImprovements, level: number) : number{ + if(improvement === 'other') { + //TODO + return 0 + } + else { + return improvementCostTable[improvement][this.getKey(level)] + } + } + + private static getKey(level : number) : string { + if(level >= 1 && level <= 12) { + return '1-12' + } else { + return level.toString() + } + } +} \ No newline at end of file diff --git a/src/classes/Skill.ts b/src/classes/Skill.ts deleted file mode 100644 index 59df62f..0000000 --- a/src/classes/Skill.ts +++ /dev/null @@ -1,25 +0,0 @@ -import type {DSAAttributes} from "../types/baseCharacter.ts"; -import type {DSAImprovements} from "../types/baseDSA.ts"; - -export default class Skill{ - skillName: string - attributes: [keyof DSAAttributes, keyof DSAAttributes, keyof DSAAttributes] - encumbrance: "YES" | "NO" | "MAYBE" - improvement: DSAImprovements - skillLevel: number - comment: string - - routineCheck() : number{ - return this.skillLevel >= 13 ? this.skillLevel/2 : 0 - } - - improvementCost(){ - return DSAImprovementsTable.getCost(this.improvement, this.skillLevel) - } - - improve(){ - this.skillLevel ++ - } -} - -// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/export diff --git a/src/classes/Skills.ts b/src/classes/Skills.ts new file mode 100644 index 0000000..bd85db7 --- /dev/null +++ b/src/classes/Skills.ts @@ -0,0 +1,26 @@ +import type {DSAAttributes} from "../types/baseCharacter.ts"; +import type {DSAImprovements} from "../types/baseDSA.ts"; +import DSAImprovementsTable from "./DSAImprovementsTable.ts"; + +export default class Skills { + skillName: string + attributes: [keyof DSAAttributes, keyof DSAAttributes, keyof DSAAttributes] + encumbrance: "YES" | "NO" | "MAYBE" + improvement: DSAImprovements + skillLevel: number + comment: string + + routineCheck(): number { + return this.skillLevel >= 13 ? this.skillLevel / 2 : 0 + } + + improvementCost() { + return DSAImprovementsTable.getCost(this.improvement, this.skillLevel) + } + + improve() { + this.skillLevel++ + } +} + +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/export diff --git a/src/data/combattechniques.json b/src/data/combattechniques.json new file mode 100644 index 0000000..e7ceaad --- /dev/null +++ b/src/data/combattechniques.json @@ -0,0 +1,91 @@ +{ + "combat_techniques": { + "page_ref": "p. 214-231", + "techniques": [ + { + "name": "Bows", + "primary": ["DEX"], + "improvement": "C", + "type": "ranged" + }, + { + "name": "Brawling", + "primary": ["AGI", "STR"], + "improvement": "B", + "type": "melee" + }, + { + "name": "Chain Weapons", + "primary": ["STR"], + "improvement": "B", + "type": "melee" + }, + { + "name": "Crossbows", + "primary": ["DEX"], + "improvement": "B", + "type": "ranged" + }, + { + "name": "Daggers", + "primary": ["AGI"], + "improvement": "B", + "type": "melee" + }, + { + "name": "Fencing Weapons", + "primary": ["AGI"], + "improvement": "C", + "type": "melee" + }, + { + "name": "Impact Weapons", + "primary": ["STR"], + "improvement": "C", + "type": "melee" + }, + { + "name": "Lances", + "primary": ["STR"], + "improvement": "B", + "type": "melee" + }, + { + "name": "Pole Weapons", + "primary": ["AGI", "STR"], + "improvement": "C", + "type": "melee" + }, + { + "name": "Shields", + "primary": ["STR"], + "improvement": "C", + "type": "defensive" + }, + { + "name": "Swords", + "primary": ["AGI", "STR"], + "improvement": "C", + "type": "melee" + }, + { + "name": "Thrown Weapons", + "primary": ["DEX"], + "improvement": "B", + "type": "ranged" + }, + { + "name": "Two-Handed Impact Weapons", + "primary": ["STR"], + "improvement": "C", + "type": "melee" + }, + { + "name": "Two-Handed Swords", + "primary": ["STR"], + "improvement": "C", + "type": "melee" + } + ] + } +} \ No newline at end of file diff --git a/src/data/improvementcosttable.json b/src/data/improvementcosttable.json new file mode 100644 index 0000000..62c9e93 --- /dev/null +++ b/src/data/improvementcosttable.json @@ -0,0 +1,87 @@ +{ + "A": { + "0": 1, + "1-12": 1, + "13": 2, + "14": 3, + "15": 4, + "16": 5, + "17": 6, + "18": 7, + "19": 8, + "20": 9, + "21": 10, + "22": 11, + "23": 12, + "24": 13, + "25": 14 + }, + "B": { + "0": 2, + "1-12": 2, + "13": 4, + "14": 6, + "15": 8, + "16": 10, + "17": 12, + "18": 14, + "19": 16, + "20": 18, + "21": 20, + "22": 22, + "23": 24, + "24": 26, + "25": 28 + }, + "C": { + "0": 3, + "1-12": 3, + "13": 6, + "14": 9, + "15": 12, + "16": 15, + "17": 18, + "18": 21, + "19": 24, + "20": 27, + "21": 30, + "22": 33, + "23": 36, + "24": 39, + "25": 42 + }, + "D": { + "0": 4, + "1-12": 4, + "13": 8, + "14": 12, + "15": 16, + "16": 20, + "17": 24, + "18": 28, + "19": 32, + "20": 36, + "21": 40, + "22": 44, + "23": 48, + "24": 52, + "25": 56 + }, + "E": { + "0": null, + "1-12": 15, + "13": 15, + "14": 15, + "15": 30, + "16": 45, + "17": 60, + "18": 75, + "19": 90, + "20": 105, + "21": 120, + "22": 135, + "23": 150, + "24": 165, + "25": 180 + } +} \ No newline at end of file diff --git a/src/data/skills.json b/src/data/skills.json new file mode 100644 index 0000000..97302f9 --- /dev/null +++ b/src/data/skills.json @@ -0,0 +1,381 @@ +{ + "physical_skills": { + "page_ref": "p. 188-192", + "skills": [ + { + "name": "Body Control", + "check": ["AGI", "AGI", "CON"], + "enc": "yes", + "improvement": "D" + }, + { + "name": "Carousing", + "check": ["SGC", "CON", "STR"], + "enc": "no", + "improvement": "A" + }, + { + "name": "Climbing", + "check": ["COU", "AGI", "STR"], + "enc": "yes", + "improvement": "A" + }, + { + "name": "Dancing", + "check": ["SGC", "CHA", "AGI"], + "enc": "yes", + "improvement": "A" + }, + { + "name": "Feat of Strength", + "check": ["COU", "STR", "STR"], + "enc": "yes", + "improvement": "B" + }, + { + "name": "Flying", + "check": ["COU", "INT", "AGI"], + "enc": "yes", + "improvement": "B" + }, + { + "name": "Gaukelei", + "check": ["COU", "CHA", "DEX"], + "enc": "yes", + "improvement": "A" + }, + { + "name": "Perception", + "check": ["SGC", "INT", "INT"], + "enc": "maybe", + "improvement": "D" + }, + { + "name": "Pickpocket", + "check": ["COU", "DEX", "AGI"], + "enc": "yes", + "improvement": "B" + }, + { + "name": "Riding", + "check": ["CHA", "AGI", "STR"], + "enc": "yes", + "improvement": "B" + }, + { + "name": "Self-Control", + "check": ["COU", "COU", "CON"], + "enc": "no", + "improvement": "D" + }, + { + "name": "Singing", + "check": ["SGC", "CHA", "CON"], + "enc": "maybe", + "improvement": "A" + }, + { + "name": "Stealth", + "check": ["COU", "INT", "AGI"], + "enc": "yes", + "improvement": "C" + }, + { + "name": "Swimming", + "check": ["AGI", "CON", "STR"], + "enc": "yes", + "improvement": "B" + } + ] + }, + "social_skills": { + "page_ref": "p. 193-197", + "skills": [ + { + "name": "Disguise", + "check": ["INT", "CHA", "AGI"], + "enc": "maybe", + "improvement": "B" + }, + { + "name": "Empathy", + "check": ["SGC", "INT", "CHA"], + "enc": "no", + "improvement": "C" + }, + { + "name": "Etiquette", + "check": ["SGC", "INT", "CHA"], + "enc": "maybe", + "improvement": "B" + }, + { + "name": "Fast-Talk", + "check": ["COU", "INT", "CHA"], + "enc": "no", + "improvement": "C" + }, + { + "name": "Intimidation", + "check": ["COU", "INT", "CHA"], + "enc": "no", + "improvement": "B" + }, + { + "name": "Persuasion", + "check": ["COU", "SGC", "CHA"], + "enc": "no", + "improvement": "B" + }, + { + "name": "Seduction", + "check": ["COU", "CHA", "CHA"], + "enc": "maybe", + "improvement": "B" + }, + { + "name": "Streetwise", + "check": ["SGC", "INT", "CHA"], + "enc": "maybe", + "improvement": "C" + }, + { + "name": "Willpower", + "check": ["COU", "INT", "CHA"], + "enc": "no", + "improvement": "D" + } + ] + }, + "knowledge_skills": { + "page_ref": "p. 201-205", + "skills": [ + { + "name": "Astronomy", + "check": ["SGC", "SGC", "INT"], + "enc": "no", + "improvement": "A" + }, + { + "name": "Gambling", + "check": ["SGC", "SGC", "INT"], + "enc": "no", + "improvement": "A" + }, + { + "name": "Geography", + "check": ["SGC", "SGC", "INT"], + "enc": "no", + "improvement": "B" + }, + { + "name": "History", + "check": ["SGC", "SGC", "INT"], + "enc": "no", + "improvement": "B" + }, + { + "name": "Law", + "check": ["SGC", "SGC", "INT"], + "enc": "no", + "improvement": "A" + }, + { + "name": "Magical Lore", + "check": ["SGC", "SGC", "INT"], + "enc": "no", + "improvement": "C" + }, + { + "name": "Math", + "check": ["SGC", "SGC", "INT"], + "enc": "no", + "improvement": "A" + }, + { + "name": "Mechanics", + "check": ["SGC", "SGC", "DEX"], + "enc": "no", + "improvement": "B" + }, + { + "name": "Myths & Legends", + "check": ["SGC", "SGC", "INT"], + "enc": "no", + "improvement": "B" + }, + { + "name": "Religions", + "check": ["SGC", "SGC", "INT"], + "enc": "no", + "improvement": "B" + }, + { + "name": "Sphere Lore", + "check": ["SGC", "SGC", "INT"], + "enc": "no", + "improvement": "B" + }, + { + "name": "Warfare", + "check": ["COU", "SGC", "INT"], + "enc": "no", + "improvement": "B" + } + ] + }, + "nature_skills": { + "page_ref": "p. 198-200", + "skills": [ + { + "name": "Animal Lore", + "check": ["COU", "COU", "CHA"], + "enc": "yes", + "improvement": "C" + }, + { + "name": "Fishing", + "check": ["DEX", "AGI", "CON"], + "enc": "maybe", + "improvement": "A" + }, + { + "name": "Orienting", + "check": ["SGC", "INT", "INT"], + "enc": "no", + "improvement": "B" + }, + { + "name": "Plant Lore", + "check": ["SGC", "DEX", "CON"], + "enc": "maybe", + "improvement": "C" + }, + { + "name": "Ropes", + "check": ["SGC", "DEX", "STR"], + "enc": "maybe", + "improvement": "A" + }, + { + "name": "Survival", + "check": ["COU", "AGI", "CON"], + "enc": "yes", + "improvement": "C" + }, + { + "name": "Tracking", + "check": ["COU", "INT", "AGI"], + "enc": "yes", + "improvement": "C" + } + ] + }, + "craft_skills": { + "page_ref": "p. 206-213", + "skills": [ + { + "name": "Alchemy", + "check": ["COU", "SGC", "DEX"], + "enc": "yes", + "improvement": "C" + }, + { + "name": "Artistic Ability", + "check": ["INT", "DEX", "DEX"], + "enc": "yes", + "improvement": "A" + }, + { + "name": "Clothworking", + "check": ["SGC", "DEX", "DEX"], + "enc": "yes", + "improvement": "B" + }, + { + "name": "Commerce", + "check": ["SGC", "INT", "CHA"], + "enc": "no", + "improvement": "B" + }, + { + "name": "Driving", + "check": ["CHA", "DEX", "CON"], + "enc": "yes", + "improvement": "A" + }, + { + "name": "Earthencraft", + "check": ["DEX", "DEX", "STR"], + "enc": "yes", + "improvement": "A" + }, + { + "name": "Leatherworking", + "check": ["DEX", "AGI", "CON"], + "enc": "yes", + "improvement": "B" + }, + { + "name": "Metalworking", + "check": ["DEX", "CON", "STR"], + "enc": "yes", + "improvement": "C" + }, + { + "name": "Music", + "check": ["CHA", "DEX", "CON"], + "enc": "yes", + "improvement": "A" + }, + { + "name": "Pick Locks", + "check": ["INT", "DEX", "DEX"], + "enc": "yes", + "improvement": "C" + }, + { + "name": "Prepare Food", + "check": ["INT", "DEX", "DEX"], + "enc": "yes", + "improvement": "A" + }, + { + "name": "Sailing", + "check": ["DEX", "AGI", "STR"], + "enc": "yes", + "improvement": "B" + }, + { + "name": "Treat Disease", + "check": ["COU", "INT", "CON"], + "enc": "yes", + "improvement": "B" + }, + { + "name": "Treat Poison", + "check": ["COU", "SGC", "INT"], + "enc": "yes", + "improvement": "B" + }, + { + "name": "Treat Soul", + "check": ["INT", "CHA", "CON"], + "enc": "no", + "improvement": "B" + }, + { + "name": "Treat Wounds", + "check": ["SGC", "DEX", "DEX"], + "enc": "yes", + "improvement": "D" + }, + { + "name": "Woodworking", + "check": ["DEX", "AGI", "STR"], + "enc": "yes", + "improvement": "B" + } + ] + } +} \ No newline at end of file diff --git a/src/types/baseAbilities.ts b/src/types/baseAbilities.ts deleted file mode 100644 index 4b9eaa1..0000000 --- a/src/types/baseAbilities.ts +++ /dev/null @@ -1,19 +0,0 @@ -export interface BaseAbilities { - str: number; - dex: number; - con: number; - int: number; - wis: number; - cha: number; -} - -export interface DSAAttributes { - courage: number; - cleverness: number; - intuition: number; - charisma: number; - dexterity: number; - agility: number; - constitution: number; - strength: number; -}