@react-text-game/core 0.4.1 → 0.5.1
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/README.md +389 -0
- package/dist/audio/audioTrack.d.ts +407 -0
- package/dist/audio/audioTrack.d.ts.map +1 -0
- package/dist/audio/audioTrack.js +656 -0
- package/dist/audio/audioTrack.js.map +1 -0
- package/dist/audio/constants.d.ts +19 -0
- package/dist/audio/constants.d.ts.map +1 -0
- package/dist/audio/constants.js +20 -0
- package/dist/audio/constants.js.map +1 -0
- package/dist/audio/fabric.d.ts +35 -0
- package/dist/audio/fabric.d.ts.map +1 -0
- package/dist/audio/fabric.js +36 -0
- package/dist/audio/fabric.js.map +1 -0
- package/dist/audio/index.d.ts +33 -0
- package/dist/audio/index.d.ts.map +1 -0
- package/dist/audio/index.js +32 -0
- package/dist/audio/index.js.map +1 -0
- package/dist/audio/types.d.ts +105 -0
- package/dist/audio/types.d.ts.map +1 -0
- package/dist/audio/types.js +2 -0
- package/dist/audio/types.js.map +1 -0
- package/dist/hooks/index.d.ts +2 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +2 -0
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/useAudio.d.ts +50 -0
- package/dist/hooks/useAudio.d.ts.map +1 -0
- package/dist/hooks/useAudio.js +42 -0
- package/dist/hooks/useAudio.js.map +1 -0
- package/dist/hooks/useAudioManager.d.ts +66 -0
- package/dist/hooks/useAudioManager.d.ts.map +1 -0
- package/dist/hooks/useAudioManager.js +70 -0
- package/dist/hooks/useAudioManager.js.map +1 -0
- package/dist/passages/interactiveMap/interactiveMap.d.ts +17 -5
- package/dist/passages/interactiveMap/interactiveMap.d.ts.map +1 -1
- package/dist/passages/interactiveMap/interactiveMap.js +19 -6
- package/dist/passages/interactiveMap/interactiveMap.js.map +1 -1
- package/dist/passages/interactiveMap/types.d.ts +28 -2
- package/dist/passages/interactiveMap/types.d.ts.map +1 -1
- package/dist/tests/audio.test.d.ts +2 -0
- package/dist/tests/audio.test.d.ts.map +1 -0
- package/dist/tests/audio.test.js +605 -0
- package/dist/tests/audio.test.js.map +1 -0
- package/dist/tests/interactiveMap.test.js +227 -0
- package/dist/tests/interactiveMap.test.js.map +1 -1
- package/package.json +5 -1
|
@@ -0,0 +1,656 @@
|
|
|
1
|
+
import { proxy, subscribe } from "valtio";
|
|
2
|
+
import { logger } from "../logger";
|
|
3
|
+
import { Storage } from "../storage";
|
|
4
|
+
import { AUDIO_STORAGE_PATH, DEFAULT_AUDIO_OPTIONS } from "./constants";
|
|
5
|
+
/**
|
|
6
|
+
* Individual audio track with reactive state management.
|
|
7
|
+
*
|
|
8
|
+
* AudioTrack wraps the HTMLAudioElement API with Valtio reactive state,
|
|
9
|
+
* making it easy to integrate with React components and the game's save system.
|
|
10
|
+
*
|
|
11
|
+
* Features:
|
|
12
|
+
* - Reactive state updates via Valtio
|
|
13
|
+
* - Automatic persistence with save/load
|
|
14
|
+
* - Volume, loop, and playback rate controls
|
|
15
|
+
* - Fade in/out effects
|
|
16
|
+
* - Event-driven state synchronization
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```typescript
|
|
20
|
+
* const music = new AudioTrack('assets/music.mp3', {
|
|
21
|
+
* id: 'bg-music',
|
|
22
|
+
* loop: true,
|
|
23
|
+
* volume: 0.7,
|
|
24
|
+
* });
|
|
25
|
+
*
|
|
26
|
+
* await music.play();
|
|
27
|
+
* music.setVolume(0.5);
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export class AudioTrack {
|
|
31
|
+
id;
|
|
32
|
+
src;
|
|
33
|
+
audioElement;
|
|
34
|
+
state;
|
|
35
|
+
jsonPath;
|
|
36
|
+
unsubscribe;
|
|
37
|
+
constructor(src, options = {}) {
|
|
38
|
+
this.id = options.id || `audio-${Date.now()}-${Math.random()}`;
|
|
39
|
+
this.src = src;
|
|
40
|
+
this.jsonPath = `${AUDIO_STORAGE_PATH}.${this.id}`;
|
|
41
|
+
// Create reactive state with Valtio
|
|
42
|
+
this.state = proxy({
|
|
43
|
+
isPlaying: false,
|
|
44
|
+
isPaused: false,
|
|
45
|
+
isStopped: true,
|
|
46
|
+
currentTime: 0,
|
|
47
|
+
duration: 0,
|
|
48
|
+
volume: options.volume ?? DEFAULT_AUDIO_OPTIONS.volume,
|
|
49
|
+
loop: options.loop ?? DEFAULT_AUDIO_OPTIONS.loop,
|
|
50
|
+
playbackRate: options.playbackRate ?? DEFAULT_AUDIO_OPTIONS.playbackRate,
|
|
51
|
+
muted: options.muted ?? DEFAULT_AUDIO_OPTIONS.muted,
|
|
52
|
+
});
|
|
53
|
+
// Create audio element
|
|
54
|
+
this.audioElement = new Audio(src);
|
|
55
|
+
this.audioElement.loop = this.state.loop;
|
|
56
|
+
this.audioElement.playbackRate = this.state.playbackRate;
|
|
57
|
+
this.audioElement.muted = this.state.muted;
|
|
58
|
+
this.audioElement.preload =
|
|
59
|
+
options.preload ?? DEFAULT_AUDIO_OPTIONS.preload;
|
|
60
|
+
// Attach event listeners
|
|
61
|
+
this.attachEventListeners();
|
|
62
|
+
// Register with AudioManager
|
|
63
|
+
AudioManager._registerTrack(this);
|
|
64
|
+
// Apply effective volume (considering master volume)
|
|
65
|
+
// Must be called after registration since it needs AudioManager
|
|
66
|
+
this._applyEffectiveVolume();
|
|
67
|
+
// Setup auto-save subscription if ID provided
|
|
68
|
+
if (options.id) {
|
|
69
|
+
// Subscribe to state changes for auto-save
|
|
70
|
+
// Audio will be saved whenever state changes, matching the pattern
|
|
71
|
+
// of other game objects that persist their state
|
|
72
|
+
//
|
|
73
|
+
// Note: Initial state is not auto-saved here to avoid overwriting
|
|
74
|
+
// existing saved states during load operations. Call save() manually
|
|
75
|
+
// or trigger a state change to persist the initial state.
|
|
76
|
+
this.unsubscribe = subscribe(this.state, () => {
|
|
77
|
+
this.save();
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
// Auto-play if requested (may be blocked by browser)
|
|
81
|
+
if (options.autoPlay) {
|
|
82
|
+
this.play().catch((error) => {
|
|
83
|
+
logger.warn(`Auto-play blocked for "${this.id}". User interaction required.`, error);
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
logger.log(`Audio track created: ${this.id} (${src})`);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Attaches event listeners to sync HTMLAudioElement state with reactive state.
|
|
90
|
+
* @private
|
|
91
|
+
*/
|
|
92
|
+
attachEventListeners() {
|
|
93
|
+
this.audioElement.addEventListener("loadedmetadata", () => {
|
|
94
|
+
this.state.duration = this.audioElement.duration;
|
|
95
|
+
});
|
|
96
|
+
this.audioElement.addEventListener("timeupdate", () => {
|
|
97
|
+
this.state.currentTime = this.audioElement.currentTime;
|
|
98
|
+
});
|
|
99
|
+
this.audioElement.addEventListener("play", () => {
|
|
100
|
+
this.state.isPlaying = true;
|
|
101
|
+
this.state.isPaused = false;
|
|
102
|
+
this.state.isStopped = false;
|
|
103
|
+
});
|
|
104
|
+
this.audioElement.addEventListener("pause", () => {
|
|
105
|
+
this.state.isPlaying = false;
|
|
106
|
+
this.state.isPaused = true;
|
|
107
|
+
});
|
|
108
|
+
this.audioElement.addEventListener("ended", () => {
|
|
109
|
+
if (!this.state.loop) {
|
|
110
|
+
this.state.isPlaying = false;
|
|
111
|
+
this.state.isStopped = true;
|
|
112
|
+
this.state.isPaused = false;
|
|
113
|
+
this.state.currentTime = 0;
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
this.audioElement.addEventListener("volumechange", () => {
|
|
117
|
+
// Only sync muted state, not volume
|
|
118
|
+
// Volume state is managed separately to support master volume
|
|
119
|
+
this.state.muted = this.audioElement.muted;
|
|
120
|
+
});
|
|
121
|
+
this.audioElement.addEventListener("ratechange", () => {
|
|
122
|
+
this.state.playbackRate = this.audioElement.playbackRate;
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Plays the audio track.
|
|
127
|
+
*
|
|
128
|
+
* @returns Promise that resolves when playback starts
|
|
129
|
+
* @throws Error if playback fails
|
|
130
|
+
*
|
|
131
|
+
* @example
|
|
132
|
+
* ```typescript
|
|
133
|
+
* try {
|
|
134
|
+
* await audio.play();
|
|
135
|
+
* } catch (error) {
|
|
136
|
+
* console.error('Playback failed:', error);
|
|
137
|
+
* }
|
|
138
|
+
* ```
|
|
139
|
+
*/
|
|
140
|
+
async play() {
|
|
141
|
+
try {
|
|
142
|
+
await this.audioElement.play();
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
logger.error(`Failed to play audio: ${this.src}`, error);
|
|
146
|
+
throw error;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Pauses the audio track.
|
|
151
|
+
*
|
|
152
|
+
* @example
|
|
153
|
+
* ```typescript
|
|
154
|
+
* audio.pause();
|
|
155
|
+
* ```
|
|
156
|
+
*/
|
|
157
|
+
pause() {
|
|
158
|
+
this.audioElement.pause();
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Resumes playback if the audio is paused.
|
|
162
|
+
*
|
|
163
|
+
* @example
|
|
164
|
+
* ```typescript
|
|
165
|
+
* audio.resume();
|
|
166
|
+
* ```
|
|
167
|
+
*/
|
|
168
|
+
resume() {
|
|
169
|
+
if (this.state.isPaused) {
|
|
170
|
+
this.play().catch((error) => {
|
|
171
|
+
logger.error(`Failed to resume audio: ${this.src}`, error);
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Stops the audio track and resets to the beginning.
|
|
177
|
+
*
|
|
178
|
+
* @example
|
|
179
|
+
* ```typescript
|
|
180
|
+
* audio.stop();
|
|
181
|
+
* ```
|
|
182
|
+
*/
|
|
183
|
+
stop() {
|
|
184
|
+
this.audioElement.pause();
|
|
185
|
+
this.audioElement.currentTime = 0;
|
|
186
|
+
this.state.isPlaying = false;
|
|
187
|
+
this.state.isPaused = false;
|
|
188
|
+
this.state.isStopped = true;
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Sets the volume level.
|
|
192
|
+
*
|
|
193
|
+
* @param volume - Volume level (0.0 to 1.0), clamped to valid range
|
|
194
|
+
*
|
|
195
|
+
* @example
|
|
196
|
+
* ```typescript
|
|
197
|
+
* audio.setVolume(0.5); // 50% volume
|
|
198
|
+
* ```
|
|
199
|
+
*/
|
|
200
|
+
setVolume(volume) {
|
|
201
|
+
const clampedVolume = Math.max(0, Math.min(1, volume));
|
|
202
|
+
this.state.volume = clampedVolume;
|
|
203
|
+
this._applyEffectiveVolume();
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Applies the effective volume (track volume * master volume) to the audio element.
|
|
207
|
+
* Internal method used by AudioManager to apply master volume changes.
|
|
208
|
+
*
|
|
209
|
+
* @internal
|
|
210
|
+
*/
|
|
211
|
+
_applyEffectiveVolume() {
|
|
212
|
+
const masterVolume = AudioManager.getMasterVolume();
|
|
213
|
+
const effectiveVolume = this.state.volume * masterVolume;
|
|
214
|
+
this.audioElement.volume = effectiveVolume;
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Sets whether the audio should loop.
|
|
218
|
+
*
|
|
219
|
+
* @param loop - True to enable looping, false to disable
|
|
220
|
+
*
|
|
221
|
+
* @example
|
|
222
|
+
* ```typescript
|
|
223
|
+
* audio.setLoop(true);
|
|
224
|
+
* ```
|
|
225
|
+
*/
|
|
226
|
+
setLoop(loop) {
|
|
227
|
+
this.audioElement.loop = loop;
|
|
228
|
+
this.state.loop = loop;
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Sets the playback rate.
|
|
232
|
+
*
|
|
233
|
+
* @param rate - Playback rate multiplier (0.5 = half speed, 2.0 = double speed)
|
|
234
|
+
*
|
|
235
|
+
* @example
|
|
236
|
+
* ```typescript
|
|
237
|
+
* audio.setPlaybackRate(1.5); // 1.5x speed
|
|
238
|
+
* ```
|
|
239
|
+
*/
|
|
240
|
+
setPlaybackRate(rate) {
|
|
241
|
+
this.audioElement.playbackRate = rate;
|
|
242
|
+
this.state.playbackRate = rate;
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Sets whether the audio is muted.
|
|
246
|
+
*
|
|
247
|
+
* @param muted - True to mute, false to unmute
|
|
248
|
+
*
|
|
249
|
+
* @example
|
|
250
|
+
* ```typescript
|
|
251
|
+
* audio.setMuted(true);
|
|
252
|
+
* ```
|
|
253
|
+
*/
|
|
254
|
+
setMuted(muted) {
|
|
255
|
+
this.audioElement.muted = muted;
|
|
256
|
+
this.state.muted = muted;
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Seeks to a specific time in the audio.
|
|
260
|
+
*
|
|
261
|
+
* @param time - Time in seconds, clamped to [0, duration]
|
|
262
|
+
*
|
|
263
|
+
* @example
|
|
264
|
+
* ```typescript
|
|
265
|
+
* audio.seek(30); // Seek to 30 seconds
|
|
266
|
+
* ```
|
|
267
|
+
*/
|
|
268
|
+
seek(time) {
|
|
269
|
+
const clampedTime = Math.max(0, Math.min(this.state.duration, time));
|
|
270
|
+
this.audioElement.currentTime = clampedTime;
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Fades in the audio over a specified duration.
|
|
274
|
+
*
|
|
275
|
+
* Starts at volume 0 and gradually increases to the target volume.
|
|
276
|
+
*
|
|
277
|
+
* @param duration - Fade duration in milliseconds
|
|
278
|
+
* @returns Promise that resolves when fade completes
|
|
279
|
+
*
|
|
280
|
+
* @example
|
|
281
|
+
* ```typescript
|
|
282
|
+
* await audio.fadeIn(2000); // Fade in over 2 seconds
|
|
283
|
+
* ```
|
|
284
|
+
*/
|
|
285
|
+
async fadeIn(duration = 1000) {
|
|
286
|
+
const targetVolume = this.state.volume;
|
|
287
|
+
this.state.volume = 0;
|
|
288
|
+
this.audioElement.volume = 0;
|
|
289
|
+
await this.play();
|
|
290
|
+
return this.fadeTo(targetVolume, duration);
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* Fades out the audio over a specified duration and stops.
|
|
294
|
+
*
|
|
295
|
+
* @param duration - Fade duration in milliseconds
|
|
296
|
+
* @returns Promise that resolves when fade completes
|
|
297
|
+
*
|
|
298
|
+
* @example
|
|
299
|
+
* ```typescript
|
|
300
|
+
* await audio.fadeOut(1500); // Fade out over 1.5 seconds
|
|
301
|
+
* ```
|
|
302
|
+
*/
|
|
303
|
+
async fadeOut(duration = 1000) {
|
|
304
|
+
await this.fadeTo(0, duration);
|
|
305
|
+
this.stop();
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Fades to a target volume over a specified duration.
|
|
309
|
+
*
|
|
310
|
+
* @private
|
|
311
|
+
* @param targetVolume - Target volume level (0.0 to 1.0)
|
|
312
|
+
* @param duration - Fade duration in milliseconds
|
|
313
|
+
* @returns Promise that resolves when fade completes
|
|
314
|
+
*/
|
|
315
|
+
async fadeTo(targetVolume, duration) {
|
|
316
|
+
const startVolume = this.audioElement.volume;
|
|
317
|
+
const startTime = Date.now();
|
|
318
|
+
return new Promise((resolve) => {
|
|
319
|
+
const fade = () => {
|
|
320
|
+
const elapsed = Date.now() - startTime;
|
|
321
|
+
const progress = Math.min(elapsed / duration, 1);
|
|
322
|
+
const currentVolume = startVolume + (targetVolume - startVolume) * progress;
|
|
323
|
+
this.audioElement.volume = currentVolume;
|
|
324
|
+
this.state.volume = currentVolume;
|
|
325
|
+
if (progress < 1) {
|
|
326
|
+
requestAnimationFrame(fade);
|
|
327
|
+
}
|
|
328
|
+
else {
|
|
329
|
+
resolve();
|
|
330
|
+
}
|
|
331
|
+
};
|
|
332
|
+
requestAnimationFrame(fade);
|
|
333
|
+
});
|
|
334
|
+
}
|
|
335
|
+
/**
|
|
336
|
+
* Gets the reactive audio state.
|
|
337
|
+
*
|
|
338
|
+
* This state is a Valtio proxy and can be used with useSnapshot() in React.
|
|
339
|
+
*
|
|
340
|
+
* @returns The reactive audio state
|
|
341
|
+
*
|
|
342
|
+
* @example
|
|
343
|
+
* ```typescript
|
|
344
|
+
* const state = audio.getState();
|
|
345
|
+
* console.log(state.isPlaying); // true/false
|
|
346
|
+
* ```
|
|
347
|
+
*/
|
|
348
|
+
getState() {
|
|
349
|
+
return this.state;
|
|
350
|
+
}
|
|
351
|
+
/**
|
|
352
|
+
* Saves the current audio state to storage.
|
|
353
|
+
*
|
|
354
|
+
* Called automatically when auto-save is enabled.
|
|
355
|
+
*
|
|
356
|
+
* @example
|
|
357
|
+
* ```typescript
|
|
358
|
+
* audio.save();
|
|
359
|
+
* ```
|
|
360
|
+
*/
|
|
361
|
+
save() {
|
|
362
|
+
const saveState = {
|
|
363
|
+
id: this.id,
|
|
364
|
+
src: this.src,
|
|
365
|
+
volume: this.state.volume,
|
|
366
|
+
loop: this.state.loop,
|
|
367
|
+
playbackRate: this.state.playbackRate,
|
|
368
|
+
muted: this.state.muted,
|
|
369
|
+
currentTime: this.state.currentTime,
|
|
370
|
+
isPlaying: this.state.isPlaying,
|
|
371
|
+
isPaused: this.state.isPaused,
|
|
372
|
+
};
|
|
373
|
+
Storage.setValue(this.jsonPath, saveState, true);
|
|
374
|
+
}
|
|
375
|
+
/**
|
|
376
|
+
* Loads the audio state from storage.
|
|
377
|
+
*
|
|
378
|
+
* Restores volume, loop, playback rate, muted status, and playback position.
|
|
379
|
+
* Optionally resumes playback if the audio was playing when saved.
|
|
380
|
+
*
|
|
381
|
+
* @example
|
|
382
|
+
* ```typescript
|
|
383
|
+
* audio.load();
|
|
384
|
+
* ```
|
|
385
|
+
*/
|
|
386
|
+
load() {
|
|
387
|
+
const savedState = Storage.getValue(this.jsonPath);
|
|
388
|
+
if (savedState.length > 0) {
|
|
389
|
+
const state = savedState[0];
|
|
390
|
+
this.state.volume = state.volume;
|
|
391
|
+
this.state.loop = state.loop;
|
|
392
|
+
this.state.playbackRate = state.playbackRate;
|
|
393
|
+
this.state.muted = state.muted;
|
|
394
|
+
// Apply effective volume (considering master volume)
|
|
395
|
+
this._applyEffectiveVolume();
|
|
396
|
+
this.audioElement.loop = state.loop;
|
|
397
|
+
this.audioElement.playbackRate = state.playbackRate;
|
|
398
|
+
this.audioElement.muted = state.muted;
|
|
399
|
+
this.audioElement.currentTime = state.currentTime;
|
|
400
|
+
// Restore playback state
|
|
401
|
+
if (state.isPlaying && !state.isPaused) {
|
|
402
|
+
this.play().catch((error) => {
|
|
403
|
+
logger.warn(`Could not auto-resume audio "${this.id}" on load. User interaction may be required.`, error);
|
|
404
|
+
});
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
/**
|
|
409
|
+
* Cleans up the audio track and removes all listeners.
|
|
410
|
+
*
|
|
411
|
+
* Should be called when the audio track is no longer needed.
|
|
412
|
+
*
|
|
413
|
+
* @example
|
|
414
|
+
* ```typescript
|
|
415
|
+
* audio.dispose();
|
|
416
|
+
* ```
|
|
417
|
+
*/
|
|
418
|
+
dispose() {
|
|
419
|
+
this.stop();
|
|
420
|
+
this.unsubscribe?.();
|
|
421
|
+
AudioManager._unregisterTrack(this);
|
|
422
|
+
// Remove all event listeners by cloning the element
|
|
423
|
+
const clone = this.audioElement.cloneNode();
|
|
424
|
+
this.audioElement.parentNode?.replaceChild(clone, this.audioElement);
|
|
425
|
+
logger.log(`Audio track disposed: ${this.id}`);
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
/**
|
|
429
|
+
* Global audio manager for controlling all audio tracks.
|
|
430
|
+
*
|
|
431
|
+
* AudioManager provides a singleton interface for game-wide audio operations
|
|
432
|
+
* like master volume control, muting all tracks, or pausing all audio.
|
|
433
|
+
*
|
|
434
|
+
* @example
|
|
435
|
+
* ```typescript
|
|
436
|
+
* // Global volume control
|
|
437
|
+
* AudioManager.setMasterVolume(0.5);
|
|
438
|
+
*
|
|
439
|
+
* // Mute all audio
|
|
440
|
+
* AudioManager.muteAll();
|
|
441
|
+
*
|
|
442
|
+
* // Pause all playing tracks
|
|
443
|
+
* AudioManager.pauseAll();
|
|
444
|
+
* ```
|
|
445
|
+
*/
|
|
446
|
+
class AudioManagerClass {
|
|
447
|
+
tracks = new Map();
|
|
448
|
+
state = proxy({
|
|
449
|
+
masterVolume: 1,
|
|
450
|
+
isMuted: false,
|
|
451
|
+
});
|
|
452
|
+
/**
|
|
453
|
+
* Internal method to register a track.
|
|
454
|
+
* Called automatically by AudioTrack constructor.
|
|
455
|
+
*
|
|
456
|
+
* @internal
|
|
457
|
+
* @param track - The audio track to register
|
|
458
|
+
*/
|
|
459
|
+
_registerTrack(track) {
|
|
460
|
+
this.tracks.set(track.id, track);
|
|
461
|
+
logger.log(`AudioManager registered track: ${track.id}`);
|
|
462
|
+
}
|
|
463
|
+
/**
|
|
464
|
+
* Internal method to unregister a track.
|
|
465
|
+
* Called automatically by AudioTrack.dispose().
|
|
466
|
+
*
|
|
467
|
+
* @internal
|
|
468
|
+
* @param track - The audio track to unregister
|
|
469
|
+
*/
|
|
470
|
+
_unregisterTrack(track) {
|
|
471
|
+
this.tracks.delete(track.id);
|
|
472
|
+
logger.log(`AudioManager unregistered track: ${track.id}`);
|
|
473
|
+
}
|
|
474
|
+
/**
|
|
475
|
+
* Sets the master volume for all audio tracks.
|
|
476
|
+
*
|
|
477
|
+
* The master volume is multiplied with each track's individual volume.
|
|
478
|
+
* This does not modify individual track volumes - it applies a global multiplier.
|
|
479
|
+
*
|
|
480
|
+
* @param volume - Master volume level (0.0 to 1.0), clamped to valid range
|
|
481
|
+
*
|
|
482
|
+
* @example
|
|
483
|
+
* ```typescript
|
|
484
|
+
* AudioManager.setMasterVolume(0.5); // 50% master volume
|
|
485
|
+
* ```
|
|
486
|
+
*/
|
|
487
|
+
setMasterVolume(volume) {
|
|
488
|
+
const clampedVolume = Math.max(0, Math.min(1, volume));
|
|
489
|
+
this.state.masterVolume = clampedVolume;
|
|
490
|
+
// Apply to all tracks without modifying their base volume
|
|
491
|
+
this.tracks.forEach((track) => {
|
|
492
|
+
track._applyEffectiveVolume();
|
|
493
|
+
});
|
|
494
|
+
logger.log(`Master volume set to: ${clampedVolume}`);
|
|
495
|
+
}
|
|
496
|
+
/**
|
|
497
|
+
* Gets the current master volume.
|
|
498
|
+
*
|
|
499
|
+
* @returns The master volume level (0.0 to 1.0)
|
|
500
|
+
*
|
|
501
|
+
* @example
|
|
502
|
+
* ```typescript
|
|
503
|
+
* const volume = AudioManager.getMasterVolume();
|
|
504
|
+
* ```
|
|
505
|
+
*/
|
|
506
|
+
getMasterVolume() {
|
|
507
|
+
return this.state.masterVolume;
|
|
508
|
+
}
|
|
509
|
+
/**
|
|
510
|
+
* Mutes all audio tracks.
|
|
511
|
+
*
|
|
512
|
+
* @example
|
|
513
|
+
* ```typescript
|
|
514
|
+
* AudioManager.muteAll();
|
|
515
|
+
* ```
|
|
516
|
+
*/
|
|
517
|
+
muteAll() {
|
|
518
|
+
this.state.isMuted = true;
|
|
519
|
+
this.tracks.forEach((track) => track.setMuted(true));
|
|
520
|
+
logger.log("All audio tracks muted");
|
|
521
|
+
}
|
|
522
|
+
/**
|
|
523
|
+
* Unmutes all audio tracks.
|
|
524
|
+
*
|
|
525
|
+
* @example
|
|
526
|
+
* ```typescript
|
|
527
|
+
* AudioManager.unmuteAll();
|
|
528
|
+
* ```
|
|
529
|
+
*/
|
|
530
|
+
unmuteAll() {
|
|
531
|
+
this.state.isMuted = false;
|
|
532
|
+
this.tracks.forEach((track) => track.setMuted(false));
|
|
533
|
+
logger.log("All audio tracks unmuted");
|
|
534
|
+
}
|
|
535
|
+
/**
|
|
536
|
+
* Pauses all currently playing audio tracks.
|
|
537
|
+
*
|
|
538
|
+
* @example
|
|
539
|
+
* ```typescript
|
|
540
|
+
* AudioManager.pauseAll();
|
|
541
|
+
* ```
|
|
542
|
+
*/
|
|
543
|
+
pauseAll() {
|
|
544
|
+
this.tracks.forEach((track) => {
|
|
545
|
+
if (track.getState().isPlaying) {
|
|
546
|
+
track.pause();
|
|
547
|
+
}
|
|
548
|
+
});
|
|
549
|
+
logger.log("All audio tracks paused");
|
|
550
|
+
}
|
|
551
|
+
/**
|
|
552
|
+
* Resumes all paused audio tracks.
|
|
553
|
+
*
|
|
554
|
+
* @example
|
|
555
|
+
* ```typescript
|
|
556
|
+
* AudioManager.resumeAll();
|
|
557
|
+
* ```
|
|
558
|
+
*/
|
|
559
|
+
resumeAll() {
|
|
560
|
+
this.tracks.forEach((track) => {
|
|
561
|
+
if (track.getState().isPaused) {
|
|
562
|
+
track.resume();
|
|
563
|
+
}
|
|
564
|
+
});
|
|
565
|
+
logger.log("All audio tracks resumed");
|
|
566
|
+
}
|
|
567
|
+
/**
|
|
568
|
+
* Stops all audio tracks.
|
|
569
|
+
*
|
|
570
|
+
* @example
|
|
571
|
+
* ```typescript
|
|
572
|
+
* AudioManager.stopAll();
|
|
573
|
+
* ```
|
|
574
|
+
*/
|
|
575
|
+
stopAll() {
|
|
576
|
+
this.tracks.forEach((track) => track.stop());
|
|
577
|
+
logger.log("All audio tracks stopped");
|
|
578
|
+
}
|
|
579
|
+
/**
|
|
580
|
+
* Gets all registered audio tracks.
|
|
581
|
+
*
|
|
582
|
+
* @returns Array of all audio tracks
|
|
583
|
+
*
|
|
584
|
+
* @example
|
|
585
|
+
* ```typescript
|
|
586
|
+
* const tracks = AudioManager.getAllTracks();
|
|
587
|
+
* console.log(`Total tracks: ${tracks.length}`);
|
|
588
|
+
* ```
|
|
589
|
+
*/
|
|
590
|
+
getAllTracks() {
|
|
591
|
+
return Array.from(this.tracks.values());
|
|
592
|
+
}
|
|
593
|
+
/**
|
|
594
|
+
* Gets an audio track by its ID.
|
|
595
|
+
*
|
|
596
|
+
* @param id - The unique identifier of the audio track
|
|
597
|
+
* @returns The audio track, or undefined if not found
|
|
598
|
+
*
|
|
599
|
+
* @example
|
|
600
|
+
* ```typescript
|
|
601
|
+
* const music = AudioManager.getTrackById('bg-music');
|
|
602
|
+
* if (music) {
|
|
603
|
+
* music.play();
|
|
604
|
+
* }
|
|
605
|
+
* ```
|
|
606
|
+
*/
|
|
607
|
+
getTrackById(id) {
|
|
608
|
+
return this.tracks.get(id);
|
|
609
|
+
}
|
|
610
|
+
/**
|
|
611
|
+
* Gets the reactive audio manager state.
|
|
612
|
+
*
|
|
613
|
+
* This state is a Valtio proxy and can be used with useSnapshot() in React.
|
|
614
|
+
*
|
|
615
|
+
* @returns The reactive audio manager state
|
|
616
|
+
*
|
|
617
|
+
* @example
|
|
618
|
+
* ```typescript
|
|
619
|
+
* const state = AudioManager.getState();
|
|
620
|
+
* console.log(state.masterVolume); // 1.0
|
|
621
|
+
* ```
|
|
622
|
+
*/
|
|
623
|
+
getState() {
|
|
624
|
+
return this.state;
|
|
625
|
+
}
|
|
626
|
+
/**
|
|
627
|
+
* Disposes all audio tracks.
|
|
628
|
+
*
|
|
629
|
+
* Useful for cleanup when shutting down the game.
|
|
630
|
+
*
|
|
631
|
+
* @example
|
|
632
|
+
* ```typescript
|
|
633
|
+
* AudioManager.disposeAll();
|
|
634
|
+
* ```
|
|
635
|
+
*/
|
|
636
|
+
disposeAll() {
|
|
637
|
+
this.tracks.forEach((track) => track.dispose());
|
|
638
|
+
this.tracks.clear();
|
|
639
|
+
logger.log("All audio tracks disposed");
|
|
640
|
+
}
|
|
641
|
+
}
|
|
642
|
+
/**
|
|
643
|
+
* Singleton instance of the AudioManager.
|
|
644
|
+
*
|
|
645
|
+
* Use this to control all audio tracks globally.
|
|
646
|
+
*
|
|
647
|
+
* @example
|
|
648
|
+
* ```typescript
|
|
649
|
+
* import { AudioManager } from '@react-text-game/core/audio';
|
|
650
|
+
*
|
|
651
|
+
* AudioManager.setMasterVolume(0.8);
|
|
652
|
+
* AudioManager.muteAll();
|
|
653
|
+
* ```
|
|
654
|
+
*/
|
|
655
|
+
export const AudioManager = new AudioManagerClass();
|
|
656
|
+
//# sourceMappingURL=audioTrack.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audioTrack.js","sourceRoot":"","sources":["../../src/audio/audioTrack.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base JSONPath for audio storage within the system path.
|
|
3
|
+
*
|
|
4
|
+
* All audio tracks with IDs will be stored under this path.
|
|
5
|
+
* Individual tracks are stored at: $._system.audio.{id}
|
|
6
|
+
*/
|
|
7
|
+
export declare const AUDIO_STORAGE_PATH: "$._system.audio";
|
|
8
|
+
/**
|
|
9
|
+
* Default audio configuration values.
|
|
10
|
+
*/
|
|
11
|
+
export declare const DEFAULT_AUDIO_OPTIONS: {
|
|
12
|
+
readonly volume: 1;
|
|
13
|
+
readonly loop: false;
|
|
14
|
+
readonly playbackRate: 1;
|
|
15
|
+
readonly muted: false;
|
|
16
|
+
readonly autoPlay: false;
|
|
17
|
+
readonly preload: "metadata";
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/audio/constants.ts"],"names":[],"mappings":"AAGA;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,mBAA6D,CAAC;AAE7F;;GAEG;AACH,eAAO,MAAM,qBAAqB;;;;;;;CAOxB,CAAC"}
|