@nice2dev/game-engine 0.1.0 → 1.0.2

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 (112) hide show
  1. package/CHANGELOG.md +193 -1
  2. package/dist/cjs/audio/AudioBridge.js +454 -0
  3. package/dist/cjs/audio/AudioBridge.js.map +1 -0
  4. package/dist/cjs/devtools/GameplayAnalytics.js +651 -0
  5. package/dist/cjs/devtools/GameplayAnalytics.js.map +1 -0
  6. package/dist/cjs/dialogue/DialogueSystem.js +1023 -0
  7. package/dist/cjs/dialogue/DialogueSystem.js.map +1 -0
  8. package/dist/cjs/editor/NiceGameEditor.js +569 -71
  9. package/dist/cjs/editor/NiceGameEditor.js.map +1 -1
  10. package/dist/cjs/engine/SaveSystemV2.js +494 -0
  11. package/dist/cjs/engine/SaveSystemV2.js.map +1 -0
  12. package/dist/cjs/i18n/useTranslation.js +11 -11
  13. package/dist/cjs/index.js +90 -1
  14. package/dist/cjs/index.js.map +1 -1
  15. package/dist/cjs/input/GamepadNavigation.js +21 -21
  16. package/dist/cjs/input/useGamepads.js +6 -6
  17. package/dist/cjs/integration/IconSprite.js +281 -0
  18. package/dist/cjs/integration/IconSprite.js.map +1 -0
  19. package/dist/cjs/inventory/InventorySystem.js +930 -0
  20. package/dist/cjs/inventory/InventorySystem.js.map +1 -0
  21. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/AbortController.js.map +1 -1
  22. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/AccessTokenHttpClient.js.map +1 -1
  23. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/DefaultHttpClient.js.map +1 -1
  24. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/DefaultReconnectPolicy.js.map +1 -1
  25. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/Errors.js.map +1 -1
  26. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/FetchHttpClient.js.map +1 -1
  27. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/HandshakeProtocol.js.map +1 -1
  28. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/HeaderNames.js.map +1 -1
  29. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/HttpClient.js.map +1 -1
  30. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/HttpConnection.js.map +1 -1
  31. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/HubConnection.js.map +1 -1
  32. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/HubConnectionBuilder.js.map +1 -1
  33. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/IHubProtocol.js.map +1 -1
  34. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/ILogger.js.map +1 -1
  35. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/ITransport.js.map +1 -1
  36. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/JsonHubProtocol.js.map +1 -1
  37. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/Loggers.js.map +1 -1
  38. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/LongPollingTransport.js.map +1 -1
  39. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/MessageBuffer.js.map +1 -1
  40. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/ServerSentEventsTransport.js.map +1 -1
  41. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/Subject.js.map +1 -1
  42. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/TextMessageFormat.js.map +1 -1
  43. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/Utils.js.map +1 -1
  44. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/WebSocketTransport.js.map +1 -1
  45. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/XhrHttpClient.js.map +1 -1
  46. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/pkg-version.js.map +1 -1
  47. package/dist/cjs/quest/QuestSystem.js +924 -0
  48. package/dist/cjs/quest/QuestSystem.js.map +1 -0
  49. package/dist/cjs/rendering/WebGPURenderPipeline.js +658 -0
  50. package/dist/cjs/rendering/WebGPURenderPipeline.js.map +1 -0
  51. package/dist/cjs/xr/ARVR.js.map +1 -1
  52. package/dist/esm/audio/AudioBridge.js +446 -0
  53. package/dist/esm/audio/AudioBridge.js.map +1 -0
  54. package/dist/esm/devtools/GameplayAnalytics.js +639 -0
  55. package/dist/esm/devtools/GameplayAnalytics.js.map +1 -0
  56. package/dist/esm/dialogue/DialogueSystem.js +1008 -0
  57. package/dist/esm/dialogue/DialogueSystem.js.map +1 -0
  58. package/dist/esm/editor/NiceGameEditor.js +556 -58
  59. package/dist/esm/editor/NiceGameEditor.js.map +1 -1
  60. package/dist/esm/engine/SaveSystemV2.js +487 -0
  61. package/dist/esm/engine/SaveSystemV2.js.map +1 -0
  62. package/dist/esm/index.js +11 -3
  63. package/dist/esm/index.js.map +1 -1
  64. package/dist/esm/integration/IconSprite.js +266 -0
  65. package/dist/esm/integration/IconSprite.js.map +1 -0
  66. package/dist/esm/inventory/InventorySystem.js +924 -0
  67. package/dist/esm/inventory/InventorySystem.js.map +1 -0
  68. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/AbortController.js.map +1 -1
  69. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/AccessTokenHttpClient.js.map +1 -1
  70. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/DefaultHttpClient.js.map +1 -1
  71. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/DefaultReconnectPolicy.js.map +1 -1
  72. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/Errors.js.map +1 -1
  73. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/FetchHttpClient.js.map +1 -1
  74. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/HandshakeProtocol.js.map +1 -1
  75. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/HeaderNames.js.map +1 -1
  76. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/HttpClient.js.map +1 -1
  77. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/HttpConnection.js.map +1 -1
  78. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/HubConnection.js.map +1 -1
  79. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/HubConnectionBuilder.js.map +1 -1
  80. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/IHubProtocol.js.map +1 -1
  81. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/ILogger.js.map +1 -1
  82. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/ITransport.js.map +1 -1
  83. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/JsonHubProtocol.js.map +1 -1
  84. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/Loggers.js.map +1 -1
  85. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/LongPollingTransport.js.map +1 -1
  86. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/MessageBuffer.js.map +1 -1
  87. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/ServerSentEventsTransport.js.map +1 -1
  88. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/Subject.js.map +1 -1
  89. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/TextMessageFormat.js.map +1 -1
  90. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/Utils.js.map +1 -1
  91. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/WebSocketTransport.js.map +1 -1
  92. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/XhrHttpClient.js.map +1 -1
  93. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/pkg-version.js.map +1 -1
  94. package/dist/esm/quest/QuestSystem.js +916 -0
  95. package/dist/esm/quest/QuestSystem.js.map +1 -0
  96. package/dist/esm/rendering/WebGPURenderPipeline.js +642 -0
  97. package/dist/esm/rendering/WebGPURenderPipeline.js.map +1 -0
  98. package/dist/esm/xr/ARVR.js.map +1 -1
  99. package/dist/types/__tests__/setup.d.ts +1 -1
  100. package/dist/types/audio/AudioBridge.d.ts +199 -0
  101. package/dist/types/devtools/GameplayAnalytics.d.ts +279 -0
  102. package/dist/types/dialogue/DialogueSystem.d.ts +326 -0
  103. package/dist/types/dialogue/index.d.ts +2 -0
  104. package/dist/types/editor/NiceGameEditor.d.ts +12 -1
  105. package/dist/types/engine/SaveSystemV2.d.ts +155 -0
  106. package/dist/types/index.d.ts +19 -3
  107. package/dist/types/integration/IconSprite.d.ts +196 -0
  108. package/dist/types/inventory/InventorySystem.d.ts +336 -0
  109. package/dist/types/performance/WebGPUCompute.d.ts +0 -10
  110. package/dist/types/quest/QuestSystem.d.ts +287 -0
  111. package/dist/types/rendering/WebGPURenderPipeline.d.ts +255 -0
  112. package/package.json +7 -1
