@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.
- package/CHANGELOG.md +193 -1
- package/dist/cjs/audio/AudioBridge.js +454 -0
- package/dist/cjs/audio/AudioBridge.js.map +1 -0
- package/dist/cjs/devtools/GameplayAnalytics.js +651 -0
- package/dist/cjs/devtools/GameplayAnalytics.js.map +1 -0
- package/dist/cjs/dialogue/DialogueSystem.js +1023 -0
- package/dist/cjs/dialogue/DialogueSystem.js.map +1 -0
- package/dist/cjs/editor/NiceGameEditor.js +569 -71
- package/dist/cjs/editor/NiceGameEditor.js.map +1 -1
- package/dist/cjs/engine/SaveSystemV2.js +494 -0
- package/dist/cjs/engine/SaveSystemV2.js.map +1 -0
- package/dist/cjs/i18n/useTranslation.js +11 -11
- package/dist/cjs/index.js +90 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/input/GamepadNavigation.js +21 -21
- package/dist/cjs/input/useGamepads.js +6 -6
- package/dist/cjs/integration/IconSprite.js +281 -0
- package/dist/cjs/integration/IconSprite.js.map +1 -0
- package/dist/cjs/inventory/InventorySystem.js +930 -0
- package/dist/cjs/inventory/InventorySystem.js.map +1 -0
- package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/AbortController.js.map +1 -1
- package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/AccessTokenHttpClient.js.map +1 -1
- package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/DefaultHttpClient.js.map +1 -1
- package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/DefaultReconnectPolicy.js.map +1 -1
- package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/Errors.js.map +1 -1
- package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/FetchHttpClient.js.map +1 -1
- package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/HandshakeProtocol.js.map +1 -1
- package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/HeaderNames.js.map +1 -1
- package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/HttpClient.js.map +1 -1
- package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/HttpConnection.js.map +1 -1
- package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/HubConnection.js.map +1 -1
- package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/HubConnectionBuilder.js.map +1 -1
- package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/IHubProtocol.js.map +1 -1
- package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/ILogger.js.map +1 -1
- package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/ITransport.js.map +1 -1
- package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/JsonHubProtocol.js.map +1 -1
- package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/Loggers.js.map +1 -1
- package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/LongPollingTransport.js.map +1 -1
- package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/MessageBuffer.js.map +1 -1
- package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/ServerSentEventsTransport.js.map +1 -1
- package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/Subject.js.map +1 -1
- package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/TextMessageFormat.js.map +1 -1
- package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/Utils.js.map +1 -1
- package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/WebSocketTransport.js.map +1 -1
- package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/XhrHttpClient.js.map +1 -1
- package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/pkg-version.js.map +1 -1
- package/dist/cjs/quest/QuestSystem.js +924 -0
- package/dist/cjs/quest/QuestSystem.js.map +1 -0
- package/dist/cjs/rendering/WebGPURenderPipeline.js +658 -0
- package/dist/cjs/rendering/WebGPURenderPipeline.js.map +1 -0
- package/dist/cjs/xr/ARVR.js.map +1 -1
- package/dist/esm/audio/AudioBridge.js +446 -0
- package/dist/esm/audio/AudioBridge.js.map +1 -0
- package/dist/esm/devtools/GameplayAnalytics.js +639 -0
- package/dist/esm/devtools/GameplayAnalytics.js.map +1 -0
- package/dist/esm/dialogue/DialogueSystem.js +1008 -0
- package/dist/esm/dialogue/DialogueSystem.js.map +1 -0
- package/dist/esm/editor/NiceGameEditor.js +556 -58
- package/dist/esm/editor/NiceGameEditor.js.map +1 -1
- package/dist/esm/engine/SaveSystemV2.js +487 -0
- package/dist/esm/engine/SaveSystemV2.js.map +1 -0
- package/dist/esm/index.js +11 -3
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/integration/IconSprite.js +266 -0
- package/dist/esm/integration/IconSprite.js.map +1 -0
- package/dist/esm/inventory/InventorySystem.js +924 -0
- package/dist/esm/inventory/InventorySystem.js.map +1 -0
- package/dist/esm/node_modules/@microsoft/signalr/dist/esm/AbortController.js.map +1 -1
- package/dist/esm/node_modules/@microsoft/signalr/dist/esm/AccessTokenHttpClient.js.map +1 -1
- package/dist/esm/node_modules/@microsoft/signalr/dist/esm/DefaultHttpClient.js.map +1 -1
- package/dist/esm/node_modules/@microsoft/signalr/dist/esm/DefaultReconnectPolicy.js.map +1 -1
- package/dist/esm/node_modules/@microsoft/signalr/dist/esm/Errors.js.map +1 -1
- package/dist/esm/node_modules/@microsoft/signalr/dist/esm/FetchHttpClient.js.map +1 -1
- package/dist/esm/node_modules/@microsoft/signalr/dist/esm/HandshakeProtocol.js.map +1 -1
- package/dist/esm/node_modules/@microsoft/signalr/dist/esm/HeaderNames.js.map +1 -1
- package/dist/esm/node_modules/@microsoft/signalr/dist/esm/HttpClient.js.map +1 -1
- package/dist/esm/node_modules/@microsoft/signalr/dist/esm/HttpConnection.js.map +1 -1
- package/dist/esm/node_modules/@microsoft/signalr/dist/esm/HubConnection.js.map +1 -1
- package/dist/esm/node_modules/@microsoft/signalr/dist/esm/HubConnectionBuilder.js.map +1 -1
- package/dist/esm/node_modules/@microsoft/signalr/dist/esm/IHubProtocol.js.map +1 -1
- package/dist/esm/node_modules/@microsoft/signalr/dist/esm/ILogger.js.map +1 -1
- package/dist/esm/node_modules/@microsoft/signalr/dist/esm/ITransport.js.map +1 -1
- package/dist/esm/node_modules/@microsoft/signalr/dist/esm/JsonHubProtocol.js.map +1 -1
- package/dist/esm/node_modules/@microsoft/signalr/dist/esm/Loggers.js.map +1 -1
- package/dist/esm/node_modules/@microsoft/signalr/dist/esm/LongPollingTransport.js.map +1 -1
- package/dist/esm/node_modules/@microsoft/signalr/dist/esm/MessageBuffer.js.map +1 -1
- package/dist/esm/node_modules/@microsoft/signalr/dist/esm/ServerSentEventsTransport.js.map +1 -1
- package/dist/esm/node_modules/@microsoft/signalr/dist/esm/Subject.js.map +1 -1
- package/dist/esm/node_modules/@microsoft/signalr/dist/esm/TextMessageFormat.js.map +1 -1
- package/dist/esm/node_modules/@microsoft/signalr/dist/esm/Utils.js.map +1 -1
- package/dist/esm/node_modules/@microsoft/signalr/dist/esm/WebSocketTransport.js.map +1 -1
- package/dist/esm/node_modules/@microsoft/signalr/dist/esm/XhrHttpClient.js.map +1 -1
- package/dist/esm/node_modules/@microsoft/signalr/dist/esm/pkg-version.js.map +1 -1
- package/dist/esm/quest/QuestSystem.js +916 -0
- package/dist/esm/quest/QuestSystem.js.map +1 -0
- package/dist/esm/rendering/WebGPURenderPipeline.js +642 -0
- package/dist/esm/rendering/WebGPURenderPipeline.js.map +1 -0
- package/dist/esm/xr/ARVR.js.map +1 -1
- package/dist/types/__tests__/setup.d.ts +1 -1
- package/dist/types/audio/AudioBridge.d.ts +199 -0
- package/dist/types/devtools/GameplayAnalytics.d.ts +279 -0
- package/dist/types/dialogue/DialogueSystem.d.ts +326 -0
- package/dist/types/dialogue/index.d.ts +2 -0
- package/dist/types/editor/NiceGameEditor.d.ts +12 -1
- package/dist/types/engine/SaveSystemV2.d.ts +155 -0
- package/dist/types/index.d.ts +19 -3
- package/dist/types/integration/IconSprite.d.ts +196 -0
- package/dist/types/inventory/InventorySystem.d.ts +336 -0
- package/dist/types/performance/WebGPUCompute.d.ts +0 -10
- package/dist/types/quest/QuestSystem.d.ts +287 -0
- package/dist/types/rendering/WebGPURenderPipeline.d.ts +255 -0
- 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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"}
|