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.
Files changed (345) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +352 -0
  3. package/dist/__vite-browser-external-DYxpcVy9.js +4 -0
  4. package/dist/constants/DefaultClasses.d.ts +46 -0
  5. package/dist/constants/DefaultClasses.d.ts.map +1 -0
  6. package/dist/constants/DefaultEnchantments.d.ts +337 -0
  7. package/dist/constants/DefaultEnchantments.d.ts.map +1 -0
  8. package/dist/constants/DefaultEnemies.d.ts +83 -0
  9. package/dist/constants/DefaultEnemies.d.ts.map +1 -0
  10. package/dist/constants/DefaultEquipment.d.ts +23 -0
  11. package/dist/constants/DefaultEquipment.d.ts.map +1 -0
  12. package/dist/constants/DefaultFeatures.d.ts +22 -0
  13. package/dist/constants/DefaultFeatures.d.ts.map +1 -0
  14. package/dist/constants/DefaultRaces.d.ts +102 -0
  15. package/dist/constants/DefaultRaces.d.ts.map +1 -0
  16. package/dist/constants/DefaultSkills.d.ts +26 -0
  17. package/dist/constants/DefaultSkills.d.ts.map +1 -0
  18. package/dist/constants/DefaultSpells.d.ts +41 -0
  19. package/dist/constants/DefaultSpells.d.ts.map +1 -0
  20. package/dist/constants/EncounterBalance.d.ts +208 -0
  21. package/dist/constants/EncounterBalance.d.ts.map +1 -0
  22. package/dist/constants/EnemyEquipment.d.ts +71 -0
  23. package/dist/constants/EnemyEquipment.d.ts.map +1 -0
  24. package/dist/constants/EnemyRarity.d.ts +79 -0
  25. package/dist/constants/EnemyRarity.d.ts.map +1 -0
  26. package/dist/constants/EnemyTemplates/Construct.d.ts +63 -0
  27. package/dist/constants/EnemyTemplates/Construct.d.ts.map +1 -0
  28. package/dist/constants/EnemyTemplates/Dragon.d.ts +68 -0
  29. package/dist/constants/EnemyTemplates/Dragon.d.ts.map +1 -0
  30. package/dist/constants/EnemyTemplates/Elemental.d.ts +64 -0
  31. package/dist/constants/EnemyTemplates/Elemental.d.ts.map +1 -0
  32. package/dist/constants/EnemyTemplates/Fiend.d.ts +62 -0
  33. package/dist/constants/EnemyTemplates/Fiend.d.ts.map +1 -0
  34. package/dist/constants/EnemyTemplates/Monstrosity.d.ts +63 -0
  35. package/dist/constants/EnemyTemplates/Monstrosity.d.ts.map +1 -0
  36. package/dist/constants/EnemyTemplates/Undead.d.ts +61 -0
  37. package/dist/constants/EnemyTemplates/Undead.d.ts.map +1 -0
  38. package/dist/constants/ItemTemplates.d.ts +40 -0
  39. package/dist/constants/ItemTemplates.d.ts.map +1 -0
  40. package/dist/constants/MagicItems.d.ts +30 -0
  41. package/dist/constants/MagicItems.d.ts.map +1 -0
  42. package/dist/constants/SpellSlots.d.ts +30 -0
  43. package/dist/constants/SpellSlots.d.ts.map +1 -0
  44. package/dist/constants/StatScaling.d.ts +113 -0
  45. package/dist/constants/StatScaling.d.ts.map +1 -0
  46. package/dist/core/analysis/AudioAnalyzer.d.ts +599 -0
  47. package/dist/core/analysis/AudioAnalyzer.d.ts.map +1 -0
  48. package/dist/core/analysis/ColorExtractor.d.ts +64 -0
  49. package/dist/core/analysis/ColorExtractor.d.ts.map +1 -0
  50. package/dist/core/analysis/EssentiaPitchDetector.d.ts +282 -0
  51. package/dist/core/analysis/EssentiaPitchDetector.d.ts.map +1 -0
  52. package/dist/core/analysis/LevelSerializer.d.ts +265 -0
  53. package/dist/core/analysis/LevelSerializer.d.ts.map +1 -0
  54. package/dist/core/analysis/MelodyContourAnalyzer.d.ts +283 -0
  55. package/dist/core/analysis/MelodyContourAnalyzer.d.ts.map +1 -0
  56. package/dist/core/analysis/MultiBandAnalyzer.d.ts +214 -0
  57. package/dist/core/analysis/MultiBandAnalyzer.d.ts.map +1 -0
  58. package/dist/core/analysis/MusicClassifier.d.ts +524 -0
  59. package/dist/core/analysis/MusicClassifier.d.ts.map +1 -0
  60. package/dist/core/analysis/PitchAnalyzer.d.ts +266 -0
  61. package/dist/core/analysis/PitchAnalyzer.d.ts.map +1 -0
  62. package/dist/core/analysis/PitchDetector.d.ts +251 -0
  63. package/dist/core/analysis/PitchDetector.d.ts.map +1 -0
  64. package/dist/core/analysis/SpectrumScanner.d.ts +52 -0
  65. package/dist/core/analysis/SpectrumScanner.d.ts.map +1 -0
  66. package/dist/core/analysis/beat/BeatInterpolator.d.ts +477 -0
  67. package/dist/core/analysis/beat/BeatInterpolator.d.ts.map +1 -0
  68. package/dist/core/analysis/beat/BeatMapGenerator.d.ts +170 -0
  69. package/dist/core/analysis/beat/BeatMapGenerator.d.ts.map +1 -0
  70. package/dist/core/analysis/beat/BeatStream.d.ts +316 -0
  71. package/dist/core/analysis/beat/BeatStream.d.ts.map +1 -0
  72. package/dist/core/analysis/beat/BeatSubdivider.d.ts +205 -0
  73. package/dist/core/analysis/beat/BeatSubdivider.d.ts.map +1 -0
  74. package/dist/core/analysis/beat/BeatTracker.d.ts +137 -0
  75. package/dist/core/analysis/beat/BeatTracker.d.ts.map +1 -0
  76. package/dist/core/analysis/beat/CompositeStreamGenerator.d.ts +180 -0
  77. package/dist/core/analysis/beat/CompositeStreamGenerator.d.ts.map +1 -0
  78. package/dist/core/analysis/beat/DensityAnalyzer.d.ts +246 -0
  79. package/dist/core/analysis/beat/DensityAnalyzer.d.ts.map +1 -0
  80. package/dist/core/analysis/beat/DifficultyVariantGenerator.d.ts +1082 -0
  81. package/dist/core/analysis/beat/DifficultyVariantGenerator.d.ts.map +1 -0
  82. package/dist/core/analysis/beat/GrooveAnalyzer.d.ts +192 -0
  83. package/dist/core/analysis/beat/GrooveAnalyzer.d.ts.map +1 -0
  84. package/dist/core/analysis/beat/OnsetStrengthEnvelope.d.ts +133 -0
  85. package/dist/core/analysis/beat/OnsetStrengthEnvelope.d.ts.map +1 -0
  86. package/dist/core/analysis/beat/PhraseAnalyzer.d.ts +230 -0
  87. package/dist/core/analysis/beat/PhraseAnalyzer.d.ts.map +1 -0
  88. package/dist/core/analysis/beat/RhythmQuantizer.d.ts +399 -0
  89. package/dist/core/analysis/beat/RhythmQuantizer.d.ts.map +1 -0
  90. package/dist/core/analysis/beat/RhythmicBalancer.d.ts +262 -0
  91. package/dist/core/analysis/beat/RhythmicBalancer.d.ts.map +1 -0
  92. package/dist/core/analysis/beat/StreamScorer.d.ts +275 -0
  93. package/dist/core/analysis/beat/StreamScorer.d.ts.map +1 -0
  94. package/dist/core/analysis/beat/TempoAwareQuantizer.d.ts +256 -0
  95. package/dist/core/analysis/beat/TempoAwareQuantizer.d.ts.map +1 -0
  96. package/dist/core/analysis/beat/TempoDetector.d.ts +220 -0
  97. package/dist/core/analysis/beat/TempoDetector.d.ts.map +1 -0
  98. package/dist/core/analysis/beat/TransientDetector.d.ts +303 -0
  99. package/dist/core/analysis/beat/TransientDetector.d.ts.map +1 -0
  100. package/dist/core/analysis/beat/beatKeyHelpers.d.ts +180 -0
  101. package/dist/core/analysis/beat/beatKeyHelpers.d.ts.map +1 -0
  102. package/dist/core/analysis/beat/index.d.ts +41 -0
  103. package/dist/core/analysis/beat/index.d.ts.map +1 -0
  104. package/dist/core/analysis/beat/utils/audioUtils.d.ts +204 -0
  105. package/dist/core/analysis/beat/utils/audioUtils.d.ts.map +1 -0
  106. package/dist/core/analysis/beat/utils/beatInterpolationDebug.d.ts +404 -0
  107. package/dist/core/analysis/beat/utils/beatInterpolationDebug.d.ts.map +1 -0
  108. package/dist/core/analysis/beat/utils/subdivideBeatMap.d.ts +61 -0
  109. package/dist/core/analysis/beat/utils/subdivideBeatMap.d.ts.map +1 -0
  110. package/dist/core/analysis/beat/utils/unifyBeatMap.d.ts +33 -0
  111. package/dist/core/analysis/beat/utils/unifyBeatMap.d.ts.map +1 -0
  112. package/dist/core/analysis/index.d.ts +18 -0
  113. package/dist/core/analysis/index.d.ts.map +1 -0
  114. package/dist/core/combat/AI/AICombatRunner.d.ts +108 -0
  115. package/dist/core/combat/AI/AICombatRunner.d.ts.map +1 -0
  116. package/dist/core/combat/AI/CombatAI.d.ts +179 -0
  117. package/dist/core/combat/AI/CombatAI.d.ts.map +1 -0
  118. package/dist/core/combat/AI/CombatMetricsTracker.d.ts +30 -0
  119. package/dist/core/combat/AI/CombatMetricsTracker.d.ts.map +1 -0
  120. package/dist/core/combat/Analysis/BalanceValidator.d.ts +170 -0
  121. package/dist/core/combat/Analysis/BalanceValidator.d.ts.map +1 -0
  122. package/dist/core/combat/Analysis/ComparativeAnalyzer.d.ts +231 -0
  123. package/dist/core/combat/Analysis/ComparativeAnalyzer.d.ts.map +1 -0
  124. package/dist/core/combat/Analysis/DifficultyCalculator.d.ts +203 -0
  125. package/dist/core/combat/Analysis/DifficultyCalculator.d.ts.map +1 -0
  126. package/dist/core/combat/Analysis/ParameterSweep.d.ts +201 -0
  127. package/dist/core/combat/Analysis/ParameterSweep.d.ts.map +1 -0
  128. package/dist/core/combat/AttackResolver.d.ts +220 -0
  129. package/dist/core/combat/AttackResolver.d.ts.map +1 -0
  130. package/dist/core/combat/CombatEngine.d.ts +388 -0
  131. package/dist/core/combat/CombatEngine.d.ts.map +1 -0
  132. package/dist/core/combat/DiceRoller.d.ts +115 -0
  133. package/dist/core/combat/DiceRoller.d.ts.map +1 -0
  134. package/dist/core/combat/InitiativeRoller.d.ts +62 -0
  135. package/dist/core/combat/InitiativeRoller.d.ts.map +1 -0
  136. package/dist/core/combat/PartyAnalyzer.d.ts +215 -0
  137. package/dist/core/combat/PartyAnalyzer.d.ts.map +1 -0
  138. package/dist/core/combat/SeededDiceRoller.d.ts +120 -0
  139. package/dist/core/combat/SeededDiceRoller.d.ts.map +1 -0
  140. package/dist/core/combat/Simulation/CombatSimulator.d.ts +366 -0
  141. package/dist/core/combat/Simulation/CombatSimulator.d.ts.map +1 -0
  142. package/dist/core/combat/SpellCaster.d.ts +113 -0
  143. package/dist/core/combat/SpellCaster.d.ts.map +1 -0
  144. package/dist/core/config/index.d.ts +24 -0
  145. package/dist/core/config/index.d.ts.map +1 -0
  146. package/dist/core/config/progressionConfig.d.ts +73 -0
  147. package/dist/core/config/progressionConfig.d.ts.map +1 -0
  148. package/dist/core/config/sensorConfig.d.ts +134 -0
  149. package/dist/core/config/sensorConfig.d.ts.map +1 -0
  150. package/dist/core/equipment/BoxOpener.d.ts +175 -0
  151. package/dist/core/equipment/BoxOpener.d.ts.map +1 -0
  152. package/dist/core/equipment/EquipmentEffectApplier.d.ts +189 -0
  153. package/dist/core/equipment/EquipmentEffectApplier.d.ts.map +1 -0
  154. package/dist/core/equipment/EquipmentModifier.d.ts +327 -0
  155. package/dist/core/equipment/EquipmentModifier.d.ts.map +1 -0
  156. package/dist/core/equipment/EquipmentSpawnHelper.d.ts +246 -0
  157. package/dist/core/equipment/EquipmentSpawnHelper.d.ts.map +1 -0
  158. package/dist/core/equipment/EquipmentValidator.d.ts +173 -0
  159. package/dist/core/equipment/EquipmentValidator.d.ts.map +1 -0
  160. package/dist/core/extensions/ExtensionManager.d.ts +517 -0
  161. package/dist/core/extensions/ExtensionManager.d.ts.map +1 -0
  162. package/dist/core/extensions/WeightedSelector.d.ts +156 -0
  163. package/dist/core/extensions/WeightedSelector.d.ts.map +1 -0
  164. package/dist/core/extensions/index.d.ts +11 -0
  165. package/dist/core/extensions/index.d.ts.map +1 -0
  166. package/dist/core/extensions/initializeDefaults.d.ts +170 -0
  167. package/dist/core/extensions/initializeDefaults.d.ts.map +1 -0
  168. package/dist/core/features/FeatureEffectApplier.d.ts +102 -0
  169. package/dist/core/features/FeatureEffectApplier.d.ts.map +1 -0
  170. package/dist/core/features/FeatureQuery.d.ts +368 -0
  171. package/dist/core/features/FeatureQuery.d.ts.map +1 -0
  172. package/dist/core/features/FeatureTypes.d.ts +199 -0
  173. package/dist/core/features/FeatureTypes.d.ts.map +1 -0
  174. package/dist/core/features/FeatureValidator.d.ts +149 -0
  175. package/dist/core/features/FeatureValidator.d.ts.map +1 -0
  176. package/dist/core/features/index.d.ts +12 -0
  177. package/dist/core/features/index.d.ts.map +1 -0
  178. package/dist/core/generation/AbilityScoreCalculator.d.ts +83 -0
  179. package/dist/core/generation/AbilityScoreCalculator.d.ts.map +1 -0
  180. package/dist/core/generation/AppearanceGenerator.d.ts +32 -0
  181. package/dist/core/generation/AppearanceGenerator.d.ts.map +1 -0
  182. package/dist/core/generation/BeatConverter.d.ts +127 -0
  183. package/dist/core/generation/BeatConverter.d.ts.map +1 -0
  184. package/dist/core/generation/ButtonMapper.d.ts +346 -0
  185. package/dist/core/generation/ButtonMapper.d.ts.map +1 -0
  186. package/dist/core/generation/ButtonPatternLibrary.d.ts +92 -0
  187. package/dist/core/generation/ButtonPatternLibrary.d.ts.map +1 -0
  188. package/dist/core/generation/CRLevelConverter.d.ts +242 -0
  189. package/dist/core/generation/CRLevelConverter.d.ts.map +1 -0
  190. package/dist/core/generation/CharacterGenerator.d.ts +194 -0
  191. package/dist/core/generation/CharacterGenerator.d.ts.map +1 -0
  192. package/dist/core/generation/ClassSuggester.d.ts +184 -0
  193. package/dist/core/generation/ClassSuggester.d.ts.map +1 -0
  194. package/dist/core/generation/EnemyEquipmentGenerator.d.ts +151 -0
  195. package/dist/core/generation/EnemyEquipmentGenerator.d.ts.map +1 -0
  196. package/dist/core/generation/EnemyGenerator.d.ts +595 -0
  197. package/dist/core/generation/EnemyGenerator.d.ts.map +1 -0
  198. package/dist/core/generation/EquipmentGenerator.d.ts +204 -0
  199. package/dist/core/generation/EquipmentGenerator.d.ts.map +1 -0
  200. package/dist/core/generation/LegendaryGenerator.d.ts +213 -0
  201. package/dist/core/generation/LegendaryGenerator.d.ts.map +1 -0
  202. package/dist/core/generation/LevelGenerator.d.ts +390 -0
  203. package/dist/core/generation/LevelGenerator.d.ts.map +1 -0
  204. package/dist/core/generation/NamingEngine.d.ts +136 -0
  205. package/dist/core/generation/NamingEngine.d.ts.map +1 -0
  206. package/dist/core/generation/PitchBeatLinker.d.ts +150 -0
  207. package/dist/core/generation/PitchBeatLinker.d.ts.map +1 -0
  208. package/dist/core/generation/RaceSelector.d.ts +58 -0
  209. package/dist/core/generation/RaceSelector.d.ts.map +1 -0
  210. package/dist/core/generation/RhythmGenerator.d.ts +597 -0
  211. package/dist/core/generation/RhythmGenerator.d.ts.map +1 -0
  212. package/dist/core/generation/SkillAssigner.d.ts +78 -0
  213. package/dist/core/generation/SkillAssigner.d.ts.map +1 -0
  214. package/dist/core/generation/SpellManager.d.ts +132 -0
  215. package/dist/core/generation/SpellManager.d.ts.map +1 -0
  216. package/dist/core/generation/SpellcastingGenerator.d.ts +255 -0
  217. package/dist/core/generation/SpellcastingGenerator.d.ts.map +1 -0
  218. package/dist/core/generation/index.d.ts +41 -0
  219. package/dist/core/generation/index.d.ts.map +1 -0
  220. package/dist/core/parser/MetadataExtractor.d.ts +66 -0
  221. package/dist/core/parser/MetadataExtractor.d.ts.map +1 -0
  222. package/dist/core/parser/PlaylistParser.d.ts +45 -0
  223. package/dist/core/parser/PlaylistParser.d.ts.map +1 -0
  224. package/dist/core/playback/SubdivisionPlaybackController.d.ts +333 -0
  225. package/dist/core/playback/SubdivisionPlaybackController.d.ts.map +1 -0
  226. package/dist/core/playback/index.d.ts +5 -0
  227. package/dist/core/playback/index.d.ts.map +1 -0
  228. package/dist/core/progression/CharacterUpdater.d.ts +203 -0
  229. package/dist/core/progression/CharacterUpdater.d.ts.map +1 -0
  230. package/dist/core/progression/LevelUpProcessor.d.ts +234 -0
  231. package/dist/core/progression/LevelUpProcessor.d.ts.map +1 -0
  232. package/dist/core/progression/PrestigeSystem.d.ts +217 -0
  233. package/dist/core/progression/PrestigeSystem.d.ts.map +1 -0
  234. package/dist/core/progression/RhythmXPCalculator.d.ts +182 -0
  235. package/dist/core/progression/RhythmXPCalculator.d.ts.map +1 -0
  236. package/dist/core/progression/SessionTracker.d.ts +169 -0
  237. package/dist/core/progression/SessionTracker.d.ts.map +1 -0
  238. package/dist/core/progression/XPCalculator.d.ts +128 -0
  239. package/dist/core/progression/XPCalculator.d.ts.map +1 -0
  240. package/dist/core/progression/stat/StatIncreaseStrategy.d.ts +97 -0
  241. package/dist/core/progression/stat/StatIncreaseStrategy.d.ts.map +1 -0
  242. package/dist/core/progression/stat/StatManager.d.ts +179 -0
  243. package/dist/core/progression/stat/StatManager.d.ts.map +1 -0
  244. package/dist/core/sensors/EnvironmentalSensors.d.ts +301 -0
  245. package/dist/core/sensors/EnvironmentalSensors.d.ts.map +1 -0
  246. package/dist/core/sensors/GamingPlatformSensors.d.ts +162 -0
  247. package/dist/core/sensors/GamingPlatformSensors.d.ts.map +1 -0
  248. package/dist/core/sensors/GeolocationProvider.d.ts +156 -0
  249. package/dist/core/sensors/GeolocationProvider.d.ts.map +1 -0
  250. package/dist/core/sensors/MotionDetector.d.ts +58 -0
  251. package/dist/core/sensors/MotionDetector.d.ts.map +1 -0
  252. package/dist/core/sensors/SteamAPIClient.d.ts +108 -0
  253. package/dist/core/sensors/SteamAPIClient.d.ts.map +1 -0
  254. package/dist/core/sensors/WeatherAPIClient.d.ts +360 -0
  255. package/dist/core/sensors/WeatherAPIClient.d.ts.map +1 -0
  256. package/dist/core/sensors/schemas/weather.schema.d.ts +144 -0
  257. package/dist/core/sensors/schemas/weather.schema.d.ts.map +1 -0
  258. package/dist/core/skills/SkillQuery.d.ts +159 -0
  259. package/dist/core/skills/SkillQuery.d.ts.map +1 -0
  260. package/dist/core/skills/SkillTypes.d.ts +233 -0
  261. package/dist/core/skills/SkillTypes.d.ts.map +1 -0
  262. package/dist/core/skills/SkillValidator.d.ts +146 -0
  263. package/dist/core/skills/SkillValidator.d.ts.map +1 -0
  264. package/dist/core/skills/index.d.ts +11 -0
  265. package/dist/core/skills/index.d.ts.map +1 -0
  266. package/dist/core/spells/SpellQuery.d.ts +194 -0
  267. package/dist/core/spells/SpellQuery.d.ts.map +1 -0
  268. package/dist/core/spells/SpellTypes.d.ts +71 -0
  269. package/dist/core/spells/SpellTypes.d.ts.map +1 -0
  270. package/dist/core/spells/SpellValidator.d.ts +129 -0
  271. package/dist/core/spells/SpellValidator.d.ts.map +1 -0
  272. package/dist/core/spells/index.d.ts +11 -0
  273. package/dist/core/spells/index.d.ts.map +1 -0
  274. package/dist/core/types/AudioProfile.d.ts +143 -0
  275. package/dist/core/types/AudioProfile.d.ts.map +1 -0
  276. package/dist/core/types/BeatMap.d.ts +1825 -0
  277. package/dist/core/types/BeatMap.d.ts.map +1 -0
  278. package/dist/core/types/ButtonMapping.d.ts +345 -0
  279. package/dist/core/types/ButtonMapping.d.ts.map +1 -0
  280. package/dist/core/types/Character.d.ts +397 -0
  281. package/dist/core/types/Character.d.ts.map +1 -0
  282. package/dist/core/types/ChartedBeatMap.d.ts +169 -0
  283. package/dist/core/types/ChartedBeatMap.d.ts.map +1 -0
  284. package/dist/core/types/Combat.d.ts +268 -0
  285. package/dist/core/types/Combat.d.ts.map +1 -0
  286. package/dist/core/types/CombatAI.d.ts +143 -0
  287. package/dist/core/types/CombatAI.d.ts.map +1 -0
  288. package/dist/core/types/Enemy.d.ts +447 -0
  289. package/dist/core/types/Enemy.d.ts.map +1 -0
  290. package/dist/core/types/Environmental.d.ts +213 -0
  291. package/dist/core/types/Environmental.d.ts.map +1 -0
  292. package/dist/core/types/Equipment.d.ts +309 -0
  293. package/dist/core/types/Equipment.d.ts.map +1 -0
  294. package/dist/core/types/ISessionTracker.d.ts +48 -0
  295. package/dist/core/types/ISessionTracker.d.ts.map +1 -0
  296. package/dist/core/types/LevelExport.d.ts +366 -0
  297. package/dist/core/types/LevelExport.d.ts.map +1 -0
  298. package/dist/core/types/Playlist.d.ts +70 -0
  299. package/dist/core/types/Playlist.d.ts.map +1 -0
  300. package/dist/core/types/Prestige.d.ts +94 -0
  301. package/dist/core/types/Prestige.d.ts.map +1 -0
  302. package/dist/core/types/Progression.d.ts +214 -0
  303. package/dist/core/types/Progression.d.ts.map +1 -0
  304. package/dist/core/types/RhythmXP.d.ts +398 -0
  305. package/dist/core/types/RhythmXP.d.ts.map +1 -0
  306. package/dist/core/utils/AbilityConstants.d.ts +31 -0
  307. package/dist/core/utils/AbilityConstants.d.ts.map +1 -0
  308. package/dist/core/utils/EffectApplierUtils.d.ts +56 -0
  309. package/dist/core/utils/EffectApplierUtils.d.ts.map +1 -0
  310. package/dist/core/utils/ImageValidator.d.ts +66 -0
  311. package/dist/core/utils/ImageValidator.d.ts.map +1 -0
  312. package/dist/core/utils/PrerequisiteValidator.d.ts +88 -0
  313. package/dist/core/utils/PrerequisiteValidator.d.ts.map +1 -0
  314. package/dist/essentia-wasm.es-BUEnKUts.js +2990 -0
  315. package/dist/essentia.js-model.es-CGA0xotH.js +306 -0
  316. package/dist/index.d.ts +176 -0
  317. package/dist/index.d.ts.map +1 -0
  318. package/dist/playlist-data-engine.js +124 -0
  319. package/dist/playlist-data-engine.mjs +49251 -0
  320. package/dist/utils/EnchantmentLibrary.d.ts +378 -0
  321. package/dist/utils/EnchantmentLibrary.d.ts.map +1 -0
  322. package/dist/utils/arweaveGatewayManager.d.ts +485 -0
  323. package/dist/utils/arweaveGatewayManager.d.ts.map +1 -0
  324. package/dist/utils/arweaveUtils.d.ts +118 -0
  325. package/dist/utils/arweaveUtils.d.ts.map +1 -0
  326. package/dist/utils/constants.d.ts +439 -0
  327. package/dist/utils/constants.d.ts.map +1 -0
  328. package/dist/utils/equipmentConstants.d.ts +60 -0
  329. package/dist/utils/equipmentConstants.d.ts.map +1 -0
  330. package/dist/utils/hash.d.ts +33 -0
  331. package/dist/utils/hash.d.ts.map +1 -0
  332. package/dist/utils/logger.d.ts +192 -0
  333. package/dist/utils/logger.d.ts.map +1 -0
  334. package/dist/utils/magicItemExamples.d.ts +46 -0
  335. package/dist/utils/magicItemExamples.d.ts.map +1 -0
  336. package/dist/utils/playlistUtils.d.ts +149 -0
  337. package/dist/utils/playlistUtils.d.ts.map +1 -0
  338. package/dist/utils/random.d.ts +34 -0
  339. package/dist/utils/random.d.ts.map +1 -0
  340. package/dist/utils/sensorDashboard.d.ts +60 -0
  341. package/dist/utils/sensorDashboard.d.ts.map +1 -0
  342. package/dist/utils/validators.d.ts +189 -0
  343. package/dist/utils/validators.d.ts.map +1 -0
  344. package/dist/vite.svg +1 -0
  345. 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"}