package/CHANGELOG.md CHANGED
@@ -1,4 +1,115 @@
1
- # Changelog
1
+ # @nice2dev/game-engine — Changelog
2
+
3
+ All notable changes to the game engine package.
4
+
5
+ ## [Unreleased] — OmniVerk Professional Roadmap
6
+
7
+ ### Planned — Multi-Language Script Export (PRO-1.1)
8
+
9
+ - **C# Export** — Unity-compatible MonoBehaviour/ScriptableObject generation
10
+ - **GDScript Export** — Godot 4.x native script export
11
+ - **Lua Export** — LÖVE2D, Defold, Solar2D compatible
12
+ - **Python/Rust Export** — Pygame, Bevy ECS targets
13
+ - **Language Abstraction Layer** — universal AST for cross-language compilation
14
+
15
+ ### Planned — Multi-Platform Export (PRO-1.2)
16
+
17
+ - **Unity Package Export** — .unitypackage with prefabs, materials, scripts
18
+ - **Godot Project Export** — .godot projects with scenes, resources
19
+ - **Unreal Blueprint Export** — C++ headers + Blueprint nodes
20
+ - **Web Export** — PixiJS, Phaser 3.x, Three.js standalone builds
21
+
22
+ ### Planned — Scene Format Interoperability (PRO-1.3)
23
+
24
+ - **Import Unity/Godot Scenes** — parse .unity YAML, .tscn formats
25
+ - **Import Tiled/LDtk** — full tilemap support
26
+ - **.ndg Universal Format** — bidirectional sync without data loss
27
+
28
+ ### Planned — Professional Editor Features (PRO-1.4)
29
+
30
+ - **Visual Scripting 2.0** — Unreal-style Blueprint system with debugger
31
+ - **Behavior Tree Editor** — AI behavior editing with real-time preview
32
+ - **Timeline Editor** — cutscene/cinematic system (like Unity Timeline)
33
+ - **Shader Graph** — visual shader editor with GLSL/HLSL export
34
+
35
+ ---
36
+
37
+ ## [0.2.0] — 2026-03-25
38
+
39
+ ### Added — WebGPU Render Pipeline (FAZA 7.5)
40
+
41
+ - **WebGPURenderPipeline** — forward+ rendering with clustered light culling
42
+ - PBR materials (albedo, metallic, roughness, normal, occlusion, emissive, alpha modes)
43
+ - WGSL shaders: depth prepass, PBR forward (Schlick fresnel, GGX NDF, Smith geometry, ACES tone mapping), bloom extract
44
+ - `GPUResourceTracker` — GPU allocation tracking by type
45
+ - `RenderPipelineManager` — batch submission, 6-pass sorting (depth-prepass → shadow → color → transparent → post-process → ui-overlay)
46
+ - `WebGPURenderer` — full device init via navigator.gpu, frame rendering, stats
47
+ - `PostProcessStack` — ordered effect chain (bloom, FXAA, SSAO, DOF, color grading)
48
+ - Quality presets: low / medium / high / ultra
49
+
50
+ ### Added — Audio Bridge (FAZA 7.5)
51
+
52
+ - **GameAudioBridge** — bridges @nice2dev/ui-audio and game engine
53
+ - `AudioBusMixer` — 6 buses (master/music/sfx/voice/ambient/ui) with volume, mute, effects
54
+ - `SFXPool` — pooled sound instances (round-robin, steal-oldest, steal-quietest, reject)
55
+ - `MusicManager` — track registry, crossfade (equal-power/linear/ease), adaptive audio rules
56
+ - Audio snapshots for save/restore, spatial audio config (HRTF, equal-power)
57
+ - `useGameAudio` hook + `GameAudioSettings` React component
58
+
59
+ ### Added — Save System v2 (FAZA 7.5)
60
+
61
+ - **SaveSystemV2** — enhanced persistence with cloud support
62
+ - Save slot types: manual / auto / checkpoint / quick
63
+ - LZ77-style compression (dictionary-based + RLE)
64
+ - CRC32 integrity checksum
65
+ - `MigrationEngine` — forward/rollback save migrations with version chain validation
66
+ - Auto-save with configurable interval and safe-state requirement
67
+ - Cloud sync with conflict resolution (local-wins / remote-wins / newest-wins / merge / prompt)
68
+ - Export/import all saves as Blob
69
+
70
+ ### Added — Gameplay Analytics (FAZA 7.5)
71
+
72
+ - **TelemetryPipeline** — event-based telemetry with batching, categories, sample rate
73
+ - **HeatmapGenerator** — spatial grid heatmap with Gaussian blur, canvas rendering, color gradient
74
+ - **SessionRecorder** — frame-based recording at configurable FPS
75
+ - **SessionPlayer** — playback with speed control (0.1x–10x), seek, pause
76
+ - **FunnelTracker** — define funnel steps, analyze drop-off rates
77
+ - **GameplayAnalytics** — orchestrator combining all systems
78
+ - `useGameplayAnalytics` hook + `AnalyticsDashboard` React component
79
+
80
+ ### Added — Exports
81
+
82
+ - Exported `DialogueSystem` module (DialogueEngine, DialogueTreeBuilder, useTypewriter, DialogueBox, ChoiceList, serialization, validation, localization, 15+ types)
83
+ - Exported `QuestSystem` module (QuestManager, QuestBuilder, QuestList, QuestTracker, 7 quest types, 12 objective types, 8 reward types)
84
+
85
+ ---
86
+
87
+ ## [0.1.0] — 2025-06-01
88
+
89
+ Initial beta release — no-code game engine & editor.
90
+
91
+ ### Core
92
+ - ECS (Entity-Component-System) architecture
93
+ - Physics engine (2D: Rapier/Box2D, 3D: PhysicsWorld3D)
94
+ - Runtime3D (Vec3, Quaternion, World3D, Renderer3D)
95
+ - 25+ game templates (platformer, tower defense, RPG, racing, etc.)
96
+ - Visual scripting editor with node graph
97
+ - Scene editor (2D/3D), tilemap editor, particle editor
98
+
99
+ ### Systems
100
+ - Dialogue system (9 node types, visual editor, variables, conditions, localization)
101
+ - Quest system (7 quest types, 12 objective types, 8 reward types)
102
+ - Inventory system (items, slots, crafting, loot, drag & drop)
103
+ - AI system (behavior trees, FSM, utility AI, GOAP, steering)
104
+ - Networking (lobby, state sync, client prediction, lag compensation)
105
+ - Monetization (IAP, ads, subscriptions, analytics, cloud saves)
106
+ - Social (leaderboards, achievements, friends, clans, chat)
107
+ - Plugin SDK (hot reload, asset packs, templates, marketplace)
108
+
109
+ ### Performance
110
+ - WebGPU compute shaders (broadphase, particles, pathfinding WGSL)
111
+ - Spatial hash, quadtree, octree
112
+ - Object pooling, frame budgeting
2
113
 
