From b5acb2b76dde750504f2494974fd3474dff7dcef Mon Sep 17 00:00:00 2001 From: vikingowl Date: Sun, 13 Jul 2025 02:31:29 +0200 Subject: [PATCH] Add `CharacterSheet` type definition: introduce foundational TypeScript interfaces and types for character management. --- src/types/CharacterSheet.ts | 142 ++++++++++++++++++++++++++++++++++++ 1 file changed, 142 insertions(+) create mode 100644 src/types/CharacterSheet.ts diff --git a/src/types/CharacterSheet.ts b/src/types/CharacterSheet.ts new file mode 100644 index 0000000..955184c --- /dev/null +++ b/src/types/CharacterSheet.ts @@ -0,0 +1,142 @@ +// Basic ID pattern types +type HeroId = string; // Pattern: "^H_[1-9]\\d*$" +type RaceId = string; // Pattern: "^R_[1-9]\\d*$" +type RaceVariantId = string; // Pattern: "^RV_[1-9]\\d*$" +type CultureId = string; // Pattern: "^C_[1-9]\\d*$" +type ProfessionId = string; // Pattern: "^P_[1-9]\\d*$" +type ProfessionVariantId = string; // Pattern: "^PV_[1-9]\\d*$" +type ExperienceLevelId = string; // Pattern: "^EL_[1-9]\\d*$" +type AttributeId = string; // Pattern: "^ATTR_[1-9]\\d*$" +type TalentId = string; // Pattern: "^TAL_[1-9]\\d*$" +type CombatTechniqueId = string; // Pattern: "^CT_[1-9]\\d*$" +type SpellId = string; // Pattern: "^SPELL_[1-9]\\d*$" +type CantripId = string; // Pattern: "^CANTRIP_[1-9]\\d*$" +type LiturgyId = string; // Pattern: "^LITURGY_[1-9]\\d*$" +type BlessingId = string; // Pattern: "^BLESSING_[1-9]\\d*$" +type ItemId = string; // Pattern: "^ITEM_[1-9]\\d*$" +type ActivatableId = string; // Pattern: "^(ADV|DISADV|SA)_[1-9]\\d*$" + +// Adventure Points +interface AdventurePoints { + total: number; // minimum: 1 +} + +// Rules configuration +interface Rules { + higherParadeValues: 0 | 2 | 4; + attributeValueLimit: boolean; + enableAllRuleBooks: boolean; + enabledRuleBooks: string[]; + enableLanguageSpecializations: boolean; +} + +// Personal data +interface PersonalData { + family?: string; + placeofbirth?: string; + dateofbirth?: string; + age?: string; + haircolor?: string; + eyecolor?: string; + size?: string; + weight?: string; + title?: string; + socialstatus?: number; // 1-5 + characteristics?: string; + otherinfo?: string; + cultureAreaKnowledge?: string; +} + +// Activatable items (advantages, disadvantages, special abilities) +interface ActivatableOption { + sid?: string | number; + sid2?: string | number; + sid3?: string | number; + tier?: number; // minimum: 1 + cost?: number; // minimum: 0 +} + +// Permanent energy attributes +interface PermanentEnergy { + lost: number; // minimum: 0 + redeemed?: number; // minimum: 0 +} + +interface PermanentLP { + lost: number; // minimum: 0 +} + +// Attribute value (older version - tuple format) +type AttributeTuple = [AttributeId, number, number]; // [id, value, adjustment] + +// Attribute value (newer version - object format) +interface AttributeValue { + id: AttributeId; + value: number; // minimum: 8 +} + +// Attributes - supports both old and new formats +interface AttributesOld { + values: AttributeTuple[]; + lp: number; // minimum: 0 + ae: number; // minimum: 0 + kp: number; // minimum: 0 + permanentLP?: PermanentLP; + permanentAE: PermanentEnergy; + permanentKP: PermanentEnergy; +} + +interface AttributesNew { + values: AttributeValue[]; + attributeAdjustmentSelected: AttributeId; + lp: number; // minimum: 0 + ae: number; // minimum: 0 + kp: number; // minimum: 0 + permanentLP?: PermanentLP; + permanentAE: PermanentEnergy; + permanentKP: PermanentEnergy; +} + +// Belongings +interface Item { + id: ItemId; + price?: number; // minimum: 0 + weight?: number; // minimum: 0 +} + +interface Belongings { + items: Record; +} + +// Main CharacterSheet type +export interface CharacterSheet { + id: HeroId; + name: string; + clientVersion: string; // Version pattern: (0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(-(\\w+)\\.(0|[1-9]\\d*))? + dateCreated: string; // ISO date-time format + dateModified: string; // ISO date-time format + locale?: string; // Pattern: "^[a-z]\\-[A-Z]$" + avatar?: string; + ap: AdventurePoints; + r?: RaceId; + rv?: RaceVariantId; + c?: CultureId; + isCulturalPackageActive?: boolean; + p?: ProfessionId; + professionName?: string; + pv?: ProfessionVariantId; + sex: "m" | "f"; + rules: Rules; + phase: 1 | 2 | 3; // 1: RCP selection, 2: standard creation, 3: after creation + el: ExperienceLevelId; + pers: PersonalData; + activatable: Record; + attr: AttributesOld | AttributesNew; + talents: Record; // minimum: 0 + ct: Record; // minimum: 0 + spells: Record; // minimum: 0 + cantrips: CantripId[]; + liturgies: Record; // minimum: 0 + blessings: BlessingId[]; + belongings?: Belongings; +}