{"_id":"@decky.fx/rmmv-animation-player","name":"@decky.fx/rmmv-animation-player","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"name":"@decky.fx/rmmv-animation-player","version":"1.0.0","description":"Standalone animation player for RPG Maker MV animations in Phaser 3","type":"module","main":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./types":{"types":"./dist/types.d.ts","import":"./dist/types.js"}},"scripts":{"build":"tsc","typecheck":"tsc --noEmit","test":"bun test"},"keywords":["rmmv","rpg-maker","animation","phaser","phaser3","game-development"],"author":{"name":"decky.fx"},"license":"MIT","publishConfig":{"access":"public"},"peerDependencies":{"phaser":"^3.60.0"},"devDependencies":{"@types/bun":"latest","phaser":"^3.87.0","typescript":"^5.7.2"},"gitHead":"1b93cd0e50523cace1ad28cf5710318167834981","_id":"@decky.fx/rmmv-animation-player@1.0.0","_nodeVersion":"22.17.0","_npmVersion":"11.6.2","dist":{"integrity":"sha512-cRowsN2DHat/c06LoeKZItuV0OIb5gNaORqNteHJhPXIHjMZOGVvytxLOTpJ7qo9domrnKnqcm0Sk9v3CG2txA==","shasum":"895c40f2a9fbce1cd0284bf611b54fab356536a7","tarball":"https://registry.npmjs.org/@decky.fx/rmmv-animation-player/-/rmmv-animation-player-1.0.0.tgz","fileCount":38,"unpackedSize":208652,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQC5yXzbLec1Uc1lCNmb+jrPJMuQhTm/lM/Byc7skxEnYwIhAIe5YPZ+nVBFiCSZdngDKC8GlNqC4A4G5SVgpIVLBwkv"}]},"_npmUser":{"name":"deckyfx","email":"decky.fx@gmail.com"},"directories":{},"maintainers":[{"name":"deckyfx","email":"decky.fx@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/rmmv-animation-player_1.0.0_1768788988109_0.26141944631168856"},"_hasShrinkwrap":false}},"time":{"created":"2026-01-19T02:16:27.947Z","1.0.0":"2026-01-19T02:16:28.260Z","modified":"2026-01-19T02:16:28.646Z"},"maintainers":[{"name":"deckyfx","email":"decky.fx@gmail.com"}],"description":"Standalone animation player for RPG Maker MV animations in Phaser 3","keywords":["rmmv","rpg-maker","animation","phaser","phaser3","game-development"],"author":{"name":"decky.fx"},"license":"MIT","readme":"# @decky.fx/rmmv-animation-player\n\nStandalone animation player for RPG Maker MV animations in Phaser 3 projects.\n\n## Overview\n\nThe RMMV Animation Player allows you to play RPG Maker MV animations in any Phaser 3 project using exported animation configs from [@decky.fx/rmmv-animation-studio](../studio). It's completely self-contained and framework-agnostic.\n\n## Installation\n\n### NPM\n\n```bash\nnpm install @decky.fx/rmmv-animation-player\n```\n\n### Bun\n\n```bash\nbun add @decky.fx/rmmv-animation-player\n```\n\n### Yarn\n\n```bash\nyarn add @decky.fx/rmmv-animation-player\n```\n\n## Quick Start\n\n### Recommended: Using AnimationPlayerManager\n\nThe **AnimationPlayerManager** is the recommended approach for production games. It separates asset preloading from animation playback, preventing loading delays during gameplay.\n\n```typescript\nimport Phaser from 'phaser';\nimport { AnimationPlayerManager } from '@decky.fx/rmmv-animation-player';\nimport type { AnimationConfig } from '@decky.fx/rmmv-animation-player';\n\nclass GameScene extends Phaser.Scene {\n  private animationManager!: AnimationPlayerManager;\n\n  constructor() {\n    super('GameScene');\n  }\n\n  async preload() {\n    // 1. Create manager\n    this.animationManager = new AnimationPlayerManager(this);\n\n    // 2. Load and register animation configs\n    const fireball: AnimationConfig = await fetch('/animations/Fireball.json').then(r => r.json());\n    const thunder: AnimationConfig = await fetch('/animations/Thunder.json').then(r => r.json());\n    const heal: AnimationConfig = await fetch('/animations/Heal.json').then(r => r.json());\n\n    this.animationManager.registerAnimations([fireball, thunder, heal]);\n\n    // 3. Get aggregated assets and preload ALL at once\n    const assets = this.animationManager.assets();\n\n    // Preload sprite sheets\n    assets.spritesheets.forEach(sheet => {\n      this.load.image(sheet.key, sheet.path);\n    });\n\n    // Preload sound effects\n    assets.soundEffects.forEach(se => {\n      this.load.audio(se.key, se.path);\n    });\n  }\n\n  async create() {\n    // 4. Play animations instantly (assets already loaded!)\n    // No loading delays during gameplay!\n\n    // Await animation completion\n    await this.animationManager.play(1, { x: 400, y: 300 });\n    console.log('Fireball finished!');\n\n    // Chain animations sequentially\n    await this.animationManager.play(2, { x: 400, y: 300 }); // Thunder\n    await this.animationManager.play(3, { x: 100, y: 100 }); // Heal\n\n    // Or play multiple in parallel\n    await Promise.all([\n      this.animationManager.play(1, { x: 100, y: 100 }),\n      this.animationManager.play(2, { x: 200, y: 200 }),\n      this.animationManager.play(3, { x: 300, y: 300 }),\n    ]);\n  }\n\n  shutdown() {\n    // Clean up on scene shutdown\n    this.animationManager.destroy();\n  }\n}\n```\n\n**Benefits:**\n- ✅ All assets preloaded in Phaser's preload phase\n- ✅ Instant playback with no loading delays\n- ✅ Automatic asset deduplication across animations\n- ✅ Play by ID - simple and intuitive\n- ✅ Automatic player lifecycle management\n\n### Alternative: Using AnimationPlayer Directly\n\nFor simpler use cases or single animations, you can use `AnimationPlayer` directly:\n\n```typescript\nimport Phaser from 'phaser';\nimport { AnimationPlayer } from '@decky.fx/rmmv-animation-player';\nimport type { AnimationConfig } from '@decky.fx/rmmv-animation-player';\n\nclass GameScene extends Phaser.Scene {\n  private player?: AnimationPlayer;\n\n  async create() {\n    // Load animation config\n    const config: AnimationConfig = await fetch('/animations/Fireball_export.json')\n      .then(r => r.json());\n\n    // Create player\n    this.player = new AnimationPlayer(this, config);\n\n    // Preload assets (happens here, may cause delay)\n    await this.player.preload();\n\n    // Play animation at position and await completion\n    await this.player.play(\n      { x: 400, y: 300 },\n      {\n        loop: false,\n        speed: 1.0,\n        onUpdate: (frame) => console.log(`Frame ${frame}`),\n      }\n    );\n\n    console.log('Animation finished!');\n  }\n}\n```\n\n## API Reference\n\n### AnimationPlayer\n\nMain class for playing RMMV animations.\n\n#### Constructor\n\n```typescript\nnew AnimationPlayer(scene: Phaser.Scene, config: AnimationConfig)\n```\n\n**Parameters:**\n- `scene` - Phaser scene to render animation in\n- `config` - Animation configuration from export\n\n#### Methods\n\n##### preload()\n\nPreload all required assets (sprite sheets and sound effects).\n\n```typescript\nawait player.preload(): Promise<void>\n```\n\n**Must be called before playing the animation.**\n\n##### play()\n\nPlay animation at target position or on an animation target. Returns a Promise that resolves when animation completes.\n\n```typescript\nplayer.play(target: AnimationTarget | TargetPosition, options?: PlaybackOptions): Promise<void>\n```\n\n**Parameters:**\n- `target` - Animation target object or position:\n  - `AnimationTarget` - Any object implementing the AnimationTarget interface (supports flash effects)\n  - `TargetPosition` - Simple position object `{ x: number, y: number }`\n- `options` - Playback options:\n  - `loop?: boolean` - Loop animation continuously (default: false)\n  - `speed?: number` - Playback speed multiplier (default: 1.0)\n  - `onComplete?: () => void` - Callback when animation finishes (optional, can use Promise instead)\n  - `onUpdate?: (frameIndex: number) => void` - Called each frame\n\n**Returns:** Promise that resolves when animation completes (does not resolve for looped animations)\n\n**Examples:**\n\n```typescript\n// Play at position (no flash effects)\nawait player.play({ x: 400, y: 300 }, {\n  loop: false,\n  speed: 1.5,\n  onUpdate: (frame) => console.log(`Frame ${frame}`),\n});\n\n// Play on target sprite (supports flash effects)\nconst enemy = this.add.sprite(400, 300, 'enemy');\nawait player.play(enemy, {\n  loop: false,\n  onComplete: () => console.log('Hit!'),\n});\n\n// Chain animations on same target\nawait player.play(enemy);\nawait anotherPlayer.play(enemy);\n```\n\n##### stop()\n\nStop animation and cleanup.\n\n```typescript\nplayer.stop(): void\n```\n\n##### pause()\n\nPause animation.\n\n```typescript\nplayer.pause(): void\n```\n\n##### resume()\n\nResume paused animation.\n\n```typescript\nplayer.resume(): void\n```\n\n##### isAnimationPlaying()\n\nCheck if animation is currently playing.\n\n```typescript\nplayer.isAnimationPlaying(): boolean\n```\n\n##### getCurrentFrame()\n\nGet current frame index.\n\n```typescript\nplayer.getCurrentFrame(): number\n```\n\n##### getFrameCount()\n\nGet total frame count.\n\n```typescript\nplayer.getFrameCount(): number\n```\n\n##### getDuration()\n\nGet animation duration in milliseconds (at normal speed).\n\n```typescript\nplayer.getDuration(): number\n```\n\n##### destroy()\n\nDestroy player and cleanup resources.\n\n```typescript\nplayer.destroy(): void\n```\n\n### AnimationPlayerManager\n\nCentralized manager for multiple animations with asset preloading support. **Recommended for production games.**\n\n#### Constructor\n\n```typescript\nnew AnimationPlayerManager(scene: Phaser.Scene)\n```\n\n**Parameters:**\n- `scene` - Phaser scene instance\n\n#### Methods\n\n##### registerAnimation()\n\nRegister single animation config.\n\n```typescript\nmanager.registerAnimation(config: AnimationConfig): void\n```\n\n**Example:**\n```typescript\nconst fireball = await fetch('/animations/Fireball.json').then(r => r.json());\nmanager.registerAnimation(fireball);\n```\n\n##### registerAnimations()\n\nRegister multiple animation configs at once.\n\n```typescript\nmanager.registerAnimations(configs: AnimationConfig[]): void\n```\n\n**Example:**\n```typescript\nconst configs = await Promise.all([\n  fetch('/animations/Fireball.json').then(r => r.json()),\n  fetch('/animations/Thunder.json').then(r => r.json()),\n]);\nmanager.registerAnimations(configs);\n```\n\n##### assets()\n\nGet aggregated assets from all registered animations for preloading.\n\n```typescript\nmanager.assets(): AggregatedAssets\n```\n\n**Returns:**\n```typescript\n{\n  spritesheets: Array<{ key: string; path: string; hue: number }>;\n  soundEffects: Array<{ key: string; path: string }>;\n}\n```\n\n**Example:**\n```typescript\nconst assets = manager.assets();\n\n// In Phaser preload\nassets.spritesheets.forEach(sheet => {\n  this.load.image(sheet.key, sheet.path);\n});\n\nassets.soundEffects.forEach(se => {\n  this.load.audio(se.key, se.path);\n});\n```\n\n##### play()\n\nPlay animation by ID. Returns a Promise that resolves when animation completes.\n\n```typescript\nmanager.play(\n  animationId: number,\n  position: TargetPosition,\n  options?: PlaybackOptions\n): Promise<AnimationPlayer | null>\n```\n\n**Parameters:**\n- `animationId` - Animation ID from registered config\n- `position` - Target position `{ x: number, y: number }`\n- `options` - Same as AnimationPlayer options\n\n**Returns:** Promise that resolves with AnimationPlayer instance when complete, or null if not found\n\n**Example:**\n```typescript\n// Await animation completion\nconst player = await manager.play(1, { x: enemy.x, y: enemy.y });\nconsole.log('Animation finished!');\n\n// Chain animations sequentially\nawait manager.play(1, { x: 400, y: 300 });\nawait manager.play(2, { x: 400, y: 300 });\n\n// Play multiple in parallel\nawait Promise.all([\n  manager.play(1, { x: 100, y: 100 }),\n  manager.play(2, { x: 200, y: 200 }),\n  manager.play(3, { x: 300, y: 300 }),\n]);\n```\n\n##### stop()\n\nStop all instances of specific animation.\n\n```typescript\nmanager.stop(animationId: number): void\n```\n\n##### stopAll()\n\nStop all active animations.\n\n```typescript\nmanager.stopAll(): void\n```\n\n##### unregisterAnimation()\n\nUnregister animation config.\n\n```typescript\nmanager.unregisterAnimation(animationId: number): boolean\n```\n\n**Returns:** True if animation was registered and removed\n\n##### isRegistered()\n\nCheck if animation is registered.\n\n```typescript\nmanager.isRegistered(animationId: number): boolean\n```\n\n##### getRegisteredIds()\n\nGet array of registered animation IDs.\n\n```typescript\nmanager.getRegisteredIds(): number[]\n```\n\n##### getActiveCount()\n\nGet active player count for specific animation.\n\n```typescript\nmanager.getActiveCount(animationId: number): number\n```\n\n##### getTotalActiveCount()\n\nGet total active player count across all animations.\n\n```typescript\nmanager.getTotalActiveCount(): number\n```\n\n##### destroy()\n\nDestroy manager and cleanup all resources.\n\n```typescript\nmanager.destroy(): void\n```\n\n## Advanced Usage\n\n### Flash Effects\n\nRMMV animations support flash effects for visual impact during battle animations. The player supports three types of flash effects:\n\n#### Flash Scopes\n\n- **TARGET (flashScope: 1)** - Tint the animation target with a color\n- **SCREEN (flashScope: 2)** - Flash the entire screen\n- **HIDE_TARGET (flashScope: 3)** - Tint and hide the target, then restore\n\n#### AnimationTarget Interface\n\nTo use TARGET and HIDE_TARGET flash effects, pass an object implementing the `AnimationTarget` interface to `play()`:\n\n```typescript\ninterface AnimationTarget {\n  x: number;                        // X position\n  y: number;                        // Y position\n  width: number;                    // Width (for positioning)\n  height: number;                   // Height (for positioning)\n  setTint(color: number): void;     // Apply tint (0xRRGGBB format)\n  clearTint(): void;                // Remove tint\n  setVisible(visible: boolean): void; // Show/hide target\n}\n```\n\nPhaser.GameObjects.GameObject (sprites, containers, etc.) naturally implements this interface:\n\n```typescript\n// Flash effects work automatically with Phaser sprites\nconst enemy = this.add.sprite(400, 300, 'enemy');\n\n// Animation will apply flash effects (tinting, hiding) to the sprite\nawait player.play(enemy);\n```\n\n#### Custom Animation Targets\n\nYou can create custom objects that implement the interface:\n\n```typescript\nclass CustomTarget implements AnimationTarget {\n  x = 400;\n  y = 300;\n  width = 64;\n  height = 64;\n\n  setTint(color: number): void {\n    console.log('Tinted with color:', color.toString(16));\n    // Apply tint to your custom rendering\n  }\n\n  clearTint(): void {\n    console.log('Tint cleared');\n    // Remove tint from your custom rendering\n  }\n\n  setVisible(visible: boolean): void {\n    console.log('Visibility:', visible);\n    // Show/hide your custom object\n  }\n}\n\nconst target = new CustomTarget();\nawait player.play(target);\n```\n\n#### Flash Effect Timing\n\nFlash effects are configured in animation timing events:\n- **flashDuration**: Duration in animation frames (not milliseconds)\n- **flashColor**: `[R, G, B, Intensity]` where each value is 0-255\n\nExample: A flash with duration 5 will tint the target for 5 animation frames, then automatically clear.\n\n### Multiple Animations\n\nPlay multiple animations simultaneously:\n\n```typescript\nclass GameScene extends Phaser.Scene {\n  private players: AnimationPlayer[] = [];\n\n  async create() {\n    // Load multiple animation configs\n    const configs = await Promise.all([\n      fetch('/animations/Fireball_export.json').then(r => r.json()),\n      fetch('/animations/Lightning_export.json').then(r => r.json()),\n      fetch('/animations/Heal_export.json').then(r => r.json()),\n    ]);\n\n    // Create players\n    for (const config of configs) {\n      const player = new AnimationPlayer(this, config);\n      await player.preload();\n      this.players.push(player);\n    }\n\n    // Play first animation\n    this.players[0].play({ x: 400, y: 300 }, {\n      onComplete: () => {\n        // Play second animation when first finishes\n        this.players[1].play({ x: 500, y: 300 });\n      }\n    });\n  }\n\n  shutdown() {\n    // Cleanup all players\n    this.players.forEach(p => p.destroy());\n  }\n}\n```\n\n### Chaining Animations\n\n```typescript\nasync playSequence(animations: AnimationConfig[], position: TargetPosition) {\n  for (const config of animations) {\n    const player = new AnimationPlayer(this.scene, config);\n    await player.preload();\n\n    await new Promise<void>((resolve) => {\n      player.play(position, {\n        onComplete: () => {\n          player.destroy();\n          resolve();\n        },\n      });\n    });\n  }\n}\n```\n\n### Dynamic Positioning\n\nPlay animation on moving targets:\n\n```typescript\nclass GameScene extends Phaser.Scene {\n  private enemy?: Phaser.GameObjects.Sprite;\n  private player?: AnimationPlayer;\n\n  async attackEnemy() {\n    // Get enemy position\n    const target = {\n      x: this.enemy!.x,\n      y: this.enemy!.y,\n    };\n\n    // Play attack animation at enemy position\n    const config = await fetch('/animations/Slash_export.json').then(r => r.json());\n    this.player = new AnimationPlayer(this, config);\n    await this.player.preload();\n\n    this.player.play(target, {\n      onComplete: () => {\n        // Damage enemy when animation finishes\n        this.damageEnemy();\n      },\n    });\n  }\n}\n```\n\n### Custom Playback Speed\n\n```typescript\n// Slow motion (50% speed)\nplayer.play({ x: 400, y: 300 }, { speed: 0.5 });\n\n// Fast forward (2x speed)\nplayer.play({ x: 400, y: 300 }, { speed: 2.0 });\n\n// Very slow (25% speed)\nplayer.play({ x: 400, y: 300 }, { speed: 0.25 });\n```\n\n### Looping Animations\n\n```typescript\n// Loop continuously\nplayer.play({ x: 400, y: 300 }, { loop: true });\n\n// Stop after 5 seconds\nsetTimeout(() => player.stop(), 5000);\n```\n\n## Export Format\n\nExported animation configs have this structure:\n\n```typescript\ninterface AnimationConfig {\n  // Animation data\n  animation: {\n    id: number;\n    name: string;\n    position: number; // 0=head, 1=center, 2=feet, 3=screen\n    animation1Name: string;\n    animation1Hue: number;\n    animation2Name: string;\n    animation2Hue: number;\n    frames: Array<Array<[cellId, x, y, scale, rotation, flip, opacity, blendMode]>>;\n    timings: Array<{\n      frame: number;\n      se: { name: string; volume: number; pitch: number; pan: number } | null;\n      flashScope: number;\n      flashColor: [number, number, number, number];\n      flashDuration: number;\n    }>;\n  };\n\n  // Required assets (relative paths)\n  assets: {\n    spritesheets: Array<{\n      name: string;\n      path: string; // e.g., \"assets/img/animations/Hit1.png\"\n      hue: number;\n      slot: number; // 1 or 2\n    }>;\n    soundEffects: Array<{\n      name: string;\n      path: string; // e.g., \"assets/se/Blow1.ogg\"\n    }>;\n  };\n\n  // Metadata\n  metadata: {\n    exportedAt: string; // ISO timestamp\n    exportedFrom: string; // \"RMMV Animation Studio\"\n    version: string; // \"1.0.0\"\n    animationId: number;\n    animationName: string;\n  };\n}\n```\n\n## Asset Requirements\n\n### Sprite Sheets\n\n- Format: PNG images\n- Cell size: 192×192 pixels\n- Layout: 5 columns (RMMV standard)\n- Path: Specified in export config (e.g., `assets/img/animations/`)\n\n### Sound Effects\n\n- Format: OGG audio files\n- Path: Specified in export config (e.g., `assets/se/`)\n- Properties: volume (0-100), pitch (10-200), pan (-100 to 100)\n\n## Features\n\n### Supported RMMV Features\n\n[x] Multiple sprite sheets (animation1/animation2)\n[x] Cell transformations (position, scale, rotation, flip)\n[x] Opacity and blend modes (normal, additive, multiply, screen)\n[x] Sound effects with volume/pitch/pan control\n[x] Timing events\n[x] Looping animations\n[x] Playback speed control\n[x] Frame-by-frame callbacks\n\n### Not Yet Implemented\n\n[] Screen flash effects (timing.flashScope, flashColor, flashDuration)\n[] Hue shift for sprite sheets (animation1Hue, animation2Hue)\n[] Position modes (head/center/feet/screen) - currently manual positioning\n\n## Troubleshooting\n\n### Assets Not Loading\n\n**Problem:** Animation plays but sprites are invisible.\n\n**Solution:**\n- Verify asset paths in export config match your project structure\n- Ensure sprite sheets are accessible from your web server\n- Check browser console for 404 errors\n\n```typescript\n// Adjust base path if needed\nconst config = await fetch('/animations/MyAnimation_export.json').then(r => r.json());\n\n// Update asset paths to match your structure\nconfig.assets.spritesheets.forEach(sheet => {\n  sheet.path = `/my-custom-path/${sheet.name}.png`;\n});\n\nconst player = new AnimationPlayer(this, config);\n```\n\n### Sound Not Playing\n\n**Problem:** Animation plays but no sound effects.\n\n**Solutions:**\n- Check browser allows autoplay (user interaction required)\n- Verify audio files are in OGG format\n- Check audio paths in export config\n\n```typescript\n// Enable audio context (after user interaction)\nthis.input.once('pointerdown', () => {\n  this.sound.unlock();\n});\n```\n\n### Animation Not Visible\n\n**Problem:** Nothing appears when playing animation.\n\n**Checklist:**\n1. ✅ Called `await player.preload()` before playing\n2. ✅ Target position is within camera bounds\n3. ✅ Animation has frames (not empty)\n4. ✅ Sprite sheets loaded successfully\n\n```typescript\n// Debug logging\nconsole.log('Frame count:', player.getFrameCount());\nconsole.log('Is playing:', player.isAnimationPlaying());\n```\n\n### Performance Issues\n\n**Problem:** Animation stutters or lags.\n\n**Solutions:**\n- Reduce playback speed: `speed: 0.5`\n- Limit concurrent animations\n- Optimize sprite sheet sizes\n- Use texture atlases for multiple animations\n\n```typescript\n// Limit to 3 concurrent animations\nconst MAX_CONCURRENT = 3;\nif (this.activePlayers.length < MAX_CONCURRENT) {\n  player.play(target);\n  this.activePlayers.push(player);\n}\n```\n\n## TypeScript Support\n\nThe SDK is written in TypeScript with full type definitions.\n\n```typescript\nimport type {\n  AnimationConfig,\n  PlaybackOptions,\n  TargetPosition,\n  RMMVAnimation,\n  RMMVCellData,\n} from './rmmv-sdk';\n```\n\n## Browser Compatibility\n\n- Modern browsers with ES2020 support\n- Phaser 3.60.0+\n- WebGL or Canvas renderer\n\n## Examples\n\nSee `/examples` directory for complete working examples:\n- `basic-usage.ts` - Simple animation playback\n- `multiple-animations.ts` - Playing multiple animations\n- `chaining.ts` - Sequential animation playback\n- `combat-system.ts` - RPG-style combat with animations\n\n## License\n\nSame as main project.\n\n## Support\n\nFor issues or questions:\n- GitHub Issues: [repository link]\n- Documentation: [link]\n- Examples: [link]\n\n## Contributing\n\nContributions welcome! Please:\n1. Fork the repository\n2. Create a feature branch\n3. Add tests for new features\n4. Submit a pull request\n\n## Changelog\n\n### v1.0.0 (Initial Release)\n- AnimationPlayer class\n- Asset loading and caching\n- Full RMMV animation support\n- TypeScript type definitions\n- Export format specification\n","readmeFilename":"README.md","_rev":"1-5c235d8cb0161a92afe6337053cd4413"}