3
114
  All notable changes to `@nice2dev/game-engine` will be documented in this file.
4
115
 
@@ -7,6 +118,87 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
118
 
8
119
  ---
9
120
 
121
+ ## [0.2.0] — 2026-06-16
122
+
123
+ ### 🎮 Massive Expansion — 20+ New Systems
124
+
125
+ #### Accessibility
126
+ - Full accessibility system for game UIs (screen reader support, high contrast, input remapping)
127
+
128
+ #### AI Enhancements
129
+ - Advanced AI behaviors, utility AI, GOAP (Goal-Oriented Action Planning), neural network integration
130
+
131
+ #### Animation
132
+ - Skeletal animation, blend trees, animation state machines, IK (inverse kinematics)
133
+
134
+ #### Community Features
135
+ - Player profiles, leaderboards, tournaments, clans/guilds, chat system
136
+
137
+ #### Dev Tools
138
+ - In-game debugger, entity inspector, performance profiler, console commands, hot reload
139
+
140
+ #### Documentation System
141
+ - Auto-generated API docs, tutorials, code samples, interactive playground
142
+
143
+ #### Enterprise
144
+ - Enterprise features: SSO, audit logging, compliance, deployment, analytics
145
+
146
+ #### i18n
147
+ - Full internationalization: translatable UI, date/number formatting, RTL support
148
+
149
+ #### Integration
150
+ - External service integrations: analytics, advertising, cloud saves, crash reporting
151
+
152
+ #### Kids Mode
153
+ - Kid-friendly features: content filtering, parental controls, simplified UI, safe mode
154
+
155
+ #### Monetization
156
+ - In-app purchases, subscriptions, virtual currencies, loot boxes (with odds display), ad integration
157
+
158
+ #### Multiplayer Expansion
159
+ - Advanced networking: rollback netcode, server authority, matchmaking, rooms, voice chat
160
+
161
+ #### Pathfinding Expansion
162
+ - NavMesh generation, hierarchical pathfinding, flow fields, crowd simulation
163
+
164
+ #### Performance
165
+ - Performance systems: LOD (level of detail), occlusion culling, spatial hashing, instancing, WebGPU renderer
166
+
167
+ #### Plugin Architecture
168
+ - Plugin system: lifecycle hooks, dependency resolution, sandboxing, marketplace
169
+
170
+ #### Procedural Generation
171
+ - Procedural content: terrain, dungeons, cities, vegetation, loot tables, name generator, quest generator
172
+
173
+ #### Release Management
174
+ - Build pipeline, versioning, patching, A/B testing, feature flags, update system
175
+
176
+ #### Runtime 3D
177
+ - 3D runtime: WebGL/WebGPU renderer, PBR materials, shadows, post-processing, glTF loader
178
+
179
+ #### Scene Management
180
+ - Scene system: scene graph, scene transitions, prefabs, scene serialization, async loading
181
+
182
+ #### Social Features
183
+ - Social systems: friends, messaging, sharing, activity feeds, achievements showcase
184
+
185
+ #### Tilemap System
186
+ - Tilemap engine: tile layers, auto-tiling, animated tiles, collision from tilemap, isometric/hex support
187
+
188
+ #### Tutorial System
189
+ - Interactive tutorials: highlight, tooltips, forced actions, progress tracking, skip/replay
190
+
191
+ #### Game UI System
192
+ - Game UI toolkit: HUD, health bars, minimap, inventory, dialog boxes, menus, drag-and-drop
193
+
194
+ #### XR Support
195
+ - XR/VR/AR: WebXR integration, hand tracking, spatial anchors, AR plane detection, VR locomotion
196
+
197
+ #### Epic & Legendary Features
198
+ - Advanced game features: weather system, day-night cycle, reputation system, crafting, dialogue trees, party system, world map
199
+
200
+ ---
201
+
10
202
  ## [0.1.0] — 2026-03-17
