kawaijs 0.1.5 → 0.1.7

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.
@@ -1 +1 @@
1
- {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,YAAY,CAAC,UAAU,SAAM,EAAE,OAAO,GAAE,YAAiB,GAAG,OAAO,CAqgBlF"}
1
+ {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,YAAY,CAAC,UAAU,SAAM,EAAE,OAAO,GAAE,YAAiB,GAAG,OAAO,CAwuBlF"}
@@ -254,6 +254,34 @@ export function buildProject(projectDir = '.', options = {}) {
254
254
  const ok = evaluateCondition(inst.condition, this.state.variables);
255
255
  this.state.currentLabel = ok ? inst.thenLabel : (inst.elseLabel || inst.thenLabel);
256
256
  this.state.instructionPointer = 0;
257
+ } else if (inst.type === 'play_audio') {
258
+ for (const cb of this.audioListeners) {
259
+ cb({
260
+ action: 'play',
261
+ channel: inst.channel,
262
+ track: inst.track,
263
+ fade: inst.fade,
264
+ loop: inst.loop
265
+ });
266
+ }
267
+ if (inst.channel === 'music') {
268
+ this.state.audio.music = inst.track;
269
+ } else if (inst.channel === 'voice') {
270
+ this.state.audio.voice = inst.track;
271
+ }
272
+ } else if (inst.type === 'stop_audio') {
273
+ for (const cb of this.audioListeners) {
274
+ cb({
275
+ action: 'stop',
276
+ channel: inst.channel,
277
+ fade: inst.fade
278
+ });
279
+ }
280
+ if (inst.channel === 'music') {
281
+ this.state.audio.music = null;
282
+ } else if (inst.channel === 'voice') {
283
+ this.state.audio.voice = null;
284
+ }
257
285
  } else if (inst.type === 'return') {
258
286
  this.state.isFinished = true;
259
287
  }
@@ -268,10 +296,163 @@ export function buildProject(projectDir = '.', options = {}) {
268
296
  }
269
297
  notify() { for (const l of this.listeners) l(this.state); }
270
298
  }
299
+ class AudioManager {
300
+ constructor() {
301
+ this.masterVolume = 1.0;
302
+ this.musicVolume = 0.8;
303
+ this.soundVolume = 1.0;
304
+ this.voiceVolume = 1.0;
305
+ this.isMuted = false;
306
+ this.currentMusicAudio = null;
307
+ this.currentMusicTrack = null;
308
+ this.currentVoiceAudio = null;
309
+ this.soundPool = [];
310
+ this.isUnlocked = false;
311
+ this.pendingMusic = null;
312
+
313
+ const unlock = () => {
314
+ this.isUnlocked = true;
315
+ if (this.pendingMusic) {
316
+ const { src, options } = this.pendingMusic;
317
+ this.pendingMusic = null;
318
+ this.playMusic(src, options);
319
+ }
320
+ window.removeEventListener('click', unlock);
321
+ window.removeEventListener('keydown', unlock);
322
+ window.removeEventListener('touchstart', unlock);
323
+ };
324
+ window.addEventListener('click', unlock, { passive: true });
325
+ window.addEventListener('keydown', unlock, { passive: true });
326
+ window.addEventListener('touchstart', unlock, { passive: true });
327
+ }
328
+ toggleMute() {
329
+ this.isMuted = !this.isMuted;
330
+ if (this.currentMusicAudio) {
331
+ this.currentMusicAudio.volume = this.isMuted ? 0 : this.masterVolume * this.musicVolume;
332
+ }
333
+ return this.isMuted;
334
+ }
335
+ playMusic(src, options = {}) {
336
+ if (this.currentMusicTrack === src && this.currentMusicAudio && !this.currentMusicAudio.paused) {
337
+ return;
338
+ }
339
+ if (!this.isUnlocked) {
340
+ this.pendingMusic = { src, options };
341
+ }
342
+ const fadein = options.fadein ?? 0;
343
+ const loop = options.loop ?? true;
344
+ const targetVolume = this.isMuted ? 0 : (options.volume ?? 1) * this.masterVolume * this.musicVolume;
345
+
346
+ if (this.currentMusicAudio) {
347
+ this.stopMusic({ fadeout: fadein > 0 ? fadein : 0.3 });
348
+ }
349
+
350
+ const audio = new Audio(src);
351
+ audio.loop = loop;
352
+ this.currentMusicAudio = audio;
353
+ this.currentMusicTrack = src;
354
+
355
+ if (fadein > 0) {
356
+ audio.volume = 0;
357
+ audio.play().catch(() => {});
358
+ this.fadeVolume(audio, 0, targetVolume, fadein * 1000);
359
+ } else {
360
+ audio.volume = targetVolume;
361
+ audio.play().catch(() => {});
362
+ }
363
+ }
364
+ stopMusic(options = {}) {
365
+ const fadeout = options.fadeout ?? 0;
366
+ const audio = this.currentMusicAudio;
367
+ if (!audio) return;
368
+ this.currentMusicAudio = null;
369
+ this.currentMusicTrack = null;
370
+ this.pendingMusic = null;
371
+
372
+ if (fadeout > 0) {
373
+ this.fadeVolume(audio, audio.volume, 0, fadeout * 1000, () => {
374
+ audio.pause();
375
+ audio.src = '';
376
+ });
377
+ } else {
378
+ audio.pause();
379
+ audio.src = '';
380
+ }
381
+ }
382
+ playSound(src, volume = 1) {
383
+ if (this.isMuted) return;
384
+ const audio = new Audio(src);
385
+ audio.volume = volume * this.masterVolume * this.soundVolume;
386
+ audio.play().catch(() => {});
387
+ this.soundPool.push(audio);
388
+ audio.addEventListener('ended', () => {
389
+ const idx = this.soundPool.indexOf(audio);
390
+ if (idx !== -1) this.soundPool.splice(idx, 1);
391
+ });
392
+ }
393
+ playVoice(src, volume = 1) {
394
+ if (this.currentVoiceAudio) {
395
+ this.currentVoiceAudio.pause();
396
+ this.currentVoiceAudio.src = '';
397
+ }
398
+ if (this.isMuted) return;
399
+ const audio = new Audio(src);
400
+ audio.volume = volume * this.masterVolume * this.voiceVolume;
401
+ audio.play().catch(() => {});
402
+ this.currentVoiceAudio = audio;
403
+ }
404
+ stopVoice() {
405
+ if (this.currentVoiceAudio) {
406
+ this.currentVoiceAudio.pause();
407
+ this.currentVoiceAudio.src = '';
408
+ this.currentVoiceAudio = null;
409
+ }
410
+ }
411
+ fadeVolume(audio, from, to, durationMs, onComplete) {
412
+ const steps = 20;
413
+ const stepTime = durationMs / steps;
414
+ const volumeStep = (to - from) / steps;
415
+ let currentStep = 0;
416
+ const interval = setInterval(() => {
417
+ currentStep++;
418
+ if (this.isMuted) {
419
+ audio.volume = 0;
420
+ } else {
421
+ audio.volume = Math.max(0, Math.min(1, from + volumeStep * currentStep));
422
+ }
423
+ if (currentStep >= steps) {
424
+ clearInterval(interval);
425
+ if (!this.isMuted) audio.volume = to;
426
+ if (onComplete) onComplete();
427
+ }
428
+ }, stepTime);
429
+ }
430
+ attachToVM(vm, assetResolver) {
431
+ return vm.onAudioEvent((event) => {
432
+ if (event.action === 'play' && event.track) {
433
+ const url = assetResolver(event.track, event.channel);
434
+ if (event.channel === 'music') {
435
+ this.playMusic(url, { fadein: event.fade, loop: event.loop });
436
+ } else if (event.channel === 'sound') {
437
+ this.playSound(url);
438
+ } else if (event.channel === 'voice') {
439
+ this.playVoice(url);
440
+ }
441
+ } else if (event.action === 'stop') {
442
+ if (event.channel === 'music') {
443
+ this.stopMusic({ fadeout: event.fade });
444
+ } else if (event.channel === 'voice') {
445
+ this.stopVoice();
446
+ }
447
+ }
448
+ });
449
+ }
450
+ }
271
451
  class DOMRenderer {
272
- constructor(vm, container) {
452
+ constructor(vm, container, audioManager) {
273
453
  this.vm = vm;
274
454
  this.container = container;
455
+ this.audioManager = audioManager;
275
456
  this.isChoicePending = false;
276
457
  this.build();
277
458
  vm.onStateChange(s => this.render(s));
@@ -295,6 +476,7 @@ export function buildProject(projectDir = '.', options = {}) {
295
476
  <button class="kawa-btn kawa-hist">History</button>
296
477
  <button class="kawa-btn kawa-save">Save</button>
297
478
  <button class="kawa-btn kawa-load">Load</button>
479
+ <button class="kawa-btn kawa-mute" title="Toggle Mute">🔊</button>
298
480
  </nav>
299
481
  </div>
300
482
  </div>
@@ -310,12 +492,20 @@ export function buildProject(projectDir = '.', options = {}) {
310
492
  this.histBtn = this.container.querySelector('.kawa-hist');
311
493
  this.saveBtn = this.container.querySelector('.kawa-save');
312
494
  this.loadBtn = this.container.querySelector('.kawa-load');
495
+ this.muteBtn = this.container.querySelector('.kawa-mute');
313
496
 
314
497
  this.boxEl.addEventListener('click', () => this.vm.next());
315
498
  this.backBtn.addEventListener('click', (e) => { e.stopPropagation(); this.vm.rollback(); });
316
499
  this.histBtn.addEventListener('click', (e) => { e.stopPropagation(); this.showHistory(); });
317
500
  this.saveBtn.addEventListener('click', (e) => { e.stopPropagation(); this.showSaveLoad('save'); });
318
501
  this.loadBtn.addEventListener('click', (e) => { e.stopPropagation(); this.showSaveLoad('load'); });
502
+ if (this.muteBtn && this.audioManager) {
503
+ this.muteBtn.addEventListener('click', (e) => {
504
+ e.stopPropagation();
505
+ const isMuted = this.audioManager.toggleMute();
506
+ this.muteBtn.textContent = isMuted ? '🔇' : '🔊';
507
+ });
508
+ }
319
509
  window.addEventListener('keydown', (e) => {
320
510
  const modal = this.rootEl.querySelector('.kawa-modal-overlay');
321
511
  if (modal) {
@@ -327,6 +517,12 @@ export function buildProject(projectDir = '.', options = {}) {
327
517
  if (e.key === 's' || e.key === 'S') this.showSaveLoad('save');
328
518
  if (e.key === 'l' || e.key === 'L') this.showSaveLoad('load');
329
519
  if (e.key === 'h' || e.key === 'H') this.showHistory();
520
+ if (e.key === 'm' || e.key === 'M') {
521
+ if (this.audioManager && this.muteBtn) {
522
+ const isMuted = this.audioManager.toggleMute();
523
+ this.muteBtn.textContent = isMuted ? '🔇' : '🔊';
524
+ }
525
+ }
330
526
  });
331
527
  }
332
528
  render(state) {
@@ -403,6 +599,32 @@ export function buildProject(projectDir = '.', options = {}) {
403
599
  } else {
404
600
  this.choiceEl.style.display = 'none';
405
601
  }
602
+
603
+ if (state.isFinished) {
604
+ this.choiceEl.style.display = 'none';
605
+ const exEnd = this.rootEl.querySelector('.kawa-ending-card');
606
+ if (!exEnd) {
607
+ const endCard = document.createElement('div');
608
+ endCard.className = 'kawa-ending-card';
609
+ endCard.innerHTML = \`
610
+ <div class="kawa-ending-title">🌸 The End</div>
611
+ <div class="kawa-ending-subtitle">Story complete! Thank you for playing.</div>
612
+ <div style="display:flex;gap:12px;margin-top:16px;">
613
+ <button class="kawa-btn kawa-btn-replay">🔄 Play Again</button>
614
+ <button class="kawa-btn kawa-btn-load-end">📂 Load Slot</button>
615
+ </div>\`;
616
+ endCard.querySelector('.kawa-btn-replay').addEventListener('click', () => {
617
+ window.location.reload();
618
+ });
619
+ endCard.querySelector('.kawa-btn-load-end').addEventListener('click', () => {
620
+ this.showSaveLoad('load');
621
+ });
622
+ this.rootEl.appendChild(endCard);
623
+ }
624
+ } else {
625
+ const exEnd = this.rootEl.querySelector('.kawa-ending-card');
626
+ if (exEnd) exEnd.remove();
627
+ }
406
628
  }
407
629
  async showSaveLoad(mode) {
408
630
  const ex = this.rootEl.querySelector('.kawa-modal-overlay');
@@ -503,7 +725,12 @@ export function buildProject(projectDir = '.', options = {}) {
503
725
  }
504
726
 
505
727
  const vm = new StoryVM(story);
506
- new DOMRenderer(vm, document.getElementById('app'));
728
+ const audio = new AudioManager();
729
+ const audioResolver = (track, channel) => {
730
+ return track.includes('.') ? './assets/audio/' + track : './assets/audio/' + track + '.mp3';
731
+ };
732
+ audio.attachToVM(vm, audioResolver);
733
+ new DOMRenderer(vm, document.getElementById('app'), audio);
507
734
  vm.start();
508
735
  </script>
509
736
  </body>
@@ -1 +1 @@
1
- {"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAgB,cAAc,CAAC,UAAU,SAAM,EAAE,OAAO,GAAE,gBAAqB,GAAG,IAAI,CAkMrF"}
1
+ {"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAgB,cAAc,CAAC,UAAU,SAAM,EAAE,OAAO,GAAE,gBAAqB,GAAG,IAAI,CAqOrF"}
@@ -13,15 +13,27 @@ export function startDevServer(projectDir = '.', options = {}) {
13
13
  return;
14
14
  }
15
15
  const clients = new Set();
16
- // File watcher for auto-reload
16
+ // Debounced file watcher for auto-reload
17
+ let reloadTimeout = null;
17
18
  const gameDir = path.join(rootDir, 'game');
18
19
  if (fs.existsSync(gameDir)) {
19
20
  fs.watch(gameDir, { recursive: true }, (_eventType, filename) => {
20
- if (filename && (filename.endsWith('.kawa') || filename.endsWith('.css') || filename.startsWith('assets'))) {
21
- console.log(`🔄 [Kawa Dev] File changed: ${filename}. Reloading...`);
22
- for (const client of clients) {
23
- client.write(`data: reload\n\n`);
24
- }
21
+ if (filename &&
22
+ (filename.endsWith('.kawa') || filename.endsWith('.css') || filename.startsWith('assets')) &&
23
+ !filename.includes('~') &&
24
+ !filename.startsWith('.') &&
25
+ !filename.endsWith('.tmp')) {
26
+ if (reloadTimeout)
27
+ clearTimeout(reloadTimeout);
28
+ reloadTimeout = setTimeout(() => {
29
+ console.log(`🔄 [Kawa Dev] File changed: ${filename}. Reloading...`);
30
+ for (const client of clients) {
31
+ try {
32
+ client.write(`data: reload\n\n`);
33
+ }
34
+ catch { }
35
+ }
36
+ }, 250);
25
37
  }
26
38
  });
27
39
  }
@@ -157,7 +169,30 @@ export function startDevServer(projectDir = '.', options = {}) {
157
169
  // Inline runtime VM + DOM Renderer
158
170
  ${getInlineRuntimeScript()}
159
171
 
160
- window.__kawa_app = mountKawaApp(story, document.getElementById('app'));
172
+ const app = mountKawaApp(story, document.getElementById('app'));
173
+ window.__kawa_app = app;
174
+
175
+ // Auto-resume state on dev live reload
176
+ const DEV_SESSION_KEY = 'kawaijs_dev_state';
177
+ const savedDevState = sessionStorage.getItem(DEV_SESSION_KEY);
178
+ if (savedDevState) {
179
+ try {
180
+ const parsed = JSON.parse(savedDevState);
181
+ if (parsed && parsed.currentLabel && story.labels[parsed.currentLabel]) {
182
+ app.vm.state = parsed;
183
+ app.vm.snapshotStack = [parsed];
184
+ app.vm.notify();
185
+ }
186
+ } catch {}
187
+ }
188
+
189
+ app.vm.onStateChange((state) => {
190
+ if (!state.isFinished) {
191
+ sessionStorage.setItem(DEV_SESSION_KEY, JSON.stringify(state));
192
+ } else {
193
+ sessionStorage.removeItem(DEV_SESSION_KEY);
194
+ }
195
+ });
161
196
  } catch (err) {
162
197
  errorEl.style.display = 'block';
163
198
  errorEl.textContent = err.stack || err.message;
@@ -372,6 +407,34 @@ function getInlineRuntimeScript() {
372
407
  const ok = evaluateCondition(inst.condition, this.state.variables);
373
408
  this.state.currentLabel = ok ? inst.thenLabel : (inst.elseLabel || inst.thenLabel);
374
409
  this.state.instructionPointer = 0;
410
+ } else if (inst.type === 'play_audio') {
411
+ for (const cb of this.audioListeners) {
412
+ cb({
413
+ action: 'play',
414
+ channel: inst.channel,
415
+ track: inst.track,
416
+ fade: inst.fade,
417
+ loop: inst.loop
418
+ });
419
+ }
420
+ if (inst.channel === 'music') {
421
+ this.state.audio.music = inst.track;
422
+ } else if (inst.channel === 'voice') {
423
+ this.state.audio.voice = inst.track;
424
+ }
425
+ } else if (inst.type === 'stop_audio') {
426
+ for (const cb of this.audioListeners) {
427
+ cb({
428
+ action: 'stop',
429
+ channel: inst.channel,
430
+ fade: inst.fade
431
+ });
432
+ }
433
+ if (inst.channel === 'music') {
434
+ this.state.audio.music = null;
435
+ } else if (inst.channel === 'voice') {
436
+ this.state.audio.voice = null;
437
+ }
375
438
  } else if (inst.type === 'return') {
376
439
  this.state.isFinished = true;
377
440
  }
@@ -386,10 +449,164 @@ function getInlineRuntimeScript() {
386
449
  }
387
450
  notify() { for (const l of this.listeners) l(this.state); }
388
451
  }
452
+ class AudioManager {
453
+ constructor() {
454
+ this.masterVolume = 1.0;
455
+ this.musicVolume = 0.8;
456
+ this.soundVolume = 1.0;
457
+ this.voiceVolume = 1.0;
458
+ this.isMuted = false;
459
+ this.currentMusicAudio = null;
460
+ this.currentMusicTrack = null;
461
+ this.currentVoiceAudio = null;
462
+ this.soundPool = [];
463
+ this.isUnlocked = false;
464
+ this.pendingMusic = null;
465
+
466
+ // Auto-unlock audio context on first user interaction
467
+ const unlock = () => {
468
+ this.isUnlocked = true;
469
+ if (this.pendingMusic) {
470
+ const { src, options } = this.pendingMusic;
471
+ this.pendingMusic = null;
472
+ this.playMusic(src, options);
473
+ }
474
+ window.removeEventListener('click', unlock);
475
+ window.removeEventListener('keydown', unlock);
476
+ window.removeEventListener('touchstart', unlock);
477
+ };
478
+ window.addEventListener('click', unlock, { passive: true });
479
+ window.addEventListener('keydown', unlock, { passive: true });
480
+ window.addEventListener('touchstart', unlock, { passive: true });
481
+ }
482
+ toggleMute() {
483
+ this.isMuted = !this.isMuted;
484
+ if (this.currentMusicAudio) {
485
+ this.currentMusicAudio.volume = this.isMuted ? 0 : this.masterVolume * this.musicVolume;
486
+ }
487
+ return this.isMuted;
488
+ }
489
+ playMusic(src, options = {}) {
490
+ if (this.currentMusicTrack === src && this.currentMusicAudio && !this.currentMusicAudio.paused) {
491
+ return;
492
+ }
493
+ if (!this.isUnlocked) {
494
+ this.pendingMusic = { src, options };
495
+ }
496
+ const fadein = options.fadein ?? 0;
497
+ const loop = options.loop ?? true;
498
+ const targetVolume = this.isMuted ? 0 : (options.volume ?? 1) * this.masterVolume * this.musicVolume;
499
+
500
+ if (this.currentMusicAudio) {
501
+ this.stopMusic({ fadeout: fadein > 0 ? fadein : 0.3 });
502
+ }
503
+
504
+ const audio = new Audio(src);
505
+ audio.loop = loop;
506
+ this.currentMusicAudio = audio;
507
+ this.currentMusicTrack = src;
508
+
509
+ if (fadein > 0) {
510
+ audio.volume = 0;
511
+ audio.play().catch(() => {});
512
+ this.fadeVolume(audio, 0, targetVolume, fadein * 1000);
513
+ } else {
514
+ audio.volume = targetVolume;
515
+ audio.play().catch(() => {});
516
+ }
517
+ }
518
+ stopMusic(options = {}) {
519
+ const fadeout = options.fadeout ?? 0;
520
+ const audio = this.currentMusicAudio;
521
+ if (!audio) return;
522
+ this.currentMusicAudio = null;
523
+ this.currentMusicTrack = null;
524
+ this.pendingMusic = null;
525
+
526
+ if (fadeout > 0) {
527
+ this.fadeVolume(audio, audio.volume, 0, fadeout * 1000, () => {
528
+ audio.pause();
529
+ audio.src = '';
530
+ });
531
+ } else {
532
+ audio.pause();
533
+ audio.src = '';
534
+ }
535
+ }
536
+ playSound(src, volume = 1) {
537
+ if (this.isMuted) return;
538
+ const audio = new Audio(src);
539
+ audio.volume = volume * this.masterVolume * this.soundVolume;
540
+ audio.play().catch(() => {});
541
+ this.soundPool.push(audio);
542
+ audio.addEventListener('ended', () => {
543
+ const idx = this.soundPool.indexOf(audio);
544
+ if (idx !== -1) this.soundPool.splice(idx, 1);
545
+ });
546
+ }
547
+ playVoice(src, volume = 1) {
548
+ if (this.currentVoiceAudio) {
549
+ this.currentVoiceAudio.pause();
550
+ this.currentVoiceAudio.src = '';
551
+ }
552
+ if (this.isMuted) return;
553
+ const audio = new Audio(src);
554
+ audio.volume = volume * this.masterVolume * this.voiceVolume;
555
+ audio.play().catch(() => {});
556
+ this.currentVoiceAudio = audio;
557
+ }
558
+ stopVoice() {
559
+ if (this.currentVoiceAudio) {
560
+ this.currentVoiceAudio.pause();
561
+ this.currentVoiceAudio.src = '';
562
+ this.currentVoiceAudio = null;
563
+ }
564
+ }
565
+ fadeVolume(audio, from, to, durationMs, onComplete) {
566
+ const steps = 20;
567
+ const stepTime = durationMs / steps;
568
+ const volumeStep = (to - from) / steps;
569
+ let currentStep = 0;
570
+ const interval = setInterval(() => {
571
+ currentStep++;
572
+ if (this.isMuted) {
573
+ audio.volume = 0;
574
+ } else {
575
+ audio.volume = Math.max(0, Math.min(1, from + volumeStep * currentStep));
576
+ }
577
+ if (currentStep >= steps) {
578
+ clearInterval(interval);
579
+ if (!this.isMuted) audio.volume = to;
580
+ if (onComplete) onComplete();
581
+ }
582
+ }, stepTime);
583
+ }
584
+ attachToVM(vm, assetResolver) {
585
+ return vm.onAudioEvent((event) => {
586
+ if (event.action === 'play' && event.track) {
587
+ const url = assetResolver(event.track, event.channel);
588
+ if (event.channel === 'music') {
589
+ this.playMusic(url, { fadein: event.fade, loop: event.loop });
590
+ } else if (event.channel === 'sound') {
591
+ this.playSound(url);
592
+ } else if (event.channel === 'voice') {
593
+ this.playVoice(url);
594
+ }
595
+ } else if (event.action === 'stop') {
596
+ if (event.channel === 'music') {
597
+ this.stopMusic({ fadeout: event.fade });
598
+ } else if (event.channel === 'voice') {
599
+ this.stopVoice();
600
+ }
601
+ }
602
+ });
603
+ }
604
+ }
389
605
  class DOMRenderer {
390
- constructor(vm, container) {
606
+ constructor(vm, container, audioManager) {
391
607
  this.vm = vm;
392
608
  this.container = container;
609
+ this.audioManager = audioManager;
393
610
  this.isChoicePending = false;
394
611
  this.build();
395
612
  vm.onStateChange(s => this.render(s));
@@ -413,6 +630,7 @@ function getInlineRuntimeScript() {
413
630
  <button class="kawa-btn kawa-hist">History</button>
414
631
  <button class="kawa-btn kawa-save">Save</button>
415
632
  <button class="kawa-btn kawa-load">Load</button>
633
+ <button class="kawa-btn kawa-mute" title="Toggle Mute">🔊</button>
416
634
  </nav>
417
635
  </div>
418
636
  </div>
@@ -428,12 +646,20 @@ function getInlineRuntimeScript() {
428
646
  this.histBtn = this.container.querySelector('.kawa-hist');
429
647
  this.saveBtn = this.container.querySelector('.kawa-save');
430
648
  this.loadBtn = this.container.querySelector('.kawa-load');
649
+ this.muteBtn = this.container.querySelector('.kawa-mute');
431
650
 
432
651
  this.boxEl.addEventListener('click', () => this.vm.next());
433
652
  this.backBtn.addEventListener('click', (e) => { e.stopPropagation(); this.vm.rollback(); });
434
653
  this.histBtn.addEventListener('click', (e) => { e.stopPropagation(); this.showHistory(); });
435
654
  this.saveBtn.addEventListener('click', (e) => { e.stopPropagation(); this.showSaveLoad('save'); });
436
655
  this.loadBtn.addEventListener('click', (e) => { e.stopPropagation(); this.showSaveLoad('load'); });
656
+ if (this.muteBtn && this.audioManager) {
657
+ this.muteBtn.addEventListener('click', (e) => {
658
+ e.stopPropagation();
659
+ const isMuted = this.audioManager.toggleMute();
660
+ this.muteBtn.textContent = isMuted ? '🔇' : '🔊';
661
+ });
662
+ }
437
663
  window.addEventListener('keydown', (e) => {
438
664
  const modal = this.rootEl.querySelector('.kawa-modal-overlay');
439
665
  if (modal) {
@@ -445,6 +671,12 @@ function getInlineRuntimeScript() {
445
671
  if (e.key === 's' || e.key === 'S') this.showSaveLoad('save');
446
672
  if (e.key === 'l' || e.key === 'L') this.showSaveLoad('load');
447
673
  if (e.key === 'h' || e.key === 'H') this.showHistory();
674
+ if (e.key === 'm' || e.key === 'M') {
675
+ if (this.audioManager && this.muteBtn) {
676
+ const isMuted = this.audioManager.toggleMute();
677
+ this.muteBtn.textContent = isMuted ? '🔇' : '🔊';
678
+ }
679
+ }
448
680
  });
449
681
  }
450
682
  render(state) {
@@ -521,6 +753,33 @@ function getInlineRuntimeScript() {
521
753
  } else {
522
754
  this.choiceEl.style.display = 'none';
523
755
  }
756
+
757
+ if (state.isFinished) {
758
+ this.choiceEl.style.display = 'none';
759
+ const exEnd = this.rootEl.querySelector('.kawa-ending-card');
760
+ if (!exEnd) {
761
+ const endCard = document.createElement('div');
762
+ endCard.className = 'kawa-ending-card';
763
+ endCard.innerHTML = \`
764
+ <div class="kawa-ending-title">🌸 The End</div>
765
+ <div class="kawa-ending-subtitle">Story complete! Thank you for playing.</div>
766
+ <div style="display:flex;gap:12px;margin-top:16px;">
767
+ <button class="kawa-btn kawa-btn-replay">🔄 Play Again</button>
768
+ <button class="kawa-btn kawa-btn-load-end">📂 Load Slot</button>
769
+ </div>\`;
770
+ endCard.querySelector('.kawa-btn-replay').addEventListener('click', () => {
771
+ sessionStorage.removeItem('kawaijs_dev_state');
772
+ window.location.reload();
773
+ });
774
+ endCard.querySelector('.kawa-btn-load-end').addEventListener('click', () => {
775
+ this.showSaveLoad('load');
776
+ });
777
+ this.rootEl.appendChild(endCard);
778
+ }
779
+ } else {
780
+ const exEnd = this.rootEl.querySelector('.kawa-ending-card');
781
+ if (exEnd) exEnd.remove();
782
+ }
524
783
  }
525
784
  async showSaveLoad(mode) {
526
785
  const ex = this.rootEl.querySelector('.kawa-modal-overlay');
@@ -621,9 +880,14 @@ function getInlineRuntimeScript() {
621
880
  }
622
881
  function mountKawaApp(story, container) {
623
882
  const vm = new StoryVM(story);
624
- const renderer = new DOMRenderer(vm, container);
883
+ const audio = new AudioManager();
884
+ const audioResolver = (track, channel) => {
885
+ return track.includes('.') ? '/assets/audio/' + track : '/assets/audio/' + track + '.mp3';
886
+ };
887
+ audio.attachToVM(vm, audioResolver);
888
+ const renderer = new DOMRenderer(vm, container, audio);
625
889
  vm.start();
626
- return { vm, renderer };
890
+ return { vm, renderer, audio };
627
891
  }
628
892
  `;
629
893
  }
@@ -1 +1 @@
1
- {"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAO7E,MAAM,UAAU,cAAc,CAAC,UAAU,GAAG,GAAG,EAAE,UAA4B,EAAE;IAC7E,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,CAAC,CAAC;IACxD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC;IAC7D,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;IAC1D,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IACvD,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC;IAEhC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,KAAK,CAAC,yBAAyB,UAAU,0DAA0D,CAAC,CAAC;QAC7G,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,GAAG,EAAuB,CAAC;IAE/C,yCAAyC;IACzC,IAAI,aAAa,GAA0B,IAAI,CAAC;IAChD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC3C,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC,UAAU,EAAE,QAAQ,EAAE,EAAE;YAC9D,IACE,QAAQ;gBACR,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;gBAC1F,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC;gBACvB,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC;gBACzB,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,EAC1B,CAAC;gBACD,IAAI,aAAa;oBAAE,YAAY,CAAC,aAAa,CAAC,CAAC;gBAC/C,aAAa,GAAG,UAAU,CAAC,GAAG,EAAE;oBAC9B,OAAO,CAAC,GAAG,CAAC,+BAA+B,QAAQ,gBAAgB,CAAC,CAAC;oBACrE,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;wBAC7B,IAAI,CAAC;4BACH,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;wBACnC,CAAC;wBAAC,MAAM,CAAC,CAAA,CAAC;oBACZ,CAAC;gBACH,CAAC,EAAE,GAAG,CAAC,CAAC;YACV,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QAC5C,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC;QAE3B,8BAA8B;QAC9B,IAAI,GAAG,KAAK,gBAAgB,EAAE,CAAC;YAC7B,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;gBACjB,cAAc,EAAE,mBAAmB;gBACnC,eAAe,EAAE,UAAU;gBAC3B,YAAY,EAAE,YAAY;gBAC1B,6BAA6B,EAAE,GAAG;aACnC,CAAC,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACjB,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAC3C,OAAO;QACT,CAAC;QAED,4BAA4B;QAC5B,IAAI,GAAG,KAAK,iBAAiB,EAAE,CAAC;YAC9B,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;gBACpD,MAAM,KAAK,GAAG,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC;gBAC/D,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;gBAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;YACjC,CAAC;YAAC,OAAO,GAAY,EAAE,CAAC;gBACtB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;gBAC3D,IAAI,MAAM,GAAG,mBAAmB,CAAC;gBACjC,IAAI,GAAG,YAAY,SAAS,EAAE,CAAC;oBAC7B,MAAM,MAAM,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;oBACpD,MAAM,GAAG,gBAAgB,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;gBACpD,CAAC;qBAAM,IAAI,GAAG,YAAY,KAAK,EAAE,CAAC;oBAChC,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC;gBACvB,CAAC;gBACD,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;YAC7C,CAAC;YACD,OAAO;QACT,CAAC;QAED,+BAA+B;QAC/B,IAAI,GAAG,KAAK,YAAY,EAAE,CAAC;YACzB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,UAAU,EAAE,CAAC,CAAC;YACnD,IAAI,WAAW,GAAG,4BAA4B,CAAC;YAE/C,kCAAkC;YAClC,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;YAC/I,IAAI,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;gBAChC,WAAW,IAAI,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;YAC/D,CAAC;YAED,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC7B,WAAW,IAAI,4BAA4B,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YACpF,CAAC;YACD,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,6BAA6B;QAC7B,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC/B,MAAM,OAAO,GAAG,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC;YAChE,IAAI,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YAE7C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC7B,uEAAuE;gBACvE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gBACpC,KAAK,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;oBAC7E,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC;oBAC3D,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;wBAChE,QAAQ,GAAG,SAAS,CAAC;wBACrB,MAAM;oBACR,CAAC;gBACH,CAAC;YACH,CAAC;YAED,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;gBAC9D,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;gBACjD,MAAM,SAAS,GAA2B;oBACxC,MAAM,EAAE,WAAW;oBACnB,MAAM,EAAE,YAAY;oBACpB,OAAO,EAAE,YAAY;oBACrB,OAAO,EAAE,YAAY;oBACrB,MAAM,EAAE,eAAe;oBACvB,MAAM,EAAE,YAAY;oBACpB,MAAM,EAAE,WAAW;oBACnB,MAAM,EAAE,WAAW;iBACpB,CAAC;gBACF,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,SAAS,CAAC,GAAG,CAAC,IAAI,0BAA0B,EAAE,CAAC,CAAC;gBACrF,EAAE,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACxC,OAAO;YACT,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC,CAAC;gBACrD,GAAG,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;gBAC3B,OAAO;YACT,CAAC;QACH,CAAC;QAED,8BAA8B;QAC9B,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,0BAA0B,EAAE,CAAC,CAAC;QACnE,GAAG,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAwCF,sBAAsB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAmC1B,CAAC,CAAC;IACR,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAwB,EAAE,EAAE;QAC9C,IAAI,CAAC,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,sBAAsB,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;YAC7D,IAAI,IAAI,CAAC,CAAC;YACV,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC;QACpC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE;QACvB,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,0CAA0C,IAAI,SAAS,CAAC,CAAC;QACrE,OAAO,CAAC,GAAG,CAAC,iBAAiB,OAAO,EAAE,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,iEAAiE,CAAC,CAAC;IACjF,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,sBAAsB;IAC7B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2pBN,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kawaijs",
3
- "version": "0.1.5",
3
+ "version": "0.1.7",
4
4
  "description": "Web-native visual novel engine and toolchain inspired by Ren'Py",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -31,12 +31,12 @@
31
31
  "typecheck": "tsc --noEmit"
32
32
  },
33
33
  "dependencies": {
34
- "@kawaijs/ast": "^0.1.5",
35
- "@kawaijs/parser": "^0.1.5",
36
- "@kawaijs/runtime": "^0.1.5",
37
- "@kawaijs/renderer-dom": "^0.1.5",
38
- "@kawaijs/audio": "^0.1.5",
39
- "@kawaijs/vite-plugin": "^0.1.5"
34
+ "@kawaijs/ast": "^0.1.7",
35
+ "@kawaijs/parser": "^0.1.7",
36
+ "@kawaijs/runtime": "^0.1.7",
37
+ "@kawaijs/renderer-dom": "^0.1.7",
38
+ "@kawaijs/audio": "^0.1.7",
39
+ "@kawaijs/vite-plugin": "^0.1.7"
40
40
  },
41
41
  "keywords": [
42
42
  "kawaijs",