Phase 3: Split types.ts into domain-specific files
This commit is contained in:
+13
-515
@@ -1,516 +1,14 @@
|
|||||||
// ─── Game Types ───────────────────────────────────────────────────────────────
|
// ─── Game Types ───────────────────────────────────────────────────────────────
|
||||||
|
// This file now re-exports types from domain-specific files in the types/ directory.
|
||||||
export type ElementCategory = 'base' | 'utility' | 'composite' | 'exotic';
|
// All type definitions have been moved to:
|
||||||
|
// - types/elements.ts - element-related types
|
||||||
// Attunement body slots
|
// - types/attunements.ts - attunement-related types
|
||||||
export type AttunementSlot = 'rightHand' | 'leftHand' | 'head' | 'back' | 'chest' | 'leftLeg' | 'rightLeg';
|
// - types/spells.ts - spell-related types
|
||||||
|
// - types/skills.ts - skill-related types
|
||||||
// Attunement definition
|
// - types/equipment.ts - equipment-related types
|
||||||
export interface AttunementDef {
|
// - types/game.ts - core game state types
|
||||||
id: string;
|
//
|
||||||
name: string;
|
// Import from this file (types.ts) to maintain backward compatibility,
|
||||||
desc: string;
|
// or import directly from the domain-specific files.
|
||||||
slot: AttunementSlot;
|
|
||||||
icon: string;
|
export * from './types/index';
|
||||||
color: string;
|
|
||||||
primaryManaType?: string; // Primary mana type this attunement generates (null for Invoker)
|
|
||||||
rawManaRegen: number; // Raw mana regeneration per hour granted by this attunement
|
|
||||||
conversionRate: number; // Raw mana converted to primary type per hour
|
|
||||||
unlocked: boolean; // Whether this is unlocked by default
|
|
||||||
unlockCondition?: string; // Description of how to unlock (for future challenges)
|
|
||||||
capabilities: string[]; // What this attunement enables (e.g., 'enchanting', 'pacts', 'golemCrafting')
|
|
||||||
skillCategories: string[]; // Skill categories this attunement provides access to
|
|
||||||
}
|
|
||||||
|
|
||||||
// Attunement instance state (tracks player's attunements)
|
|
||||||
export interface AttunementState {
|
|
||||||
id: string;
|
|
||||||
active: boolean; // Whether this attunement is currently active
|
|
||||||
level: number; // Attunement level (for future progression)
|
|
||||||
experience: number; // Progress toward next level
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ElementDef {
|
|
||||||
name: string;
|
|
||||||
sym: string;
|
|
||||||
color: string;
|
|
||||||
glow: string;
|
|
||||||
cat: ElementCategory;
|
|
||||||
recipe?: string[];
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ElementState {
|
|
||||||
current: number;
|
|
||||||
max: number;
|
|
||||||
unlocked: boolean;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Boon types that guardians can grant
|
|
||||||
export interface GuardianBoon {
|
|
||||||
type: 'maxMana' | 'manaRegen' | 'castingSpeed' | 'elementalDamage' | 'rawDamage' |
|
|
||||||
'critChance' | 'critDamage' | 'spellEfficiency' | 'manaGain' | 'insightGain' |
|
|
||||||
'studySpeed' | 'prestigeInsight';
|
|
||||||
value: number;
|
|
||||||
desc: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface GuardianDef {
|
|
||||||
name: string;
|
|
||||||
element: string;
|
|
||||||
hp: number;
|
|
||||||
pact: number; // Pact multiplier when signed
|
|
||||||
color: string;
|
|
||||||
boons: GuardianBoon[]; // Bonuses granted when pact is signed
|
|
||||||
pactCost: number; // Mana cost to perform pact ritual
|
|
||||||
pactTime: number; // Hours required for pact ritual
|
|
||||||
uniquePerk: string; // Description of unique perk
|
|
||||||
armor?: number; // Damage reduction (0-1, e.g., 0.2 = 20% reduction)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Spell cost can be raw mana or elemental mana
|
|
||||||
export interface SpellCost {
|
|
||||||
type: 'raw' | 'element'; // 'raw' for raw mana, 'element' for specific elemental mana
|
|
||||||
element?: string; // Required if type is 'element'
|
|
||||||
amount: number; // Amount of mana required
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface SpellDef {
|
|
||||||
name: string;
|
|
||||||
elem: string; // Element type for damage calculations
|
|
||||||
dmg: number;
|
|
||||||
cost: SpellCost; // Changed from number to SpellCost object
|
|
||||||
tier: number;
|
|
||||||
unlock: number; // Mana cost to start studying
|
|
||||||
studyTime?: number; // Hours needed to study (optional, defaults based on tier)
|
|
||||||
castSpeed?: number; // Casts per hour (default 1, higher = faster)
|
|
||||||
desc?: string; // Optional spell description
|
|
||||||
effects?: SpellEffect[]; // Optional special effects
|
|
||||||
isAoe?: boolean; // AOE spell that hits multiple enemies
|
|
||||||
aoeTargets?: number; // Number of enemies hit by AOE
|
|
||||||
isWeaponEnchant?: boolean; // Can be used as weapon enchantment (magic swords)
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface SpellEffect {
|
|
||||||
type: 'burn' | 'freeze' | 'stun' | 'pierce' | 'multicast' | 'shield' | 'buff' | 'chain' | 'aoe' | 'armor_pierce';
|
|
||||||
value: number; // Effect potency
|
|
||||||
duration?: number; // Duration in hours for timed effects
|
|
||||||
targets?: number; // For AOE: number of targets
|
|
||||||
chance?: number; // For chance-based effects (e.g., stun chance)
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface SpellState {
|
|
||||||
learned: boolean;
|
|
||||||
level: number;
|
|
||||||
studyProgress?: number; // Hours studied so far (for in-progress spells)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ─── Room and Enemy Types ─────────────────────────────────────────────────────
|
|
||||||
|
|
||||||
export type RoomType = 'combat' | 'puzzle' | 'swarm' | 'speed' | 'guardian';
|
|
||||||
|
|
||||||
export interface EnemyState {
|
|
||||||
id: string;
|
|
||||||
hp: number;
|
|
||||||
maxHP: number;
|
|
||||||
armor: number; // Damage reduction (0-1)
|
|
||||||
dodgeChance: number; // For speed rooms (0-1)
|
|
||||||
element: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface FloorState {
|
|
||||||
roomType: RoomType;
|
|
||||||
enemies: EnemyState[]; // For swarm rooms, multiple enemies
|
|
||||||
puzzleProgress?: number; // For puzzle rooms (0-1)
|
|
||||||
puzzleRequired?: number; // Total progress needed
|
|
||||||
puzzleId?: string; // Which puzzle type
|
|
||||||
puzzleAttunements?: string[]; // Which attunements speed up this puzzle
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface SkillDef {
|
|
||||||
name: string;
|
|
||||||
desc: string;
|
|
||||||
cat: string;
|
|
||||||
attunement?: string; // Which attunement this skill belongs to (null = core)
|
|
||||||
max: number;
|
|
||||||
base: number; // Mana cost to start studying
|
|
||||||
req?: Record<string, number>; // Skill prerequisites
|
|
||||||
attunementReq?: Record<string, number>; // Attunement level requirements (attunement id -> min level)
|
|
||||||
studyTime: number; // Hours needed to study
|
|
||||||
level?: number; // Current level (optional, for UI display)
|
|
||||||
tier?: number; // Skill tier (1-5)
|
|
||||||
tierUp?: string; // Skill ID this evolves into at max level
|
|
||||||
baseSkill?: string; // Original skill ID this evolved from
|
|
||||||
tierMultiplier?: number; // Multiplier for each tier (default 2)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Skill upgrade choices at milestones (level 5 and level 10)
|
|
||||||
export interface SkillUpgradeDef {
|
|
||||||
id: string;
|
|
||||||
name: string;
|
|
||||||
desc: string;
|
|
||||||
skillId: string; // Which skill this upgrade belongs to
|
|
||||||
milestone: 5 | 10; // Level at which this upgrade is available
|
|
||||||
effect: SkillUpgradeEffect;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface SkillUpgradeEffect {
|
|
||||||
type: 'multiplier' | 'bonus' | 'special';
|
|
||||||
stat?: string; // Stat to modify
|
|
||||||
value?: number; // Multiplier or bonus value
|
|
||||||
specialId?: string; // Special effect identifier
|
|
||||||
specialDesc?: string; // Description of special effect
|
|
||||||
}
|
|
||||||
|
|
||||||
// Skill evolution system - 5-Tier Continuous Talent Tree
|
|
||||||
// Each skill with max level 10 follows this structure:
|
|
||||||
// - 5 Tiers (T1-T5)
|
|
||||||
// - Each tier has L5 and L10 milestone perk choices
|
|
||||||
// - 3 paths per tier (A, B, C columns) representing different playstyles
|
|
||||||
// - T3 L10 and T5 L10 have Elite Perks (game-changing mechanics)
|
|
||||||
|
|
||||||
export interface SkillEvolutionPath {
|
|
||||||
baseSkillId: string; // Starting skill ID
|
|
||||||
tiers: SkillTierDef[]; // 5 tiers of evolution
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface SkillTierDef {
|
|
||||||
tier: number; // Tier number (1-5)
|
|
||||||
skillId: string; // Skill ID for this tier
|
|
||||||
name: string;
|
|
||||||
multiplier: number; // Base effect multiplier for this tier
|
|
||||||
// Perk choices organized by milestone and path (A, B, C)
|
|
||||||
l5Perks: SkillPerkChoice[]; // 3 choices (one per path) at level 5
|
|
||||||
l10Perks: SkillPerkChoice[]; // 3 choices (one per path) at level 10
|
|
||||||
}
|
|
||||||
|
|
||||||
// Perk choice at a milestone - belongs to a specific path (A, B, or C)
|
|
||||||
export interface SkillPerkChoice {
|
|
||||||
id: string;
|
|
||||||
name: string;
|
|
||||||
desc: string;
|
|
||||||
path: 'A' | 'B' | 'C'; // Which path this perk belongs to
|
|
||||||
isElite?: boolean; // True for T3 L10 and T5 L10 perks
|
|
||||||
effect: SkillUpgradeEffect;
|
|
||||||
// For path compounding - if player stays on same path, bonuses compound
|
|
||||||
pathCompoundBonus?: number; // Exponential bonus for staying on same path
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface SkillUpgradeChoice {
|
|
||||||
id: string;
|
|
||||||
name: string;
|
|
||||||
desc: string;
|
|
||||||
milestone: 5 | 10; // Level at which this upgrade is available
|
|
||||||
effect: SkillUpgradeEffect;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface PrestigeDef {
|
|
||||||
name: string;
|
|
||||||
desc: string;
|
|
||||||
max: number;
|
|
||||||
cost: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Legacy EquipmentDef for backward compatibility
|
|
||||||
export interface EquipmentDef {
|
|
||||||
id: string;
|
|
||||||
name: string;
|
|
||||||
slot: 'mainHand' | 'offHand' | 'head' | 'body' | 'hands' | 'accessory';
|
|
||||||
rarity: 'common' | 'uncommon' | 'rare' | 'epic' | 'legendary' | 'mythic';
|
|
||||||
stats: Record<string, number>;
|
|
||||||
durability: number;
|
|
||||||
maxDurability: number;
|
|
||||||
element?: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Equipment Instance (actual equipped item with enchantments)
|
|
||||||
export interface EquipmentInstance {
|
|
||||||
instanceId: string; // Unique ID for this specific item
|
|
||||||
typeId: string; // Reference to EquipmentType (e.g., 'basicStaff')
|
|
||||||
name: string; // Display name (defaults to type name)
|
|
||||||
enchantments: AppliedEnchantment[];
|
|
||||||
usedCapacity: number; // Currently used capacity
|
|
||||||
totalCapacity: number; // Base capacity + bonuses
|
|
||||||
rarity: 'common' | 'uncommon' | 'rare' | 'epic' | 'legendary' | 'mythic';
|
|
||||||
quality: number; // 0-100, affects capacity efficiency
|
|
||||||
weaponMana?: number; // Current mana stored in weapon (for weapon enchantments)
|
|
||||||
weaponManaMax?: number; // Max mana the weapon can store
|
|
||||||
weaponManaRegen?: number; // Mana regen per hour for weapon
|
|
||||||
weaponManaType?: string; // Type of mana the weapon stores
|
|
||||||
activeWeaponEnchant?: string; // Active weapon enchantment (for magic swords)
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface AppliedEnchantment {
|
|
||||||
effectId: string; // Reference to EnchantmentEffectDef
|
|
||||||
stacks: number; // Number of times this effect is applied
|
|
||||||
actualCost: number; // Actual capacity cost (after efficiency)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Enchantment Design (saved design for later application)
|
|
||||||
export interface EnchantmentDesign {
|
|
||||||
id: string;
|
|
||||||
name: string;
|
|
||||||
equipmentType: string; // Which equipment type this is designed for
|
|
||||||
effects: DesignEffect[];
|
|
||||||
totalCapacityUsed: number;
|
|
||||||
designTime: number; // Hours required to design
|
|
||||||
created: number; // Timestamp
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface DesignEffect {
|
|
||||||
effectId: string;
|
|
||||||
stacks: number;
|
|
||||||
capacityCost: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Crafting Progress States
|
|
||||||
export interface DesignProgress {
|
|
||||||
designId: string;
|
|
||||||
progress: number; // Hours spent designing
|
|
||||||
required: number; // Total hours needed
|
|
||||||
// Design data stored during progress
|
|
||||||
name: string;
|
|
||||||
equipmentType: string;
|
|
||||||
effects: DesignEffect[];
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface PreparationProgress {
|
|
||||||
equipmentInstanceId: string;
|
|
||||||
progress: number; // Hours spent preparing
|
|
||||||
required: number; // Total hours needed
|
|
||||||
manaCostPaid: number; // Mana cost already paid
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ApplicationProgress {
|
|
||||||
equipmentInstanceId: string;
|
|
||||||
designId: string;
|
|
||||||
progress: number; // Hours spent applying
|
|
||||||
required: number; // Total hours needed
|
|
||||||
manaPerHour: number; // Mana cost per hour
|
|
||||||
paused: boolean;
|
|
||||||
manaSpent: number; // Total mana spent so far
|
|
||||||
}
|
|
||||||
|
|
||||||
// Equipment crafting progress (from blueprints)
|
|
||||||
export interface EquipmentCraftingProgress {
|
|
||||||
blueprintId: string;
|
|
||||||
equipmentTypeId: string;
|
|
||||||
progress: number; // Hours spent crafting
|
|
||||||
required: number; // Total hours needed
|
|
||||||
manaSpent: number; // Total mana spent so far
|
|
||||||
}
|
|
||||||
|
|
||||||
// Equipment spell state (for multi-spell casting)
|
|
||||||
export interface EquipmentSpellState {
|
|
||||||
spellId: string;
|
|
||||||
sourceEquipment: string; // Equipment instance ID
|
|
||||||
castProgress: number; // 0-1 progress toward next cast
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface BlueprintDef {
|
|
||||||
id: string;
|
|
||||||
name: string;
|
|
||||||
tier: number;
|
|
||||||
slot: string;
|
|
||||||
stats: Record<string, number>;
|
|
||||||
studyTime: number;
|
|
||||||
craftTime: number;
|
|
||||||
craftCost: number;
|
|
||||||
discovered: boolean;
|
|
||||||
learned: boolean;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Loot inventory for materials and blueprints
|
|
||||||
export interface LootInventory {
|
|
||||||
materials: Record<string, number>; // materialId -> count
|
|
||||||
blueprints: string[]; // blueprint IDs discovered
|
|
||||||
}
|
|
||||||
|
|
||||||
// Achievement definitions
|
|
||||||
export interface AchievementDef {
|
|
||||||
id: string;
|
|
||||||
name: string;
|
|
||||||
desc: string;
|
|
||||||
category: string;
|
|
||||||
requirement: {
|
|
||||||
type: string;
|
|
||||||
value: number;
|
|
||||||
subType?: string;
|
|
||||||
};
|
|
||||||
reward: {
|
|
||||||
insight?: number;
|
|
||||||
manaBonus?: number;
|
|
||||||
damageBonus?: number;
|
|
||||||
regenBonus?: number;
|
|
||||||
title?: string;
|
|
||||||
unlockEffect?: string;
|
|
||||||
};
|
|
||||||
hidden?: boolean;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Achievement state tracks unlocked achievements and progress
|
|
||||||
export interface AchievementState {
|
|
||||||
unlocked: string[]; // IDs of unlocked achievements
|
|
||||||
progress: Record<string, number>; // Progress toward achievement requirements
|
|
||||||
}
|
|
||||||
|
|
||||||
export type GameAction = 'meditate' | 'climb' | 'study' | 'craft' | 'repair' | 'convert' | 'design' | 'prepare' | 'enchant';
|
|
||||||
|
|
||||||
export interface ScheduleBlock {
|
|
||||||
id: string;
|
|
||||||
action: GameAction;
|
|
||||||
startHour: number;
|
|
||||||
endHour: number;
|
|
||||||
enabled: boolean;
|
|
||||||
target?: string; // spell id, blueprint id, skill id, element id
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface StudyTarget {
|
|
||||||
type: 'skill' | 'spell' | 'blueprint';
|
|
||||||
id: string;
|
|
||||||
progress: number; // Hours studied
|
|
||||||
required: number; // Total hours needed
|
|
||||||
}
|
|
||||||
|
|
||||||
// ─── Golemancy Types ───────────────────────────────────────────────────────────
|
|
||||||
|
|
||||||
export interface SummonedGolem {
|
|
||||||
golemId: string; // Reference to GOLEMS_DEF
|
|
||||||
summonedFloor: number; // Floor when golem was summoned
|
|
||||||
attackProgress: number; // Progress toward next attack (0-1)
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface GolemancyState {
|
|
||||||
enabledGolems: string[]; // Golem IDs the player wants active
|
|
||||||
summonedGolems: SummonedGolem[]; // Currently summoned golems on this floor
|
|
||||||
lastSummonFloor: number; // Floor golems were last summoned on
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface GameState {
|
|
||||||
// Time
|
|
||||||
day: number;
|
|
||||||
hour: number;
|
|
||||||
loopCount: number;
|
|
||||||
gameOver: boolean;
|
|
||||||
victory: boolean;
|
|
||||||
paused: boolean;
|
|
||||||
|
|
||||||
// Raw Mana
|
|
||||||
rawMana: number;
|
|
||||||
meditateTicks: number;
|
|
||||||
totalManaGathered: number;
|
|
||||||
|
|
||||||
// Attunements (class-like system)
|
|
||||||
attunements: Record<string, AttunementState>; // attunement id -> state
|
|
||||||
|
|
||||||
// Elements
|
|
||||||
elements: Record<string, ElementState>;
|
|
||||||
|
|
||||||
// Spire
|
|
||||||
currentFloor: number;
|
|
||||||
floorHP: number;
|
|
||||||
floorMaxHP: number;
|
|
||||||
maxFloorReached: number;
|
|
||||||
signedPacts: number[];
|
|
||||||
activeSpell: string;
|
|
||||||
currentAction: GameAction;
|
|
||||||
castProgress: number; // Progress towards next spell cast (0-1)
|
|
||||||
|
|
||||||
// Room system for special floors
|
|
||||||
currentRoom: FloorState; // Current room state (swarm, puzzle, speed, etc.)
|
|
||||||
|
|
||||||
// Spells
|
|
||||||
spells: Record<string, SpellState>;
|
|
||||||
|
|
||||||
// Skills
|
|
||||||
skills: Record<string, number>;
|
|
||||||
skillProgress: Record<string, number>; // Saved study progress for skills
|
|
||||||
skillUpgrades: Record<string, string[]>; // Selected upgrade IDs per skill
|
|
||||||
skillTiers: Record<string, number>; // Current tier for each base skill
|
|
||||||
|
|
||||||
// Equipment System (new instance-based system)
|
|
||||||
equippedInstances: Record<string, string | null>; // slot -> instanceId
|
|
||||||
equipmentInstances: Record<string, EquipmentInstance>; // instanceId -> instance
|
|
||||||
enchantmentDesigns: EnchantmentDesign[]; // Saved enchantment designs
|
|
||||||
|
|
||||||
// Crafting Progress
|
|
||||||
designProgress: DesignProgress | null;
|
|
||||||
preparationProgress: PreparationProgress | null;
|
|
||||||
applicationProgress: ApplicationProgress | null;
|
|
||||||
equipmentCraftingProgress: EquipmentCraftingProgress | null;
|
|
||||||
|
|
||||||
// Unlocked enchantment effects for designing
|
|
||||||
unlockedEffects: string[]; // Effect IDs that have been researched
|
|
||||||
|
|
||||||
// Equipment spell states for multi-casting
|
|
||||||
equipmentSpellStates: EquipmentSpellState[];
|
|
||||||
|
|
||||||
// Legacy Equipment (for backward compatibility)
|
|
||||||
equipment: Record<string, EquipmentDef | null>;
|
|
||||||
inventory: EquipmentDef[];
|
|
||||||
|
|
||||||
// Blueprints
|
|
||||||
blueprints: Record<string, BlueprintDef>;
|
|
||||||
|
|
||||||
// Loot Inventory
|
|
||||||
lootInventory: LootInventory;
|
|
||||||
|
|
||||||
// Schedule
|
|
||||||
schedule: ScheduleBlock[];
|
|
||||||
autoSchedule: boolean;
|
|
||||||
studyQueue: string[];
|
|
||||||
craftQueue: string[];
|
|
||||||
|
|
||||||
// Current Study Target
|
|
||||||
currentStudyTarget: StudyTarget | null;
|
|
||||||
|
|
||||||
// Parallel Study Target (for Parallel Mind milestone upgrade)
|
|
||||||
parallelStudyTarget: StudyTarget | null;
|
|
||||||
|
|
||||||
// Golemancy (summoned golems)
|
|
||||||
golemancy: GolemancyState;
|
|
||||||
|
|
||||||
// Achievements
|
|
||||||
achievements: AchievementState;
|
|
||||||
|
|
||||||
// Stats tracking
|
|
||||||
totalSpellsCast: number;
|
|
||||||
totalDamageDealt: number;
|
|
||||||
totalCraftsCompleted: number;
|
|
||||||
|
|
||||||
// Prestige
|
|
||||||
insight: number;
|
|
||||||
totalInsight: number;
|
|
||||||
prestigeUpgrades: Record<string, number>;
|
|
||||||
memorySlots: number;
|
|
||||||
memories: string[];
|
|
||||||
|
|
||||||
// Incursion
|
|
||||||
incursionStrength: number;
|
|
||||||
containmentWards: number;
|
|
||||||
|
|
||||||
// Log
|
|
||||||
log: string[];
|
|
||||||
|
|
||||||
// Loop insight (earned at end of current loop)
|
|
||||||
loopInsight: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Action types for the store
|
|
||||||
export type GameActionType =
|
|
||||||
| { type: 'TICK' }
|
|
||||||
| { type: 'GATHER_MANA' }
|
|
||||||
| { type: 'SET_ACTION'; action: GameAction }
|
|
||||||
| { type: 'SET_SPELL'; spellId: string }
|
|
||||||
| { type: 'LEARN_SPELL'; spellId: string }
|
|
||||||
| { type: 'START_STUDYING_SKILL'; skillId: string }
|
|
||||||
| { type: 'START_STUDYING_SPELL'; spellId: string }
|
|
||||||
| { type: 'CANCEL_STUDY' }
|
|
||||||
| { type: 'CONVERT_MANA'; element: string; amount: number }
|
|
||||||
| { type: 'UNLOCK_ELEMENT'; element: string }
|
|
||||||
| { type: 'CRAFT_COMPOSITE'; target: string }
|
|
||||||
| { type: 'DO_PRESTIGE'; id: string }
|
|
||||||
| { type: 'START_NEW_LOOP' }
|
|
||||||
| { type: 'TOGGLE_PAUSE' }
|
|
||||||
| { type: 'RESET_GAME' }
|
|
||||||
| { type: 'SELECT_SKILL_UPGRADE'; skillId: string; upgradeId: string }
|
|
||||||
| { type: 'TIER_UP_SKILL'; skillId: string };
|
|
||||||
|
|||||||
@@ -0,0 +1,51 @@
|
|||||||
|
// ─── Attunement Types ───────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
// Attunement body slots
|
||||||
|
export type AttunementSlot = 'rightHand' | 'leftHand' | 'head' | 'back' | 'chest' | 'leftLeg' | 'rightLeg';
|
||||||
|
|
||||||
|
// Attunement definition
|
||||||
|
export interface AttunementDef {
|
||||||
|
id: string;
|
||||||
|
name: string;
|
||||||
|
desc: string;
|
||||||
|
slot: AttunementSlot;
|
||||||
|
icon: string;
|
||||||
|
color: string;
|
||||||
|
primaryManaType?: string; // Primary mana type this attunement generates (null for Invoker)
|
||||||
|
rawManaRegen: number; // Raw mana regeneration per hour granted by this attunement
|
||||||
|
conversionRate: number; // Raw mana converted to primary type per hour
|
||||||
|
unlocked: boolean; // Whether this is unlocked by default
|
||||||
|
unlockCondition?: string; // Description of how to unlock (for future challenges)
|
||||||
|
capabilities: string[]; // What this attunement enables (e.g., 'enchanting', 'pacts', 'golemCrafting')
|
||||||
|
skillCategories: string[]; // Skill categories this attunement provides access to
|
||||||
|
}
|
||||||
|
|
||||||
|
// Attunement instance state (tracks player's attunements)
|
||||||
|
export interface AttunementState {
|
||||||
|
id: string;
|
||||||
|
active: boolean; // Whether this attunement is currently active
|
||||||
|
level: number; // Attunement level (for future progression)
|
||||||
|
experience: number; // Progress toward next level
|
||||||
|
}
|
||||||
|
|
||||||
|
// Boon types that guardians can grant
|
||||||
|
export interface GuardianBoon {
|
||||||
|
type: 'maxMana' | 'manaRegen' | 'castingSpeed' | 'elementalDamage' | 'rawDamage' |
|
||||||
|
'critChance' | 'critDamage' | 'spellEfficiency' | 'manaGain' | 'insightGain' |
|
||||||
|
'studySpeed' | 'prestigeInsight';
|
||||||
|
value: number;
|
||||||
|
desc: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface GuardianDef {
|
||||||
|
name: string;
|
||||||
|
element: string;
|
||||||
|
hp: number;
|
||||||
|
pact: number; // Pact multiplier when signed
|
||||||
|
color: string;
|
||||||
|
boons: GuardianBoon[]; // Bonuses granted when pact is signed
|
||||||
|
pactCost: number; // Mana cost to perform pact ritual
|
||||||
|
pactTime: number; // Hours required for pact ritual
|
||||||
|
uniquePerk: string; // Description of unique perk
|
||||||
|
armor?: number; // Damage reduction (0-1, e.g., 0.2 = 20% reduction)
|
||||||
|
}
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
// ─── Element Types ───────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
export type ElementCategory = 'base' | 'utility' | 'composite' | 'exotic';
|
||||||
|
|
||||||
|
export interface ElementDef {
|
||||||
|
name: string;
|
||||||
|
sym: string;
|
||||||
|
color: string;
|
||||||
|
glow: string;
|
||||||
|
cat: ElementCategory;
|
||||||
|
recipe?: string[];
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface ElementState {
|
||||||
|
current: number;
|
||||||
|
max: number;
|
||||||
|
unlocked: boolean;
|
||||||
|
}
|
||||||
@@ -0,0 +1,116 @@
|
|||||||
|
// ─── Equipment Types ───────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
// Legacy EquipmentDef for backward compatibility
|
||||||
|
export interface EquipmentDef {
|
||||||
|
id: string;
|
||||||
|
name: string;
|
||||||
|
slot: 'mainHand' | 'offHand' | 'head' | 'body' | 'hands' | 'accessory';
|
||||||
|
rarity: 'common' | 'uncommon' | 'rare' | 'epic' | 'legendary' | 'mythic';
|
||||||
|
stats: Record<string, number>;
|
||||||
|
durability: number;
|
||||||
|
maxDurability: number;
|
||||||
|
element?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Equipment Instance (actual equipped item with enchantments)
|
||||||
|
export interface EquipmentInstance {
|
||||||
|
instanceId: string; // Unique ID for this specific item
|
||||||
|
typeId: string; // Reference to EquipmentType (e.g., 'basicStaff')
|
||||||
|
name: string; // Display name (defaults to type name)
|
||||||
|
enchantments: AppliedEnchantment[];
|
||||||
|
usedCapacity: number; // Currently used capacity
|
||||||
|
totalCapacity: number; // Base capacity + bonuses
|
||||||
|
rarity: 'common' | 'uncommon' | 'rare' | 'epic' | 'legendary' | 'mythic';
|
||||||
|
quality: number; // 0-100, affects capacity efficiency
|
||||||
|
weaponMana?: number; // Current mana stored in weapon (for weapon enchantments)
|
||||||
|
weaponManaMax?: number; // Max mana the weapon can store
|
||||||
|
weaponManaRegen?: number; // Mana regen per hour for weapon
|
||||||
|
weaponManaType?: string; // Type of mana the weapon stores
|
||||||
|
activeWeaponEnchant?: string; // Active weapon enchantment (for magic swords)
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface AppliedEnchantment {
|
||||||
|
effectId: string; // Reference to EnchantmentEffectDef
|
||||||
|
stacks: number; // Number of times this effect is applied
|
||||||
|
actualCost: number; // Actual capacity cost (after efficiency)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Enchantment Design (saved design for later application)
|
||||||
|
export interface EnchantmentDesign {
|
||||||
|
id: string;
|
||||||
|
name: string;
|
||||||
|
equipmentType: string; // Which equipment type this is designed for
|
||||||
|
effects: DesignEffect[];
|
||||||
|
totalCapacityUsed: number;
|
||||||
|
designTime: number; // Hours required to design
|
||||||
|
created: number; // Timestamp
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface DesignEffect {
|
||||||
|
effectId: string;
|
||||||
|
stacks: number;
|
||||||
|
capacityCost: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Crafting Progress States
|
||||||
|
export interface DesignProgress {
|
||||||
|
designId: string;
|
||||||
|
progress: number; // Hours spent designing
|
||||||
|
required: number; // Total hours needed
|
||||||
|
// Design data stored during progress
|
||||||
|
name: string;
|
||||||
|
equipmentType: string;
|
||||||
|
effects: DesignEffect[];
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface PreparationProgress {
|
||||||
|
equipmentInstanceId: string;
|
||||||
|
progress: number; // Hours spent preparing
|
||||||
|
required: number; // Total hours needed
|
||||||
|
manaCostPaid: number; // Mana cost already paid
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface ApplicationProgress {
|
||||||
|
equipmentInstanceId: string;
|
||||||
|
designId: string;
|
||||||
|
progress: number; // Hours spent applying
|
||||||
|
required: number; // Total hours needed
|
||||||
|
manaPerHour: number; // Mana cost per hour
|
||||||
|
paused: boolean;
|
||||||
|
manaSpent: number; // Total mana spent so far
|
||||||
|
}
|
||||||
|
|
||||||
|
// Equipment crafting progress (from blueprints)
|
||||||
|
export interface EquipmentCraftingProgress {
|
||||||
|
blueprintId: string;
|
||||||
|
equipmentTypeId: string;
|
||||||
|
progress: number; // Hours spent crafting
|
||||||
|
required: number; // Total hours needed
|
||||||
|
manaSpent: number; // Total mana spent so far
|
||||||
|
}
|
||||||
|
|
||||||
|
// Equipment spell state (for multi-spell casting)
|
||||||
|
export interface EquipmentSpellState {
|
||||||
|
spellId: string;
|
||||||
|
sourceEquipment: string; // Equipment instance ID
|
||||||
|
castProgress: number; // 0-1 progress toward next cast
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface BlueprintDef {
|
||||||
|
id: string;
|
||||||
|
name: string;
|
||||||
|
tier: number;
|
||||||
|
slot: string;
|
||||||
|
stats: Record<string, number>;
|
||||||
|
studyTime: number;
|
||||||
|
craftTime: number;
|
||||||
|
craftCost: number;
|
||||||
|
discovered: boolean;
|
||||||
|
learned: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Loot inventory for materials and blueprints
|
||||||
|
export interface LootInventory {
|
||||||
|
materials: Record<string, number>; // materialId -> count
|
||||||
|
blueprints: string[]; // blueprint IDs discovered
|
||||||
|
}
|
||||||
@@ -0,0 +1,224 @@
|
|||||||
|
// ─── Core Game State Types ───────────────────────────────────────────────
|
||||||
|
|
||||||
|
import type { AttunementState } from './attunements';
|
||||||
|
import type { ElementState } from './elements';
|
||||||
|
import type { SpellState } from './spells';
|
||||||
|
import type { EquipmentInstance, EnchantmentDesign, DesignProgress, PreparationProgress, ApplicationProgress, EquipmentCraftingProgress, EquipmentDef, BlueprintDef, LootInventory, EquipmentSpellState } from './equipment';
|
||||||
|
|
||||||
|
// ─── Room and Enemy Types ─────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
export type RoomType = 'combat' | 'puzzle' | 'swarm' | 'speed' | 'guardian';
|
||||||
|
|
||||||
|
export interface EnemyState {
|
||||||
|
id: string;
|
||||||
|
hp: number;
|
||||||
|
maxHP: number;
|
||||||
|
armor: number; // Damage reduction (0-1)
|
||||||
|
dodgeChance: number; // For speed rooms (0-1)
|
||||||
|
element: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface FloorState {
|
||||||
|
roomType: RoomType;
|
||||||
|
enemies: EnemyState[]; // For swarm rooms, multiple enemies
|
||||||
|
puzzleProgress?: number; // For puzzle rooms (0-1)
|
||||||
|
puzzleRequired?: number; // Total progress needed
|
||||||
|
puzzleId?: string; // Which puzzle type
|
||||||
|
puzzleAttunements?: string[]; // Which attunements speed up this puzzle
|
||||||
|
}
|
||||||
|
|
||||||
|
// ─── Achievement Types ─────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
export interface AchievementDef {
|
||||||
|
id: string;
|
||||||
|
name: string;
|
||||||
|
desc: string;
|
||||||
|
category: string;
|
||||||
|
requirement: {
|
||||||
|
type: string;
|
||||||
|
value: number;
|
||||||
|
subType?: string;
|
||||||
|
};
|
||||||
|
reward: {
|
||||||
|
insight?: number;
|
||||||
|
manaBonus?: number;
|
||||||
|
damageBonus?: number;
|
||||||
|
regenBonus?: number;
|
||||||
|
title?: string;
|
||||||
|
unlockEffect?: string;
|
||||||
|
};
|
||||||
|
hidden?: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Achievement state tracks unlocked achievements and progress
|
||||||
|
export interface AchievementState {
|
||||||
|
unlocked: string[]; // IDs of unlocked achievements
|
||||||
|
progress: Record<string, number>; // Progress toward achievement requirements
|
||||||
|
}
|
||||||
|
|
||||||
|
// ─── Game Actions and Scheduling ─────────────────────────────────────────
|
||||||
|
|
||||||
|
export type GameAction = 'meditate' | 'climb' | 'study' | 'craft' | 'repair' | 'convert' | 'design' | 'prepare' | 'enchant';
|
||||||
|
|
||||||
|
export interface ScheduleBlock {
|
||||||
|
id: string;
|
||||||
|
action: GameAction;
|
||||||
|
startHour: number;
|
||||||
|
endHour: number;
|
||||||
|
enabled: boolean;
|
||||||
|
target?: string; // spell id, blueprint id, skill id, element id
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface StudyTarget {
|
||||||
|
type: 'skill' | 'spell' | 'blueprint';
|
||||||
|
id: string;
|
||||||
|
progress: number; // Hours studied
|
||||||
|
required: number; // Total hours needed
|
||||||
|
}
|
||||||
|
|
||||||
|
// ─── Golemancy Types ─────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
export interface SummonedGolem {
|
||||||
|
golemId: string; // Reference to GOLEMS_DEF
|
||||||
|
summonedFloor: number; // Floor when golem was summoned
|
||||||
|
attackProgress: number; // Progress toward next attack (0-1)
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface GolemancyState {
|
||||||
|
enabledGolems: string[]; // Golem IDs the player wants active
|
||||||
|
summonedGolems: SummonedGolem[]; // Currently summoned golems on this floor
|
||||||
|
lastSummonFloor: number; // Floor golems were last summoned on
|
||||||
|
}
|
||||||
|
|
||||||
|
// ─── Main Game State ─────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
export interface GameState {
|
||||||
|
// Time
|
||||||
|
day: number;
|
||||||
|
hour: number;
|
||||||
|
loopCount: number;
|
||||||
|
gameOver: boolean;
|
||||||
|
victory: boolean;
|
||||||
|
paused: boolean;
|
||||||
|
|
||||||
|
// Raw Mana
|
||||||
|
rawMana: number;
|
||||||
|
meditateTicks: number;
|
||||||
|
totalManaGathered: number;
|
||||||
|
|
||||||
|
// Attunements (class-like system)
|
||||||
|
attunements: Record<string, AttunementState>; // attunement id -> state
|
||||||
|
|
||||||
|
// Elements
|
||||||
|
elements: Record<string, ElementState>;
|
||||||
|
|
||||||
|
// Spire
|
||||||
|
currentFloor: number;
|
||||||
|
floorHP: number;
|
||||||
|
floorMaxHP: number;
|
||||||
|
maxFloorReached: number;
|
||||||
|
signedPacts: number[];
|
||||||
|
activeSpell: string;
|
||||||
|
currentAction: GameAction;
|
||||||
|
castProgress: number; // Progress towards next spell cast (0-1)
|
||||||
|
|
||||||
|
// Room system for special floors
|
||||||
|
currentRoom: FloorState; // Current room state (swarm, puzzle, speed, etc.)
|
||||||
|
|
||||||
|
// Spells
|
||||||
|
spells: Record<string, SpellState>;
|
||||||
|
|
||||||
|
// Skills
|
||||||
|
skills: Record<string, number>;
|
||||||
|
skillProgress: Record<string, number>; // Saved study progress for skills
|
||||||
|
skillUpgrades: Record<string, string[]>; // Selected upgrade IDs per skill
|
||||||
|
skillTiers: Record<string, number>; // Current tier for each base skill
|
||||||
|
|
||||||
|
// Equipment System (new instance-based system)
|
||||||
|
equippedInstances: Record<string, string | null>; // slot -> instanceId
|
||||||
|
equipmentInstances: Record<string, EquipmentInstance>; // instanceId -> instance
|
||||||
|
enchantmentDesigns: EnchantmentDesign[]; // Saved enchantment designs
|
||||||
|
|
||||||
|
// Crafting Progress
|
||||||
|
designProgress: DesignProgress | null;
|
||||||
|
preparationProgress: PreparationProgress | null;
|
||||||
|
applicationProgress: ApplicationProgress | null;
|
||||||
|
equipmentCraftingProgress: EquipmentCraftingProgress | null;
|
||||||
|
|
||||||
|
// Unlocked enchantment effects for designing
|
||||||
|
unlockedEffects: string[]; // Effect IDs that have been researched
|
||||||
|
|
||||||
|
// Equipment spell states for multi-casting
|
||||||
|
equipmentSpellStates: EquipmentSpellState[];
|
||||||
|
|
||||||
|
// Legacy Equipment (for backward compatibility)
|
||||||
|
equipment: Record<string, EquipmentDef | null>;
|
||||||
|
inventory: EquipmentDef[];
|
||||||
|
|
||||||
|
// Blueprints
|
||||||
|
blueprints: Record<string, BlueprintDef>;
|
||||||
|
|
||||||
|
// Loot Inventory
|
||||||
|
lootInventory: LootInventory;
|
||||||
|
|
||||||
|
// Schedule
|
||||||
|
schedule: ScheduleBlock[];
|
||||||
|
autoSchedule: boolean;
|
||||||
|
studyQueue: string[];
|
||||||
|
craftQueue: string[];
|
||||||
|
|
||||||
|
// Current Study Target
|
||||||
|
currentStudyTarget: StudyTarget | null;
|
||||||
|
|
||||||
|
// Parallel Study Target (for Parallel Mind milestone upgrade)
|
||||||
|
parallelStudyTarget: StudyTarget | null;
|
||||||
|
|
||||||
|
// Golemancy (summoned golems)
|
||||||
|
golemancy: GolemancyState;
|
||||||
|
|
||||||
|
// Achievements
|
||||||
|
achievements: AchievementState;
|
||||||
|
|
||||||
|
// Stats tracking
|
||||||
|
totalSpellsCast: number;
|
||||||
|
totalDamageDealt: number;
|
||||||
|
totalCraftsCompleted: number;
|
||||||
|
|
||||||
|
// Prestige
|
||||||
|
insight: number;
|
||||||
|
totalInsight: number;
|
||||||
|
prestigeUpgrades: Record<string, number>;
|
||||||
|
memorySlots: number;
|
||||||
|
memories: string[];
|
||||||
|
|
||||||
|
// Incursion
|
||||||
|
incursionStrength: number;
|
||||||
|
containmentWards: number;
|
||||||
|
|
||||||
|
// Log
|
||||||
|
log: string[];
|
||||||
|
|
||||||
|
// Loop insight (earned at end of current loop)
|
||||||
|
loopInsight: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ─── Action Types for Store ─────────────────────────────────────────────
|
||||||
|
|
||||||
|
export type GameActionType =
|
||||||
|
| { type: 'TICK' }
|
||||||
|
| { type: 'GATHER_MANA' }
|
||||||
|
| { type: 'SET_ACTION'; action: GameAction }
|
||||||
|
| { type: 'SET_SPELL'; spellId: string }
|
||||||
|
| { type: 'LEARN_SPELL'; spellId: string }
|
||||||
|
| { type: 'START_STUDYING_SKILL'; skillId: string }
|
||||||
|
| { type: 'START_STUDYING_SPELL'; spellId: string }
|
||||||
|
| { type: 'CANCEL_STUDY' }
|
||||||
|
| { type: 'CONVERT_MANA'; element: string; amount: number }
|
||||||
|
| { type: 'UNLOCK_ELEMENT'; element: string }
|
||||||
|
| { type: 'CRAFT_COMPOSITE'; target: string }
|
||||||
|
| { type: 'DO_PRESTIGE'; id: string }
|
||||||
|
| { type: 'START_NEW_LOOP' }
|
||||||
|
| { type: 'TOGGLE_PAUSE' }
|
||||||
|
| { type: 'RESET_GAME' }
|
||||||
|
| { type: 'SELECT_SKILL_UPGRADE'; skillId: string; upgradeId: string }
|
||||||
|
| { type: 'TIER_UP_SKILL'; skillId: string };
|
||||||
@@ -0,0 +1,56 @@
|
|||||||
|
// ─── Game Types Index ──────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
// Re-export all types from domain-specific files
|
||||||
|
|
||||||
|
// Element types
|
||||||
|
export type { ElementCategory, ElementDef, ElementState } from './elements';
|
||||||
|
|
||||||
|
// Attunement types
|
||||||
|
export type { AttunementSlot, AttunementDef, AttunementState, GuardianBoon, GuardianDef } from './attunements';
|
||||||
|
|
||||||
|
// Spell types
|
||||||
|
export type { SpellCost, SpellDef, SpellEffect, SpellState } from './spells';
|
||||||
|
|
||||||
|
// Skill types
|
||||||
|
export type {
|
||||||
|
SkillDef,
|
||||||
|
SkillUpgradeDef,
|
||||||
|
SkillUpgradeEffect,
|
||||||
|
SkillEvolutionPath,
|
||||||
|
SkillTierDef,
|
||||||
|
SkillPerkChoice,
|
||||||
|
SkillUpgradeChoice,
|
||||||
|
PrestigeDef
|
||||||
|
} from './skills';
|
||||||
|
|
||||||
|
// Equipment types
|
||||||
|
export type {
|
||||||
|
EquipmentDef,
|
||||||
|
EquipmentInstance,
|
||||||
|
AppliedEnchantment,
|
||||||
|
EnchantmentDesign,
|
||||||
|
DesignEffect,
|
||||||
|
DesignProgress,
|
||||||
|
PreparationProgress,
|
||||||
|
ApplicationProgress,
|
||||||
|
EquipmentCraftingProgress,
|
||||||
|
EquipmentSpellState,
|
||||||
|
BlueprintDef,
|
||||||
|
LootInventory
|
||||||
|
} from './equipment';
|
||||||
|
|
||||||
|
// Game state types
|
||||||
|
export type {
|
||||||
|
RoomType,
|
||||||
|
EnemyState,
|
||||||
|
FloorState,
|
||||||
|
AchievementDef,
|
||||||
|
AchievementState,
|
||||||
|
GameAction,
|
||||||
|
ScheduleBlock,
|
||||||
|
StudyTarget,
|
||||||
|
SummonedGolem,
|
||||||
|
GolemancyState,
|
||||||
|
GameState,
|
||||||
|
GameActionType
|
||||||
|
} from './game';
|
||||||
@@ -0,0 +1,85 @@
|
|||||||
|
// ─── Skill Types ───────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
export interface SkillDef {
|
||||||
|
name: string;
|
||||||
|
desc: string;
|
||||||
|
cat: string;
|
||||||
|
attunement?: string; // Which attunement this skill belongs to (null = core)
|
||||||
|
max: number;
|
||||||
|
base: number; // Mana cost to start studying
|
||||||
|
req?: Record<string, number>; // Skill prerequisites
|
||||||
|
attunementReq?: Record<string, number>; // Attunement level requirements (attunement id -> min level)
|
||||||
|
studyTime: number; // Hours needed to study
|
||||||
|
level?: number; // Current level (optional, for UI display)
|
||||||
|
tier?: number; // Skill tier (1-5)
|
||||||
|
tierUp?: string; // Skill ID this evolves into at max level
|
||||||
|
baseSkill?: string; // Original skill ID this evolved from
|
||||||
|
tierMultiplier?: number; // Multiplier for each tier (default 2)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Skill upgrade choices at milestones (level 5 and level 10)
|
||||||
|
export interface SkillUpgradeDef {
|
||||||
|
id: string;
|
||||||
|
name: string;
|
||||||
|
desc: string;
|
||||||
|
skillId: string; // Which skill this upgrade belongs to
|
||||||
|
milestone: 5 | 10; // Level at which this upgrade is available
|
||||||
|
effect: SkillUpgradeEffect;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface SkillUpgradeEffect {
|
||||||
|
type: 'multiplier' | 'bonus' | 'special';
|
||||||
|
stat?: string; // Stat to modify
|
||||||
|
value?: number; // Multiplier or bonus value
|
||||||
|
specialId?: string; // Special effect identifier
|
||||||
|
specialDesc?: string; // Description of special effect
|
||||||
|
}
|
||||||
|
|
||||||
|
// Skill evolution system - 5-Tier Continuous Talent Tree
|
||||||
|
// Each skill with max level 10 follows this structure:
|
||||||
|
// - 5 Tiers (T1-T5)
|
||||||
|
// - Each tier has L5 and L10 milestone perk choices
|
||||||
|
// - 3 paths per tier (A, B, C columns) representing different playstyles
|
||||||
|
// - T3 L10 and T5 L10 have Elite Perks (game-changing mechanics)
|
||||||
|
|
||||||
|
export interface SkillEvolutionPath {
|
||||||
|
baseSkillId: string; // Starting skill ID
|
||||||
|
tiers: SkillTierDef[]; // 5 tiers of evolution
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface SkillTierDef {
|
||||||
|
tier: number; // Tier number (1-5)
|
||||||
|
skillId: string; // Skill ID for this tier
|
||||||
|
name: string;
|
||||||
|
multiplier: number; // Base effect multiplier for this tier
|
||||||
|
// Perk choices organized by milestone and path (A, B, C)
|
||||||
|
l5Perks: SkillPerkChoice[]; // 3 choices (one per path) at level 5
|
||||||
|
l10Perks: SkillPerkChoice[]; // 3 choices (one per path) at level 10
|
||||||
|
}
|
||||||
|
|
||||||
|
// Perk choice at a milestone - belongs to a specific path (A, B, or C)
|
||||||
|
export interface SkillPerkChoice {
|
||||||
|
id: string;
|
||||||
|
name: string;
|
||||||
|
desc: string;
|
||||||
|
path: 'A' | 'B' | 'C'; // Which path this perk belongs to
|
||||||
|
isElite?: boolean; // True for T3 L10 and T5 L10 perks
|
||||||
|
effect: SkillUpgradeEffect;
|
||||||
|
// For path compounding - if player stays on same path, bonuses compound
|
||||||
|
pathCompoundBonus?: number; // Exponential bonus for staying on same path
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface SkillUpgradeChoice {
|
||||||
|
id: string;
|
||||||
|
name: string;
|
||||||
|
desc: string;
|
||||||
|
milestone: 5 | 10; // Level at which this upgrade is available
|
||||||
|
effect: SkillUpgradeEffect;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface PrestigeDef {
|
||||||
|
name: string;
|
||||||
|
desc: string;
|
||||||
|
max: number;
|
||||||
|
cost: number;
|
||||||
|
}
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
// ─── Spell Types ────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
// Spell cost can be raw mana or elemental mana
|
||||||
|
export interface SpellCost {
|
||||||
|
type: 'raw' | 'element'; // 'raw' for raw mana, 'element' for specific elemental mana
|
||||||
|
element?: string; // Required if type is 'element'
|
||||||
|
amount: number; // Amount of mana required
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface SpellDef {
|
||||||
|
name: string;
|
||||||
|
elem: string; // Element type for damage calculations
|
||||||
|
dmg: number;
|
||||||
|
cost: SpellCost; // Changed from number to SpellCost object
|
||||||
|
tier: number;
|
||||||
|
unlock: number; // Mana cost to start studying
|
||||||
|
studyTime?: number; // Hours needed to study (optional, defaults based on tier)
|
||||||
|
castSpeed?: number; // Casts per hour (default 1, higher = faster)
|
||||||
|
desc?: string; // Optional spell description
|
||||||
|
effects?: SpellEffect[]; // Optional special effects
|
||||||
|
isAoe?: boolean; // AOE spell that hits multiple enemies
|
||||||
|
aoeTargets?: number; // Number of enemies hit by AOE
|
||||||
|
isWeaponEnchant?: boolean; // Can be used as weapon enchantment (magic swords)
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface SpellEffect {
|
||||||
|
type: 'burn' | 'freeze' | 'stun' | 'pierce' | 'multicast' | 'shield' | 'buff' | 'chain' | 'aoe' | 'armor_pierce';
|
||||||
|
value: number; // Effect potency
|
||||||
|
duration?: number; // Duration in hours for timed effects
|
||||||
|
targets?: number; // For AOE: number of targets
|
||||||
|
chance?: number; // For chance-based effects (e.g., stun chance)
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface SpellState {
|
||||||
|
learned: boolean;
|
||||||
|
level: number;
|
||||||
|
studyProgress?: number; // Hours studied so far (for in-progress spells)
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user