11
203
 
12
204
  ### 🎮 Initial Release (Beta)
@@ -0,0 +1,454 @@
1
+ 'use strict';
2
+
3
+ var React = require('react');
4
+
5
+ /* ────────────────────────────────────────────────────────────────
6
+ Audio Bridge — Integration between @nice2dev/ui-audio and
7
+ the game engine audio system
8
+
9
+ Bridges the standalone ui-audio package's components and hooks
10
+ into the game engine's AudioManager/AudioAdvanced system with:
11
+ - Spatial audio positioning (2D/3D)
12
+ - Game-state aware audio (pause/resume on menu, focus loss)
13
+ - Audio pools for frequent SFX
14
+ - Music crossfade tied to scene transitions
15
+ - Adaptive audio based on gameplay events
16
+ ──────────────────────────────────────────────────────────────── */
17
+ const DEFAULT_SPATIAL = {
18
+ model: '3d-hrtf',
19
+ maxDistance: 100,
20
+ refDistance: 1,
21
+ rolloffFactor: 1,
22
+ coneInnerAngle: 360,
23
+ coneOuterAngle: 360,
24
+ coneOuterGain: 0,
25
+ };
26
+ /* ══════════════════════════════════════════════════════════════
27
+ AUDIO BUS MIXER
28
+ ══════════════════════════════════════════════════════════════ */
29
+ const DEFAULT_BUS_VOLUMES = {
30
+ master: 1,
31
+ music: 0.7,
32
+ sfx: 1,
33
+ voice: 1,
34
+ ambient: 0.5,
35
+ ui: 0.8,
36
+ };
37
+ class AudioBusMixer {
38
+ constructor(eventBus) {
39
+ this.buses = new Map();
40
+ this.eventBus = eventBus;
41
+ for (const [type, volume] of Object.entries(DEFAULT_BUS_VOLUMES)) {
42
+ this.buses.set(type, {
43
+ type: type,
44
+ volume,
45
+ muted: false,
46
+ effects: [],
47
+ });
48
+ }
49
+ }
50
+ getBus(type) {
51
+ return this.buses.get(type);
52
+ }
53
+ setVolume(type, volume) {
54
+ const bus = this.buses.get(type);
55
+ if (bus) {
56
+ bus.volume = Math.max(0, Math.min(1, volume));
57
+ this.eventBus.emit('audio:bus-volume', { bus: type, volume: bus.volume });
58
+ }
59
+ }
60
+ setMuted(type, muted) {
61
+ const bus = this.buses.get(type);
62
+ if (bus) {
63
+ bus.muted = muted;
64
+ this.eventBus.emit('audio:bus-mute', { bus: type, muted });
65
+ }
66
+ }
67
+ /** Get effective volume considering master and mute */
68
+ getEffectiveVolume(type) {
69
+ const bus = this.buses.get(type);
70
+ if (!bus || bus.muted)
71
+ return 0;
72
+ const master = this.buses.get('master');
73
+ if (!master || master.muted)
74
+ return 0;
75
+ return bus.volume * master.volume;
76
+ }
77
+ addEffect(type, effect) {
78
+ const bus = this.buses.get(type);
79
+ if (bus) {
80
+ bus.effects.push(effect);
81
+ }
82
+ }
83
+ removeEffect(type, effectType) {
84
+ const bus = this.buses.get(type);
85
+ if (bus) {
86
+ bus.effects = bus.effects.filter(e => e.type !== effectType);
87
+ }
88
+ }
89
+ getAllBuses() {
90
+ return this.buses;
91
+ }
92
+ snapshot() {
93
+ const result = {};
94
+ for (const [type, bus] of this.buses) {
95
+ result[type] = bus.muted ? 0 : bus.volume;
96
+ }
97
+ return result;
98
+ }
99
+ }
100
+ class SFXPool {
101
+ constructor(config) {
102
+ this.sounds = [];
103
+ this.nextId = 0;
104
+ this.lastPlayedAt = 0;
105
+ this.config = config;
106
+ for (let i = 0; i < config.maxInstances; i++) {
107
+ this.sounds.push({ id: i, playing: false, volume: 1, startedAt: 0 });
108
+ }
109
+ }
110
+ play(volume = 1, position) {
111
+ const now = Date.now();
112
+ if (this.config.cooldownMs && now - this.lastPlayedAt < this.config.cooldownMs) {
113
+ return null;
114
+ }
115
+ // Find a free slot
116
+ let slot = this.sounds.find(s => !s.playing);
117
+ if (!slot) {
118
+ // All busy — apply strategy
119
+ switch (this.config.strategy) {
120
+ case 'round-robin':
121
+ slot = this.sounds[this.nextId % this.sounds.length];
122
+ break;
123
+ case 'steal-oldest':
124
+ slot = this.sounds.reduce((a, b) => a.startedAt < b.startedAt ? a : b);
125
+ break;
126
+ case 'steal-quietest':
127
+ slot = this.sounds.reduce((a, b) => a.volume < b.volume ? a : b);
128
+ break;
129
+ case 'reject':
130
+ return null;
131
+ }
132
+ }
133
+ if (!slot)
134
+ return null;
135
+ slot.playing = true;
136
+ slot.volume = volume;
137
+ slot.startedAt = now;
138
+ this.lastPlayedAt = now;
139
+ this.nextId++;
140
+ return slot.id;
141
+ }
142
+ stop(id) {
143
+ const s = this.sounds.find(ss => ss.id === id);
144
+ if (s)
145
+ s.playing = false;
146
+ }
147
+ stopAll() {
148
+ for (const s of this.sounds)
149
+ s.playing = false;
150
+ }
151
+ getActiveCount() {
152
+ return this.sounds.filter(s => s.playing).length;
153
+ }
154
+ getConfig() {
155
+ return this.config;
156
+ }
157
+ }
158
+ /* ══════════════════════════════════════════════════════════════
159
+ MUSIC MANAGER
160
+ ══════════════════════════════════════════════════════════════ */
161
+ class MusicManager {
162
+ constructor(eventBus) {
163
+ this.tracks = new Map();
164
+ this.currentTrackId = null;
165
+ this.adaptiveRules = [];
166
+ this.intensity = 0.5;
167
+ this.eventBus = eventBus;
168
+ }
169
+ registerTrack(track) {
170
+ this.tracks.set(track.id, track);
171
+ }
172
+ unregisterTrack(id) {
173
+ this.tracks.delete(id);
174
+ }
175
+ getTrack(id) {
176
+ return this.tracks.get(id);
177
+ }
178
+ getCurrentTrackId() {
179
+ return this.currentTrackId;
180
+ }
181
+ /** Start playing or crossfade to a new track */
182
+ play(trackId, crossfadeDuration = 1000) {
183
+ const track = this.tracks.get(trackId);
184
+ if (!track)
185
+ return null;
186
+ const config = {
187
+ fromTrackId: this.currentTrackId,
188
+ toTrackId: trackId,
189
+ duration: crossfadeDuration,
190
+ curve: 'equal-power',
191
+ };
192
+ this.currentTrackId = trackId;
193
+ this.eventBus.emit('audio:music-crossfade', config);
194
+ return config;
195
+ }
196
+ stop(fadeOutMs = 500) {
197
+ if (this.currentTrackId) {
198
+ this.eventBus.emit('audio:music-stop', { trackId: this.currentTrackId, fadeOutMs });
199
+ this.currentTrackId = null;
200
+ }
201
+ }
202
+ /** Adaptive audio rules — respond to game events */
203
+ addRule(rule) {
204
+ this.adaptiveRules.push(rule);
205
+ this.adaptiveRules.sort((a, b) => b.priority - a.priority);
206
+ }
207
+ removeRule(id) {
208
+ this.adaptiveRules = this.adaptiveRules.filter(r => r.id !== id);
209
+ }
210
+ /** Process a game event and apply matching adaptive rules */
211
+ processGameEvent(eventName) {
212
+ var _a;
213
+ const rule = this.adaptiveRules.find(r => r.triggerEvent === eventName);
214
+ if (!rule)
215
+ return null;
216
+ switch (rule.action) {
217
+ case 'switch-track':
218
+ if (rule.targetTrackId)
219
+ this.play(rule.targetTrackId, (_a = rule.fadeDuration) !== null && _a !== void 0 ? _a : 1000);
220
+ break;
221
+ case 'set-intensity':
222
+ if (rule.intensity !== undefined)
223
+ this.intensity = rule.intensity;
224
+ this.eventBus.emit('audio:music-intensity', { intensity: this.intensity });
225
+ break;
226
+ case 'add-layer':
227
+ case 'remove-layer':
228
+ this.eventBus.emit(`audio:music-${rule.action}`, { layerId: rule.layerId });
229
+ break;
230
+ case 'play-stinger':
231
+ if (rule.stingerSrc) {
232
+ this.eventBus.emit('audio:play-stinger', { src: rule.stingerSrc });
233
+ }
234
+ break;
235
+ }
236
+ return rule;
237
+ }
238
+ getIntensity() {
239
+ return this.intensity;
240
+ }
241
+ setIntensity(value) {
242
+ this.intensity = Math.max(0, Math.min(1, value));
243
+ this.eventBus.emit('audio:music-intensity', { intensity: this.intensity });
244
+ }
245
+ getRules() {
246
+ return this.adaptiveRules;
247
+ }
248
+ getAllTracks() {
249
+ return Array.from(this.tracks.values());
250
+ }
251
+ /** Find tracks matching tags */
252
+ findByTags(tags) {
253
+ return this.getAllTracks().filter(t => tags.some(tag => t.tags.includes(tag)));
254
+ }
255
+ }
256
+ /* ══════════════════════════════════════════════════════════════
257
+ GAME AUDIO BRIDGE
258
+ ══════════════════════════════════════════════════════════════ */
259
+ /** Main bridge class connecting @nice2dev/ui-audio features to the game engine */
260
+ class GameAudioBridge {
261
+ constructor(eventBus) {
262
+ this.pools = new Map();
263
+ this.paused = false;
264
+ this.snapshot = null;
265
+ this.eventBus = eventBus;
266
+ this.mixer = new AudioBusMixer(eventBus);
267
+ this.music = new MusicManager(eventBus);
268
+ this.setupGameStateHandlers();
269
+ }
270
+ setupGameStateHandlers() {
271
+ // Pause audio when game pauses
272
+ this.eventBus.on('game:pause', () => this.pauseAll());
273
+ this.eventBus.on('game:resume', () => this.resumeAll());
274
+ // Handle scene transitions
275
+ this.eventBus.on('scene:transition', (data) => {
276
+ if (data.musicTrackId) {
277
+ this.music.play(data.musicTrackId, 2000);
278
+ }
279
+ });
280
+ // Forward game events to adaptive audio
281
+ this.eventBus.on('game:event', (data) => {
282
+ this.music.processGameEvent(data.name);
283
+ });
284
+ }
285
+ /** Register an SFX pool for frequent sounds */
286
+ registerPool(config) {
287
+ this.pools.set(config.id, new SFXPool(config));
288
+ }
289
+ /** Play a pooled SFX */
290
+ playSFX(poolId, volume = 1, position) {
291
+ const pool = this.pools.get(poolId);
292
+ return pool ? pool.play(volume, position) : null;
293
+ }
294
+ /** Stop a pooled SFX instance */
295
+ stopSFX(poolId, instanceId) {
296
+ var _a;
297
+ (_a = this.pools.get(poolId)) === null || _a === void 0 ? void 0 : _a.stop(instanceId);
298
+ }
299
+ /** Pause all audio (game menu, alt-tab, etc.) */
300
+ pauseAll() {
301
+ if (this.paused)
302
+ return;
303
+ this.paused = true;
304
+ this.snapshot = this.createSnapshot();
305
+ for (const pool of this.pools.values())
306
+ pool.stopAll();
307
+ this.eventBus.emit('audio:pause-all', {});
308
+ }
309
+ /** Resume all audio */
310
+ resumeAll() {
311
+ if (!this.paused)
312
+ return;
313
+ this.paused = false;
314
+ this.eventBus.emit('audio:resume-all', { snapshot: this.snapshot });
315
+ this.snapshot = null;
316
+ }
317
+ isPaused() {
318
+ return this.paused;
319
+ }
320
+ /** Create a snapshot of current audio state for save/restore */
321
+ createSnapshot() {
322
+ const activeSounds = [];
323
+ for (const [poolId, pool] of this.pools) {
324
+ if (pool.getActiveCount() > 0) {
325
+ activeSounds.push({
326
+ id: poolId,
327
+ src: pool.getConfig().src,
328
+ bus: pool.getConfig().bus,
329
+ volume: 1,
330
+ playing: true,
331
+ });
332
+ }
333
+ }
334
+ return {
335
+ timestamp: Date.now(),
336
+ busVolumes: this.mixer.snapshot(),
337
+ activeSounds,
338
+ currentMusicTrack: this.music.getCurrentTrackId(),
339
+ musicPosition: 0,
340
+ };
341
+ }
342
+ /** Restore audio from a snapshot */
343
+ restoreSnapshot(snap) {
344
+ for (const [bus, vol] of Object.entries(snap.busVolumes)) {
345
+ this.mixer.setVolume(bus, vol);
346
+ }
347
+ if (snap.currentMusicTrack) {
348
+ this.music.play(snap.currentMusicTrack, 0);
349
+ }
350
+ }
351
+ /** Process a game audio event */
352
+ processEvent(event) {
353
+ var _a;
354
+ switch (event.type) {
355
+ case 'set-bus-volume':
356
+ if (event.bus !== undefined && event.volume !== undefined) {
357
+ this.mixer.setVolume(event.bus, event.volume);
358
+ }
359
+ break;
360
+ case 'crossfade':
361
+ if (event.sourceId) {
362
+ this.music.play(event.sourceId, (_a = event.fadeDuration) !== null && _a !== void 0 ? _a : 1000);
363
+ }
364
+ break;
365
+ default:
366
+ this.eventBus.emit(`audio:${event.type}`, event);
367
+ }
368
+ }
369
+ getPool(id) {
370
+ return this.pools.get(id);
371
+ }
372
+ getAllPools() {
373
+ return new Map(this.pools);
374
+ }
375
+ destroy() {
376
+ for (const pool of this.pools.values())
377
+ pool.stopAll();
378
+ this.pools.clear();
379
+ this.music.stop(0);
380
+ }
381
+ }
382
+ /* ══════════════════════════════════════════════════════════════
383
+ REACT HOOK & COMPONENT
384
+ ══════════════════════════════════════════════════════════════ */
385
+ function useGameAudio(eventBus) {
386
+ const bridgeRef = React.useRef(null);
387
+ const bridge = React.useMemo(() => {
388
+ if (!bridgeRef.current) {
389
+ bridgeRef.current = new GameAudioBridge(eventBus);
390
+ }
391
+ return bridgeRef.current;
392
+ }, [eventBus]);
393
+ React.useEffect(() => {
394
+ return () => {
395
+ bridge.destroy();
396
+ bridgeRef.current = null;
397
+ };
398
+ }, [bridge]);
399
+ const playSFX = React.useCallback((poolId, volume, position) => bridge.playSFX(poolId, volume, position), [bridge]);
400
+ const playMusic = React.useCallback((trackId, crossfadeDuration) => bridge.music.play(trackId, crossfadeDuration), [bridge]);
401
+ const stopMusic = React.useCallback((fadeOutMs) => bridge.music.stop(fadeOutMs), [bridge]);
402
+ const setVolume = React.useCallback((bus, volume) => bridge.mixer.setVolume(bus, volume), [bridge]);
403
+ return {
404
+ bridge,
405
+ playSFX,
406
+ playMusic,
407
+ stopMusic,
408
+ setVolume,
409
+ pauseAll: () => bridge.pauseAll(),
410
+ resumeAll: () => bridge.resumeAll(),
411
+ registerPool: (config) => bridge.registerPool(config),
412
+ registerTrack: (track) => bridge.music.registerTrack(track),
413
+ };
414
+ }
415
+ const GameAudioSettings = ({ bridge, className, style, }) => {
416
+ const [volumes, setVolumes] = React.useState(() => bridge.mixer.snapshot());
417
+ const handleVolumeChange = React.useCallback((bus, value) => {
418
+ bridge.mixer.setVolume(bus, value);
419
+ setVolumes(prev => ({ ...prev, [bus]: value }));
420
+ }, [bridge]);
421
+ const busOrder = ['master', 'music', 'sfx', 'voice', 'ambient', 'ui'];
422
+ return React.createElement('div', {
423
+ className: `nice-game-audio-settings ${className !== null && className !== void 0 ? className : ''}`.trim(),
424
+ style: { display: 'flex', flexDirection: 'column', gap: 8, padding: 16, ...style },
425
+ }, busOrder.map(bus => {
426
+ var _a, _b;
427
+ return React.createElement('div', {
428
+ key: bus,
429
+ style: { display: 'flex', alignItems: 'center', gap: 8 },
430
+ }, React.createElement('label', {
431
+ style: { width: 80, textTransform: 'capitalize', fontSize: 14 },
432
+ }, bus), React.createElement('input', {
433
+ type: 'range',
434
+ min: 0,
435
+ max: 1,
436
+ step: 0.01,
437
+ value: (_a = volumes[bus]) !== null && _a !== void 0 ? _a : 1,
438
+ onChange: (e) => handleVolumeChange(bus, parseFloat(e.target.value)),
439
+ style: { flex: 1 },
440
+ }), React.createElement('span', {
441
+ style: { width: 40, textAlign: 'right', fontSize: 12, fontVariantNumeric: 'tabular-nums' },
442
+ }, `${Math.round(((_b = volumes[bus]) !== null && _b !== void 0 ? _b : 1) * 100)}%`));
443
+ }));
444
+ };
445
+ GameAudioSettings.displayName = 'GameAudioSettings';
446
+
447
+ exports.AudioBusMixer = AudioBusMixer;
448
+ exports.DEFAULT_SPATIAL = DEFAULT_SPATIAL;
449
+ exports.GameAudioBridge = GameAudioBridge;
450
+ exports.GameAudioSettings = GameAudioSettings;
451
+ exports.MusicManager = MusicManager;
452
+ exports.SFXPool = SFXPool;
453
+ exports.useGameAudio = useGameAudio;
454
+ //# sourceMappingURL=AudioBridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AudioBridge.js","sources":["../../../src/audio/AudioBridge.ts"],"sourcesContent":[null],"names":["useRef","useMemo","useEffect","useCallback","useState"],"mappings":"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"}