playlist-data-engine 1.1.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.
- package/LICENSE +21 -0
- package/README.md +352 -0
- package/dist/__vite-browser-external-DYxpcVy9.js +4 -0
- package/dist/constants/DefaultClasses.d.ts +46 -0
- package/dist/constants/DefaultClasses.d.ts.map +1 -0
- package/dist/constants/DefaultEnchantments.d.ts +337 -0
- package/dist/constants/DefaultEnchantments.d.ts.map +1 -0
- package/dist/constants/DefaultEnemies.d.ts +83 -0
- package/dist/constants/DefaultEnemies.d.ts.map +1 -0
- package/dist/constants/DefaultEquipment.d.ts +23 -0
- package/dist/constants/DefaultEquipment.d.ts.map +1 -0
- package/dist/constants/DefaultFeatures.d.ts +22 -0
- package/dist/constants/DefaultFeatures.d.ts.map +1 -0
- package/dist/constants/DefaultRaces.d.ts +102 -0
- package/dist/constants/DefaultRaces.d.ts.map +1 -0
- package/dist/constants/DefaultSkills.d.ts +26 -0
- package/dist/constants/DefaultSkills.d.ts.map +1 -0
- package/dist/constants/DefaultSpells.d.ts +41 -0
- package/dist/constants/DefaultSpells.d.ts.map +1 -0
- package/dist/constants/EncounterBalance.d.ts +208 -0
- package/dist/constants/EncounterBalance.d.ts.map +1 -0
- package/dist/constants/EnemyEquipment.d.ts +71 -0
- package/dist/constants/EnemyEquipment.d.ts.map +1 -0
- package/dist/constants/EnemyRarity.d.ts +79 -0
- package/dist/constants/EnemyRarity.d.ts.map +1 -0
- package/dist/constants/EnemyTemplates/Construct.d.ts +63 -0
- package/dist/constants/EnemyTemplates/Construct.d.ts.map +1 -0
- package/dist/constants/EnemyTemplates/Dragon.d.ts +68 -0
- package/dist/constants/EnemyTemplates/Dragon.d.ts.map +1 -0
- package/dist/constants/EnemyTemplates/Elemental.d.ts +64 -0
- package/dist/constants/EnemyTemplates/Elemental.d.ts.map +1 -0
- package/dist/constants/EnemyTemplates/Fiend.d.ts +62 -0
- package/dist/constants/EnemyTemplates/Fiend.d.ts.map +1 -0
- package/dist/constants/EnemyTemplates/Monstrosity.d.ts +63 -0
- package/dist/constants/EnemyTemplates/Monstrosity.d.ts.map +1 -0
- package/dist/constants/EnemyTemplates/Undead.d.ts +61 -0
- package/dist/constants/EnemyTemplates/Undead.d.ts.map +1 -0
- package/dist/constants/ItemTemplates.d.ts +40 -0
- package/dist/constants/ItemTemplates.d.ts.map +1 -0
- package/dist/constants/MagicItems.d.ts +30 -0
- package/dist/constants/MagicItems.d.ts.map +1 -0
- package/dist/constants/SpellSlots.d.ts +30 -0
- package/dist/constants/SpellSlots.d.ts.map +1 -0
- package/dist/constants/StatScaling.d.ts +113 -0
- package/dist/constants/StatScaling.d.ts.map +1 -0
- package/dist/core/analysis/AudioAnalyzer.d.ts +599 -0
- package/dist/core/analysis/AudioAnalyzer.d.ts.map +1 -0
- package/dist/core/analysis/ColorExtractor.d.ts +64 -0
- package/dist/core/analysis/ColorExtractor.d.ts.map +1 -0
- package/dist/core/analysis/EssentiaPitchDetector.d.ts +282 -0
- package/dist/core/analysis/EssentiaPitchDetector.d.ts.map +1 -0
- package/dist/core/analysis/LevelSerializer.d.ts +265 -0
- package/dist/core/analysis/LevelSerializer.d.ts.map +1 -0
- package/dist/core/analysis/MelodyContourAnalyzer.d.ts +283 -0
- package/dist/core/analysis/MelodyContourAnalyzer.d.ts.map +1 -0
- package/dist/core/analysis/MultiBandAnalyzer.d.ts +214 -0
- package/dist/core/analysis/MultiBandAnalyzer.d.ts.map +1 -0
- package/dist/core/analysis/MusicClassifier.d.ts +524 -0
- package/dist/core/analysis/MusicClassifier.d.ts.map +1 -0
- package/dist/core/analysis/PitchAnalyzer.d.ts +266 -0
- package/dist/core/analysis/PitchAnalyzer.d.ts.map +1 -0
- package/dist/core/analysis/PitchDetector.d.ts +251 -0
- package/dist/core/analysis/PitchDetector.d.ts.map +1 -0
- package/dist/core/analysis/SpectrumScanner.d.ts +52 -0
- package/dist/core/analysis/SpectrumScanner.d.ts.map +1 -0
- package/dist/core/analysis/beat/BeatInterpolator.d.ts +477 -0
- package/dist/core/analysis/beat/BeatInterpolator.d.ts.map +1 -0
- package/dist/core/analysis/beat/BeatMapGenerator.d.ts +170 -0
- package/dist/core/analysis/beat/BeatMapGenerator.d.ts.map +1 -0
- package/dist/core/analysis/beat/BeatStream.d.ts +316 -0
- package/dist/core/analysis/beat/BeatStream.d.ts.map +1 -0
- package/dist/core/analysis/beat/BeatSubdivider.d.ts +205 -0
- package/dist/core/analysis/beat/BeatSubdivider.d.ts.map +1 -0
- package/dist/core/analysis/beat/BeatTracker.d.ts +137 -0
- package/dist/core/analysis/beat/BeatTracker.d.ts.map +1 -0
- package/dist/core/analysis/beat/CompositeStreamGenerator.d.ts +180 -0
- package/dist/core/analysis/beat/CompositeStreamGenerator.d.ts.map +1 -0
- package/dist/core/analysis/beat/DensityAnalyzer.d.ts +246 -0
- package/dist/core/analysis/beat/DensityAnalyzer.d.ts.map +1 -0
- package/dist/core/analysis/beat/DifficultyVariantGenerator.d.ts +1082 -0
- package/dist/core/analysis/beat/DifficultyVariantGenerator.d.ts.map +1 -0
- package/dist/core/analysis/beat/GrooveAnalyzer.d.ts +192 -0
- package/dist/core/analysis/beat/GrooveAnalyzer.d.ts.map +1 -0
- package/dist/core/analysis/beat/OnsetStrengthEnvelope.d.ts +133 -0
- package/dist/core/analysis/beat/OnsetStrengthEnvelope.d.ts.map +1 -0
- package/dist/core/analysis/beat/PhraseAnalyzer.d.ts +230 -0
- package/dist/core/analysis/beat/PhraseAnalyzer.d.ts.map +1 -0
- package/dist/core/analysis/beat/RhythmQuantizer.d.ts +399 -0
- package/dist/core/analysis/beat/RhythmQuantizer.d.ts.map +1 -0
- package/dist/core/analysis/beat/RhythmicBalancer.d.ts +262 -0
- package/dist/core/analysis/beat/RhythmicBalancer.d.ts.map +1 -0
- package/dist/core/analysis/beat/StreamScorer.d.ts +275 -0
- package/dist/core/analysis/beat/StreamScorer.d.ts.map +1 -0
- package/dist/core/analysis/beat/TempoAwareQuantizer.d.ts +256 -0
- package/dist/core/analysis/beat/TempoAwareQuantizer.d.ts.map +1 -0
- package/dist/core/analysis/beat/TempoDetector.d.ts +220 -0
- package/dist/core/analysis/beat/TempoDetector.d.ts.map +1 -0
- package/dist/core/analysis/beat/TransientDetector.d.ts +303 -0
- package/dist/core/analysis/beat/TransientDetector.d.ts.map +1 -0
- package/dist/core/analysis/beat/beatKeyHelpers.d.ts +180 -0
- package/dist/core/analysis/beat/beatKeyHelpers.d.ts.map +1 -0
- package/dist/core/analysis/beat/index.d.ts +41 -0
- package/dist/core/analysis/beat/index.d.ts.map +1 -0
- package/dist/core/analysis/beat/utils/audioUtils.d.ts +204 -0
- package/dist/core/analysis/beat/utils/audioUtils.d.ts.map +1 -0
- package/dist/core/analysis/beat/utils/beatInterpolationDebug.d.ts +404 -0
- package/dist/core/analysis/beat/utils/beatInterpolationDebug.d.ts.map +1 -0
- package/dist/core/analysis/beat/utils/subdivideBeatMap.d.ts +61 -0
- package/dist/core/analysis/beat/utils/subdivideBeatMap.d.ts.map +1 -0
- package/dist/core/analysis/beat/utils/unifyBeatMap.d.ts +33 -0
- package/dist/core/analysis/beat/utils/unifyBeatMap.d.ts.map +1 -0
- package/dist/core/analysis/index.d.ts +18 -0
- package/dist/core/analysis/index.d.ts.map +1 -0
- package/dist/core/combat/AI/AICombatRunner.d.ts +108 -0
- package/dist/core/combat/AI/AICombatRunner.d.ts.map +1 -0
- package/dist/core/combat/AI/CombatAI.d.ts +179 -0
- package/dist/core/combat/AI/CombatAI.d.ts.map +1 -0
- package/dist/core/combat/AI/CombatMetricsTracker.d.ts +30 -0
- package/dist/core/combat/AI/CombatMetricsTracker.d.ts.map +1 -0
- package/dist/core/combat/Analysis/BalanceValidator.d.ts +170 -0
- package/dist/core/combat/Analysis/BalanceValidator.d.ts.map +1 -0
- package/dist/core/combat/Analysis/ComparativeAnalyzer.d.ts +231 -0
- package/dist/core/combat/Analysis/ComparativeAnalyzer.d.ts.map +1 -0
- package/dist/core/combat/Analysis/DifficultyCalculator.d.ts +203 -0
- package/dist/core/combat/Analysis/DifficultyCalculator.d.ts.map +1 -0
- package/dist/core/combat/Analysis/ParameterSweep.d.ts +201 -0
- package/dist/core/combat/Analysis/ParameterSweep.d.ts.map +1 -0
- package/dist/core/combat/AttackResolver.d.ts +220 -0
- package/dist/core/combat/AttackResolver.d.ts.map +1 -0
- package/dist/core/combat/CombatEngine.d.ts +388 -0
- package/dist/core/combat/CombatEngine.d.ts.map +1 -0
- package/dist/core/combat/DiceRoller.d.ts +115 -0
- package/dist/core/combat/DiceRoller.d.ts.map +1 -0
- package/dist/core/combat/InitiativeRoller.d.ts +62 -0
- package/dist/core/combat/InitiativeRoller.d.ts.map +1 -0
- package/dist/core/combat/PartyAnalyzer.d.ts +215 -0
- package/dist/core/combat/PartyAnalyzer.d.ts.map +1 -0
- package/dist/core/combat/SeededDiceRoller.d.ts +120 -0
- package/dist/core/combat/SeededDiceRoller.d.ts.map +1 -0
- package/dist/core/combat/Simulation/CombatSimulator.d.ts +366 -0
- package/dist/core/combat/Simulation/CombatSimulator.d.ts.map +1 -0
- package/dist/core/combat/SpellCaster.d.ts +113 -0
- package/dist/core/combat/SpellCaster.d.ts.map +1 -0
- package/dist/core/config/index.d.ts +24 -0
- package/dist/core/config/index.d.ts.map +1 -0
- package/dist/core/config/progressionConfig.d.ts +73 -0
- package/dist/core/config/progressionConfig.d.ts.map +1 -0
- package/dist/core/config/sensorConfig.d.ts +134 -0
- package/dist/core/config/sensorConfig.d.ts.map +1 -0
- package/dist/core/equipment/BoxOpener.d.ts +175 -0
- package/dist/core/equipment/BoxOpener.d.ts.map +1 -0
- package/dist/core/equipment/EquipmentEffectApplier.d.ts +189 -0
- package/dist/core/equipment/EquipmentEffectApplier.d.ts.map +1 -0
- package/dist/core/equipment/EquipmentModifier.d.ts +327 -0
- package/dist/core/equipment/EquipmentModifier.d.ts.map +1 -0
- package/dist/core/equipment/EquipmentSpawnHelper.d.ts +246 -0
- package/dist/core/equipment/EquipmentSpawnHelper.d.ts.map +1 -0
- package/dist/core/equipment/EquipmentValidator.d.ts +173 -0
- package/dist/core/equipment/EquipmentValidator.d.ts.map +1 -0
- package/dist/core/extensions/ExtensionManager.d.ts +517 -0
- package/dist/core/extensions/ExtensionManager.d.ts.map +1 -0
- package/dist/core/extensions/WeightedSelector.d.ts +156 -0
- package/dist/core/extensions/WeightedSelector.d.ts.map +1 -0
- package/dist/core/extensions/index.d.ts +11 -0
- package/dist/core/extensions/index.d.ts.map +1 -0
- package/dist/core/extensions/initializeDefaults.d.ts +170 -0
- package/dist/core/extensions/initializeDefaults.d.ts.map +1 -0
- package/dist/core/features/FeatureEffectApplier.d.ts +102 -0
- package/dist/core/features/FeatureEffectApplier.d.ts.map +1 -0
- package/dist/core/features/FeatureQuery.d.ts +368 -0
- package/dist/core/features/FeatureQuery.d.ts.map +1 -0
- package/dist/core/features/FeatureTypes.d.ts +199 -0
- package/dist/core/features/FeatureTypes.d.ts.map +1 -0
- package/dist/core/features/FeatureValidator.d.ts +149 -0
- package/dist/core/features/FeatureValidator.d.ts.map +1 -0
- package/dist/core/features/index.d.ts +12 -0
- package/dist/core/features/index.d.ts.map +1 -0
- package/dist/core/generation/AbilityScoreCalculator.d.ts +83 -0
- package/dist/core/generation/AbilityScoreCalculator.d.ts.map +1 -0
- package/dist/core/generation/AppearanceGenerator.d.ts +32 -0
- package/dist/core/generation/AppearanceGenerator.d.ts.map +1 -0
- package/dist/core/generation/BeatConverter.d.ts +127 -0
- package/dist/core/generation/BeatConverter.d.ts.map +1 -0
- package/dist/core/generation/ButtonMapper.d.ts +346 -0
- package/dist/core/generation/ButtonMapper.d.ts.map +1 -0
- package/dist/core/generation/ButtonPatternLibrary.d.ts +92 -0
- package/dist/core/generation/ButtonPatternLibrary.d.ts.map +1 -0
- package/dist/core/generation/CRLevelConverter.d.ts +242 -0
- package/dist/core/generation/CRLevelConverter.d.ts.map +1 -0
- package/dist/core/generation/CharacterGenerator.d.ts +194 -0
- package/dist/core/generation/CharacterGenerator.d.ts.map +1 -0
- package/dist/core/generation/ClassSuggester.d.ts +184 -0
- package/dist/core/generation/ClassSuggester.d.ts.map +1 -0
- package/dist/core/generation/EnemyEquipmentGenerator.d.ts +151 -0
- package/dist/core/generation/EnemyEquipmentGenerator.d.ts.map +1 -0
- package/dist/core/generation/EnemyGenerator.d.ts +595 -0
- package/dist/core/generation/EnemyGenerator.d.ts.map +1 -0
- package/dist/core/generation/EquipmentGenerator.d.ts +204 -0
- package/dist/core/generation/EquipmentGenerator.d.ts.map +1 -0
- package/dist/core/generation/LegendaryGenerator.d.ts +213 -0
- package/dist/core/generation/LegendaryGenerator.d.ts.map +1 -0
- package/dist/core/generation/LevelGenerator.d.ts +390 -0
- package/dist/core/generation/LevelGenerator.d.ts.map +1 -0
- package/dist/core/generation/NamingEngine.d.ts +136 -0
- package/dist/core/generation/NamingEngine.d.ts.map +1 -0
- package/dist/core/generation/PitchBeatLinker.d.ts +150 -0
- package/dist/core/generation/PitchBeatLinker.d.ts.map +1 -0
- package/dist/core/generation/RaceSelector.d.ts +58 -0
- package/dist/core/generation/RaceSelector.d.ts.map +1 -0
- package/dist/core/generation/RhythmGenerator.d.ts +597 -0
- package/dist/core/generation/RhythmGenerator.d.ts.map +1 -0
- package/dist/core/generation/SkillAssigner.d.ts +78 -0
- package/dist/core/generation/SkillAssigner.d.ts.map +1 -0
- package/dist/core/generation/SpellManager.d.ts +132 -0
- package/dist/core/generation/SpellManager.d.ts.map +1 -0
- package/dist/core/generation/SpellcastingGenerator.d.ts +255 -0
- package/dist/core/generation/SpellcastingGenerator.d.ts.map +1 -0
- package/dist/core/generation/index.d.ts +41 -0
- package/dist/core/generation/index.d.ts.map +1 -0
- package/dist/core/parser/MetadataExtractor.d.ts +66 -0
- package/dist/core/parser/MetadataExtractor.d.ts.map +1 -0
- package/dist/core/parser/PlaylistParser.d.ts +45 -0
- package/dist/core/parser/PlaylistParser.d.ts.map +1 -0
- package/dist/core/playback/SubdivisionPlaybackController.d.ts +333 -0
- package/dist/core/playback/SubdivisionPlaybackController.d.ts.map +1 -0
- package/dist/core/playback/index.d.ts +5 -0
- package/dist/core/playback/index.d.ts.map +1 -0
- package/dist/core/progression/CharacterUpdater.d.ts +203 -0
- package/dist/core/progression/CharacterUpdater.d.ts.map +1 -0
- package/dist/core/progression/LevelUpProcessor.d.ts +234 -0
- package/dist/core/progression/LevelUpProcessor.d.ts.map +1 -0
- package/dist/core/progression/PrestigeSystem.d.ts +217 -0
- package/dist/core/progression/PrestigeSystem.d.ts.map +1 -0
- package/dist/core/progression/RhythmXPCalculator.d.ts +182 -0
- package/dist/core/progression/RhythmXPCalculator.d.ts.map +1 -0
- package/dist/core/progression/SessionTracker.d.ts +169 -0
- package/dist/core/progression/SessionTracker.d.ts.map +1 -0
- package/dist/core/progression/XPCalculator.d.ts +128 -0
- package/dist/core/progression/XPCalculator.d.ts.map +1 -0
- package/dist/core/progression/stat/StatIncreaseStrategy.d.ts +97 -0
- package/dist/core/progression/stat/StatIncreaseStrategy.d.ts.map +1 -0
- package/dist/core/progression/stat/StatManager.d.ts +179 -0
- package/dist/core/progression/stat/StatManager.d.ts.map +1 -0
- package/dist/core/sensors/EnvironmentalSensors.d.ts +301 -0
- package/dist/core/sensors/EnvironmentalSensors.d.ts.map +1 -0
- package/dist/core/sensors/GamingPlatformSensors.d.ts +162 -0
- package/dist/core/sensors/GamingPlatformSensors.d.ts.map +1 -0
- package/dist/core/sensors/GeolocationProvider.d.ts +156 -0
- package/dist/core/sensors/GeolocationProvider.d.ts.map +1 -0
- package/dist/core/sensors/MotionDetector.d.ts +58 -0
- package/dist/core/sensors/MotionDetector.d.ts.map +1 -0
- package/dist/core/sensors/SteamAPIClient.d.ts +108 -0
- package/dist/core/sensors/SteamAPIClient.d.ts.map +1 -0
- package/dist/core/sensors/WeatherAPIClient.d.ts +360 -0
- package/dist/core/sensors/WeatherAPIClient.d.ts.map +1 -0
- package/dist/core/sensors/schemas/weather.schema.d.ts +144 -0
- package/dist/core/sensors/schemas/weather.schema.d.ts.map +1 -0
- package/dist/core/skills/SkillQuery.d.ts +159 -0
- package/dist/core/skills/SkillQuery.d.ts.map +1 -0
- package/dist/core/skills/SkillTypes.d.ts +233 -0
- package/dist/core/skills/SkillTypes.d.ts.map +1 -0
- package/dist/core/skills/SkillValidator.d.ts +146 -0
- package/dist/core/skills/SkillValidator.d.ts.map +1 -0
- package/dist/core/skills/index.d.ts +11 -0
- package/dist/core/skills/index.d.ts.map +1 -0
- package/dist/core/spells/SpellQuery.d.ts +194 -0
- package/dist/core/spells/SpellQuery.d.ts.map +1 -0
- package/dist/core/spells/SpellTypes.d.ts +71 -0
- package/dist/core/spells/SpellTypes.d.ts.map +1 -0
- package/dist/core/spells/SpellValidator.d.ts +129 -0
- package/dist/core/spells/SpellValidator.d.ts.map +1 -0
- package/dist/core/spells/index.d.ts +11 -0
- package/dist/core/spells/index.d.ts.map +1 -0
- package/dist/core/types/AudioProfile.d.ts +143 -0
- package/dist/core/types/AudioProfile.d.ts.map +1 -0
- package/dist/core/types/BeatMap.d.ts +1825 -0
- package/dist/core/types/BeatMap.d.ts.map +1 -0
- package/dist/core/types/ButtonMapping.d.ts +345 -0
- package/dist/core/types/ButtonMapping.d.ts.map +1 -0
- package/dist/core/types/Character.d.ts +397 -0
- package/dist/core/types/Character.d.ts.map +1 -0
- package/dist/core/types/ChartedBeatMap.d.ts +169 -0
- package/dist/core/types/ChartedBeatMap.d.ts.map +1 -0
- package/dist/core/types/Combat.d.ts +268 -0
- package/dist/core/types/Combat.d.ts.map +1 -0
- package/dist/core/types/CombatAI.d.ts +143 -0
- package/dist/core/types/CombatAI.d.ts.map +1 -0
- package/dist/core/types/Enemy.d.ts +447 -0
- package/dist/core/types/Enemy.d.ts.map +1 -0
- package/dist/core/types/Environmental.d.ts +213 -0
- package/dist/core/types/Environmental.d.ts.map +1 -0
- package/dist/core/types/Equipment.d.ts +309 -0
- package/dist/core/types/Equipment.d.ts.map +1 -0
- package/dist/core/types/ISessionTracker.d.ts +48 -0
- package/dist/core/types/ISessionTracker.d.ts.map +1 -0
- package/dist/core/types/LevelExport.d.ts +366 -0
- package/dist/core/types/LevelExport.d.ts.map +1 -0
- package/dist/core/types/Playlist.d.ts +70 -0
- package/dist/core/types/Playlist.d.ts.map +1 -0
- package/dist/core/types/Prestige.d.ts +94 -0
- package/dist/core/types/Prestige.d.ts.map +1 -0
- package/dist/core/types/Progression.d.ts +214 -0
- package/dist/core/types/Progression.d.ts.map +1 -0
- package/dist/core/types/RhythmXP.d.ts +398 -0
- package/dist/core/types/RhythmXP.d.ts.map +1 -0
- package/dist/core/utils/AbilityConstants.d.ts +31 -0
- package/dist/core/utils/AbilityConstants.d.ts.map +1 -0
- package/dist/core/utils/EffectApplierUtils.d.ts +56 -0
- package/dist/core/utils/EffectApplierUtils.d.ts.map +1 -0
- package/dist/core/utils/ImageValidator.d.ts +66 -0
- package/dist/core/utils/ImageValidator.d.ts.map +1 -0
- package/dist/core/utils/PrerequisiteValidator.d.ts +88 -0
- package/dist/core/utils/PrerequisiteValidator.d.ts.map +1 -0
- package/dist/essentia-wasm.es-BUEnKUts.js +2990 -0
- package/dist/essentia.js-model.es-CGA0xotH.js +306 -0
- package/dist/index.d.ts +176 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/playlist-data-engine.js +124 -0
- package/dist/playlist-data-engine.mjs +49251 -0
- package/dist/utils/EnchantmentLibrary.d.ts +378 -0
- package/dist/utils/EnchantmentLibrary.d.ts.map +1 -0
- package/dist/utils/arweaveGatewayManager.d.ts +485 -0
- package/dist/utils/arweaveGatewayManager.d.ts.map +1 -0
- package/dist/utils/arweaveUtils.d.ts +118 -0
- package/dist/utils/arweaveUtils.d.ts.map +1 -0
- package/dist/utils/constants.d.ts +439 -0
- package/dist/utils/constants.d.ts.map +1 -0
- package/dist/utils/equipmentConstants.d.ts +60 -0
- package/dist/utils/equipmentConstants.d.ts.map +1 -0
- package/dist/utils/hash.d.ts +33 -0
- package/dist/utils/hash.d.ts.map +1 -0
- package/dist/utils/logger.d.ts +192 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/magicItemExamples.d.ts +46 -0
- package/dist/utils/magicItemExamples.d.ts.map +1 -0
- package/dist/utils/playlistUtils.d.ts +149 -0
- package/dist/utils/playlistUtils.d.ts.map +1 -0
- package/dist/utils/random.d.ts +34 -0
- package/dist/utils/random.d.ts.map +1 -0
- package/dist/utils/sensorDashboard.d.ts +60 -0
- package/dist/utils/sensorDashboard.d.ts.map +1 -0
- package/dist/utils/validators.d.ts +189 -0
- package/dist/utils/validators.d.ts.map +1 -0
- package/dist/vite.svg +1 -0
- package/package.json +82 -0
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CR/Level Conversion Utilities
|
|
3
|
+
*
|
|
4
|
+
* Provides bidirectional conversion between Challenge Rating (CR) and character level
|
|
5
|
+
* for enemy generation and encounter balancing.
|
|
6
|
+
*
|
|
7
|
+
* These functions use D&D 5e-style mappings with smooth interpolation for fractional
|
|
8
|
+
* CR values and configurable tuning parameters for game balance adjustments.
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* CR Tuning Configuration
|
|
12
|
+
*
|
|
13
|
+
* Controls how CR and level values are converted and scaled.
|
|
14
|
+
* Allows game balance adjustments without code changes.
|
|
15
|
+
*/
|
|
16
|
+
export interface CRTuningConfig {
|
|
17
|
+
/**
|
|
18
|
+
* Base multiplier for CR-to-level conversion
|
|
19
|
+
* Default: 1.0 (standard D&D 5e mapping)
|
|
20
|
+
* Higher values make enemies scale faster with CR
|
|
21
|
+
*/
|
|
22
|
+
baseMultiplier: number;
|
|
23
|
+
/**
|
|
24
|
+
* Level offset applied after conversion
|
|
25
|
+
* Default: 0 (no offset)
|
|
26
|
+
* Can be used to shift all enemies to be slightly stronger/weaker
|
|
27
|
+
*/
|
|
28
|
+
levelOffset: number;
|
|
29
|
+
/**
|
|
30
|
+
* Custom CR/level mappings that override the default calculation
|
|
31
|
+
* Key is CR, value is the exact level to use
|
|
32
|
+
*/
|
|
33
|
+
customCurve: Map<number, number>;
|
|
34
|
+
/**
|
|
35
|
+
* Minimum level for any CR
|
|
36
|
+
* Prevents CR 0 from resulting in negative levels
|
|
37
|
+
*/
|
|
38
|
+
minLevel: number;
|
|
39
|
+
/**
|
|
40
|
+
* Maximum level cap
|
|
41
|
+
* Default: Infinity (no cap — CR scales to any level)
|
|
42
|
+
* Set to a finite number to cap conversions (e.g., 20 for standard D&D 5e)
|
|
43
|
+
*/
|
|
44
|
+
maxLevel: number;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Default CR tuning configuration
|
|
48
|
+
*
|
|
49
|
+
* Standard D&D 5e mapping: CR 0 = level 0, CR 1 = level 1, CR 2 = level 2, etc.
|
|
50
|
+
*/
|
|
51
|
+
export declare const DEFAULT_CR_TUNING: CRTuningConfig;
|
|
52
|
+
/**
|
|
53
|
+
* Convert Challenge Rating to character level
|
|
54
|
+
*
|
|
55
|
+
* Uses D&D 5e-style mapping with smooth interpolation for fractional CRs.
|
|
56
|
+
*
|
|
57
|
+
* Default mapping (with baseMultiplier: 1.0, levelOffset: 0):
|
|
58
|
+
* - CR 0 = level 0
|
|
59
|
+
* - CR 0.125 (1/8) = level 0.125
|
|
60
|
+
* - CR 0.25 (1/4) = level 0.25
|
|
61
|
+
* - CR 0.5 (1/2) = level 0.5
|
|
62
|
+
* - CR 1 = level 1
|
|
63
|
+
* - CR 2 = level 2
|
|
64
|
+
* - CR 10 = level 10
|
|
65
|
+
* - CR 20 = level 20
|
|
66
|
+
* - CR 30 = level 30
|
|
67
|
+
* - CR 50 = level 50
|
|
68
|
+
* - No upper limit by default
|
|
69
|
+
*
|
|
70
|
+
* The formula is: level = (CR * baseMultiplier) + levelOffset
|
|
71
|
+
* Custom curve mappings take precedence over the calculated value.
|
|
72
|
+
*
|
|
73
|
+
* @param cr - Challenge Rating (supports decimals like 0.25, 0.5)
|
|
74
|
+
* @param tuning - Optional tuning configuration (defaults to DEFAULT_CR_TUNING)
|
|
75
|
+
* @returns Character level (may be fractional, typically rounded for use)
|
|
76
|
+
*
|
|
77
|
+
* @example
|
|
78
|
+
* ```typescript
|
|
79
|
+
* // Standard conversions
|
|
80
|
+
* crToLevel(0); // 0
|
|
81
|
+
* crToLevel(0.25); // 0.25
|
|
82
|
+
* crToLevel(0.5); // 0.5
|
|
83
|
+
* crToLevel(1); // 1
|
|
84
|
+
* crToLevel(5); // 5
|
|
85
|
+
* crToLevel(10); // 10
|
|
86
|
+
*
|
|
87
|
+
* // With custom tuning for harder enemies
|
|
88
|
+
* const hardMode = { ...DEFAULT_CR_TUNING, baseMultiplier: 1.2 };
|
|
89
|
+
* crToLevel(5, hardMode); // 6 (5 * 1.2)
|
|
90
|
+
*
|
|
91
|
+
* // With custom curve override
|
|
92
|
+
* const customCurve = new Map([[5, 7]]);
|
|
93
|
+
* const customTuning = { ...DEFAULT_CR_TUNING, customCurve };
|
|
94
|
+
* crToLevel(5, customTuning); // 7 (uses custom mapping)
|
|
95
|
+
* ```
|
|
96
|
+
*/
|
|
97
|
+
export declare function crToLevel(cr: number, tuning?: CRTuningConfig): number;
|
|
98
|
+
/**
|
|
99
|
+
* Convert character level to Challenge Rating
|
|
100
|
+
*
|
|
101
|
+
* Inverse of crToLevel(). Uses the same tuning parameters to ensure
|
|
102
|
+
* bidirectional consistency.
|
|
103
|
+
*
|
|
104
|
+
* The formula is: CR = (level - levelOffset) / baseMultiplier
|
|
105
|
+
* Custom curve mappings are searched for a matching level first.
|
|
106
|
+
*
|
|
107
|
+
* @param level - Character level (supports decimals)
|
|
108
|
+
* @param tuning - Optional tuning configuration (defaults to DEFAULT_CR_TUNING)
|
|
109
|
+
* @returns Challenge Rating (may be fractional)
|
|
110
|
+
*
|
|
111
|
+
* @example
|
|
112
|
+
* ```typescript
|
|
113
|
+
* // Standard conversions
|
|
114
|
+
* levelToCR(0); // 0
|
|
115
|
+
* levelToCR(1); // 1
|
|
116
|
+
* levelToCR(5); // 5
|
|
117
|
+
* levelToCR(10); // 10
|
|
118
|
+
*
|
|
119
|
+
* // With custom tuning
|
|
120
|
+
* const hardMode = { ...DEFAULT_CR_TUNING, baseMultiplier: 1.2 };
|
|
121
|
+
* levelToCR(6, hardMode); // 5 (6 / 1.2)
|
|
122
|
+
*
|
|
123
|
+
* // Bidirectional consistency
|
|
124
|
+
* const original = 5;
|
|
125
|
+
* const converted = levelToCR(crToLevel(original)); // 5
|
|
126
|
+
* ```
|
|
127
|
+
*/
|
|
128
|
+
export declare function levelToCR(level: number, tuning?: CRTuningConfig): number;
|
|
129
|
+
/**
|
|
130
|
+
* Round a level to the nearest valid character level
|
|
131
|
+
*
|
|
132
|
+
* D&D 5e levels are integers (1-20). This utility rounds fractional levels
|
|
133
|
+
* to the nearest integer, clamping to the valid range.
|
|
134
|
+
*
|
|
135
|
+
* Note: The default minLevel is 1 for standard D&D 5e characters.
|
|
136
|
+
* Pass 0 as minLevel if you want to allow level 0 results.
|
|
137
|
+
*
|
|
138
|
+
* @param level - Level value (may be fractional)
|
|
139
|
+
* @param minLevel - Minimum valid level (default: 1)
|
|
140
|
+
* @param maxLevel - Maximum valid level (default: Infinity — no cap)
|
|
141
|
+
* @returns Rounded integer level
|
|
142
|
+
*
|
|
143
|
+
* @example
|
|
144
|
+
* ```typescript
|
|
145
|
+
* roundLevel(0.5, 1, Infinity); // 1
|
|
146
|
+
* roundLevel(1.2, 1, Infinity); // 1
|
|
147
|
+
* roundLevel(2.7, 1, Infinity); // 3
|
|
148
|
+
* roundLevel(25, 1, Infinity); // 25
|
|
149
|
+
* roundLevel(50, 1, Infinity); // 50
|
|
150
|
+
* roundLevel(0.4, 0, Infinity); // 0 (minLevel 0 allows 0)
|
|
151
|
+
* ```
|
|
152
|
+
*/
|
|
153
|
+
export declare function roundLevel(level: number, minLevel?: number, maxLevel?: number): number;
|
|
154
|
+
/**
|
|
155
|
+
* Round a CR to the nearest valid CR step
|
|
156
|
+
*
|
|
157
|
+
* D&D 5e CRs typically use specific fractional values: 0, 1/8, 1/4, 1/2, 1, 2, 3, etc.
|
|
158
|
+
* This utility rounds to the nearest valid CR step.
|
|
159
|
+
*
|
|
160
|
+
* Valid CR steps (1-30): 0, 0.125, 0.25, 0.5, 1, 2, 3, ..., 24, 26, 27, 28, 29, 30
|
|
161
|
+
* For CR > 30, falls back to the nearest integer (no step table).
|
|
162
|
+
* (CR 25 does not exist in standard D&D 5e)
|
|
163
|
+
*
|
|
164
|
+
* When equidistant between two steps, prefers the higher value (rounds up).
|
|
165
|
+
*
|
|
166
|
+
* @param cr - CR value (may be any decimal)
|
|
167
|
+
* @returns Rounded CR to nearest valid step
|
|
168
|
+
*
|
|
169
|
+
* @example
|
|
170
|
+
* ```typescript
|
|
171
|
+
* roundCR(0.1); // 0.125 (closest to 1/8)
|
|
172
|
+
* roundCR(0.3); // 0.25
|
|
173
|
+
* roundCR(1.5); // 2 (equidistant, rounds up)
|
|
174
|
+
* roundCR(4.4); // 4
|
|
175
|
+
* roundCR(50.3); // 50 (above 30, uses integer rounding)
|
|
176
|
+
* ```
|
|
177
|
+
*/
|
|
178
|
+
export declare function roundCR(cr: number): number;
|
|
179
|
+
/**
|
|
180
|
+
* Get level as a formatted string with fractional notation
|
|
181
|
+
*
|
|
182
|
+
* Converts decimal levels to D&D-style notation where applicable.
|
|
183
|
+
* For example, 0.25 becomes "0 (1/4)" for display purposes.
|
|
184
|
+
*
|
|
185
|
+
* @param level - Level value (may be fractional)
|
|
186
|
+
* @returns Formatted level string
|
|
187
|
+
*
|
|
188
|
+
* @example
|
|
189
|
+
* ```typescript
|
|
190
|
+
* formatLevel(0); // "0"
|
|
191
|
+
* formatLevel(0.125); // "0 (1/8)"
|
|
192
|
+
* formatLevel(0.25); // "0 (1/4)"
|
|
193
|
+
* formatLevel(0.5); // "0 (1/2)"
|
|
194
|
+
* formatLevel(1); // "1"
|
|
195
|
+
* formatLevel(5.5); // "5.5"
|
|
196
|
+
* ```
|
|
197
|
+
*/
|
|
198
|
+
export declare function formatLevel(level: number): string;
|
|
199
|
+
/**
|
|
200
|
+
* Get CR as a formatted string with fractional notation
|
|
201
|
+
*
|
|
202
|
+
* Converts decimal CRs to D&D-style notation.
|
|
203
|
+
* For example, 0.25 becomes "1/4" and 0.125 becomes "1/8".
|
|
204
|
+
*
|
|
205
|
+
* @param cr - CR value (may be fractional)
|
|
206
|
+
* @returns Formatted CR string
|
|
207
|
+
*
|
|
208
|
+
* @example
|
|
209
|
+
* ```typescript
|
|
210
|
+
* formatCR(0); // "0"
|
|
211
|
+
* formatCR(0.125); // "1/8"
|
|
212
|
+
* formatCR(0.25); // "1/4"
|
|
213
|
+
* formatCR(0.5); // "1/2"
|
|
214
|
+
* formatCR(1); // "1"
|
|
215
|
+
* formatCR(5); // "5"
|
|
216
|
+
* ```
|
|
217
|
+
*/
|
|
218
|
+
export declare function formatCR(cr: number): string;
|
|
219
|
+
/**
|
|
220
|
+
* Create a custom CR tuning configuration
|
|
221
|
+
*
|
|
222
|
+
* Factory function to create tuning configs with partial overrides.
|
|
223
|
+
* Merges provided options with defaults.
|
|
224
|
+
*
|
|
225
|
+
* @param options - Partial tuning options to override
|
|
226
|
+
* @returns Complete CRTuningConfig
|
|
227
|
+
*
|
|
228
|
+
* @example
|
|
229
|
+
* ```typescript
|
|
230
|
+
* // Harder enemies: CR converts to higher levels
|
|
231
|
+
* const hardMode = createCRTuning({ baseMultiplier: 1.2 });
|
|
232
|
+
*
|
|
233
|
+
* // Softer enemies: CR converts to lower levels
|
|
234
|
+
* const easyMode = createCRTuning({ baseMultiplier: 0.8 });
|
|
235
|
+
*
|
|
236
|
+
* // Custom curve for specific CRs
|
|
237
|
+
* const customCurve = new Map([[10, 12], [20, 25]]);
|
|
238
|
+
* const custom = createCRTuning({ customCurve });
|
|
239
|
+
* ```
|
|
240
|
+
*/
|
|
241
|
+
export declare function createCRTuning(options?: Partial<CRTuningConfig>): CRTuningConfig;
|
|
242
|
+
//# sourceMappingURL=CRLevelConverter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CRLevelConverter.d.ts","sourceRoot":"","sources":["../../../src/core/generation/CRLevelConverter.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC3B;;;;OAIG;IACH,cAAc,EAAE,MAAM,CAAC;IAEvB;;;;OAIG;IACH,WAAW,EAAE,MAAM,CAAC;IAEpB;;;OAGG;IACH,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEjC;;;OAGG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB;;;;OAIG;IACH,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,EAAE,cAM/B,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AACH,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,GAAE,cAAkC,GAAG,MAAM,CAaxF;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,GAAE,cAAkC,GAAG,MAAM,CAe3F;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAU,EAAE,QAAQ,GAAE,MAAiB,GAAG,MAAM,CAGnG;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CA8B1C;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAqBjD;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAsB3C;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,cAAc,CAAC,OAAO,GAAE,OAAO,CAAC,cAAc,CAAM,GAAG,cAAc,CAMpF"}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import type { CharacterSheet, Class, Race, GameMode } from '../types/Character.js';
|
|
2
|
+
import type { AudioProfile } from '../types/AudioProfile.js';
|
|
3
|
+
import type { PlaylistTrack } from '../types/Playlist.js';
|
|
4
|
+
/**
|
|
5
|
+
* Extension data for custom spells
|
|
6
|
+
*/
|
|
7
|
+
export interface SpellExtension {
|
|
8
|
+
name: string;
|
|
9
|
+
level: number;
|
|
10
|
+
school: string;
|
|
11
|
+
casting_time?: string;
|
|
12
|
+
range?: string;
|
|
13
|
+
duration?: string;
|
|
14
|
+
components?: string[];
|
|
15
|
+
description?: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Extension data for custom equipment
|
|
19
|
+
*/
|
|
20
|
+
export interface EquipmentExtension {
|
|
21
|
+
name: string;
|
|
22
|
+
type: 'weapon' | 'armor' | 'item';
|
|
23
|
+
rarity: 'common' | 'uncommon' | 'rare' | 'very_rare' | 'legendary';
|
|
24
|
+
weight: number;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Extension data for custom races (race name only, uses existing Race enum)
|
|
28
|
+
*/
|
|
29
|
+
export type RaceExtension = string;
|
|
30
|
+
/**
|
|
31
|
+
* Extension data for custom classes (class name only, uses existing Class enum)
|
|
32
|
+
*/
|
|
33
|
+
export type ClassExtension = string;
|
|
34
|
+
/**
|
|
35
|
+
* Extension data for custom appearance options
|
|
36
|
+
*/
|
|
37
|
+
export type AppearanceExtension = {
|
|
38
|
+
bodyTypes?: string[];
|
|
39
|
+
skinTones?: string[];
|
|
40
|
+
hairColors?: string[];
|
|
41
|
+
hairStyles?: string[];
|
|
42
|
+
eyeColors?: string[];
|
|
43
|
+
facialFeatures?: string[];
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* Extension configuration for CharacterGenerator
|
|
47
|
+
*/
|
|
48
|
+
export interface CharacterGeneratorExtensions {
|
|
49
|
+
/** Custom spells to add */
|
|
50
|
+
spells?: SpellExtension[];
|
|
51
|
+
/** Custom equipment to add */
|
|
52
|
+
equipment?: EquipmentExtension[];
|
|
53
|
+
/** Custom races to add (race names) */
|
|
54
|
+
races?: RaceExtension[];
|
|
55
|
+
/** Custom classes to add (class names) */
|
|
56
|
+
classes?: ClassExtension[];
|
|
57
|
+
/** Custom appearance options */
|
|
58
|
+
appearance?: AppearanceExtension;
|
|
59
|
+
}
|
|
60
|
+
export interface CharacterGeneratorOptions {
|
|
61
|
+
/** Starting level (default: 1) */
|
|
62
|
+
level?: number;
|
|
63
|
+
/** Override class suggestion */
|
|
64
|
+
forceClass?: Class;
|
|
65
|
+
/** Override race selection (required when specifying a subrace other than 'pure') */
|
|
66
|
+
forceRace?: Race;
|
|
67
|
+
/** Game mode for stat progression (default: 'standard') */
|
|
68
|
+
gameMode?: GameMode;
|
|
69
|
+
/** Override automatic name generation with custom name */
|
|
70
|
+
forceName?: string;
|
|
71
|
+
/** Generate deterministic names (same seed = same name). Default: true */
|
|
72
|
+
deterministicName?: boolean;
|
|
73
|
+
/**
|
|
74
|
+
* Optional subrace selection
|
|
75
|
+
*
|
|
76
|
+
* - `'pure'` - Explicitly generate character with no subrace (no race required)
|
|
77
|
+
* - `undefined` - Randomly select between 'pure' and available subraces for the race
|
|
78
|
+
* - `'Specific Subrace'` - Manually specify a subrace (REQUIRES `forceRace` to also be set)
|
|
79
|
+
*
|
|
80
|
+
* @example
|
|
81
|
+
* // Random subrace or pure
|
|
82
|
+
* const randomSubrace = CharacterGenerator.generate(seed, audio, track);
|
|
83
|
+
*
|
|
84
|
+
* @example
|
|
85
|
+
* // Explicitly no subrace
|
|
86
|
+
* const pure = CharacterGenerator.generate(seed, audio, track, { subrace: 'pure' });
|
|
87
|
+
*
|
|
88
|
+
* @example
|
|
89
|
+
* // Specific subrace with race (both required)
|
|
90
|
+
* const highElf = CharacterGenerator.generate(seed, audio, track, { forceRace: 'Elf', subrace: 'High Elf' });
|
|
91
|
+
*/
|
|
92
|
+
subrace?: string;
|
|
93
|
+
/**
|
|
94
|
+
* Custom extensions for procedural generation
|
|
95
|
+
* Allows adding custom spells, equipment, races, classes, and appearance options
|
|
96
|
+
*/
|
|
97
|
+
extensions?: CharacterGeneratorExtensions;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Generate D&D 5e-compliant character sheets deterministically from audio signatures
|
|
101
|
+
*
|
|
102
|
+
* Uses seeded random number generation to ensure the same seed always produces
|
|
103
|
+
* the same character. Combines audio frequency analysis with blockchain metadata
|
|
104
|
+
* to create unique, reproducible characters.
|
|
105
|
+
*/
|
|
106
|
+
export declare class CharacterGenerator {
|
|
107
|
+
/**
|
|
108
|
+
* Register custom extensions with the ExtensionManager
|
|
109
|
+
*
|
|
110
|
+
* This method registers custom spells, equipment, races, classes, and appearance
|
|
111
|
+
* options that will be merged with the default data during character generation.
|
|
112
|
+
*
|
|
113
|
+
* @param extensions - Custom extensions to register
|
|
114
|
+
*
|
|
115
|
+
* @example
|
|
116
|
+
* CharacterGenerator.registerExtensions({
|
|
117
|
+
* spells: [{ name: 'Phoenix Fire', level: 5, school: 'Evocation' }],
|
|
118
|
+
* equipment: [{ name: 'Dragon Scale Armor', type: 'armor', rarity: 'rare', weight: 25 }],
|
|
119
|
+
* races: ['Dragonborn'],
|
|
120
|
+
* classes: ['Paladin'],
|
|
121
|
+
* appearance: { bodyTypes: ['muscular'] }
|
|
122
|
+
* });
|
|
123
|
+
*/
|
|
124
|
+
private static registerExtensions;
|
|
125
|
+
/**
|
|
126
|
+
* Generate a complete D&D 5e character sheet from audio profile and seed
|
|
127
|
+
*
|
|
128
|
+
* Deterministically generates:
|
|
129
|
+
* - Race (with racial ability bonuses)
|
|
130
|
+
* - Class (suggested by audio profile frequency analysis)
|
|
131
|
+
* - Ability scores (based on bass/mid/treble dominance)
|
|
132
|
+
* - Skills, proficiencies, and saving throws
|
|
133
|
+
* - Hit points and armor class
|
|
134
|
+
* - Character appearance (color-matched to audio)
|
|
135
|
+
*
|
|
136
|
+
* Same seed + audio profile = identical character every time.
|
|
137
|
+
*
|
|
138
|
+
* @param {string} seed - Deterministic seed (e.g., "chain-contract-tokenId")
|
|
139
|
+
* @param {AudioProfile} audioProfile - Audio frequency analysis results
|
|
140
|
+
* @param {PlaylistTrack} track - Track metadata (title, artist, genre) for automatic name generation
|
|
141
|
+
* @param {CharacterGeneratorOptions} [options] - Generation options
|
|
142
|
+
* @param {number} [options.level=1] - Starting level (1-20)
|
|
143
|
+
* @param {Class} [options.forceClass] - Override class suggestion
|
|
144
|
+
* @param {Race} [options.forceRace] - Override race selection (required when subrace is specified)
|
|
145
|
+
* @param {GameMode} [options.gameMode='standard'] - Game mode for stat progression
|
|
146
|
+
* @param {string} [options.subrace] - Subrace: 'pure' (no subrace), undefined (random), or specific subrace name
|
|
147
|
+
* @param {boolean} [options.deterministicName=true] - Generate deterministic names (same seed = same name)
|
|
148
|
+
* @param {CharacterGeneratorExtensions} [options.extensions] - Custom extensions
|
|
149
|
+
* @returns {CharacterSheet} Complete D&D 5e character sheet
|
|
150
|
+
*
|
|
151
|
+
* @example
|
|
152
|
+
* const character = CharacterGenerator.generate(
|
|
153
|
+
* 'polygon-0x123-456',
|
|
154
|
+
* audioProfile,
|
|
155
|
+
* track,
|
|
156
|
+
* { level: 5 }
|
|
157
|
+
* );
|
|
158
|
+
* console.log(`${character.name}: Level ${character.level} ${character.class}`);
|
|
159
|
+
*
|
|
160
|
+
* @example
|
|
161
|
+
* // Explicitly no subrace
|
|
162
|
+
* const pure = CharacterGenerator.generate(
|
|
163
|
+
* 'seed',
|
|
164
|
+
* audioProfile,
|
|
165
|
+
* track,
|
|
166
|
+
* { subrace: 'pure' }
|
|
167
|
+
* );
|
|
168
|
+
*
|
|
169
|
+
* @example
|
|
170
|
+
* // Specific subrace with race (both required)
|
|
171
|
+
* const highElf = CharacterGenerator.generate(
|
|
172
|
+
* 'seed',
|
|
173
|
+
* audioProfile,
|
|
174
|
+
* track,
|
|
175
|
+
* { forceRace: 'Elf', subrace: 'High Elf' }
|
|
176
|
+
* );
|
|
177
|
+
*
|
|
178
|
+
* @example
|
|
179
|
+
* // With custom spells and non deterministic name
|
|
180
|
+
* const customCharacter = CharacterGenerator.generate(
|
|
181
|
+
* 'seed',
|
|
182
|
+
* audioProfile,
|
|
183
|
+
* track,
|
|
184
|
+
* {
|
|
185
|
+
* deterministicName: false,
|
|
186
|
+
* extensions: {
|
|
187
|
+
* spells: [{ name: 'Phoenix Fire', level: 5, school: 'Evocation' }]
|
|
188
|
+
* }
|
|
189
|
+
* }
|
|
190
|
+
* );
|
|
191
|
+
*/
|
|
192
|
+
static generate(seed: string, audioProfile: AudioProfile, track: PlaylistTrack, options?: CharacterGeneratorOptions): CharacterSheet;
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=CharacterGenerator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CharacterGenerator.d.ts","sourceRoot":"","sources":["../../../src/core/generation/CharacterGenerator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,IAAI,EAAW,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAC5F,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAmB1D;;GAEG;AACH,MAAM,WAAW,cAAc;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAC;IAClC,MAAM,EAAE,QAAQ,GAAG,UAAU,GAAG,MAAM,GAAG,WAAW,GAAG,WAAW,CAAC;IACnE,MAAM,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC;AAEnC;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC;AAEpC;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAC9B,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC7B,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,4BAA4B;IACzC,2BAA2B;IAC3B,MAAM,CAAC,EAAE,cAAc,EAAE,CAAC;IAC1B,8BAA8B;IAC9B,SAAS,CAAC,EAAE,kBAAkB,EAAE,CAAC;IACjC,uCAAuC;IACvC,KAAK,CAAC,EAAE,aAAa,EAAE,CAAC;IACxB,0CAA0C;IAC1C,OAAO,CAAC,EAAE,cAAc,EAAE,CAAC;IAC3B,gCAAgC;IAChC,UAAU,CAAC,EAAE,mBAAmB,CAAC;CACpC;AAED,MAAM,WAAW,yBAAyB;IACtC,kCAAkC;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,gCAAgC;IAChC,UAAU,CAAC,EAAE,KAAK,CAAC;IAEnB,qFAAqF;IACrF,SAAS,CAAC,EAAE,IAAI,CAAC;IAEjB,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,QAAQ,CAAC;IAEpB,0DAA0D;IAC1D,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,0EAA0E;IAC1E,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAE5B;;;;;;;;;;;;;;;;;;OAkBG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;OAGG;IACH,UAAU,CAAC,EAAE,4BAA4B,CAAC;CAC7C;AAED;;;;;;GAMG;AACH,qBAAa,kBAAkB;IAC3B;;;;;;;;;;;;;;;;OAgBG;IACH,OAAO,CAAC,MAAM,CAAC,kBAAkB;IAgDjC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAkEG;IACH,MAAM,CAAC,QAAQ,CACX,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,YAAY,EAC1B,KAAK,EAAE,aAAa,EACpB,OAAO,GAAE,yBAA8B,GACxC,cAAc;CAsRpB"}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Class Suggester - Affinity-based class selection with baseline system
|
|
3
|
+
* Based on specs/001-core-engine/SPEC.md
|
|
4
|
+
*/
|
|
5
|
+
import type { Class } from '../types/Character.js';
|
|
6
|
+
import type { AudioProfile } from '../types/AudioProfile.js';
|
|
7
|
+
import { SeededRNG } from '../../utils/random.js';
|
|
8
|
+
/**
|
|
9
|
+
* Suggest D&D 5e classes based on audio frequency analysis
|
|
10
|
+
*
|
|
11
|
+
* Key improvements over previous implementation:
|
|
12
|
+
* - **4% baseline probability**: All classes always have at least 4% chance
|
|
13
|
+
* - **Affinity-based selection**: Smooth affinity scoring instead of hard thresholds
|
|
14
|
+
* - **No class lockout**: Any class can be selected at any time
|
|
15
|
+
* - **Audio influences smoothly**: Higher affinity = higher probability (up to 50%+)
|
|
16
|
+
*
|
|
17
|
+
* Maps audio characteristics to character classes:
|
|
18
|
+
* - High bass (strength) → Barbarian, Fighter, Paladin
|
|
19
|
+
* - High treble (dexterity) → Rogue, Ranger, Monk
|
|
20
|
+
* - High mid (intelligence/wisdom) → Wizard, Cleric, Druid
|
|
21
|
+
* - High amplitude (charisma) → Bard, Sorcerer, Warlock
|
|
22
|
+
*
|
|
23
|
+
* Supports the extensibility system:
|
|
24
|
+
* - Custom classes can be registered via ExtensionManager
|
|
25
|
+
* - Spawn rates can be customized per class
|
|
26
|
+
* - Audio-based affinities are combined with custom spawn rate weights
|
|
27
|
+
*/
|
|
28
|
+
export declare class ClassSuggester {
|
|
29
|
+
/**
|
|
30
|
+
* Minimum probability for each class (4%)
|
|
31
|
+
*
|
|
32
|
+
* This ensures that even with unfavorable audio, every class has a chance.
|
|
33
|
+
* The remaining (1 - baseline × num_classes) is distributed by affinity.
|
|
34
|
+
*/
|
|
35
|
+
private static readonly BASELINE_PROBABILITY;
|
|
36
|
+
/**
|
|
37
|
+
* Suggest a class based on audio frequency dominance
|
|
38
|
+
*
|
|
39
|
+
* Algorithm:
|
|
40
|
+
* 1. Calculate affinity for each class based on audio profile
|
|
41
|
+
* 2. Convert affinities to probabilities with 4% baseline
|
|
42
|
+
* 3. Apply custom spawn rate weights (custom takes priority)
|
|
43
|
+
* 4. Weighted random selection with seeded RNG
|
|
44
|
+
*
|
|
45
|
+
* The affinity system uses smooth scoring instead of hard thresholds:
|
|
46
|
+
* - Each class has preferred audio traits (bass, treble, mid, amplitude)
|
|
47
|
+
* - Primary trait contributes 100% of its weight
|
|
48
|
+
* - Secondary trait contributes 50% of its weight
|
|
49
|
+
* - Tertiary trait contributes 25% of its weight
|
|
50
|
+
* - Result: Smooth affinity score based on how close audio is to "ideal"
|
|
51
|
+
*
|
|
52
|
+
* The baseline system ensures variety:
|
|
53
|
+
* - Each class gets 4% minimum probability
|
|
54
|
+
* - Audio can boost a class from 4% to 50%+
|
|
55
|
+
* - No class ever has 0% chance
|
|
56
|
+
*
|
|
57
|
+
* @param {AudioProfile} audioProfile - Frequency analysis results (bass/mid/treble/amplitude)
|
|
58
|
+
* @param {SeededRNG} rng - Seeded random number generator for deterministic selection
|
|
59
|
+
* @returns {Class} Suggested D&D 5e class
|
|
60
|
+
*
|
|
61
|
+
* @example
|
|
62
|
+
* ```typescript
|
|
63
|
+
* const audioProfile = await analyzer.extractSonicFingerprint(audioUrl);
|
|
64
|
+
* const suggestedClass = ClassSuggester.suggest(audioProfile, rng);
|
|
65
|
+
* console.log(`This audio suggests: ${suggestedClass}`);
|
|
66
|
+
* ```
|
|
67
|
+
*
|
|
68
|
+
* @example
|
|
69
|
+
* ```typescript
|
|
70
|
+
* // With custom spawn weights
|
|
71
|
+
* const manager = ExtensionManager.getInstance();
|
|
72
|
+
* manager.setWeights('classes', { 'Barbarian': 2, 'Wizard': 0.5 }); // Make barbarians more common
|
|
73
|
+
* const suggestedClass = ClassSuggester.suggest(audioProfile, rng);
|
|
74
|
+
* ```
|
|
75
|
+
*
|
|
76
|
+
* @example
|
|
77
|
+
* ```typescript
|
|
78
|
+
* // With custom classes
|
|
79
|
+
* manager.register('classes', ['Necromancer', 'Battlemage'], {
|
|
80
|
+
* mode: 'relative',
|
|
81
|
+
* weights: { 'Necromancer': 0.3, 'Battlemage': 0.5 }
|
|
82
|
+
* });
|
|
83
|
+
* const suggestedClass = ClassSuggester.suggest(audioProfile, rng);
|
|
84
|
+
* ```
|
|
85
|
+
*/
|
|
86
|
+
static suggest(audioProfile: AudioProfile, rng: SeededRNG): Class;
|
|
87
|
+
/**
|
|
88
|
+
* Calculate affinity score for all classes based on audio profile
|
|
89
|
+
*
|
|
90
|
+
* Uses CLASS_AUDIO_PREFERENCES to determine how much each class "likes"
|
|
91
|
+
* the current audio profile. Higher affinity = higher probability.
|
|
92
|
+
*
|
|
93
|
+
* Affinity calculation:
|
|
94
|
+
* - Primary trait: audio_value × weight × 1.0
|
|
95
|
+
* - Secondary trait: audio_value × weight × 0.5
|
|
96
|
+
* - Tertiary trait: audio_value × weight × 0.25
|
|
97
|
+
* - Chaos: variance across all traits × 0.5
|
|
98
|
+
*
|
|
99
|
+
* @param {AudioProfile} audioProfile - Frequency analysis results
|
|
100
|
+
* @param {Class[]} allClasses - All available classes (default + custom)
|
|
101
|
+
* @returns {Record<Class, number>} Affinity scores for each class
|
|
102
|
+
* @private
|
|
103
|
+
*/
|
|
104
|
+
private static calculateAllAffinities;
|
|
105
|
+
/**
|
|
106
|
+
* Calculate affinity score for a single class
|
|
107
|
+
*
|
|
108
|
+
* Checks for audio preferences in this order:
|
|
109
|
+
* 1. CLASS_AUDIO_PREFERENCES (for default D&D 5e classes)
|
|
110
|
+
* 2. ExtensionManager's classes.data (for custom classes with audio_preferences)
|
|
111
|
+
* 3. Returns neutral affinity (0.5) if no preferences found
|
|
112
|
+
*
|
|
113
|
+
* Audio preferences structure:
|
|
114
|
+
* - primary: Most important audio trait (bass/treble/mid/amplitude/chaos)
|
|
115
|
+
* - secondary: Optional secondary trait
|
|
116
|
+
* - tertiary: Optional tertiary trait
|
|
117
|
+
* - weights: Multipliers for each frequency band (0-1 range)
|
|
118
|
+
*
|
|
119
|
+
* Special trait: "chaos" rewards high variance across frequency bands
|
|
120
|
+
*
|
|
121
|
+
* @param {AudioProfile} audioProfile - Frequency analysis results
|
|
122
|
+
* @param {Class} characterClass - Class to calculate affinity for
|
|
123
|
+
* @returns {number} Affinity score (0-1+ range, can exceed 1 with boosts)
|
|
124
|
+
* @private
|
|
125
|
+
*/
|
|
126
|
+
private static calculateClassAffinity;
|
|
127
|
+
/**
|
|
128
|
+
* Get audio preferences for a custom class from ExtensionManager
|
|
129
|
+
*
|
|
130
|
+
* Checks the 'classes.data' category for custom class entries that include
|
|
131
|
+
* audio_preferences. This allows custom classes to participate in affinity-based
|
|
132
|
+
* class suggestion.
|
|
133
|
+
*
|
|
134
|
+
* @param {Class} characterClass - Class to get audio preferences for
|
|
135
|
+
* @returns Audio preferences object or undefined if not found
|
|
136
|
+
* @private
|
|
137
|
+
*/
|
|
138
|
+
private static getCustomClassAudioPreferences;
|
|
139
|
+
/**
|
|
140
|
+
* Get the contribution of a specific audio trait to affinity
|
|
141
|
+
*
|
|
142
|
+
* @param {AudioProfile} audioProfile - Frequency analysis results
|
|
143
|
+
* @param {AudioTrait} trait - The trait to get contribution for
|
|
144
|
+
* @param prefs - Class audio preferences with weights
|
|
145
|
+
* @param {number} multiplier - Contribution multiplier (1.0, 0.5, or 0.25)
|
|
146
|
+
* @returns {number} Trait contribution to affinity
|
|
147
|
+
* @private
|
|
148
|
+
*/
|
|
149
|
+
private static getTraitContribution;
|
|
150
|
+
/**
|
|
151
|
+
* Convert affinity scores to probabilities with 4% baseline
|
|
152
|
+
*
|
|
153
|
+
* Algorithm:
|
|
154
|
+
* 1. Normalize affinities to 0-1 range
|
|
155
|
+
* 2. Apply 4% baseline to each class
|
|
156
|
+
* 3. Distribute remaining probability by normalized affinity
|
|
157
|
+
* 4. Renormalize to ensure sum = 1.0
|
|
158
|
+
*
|
|
159
|
+
* Result: Each class has minimum 4% probability, audio influences remaining 52%
|
|
160
|
+
* (for 12 classes: 12 × 4% = 48% baseline, 52% distributed by affinity)
|
|
161
|
+
*
|
|
162
|
+
* @param {Record<string, number>} affinities - Affinity scores for each class
|
|
163
|
+
* @returns {Record<string, number>} Probabilities (sum = 1.0)
|
|
164
|
+
* @private
|
|
165
|
+
*/
|
|
166
|
+
private static calculateProbabilities;
|
|
167
|
+
/**
|
|
168
|
+
* Apply custom spawn rate weights to probabilities
|
|
169
|
+
*
|
|
170
|
+
* Custom weights from ExtensionManager take priority over audio-based probabilities.
|
|
171
|
+
* This allows users to override audio suggestions with their own preferences.
|
|
172
|
+
*
|
|
173
|
+
* If no custom weights exist, returns audio-based probabilities unchanged.
|
|
174
|
+
* If custom weights exist, they replace the audio-based probabilities.
|
|
175
|
+
*
|
|
176
|
+
* @param {Record<string, number>} probabilities - Audio-based probabilities
|
|
177
|
+
* @param {Record<string, number>} customWeights - Custom spawn rate weights
|
|
178
|
+
* @param {Class[]} allClasses - All available classes
|
|
179
|
+
* @returns {Record<string, number>} Final probabilities (sum = 1.0)
|
|
180
|
+
* @private
|
|
181
|
+
*/
|
|
182
|
+
private static applyCustomWeights;
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=ClassSuggester.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ClassSuggester.d.ts","sourceRoot":"","sources":["../../../src/core/generation/ClassSuggester.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAUlD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,cAAc;IACvB;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,oBAAoB,CAAQ;IAEpD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAiDG;IACH,MAAM,CAAC,OAAO,CAAC,YAAY,EAAE,YAAY,EAAE,GAAG,EAAE,SAAS,GAAG,KAAK;IAwBjE;;;;;;;;;;;;;;;;OAgBG;IACH,OAAO,CAAC,MAAM,CAAC,sBAAsB;IAarC;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,OAAO,CAAC,MAAM,CAAC,sBAAsB;IAwCrC;;;;;;;;;;OAUG;IACH,OAAO,CAAC,MAAM,CAAC,8BAA8B;IA4B7C;;;;;;;;;OASG;IACH,OAAO,CAAC,MAAM,CAAC,oBAAoB;IA8BnC;;;;;;;;;;;;;;;OAeG;IACH,OAAO,CAAC,MAAM,CAAC,sBAAsB;IAiDrC;;;;;;;;;;;;;;OAcG;IACH,OAAO,CAAC,MAAM,CAAC,kBAAkB;CA+CpC"}
|