kawaijs 0.1.2 → 0.1.3

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,CAmXlF"}
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"}
@@ -93,6 +93,16 @@ export function buildProject(projectDir = '.', options = {}) {
93
93
  const raw = this.storage.getItem('kawaijs_save_' + id);
94
94
  return raw ? JSON.parse(raw) : null;
95
95
  }
96
+ async deleteSlot(id) {
97
+ this.storage.removeItem('kawaijs_save_' + id);
98
+ }
99
+ async listSlots(total = 6) {
100
+ const slots = [];
101
+ for (let i = 1; i <= total; i++) {
102
+ slots.push(await this.loadSlot(String(i)));
103
+ }
104
+ return slots;
105
+ }
96
106
  }
97
107
  function evaluateCondition(cond, vars) {
98
108
  const t = (cond || '').trim();
@@ -147,18 +157,21 @@ export function buildProject(projectDir = '.', options = {}) {
147
157
  };
148
158
  this.snapshotStack = [];
149
159
  this.listeners = new Set();
160
+ this.audioListeners = new Set();
161
+ this.history = [];
150
162
  this.saveManager = new SaveManager();
163
+ this.isExecuting = false;
151
164
  }
152
165
  getState() { return this.state; }
153
166
  onStateChange(cb) { this.listeners.add(cb); return () => this.listeners.delete(cb); }
154
167
  start() { this.execute(); }
155
168
  next() {
156
- if (this.state.isFinished || (this.state.choices && this.state.choices.length > 0)) return;
169
+ if (this.state.isFinished || this.isExecuting || (this.state.choices && this.state.choices.length > 0)) return;
157
170
  this.state.isWaitingForInput = false;
158
171
  this.execute();
159
172
  }
160
173
  choose(idx) {
161
- if (!this.state.choices || !this.state.choices[idx]) return;
174
+ if (this.isExecuting || !this.state.choices || !this.state.choices[idx]) return;
162
175
  const choice = this.state.choices[idx];
163
176
  this.state.choices = null;
164
177
  this.state.isWaitingForInput = false;
@@ -179,70 +192,77 @@ export function buildProject(projectDir = '.', options = {}) {
179
192
  }
180
193
  canRollback() { return this.snapshotStack.length > 1; }
181
194
  async save(slot) {
182
- await this.saveManager.saveSlot(slot, this.state, this.state.dialogue ? this.state.dialogue.text : '');
195
+ await this.saveManager.saveSlot(slot, JSON.parse(JSON.stringify(this.state)), this.state.dialogue ? this.state.dialogue.text : '');
183
196
  }
184
197
  async load(slot) {
185
198
  const data = await this.saveManager.loadSlot(slot);
186
199
  if (data && data.snapshot) {
187
- this.state = JSON.parse(JSON.stringify(data.snapshot));
188
- this.snapshotStack = [this.state];
200
+ this.state = JSON.parse(JSON.stringify(data.snapshot.state || data.snapshot));
201
+ this.snapshotStack = [JSON.parse(JSON.stringify(this.state))];
189
202
  this.notify();
190
203
  return true;
191
204
  }
192
205
  return false;
193
206
  }
194
207
  execute() {
195
- while (!this.state.isWaitingForInput && !this.state.isFinished) {
196
- const list = this.story.labels[this.state.currentLabel];
197
- if (!list || this.state.instructionPointer >= list.length) {
198
- if (this.state.callStack.length > 0) {
199
- const frame = this.state.callStack.pop();
200
- this.state.currentLabel = frame.returnLabel;
201
- this.state.instructionPointer = frame.returnPointer;
202
- continue;
208
+ if (this.isExecuting) return;
209
+ this.isExecuting = true;
210
+ try {
211
+ while (!this.state.isWaitingForInput && !this.state.isFinished) {
212
+ const list = this.story.labels[this.state.currentLabel];
213
+ if (!list || this.state.instructionPointer >= list.length) {
214
+ if (this.state.callStack.length > 0) {
215
+ const frame = this.state.callStack.pop();
216
+ this.state.currentLabel = frame.returnLabel;
217
+ this.state.instructionPointer = frame.returnPointer;
218
+ continue;
219
+ }
220
+ this.state.isFinished = true;
221
+ break;
222
+ }
223
+ const inst = list[this.state.instructionPointer++];
224
+ if (inst.type === 'scene') {
225
+ this.state.visual.background = inst.background;
226
+ this.state.visual.characters = {};
227
+ } else if (inst.type === 'show') {
228
+ this.state.visual.characters[inst.character] = {
229
+ expression: inst.expression,
230
+ position: inst.position || 'center'
231
+ };
232
+ } else if (inst.type === 'hide') {
233
+ delete this.state.visual.characters[inst.character];
234
+ } else if (inst.type === 'dialogue') {
235
+ const charDef = inst.speaker ? this.story.characters[inst.speaker] : null;
236
+ this.state.dialogue = {
237
+ speaker: inst.speaker,
238
+ speakerDisplayName: charDef ? charDef.name : inst.speaker,
239
+ speakerColor: charDef ? charDef.color : null,
240
+ text: inst.text
241
+ };
242
+ this.state.isWaitingForInput = true;
243
+ this.history.push(this.state.dialogue);
244
+ } else if (inst.type === 'choice') {
245
+ this.state.choices = inst.choices;
246
+ this.state.isWaitingForInput = true;
247
+ } else if (inst.type === 'jump') {
248
+ this.state.currentLabel = inst.targetLabel;
249
+ this.state.instructionPointer = 0;
250
+ } else if (inst.type === 'set') {
251
+ const curr = this.state.variables[inst.variable];
252
+ this.state.variables[inst.variable] = applySetOp(curr, inst.operator, inst.value, this.state.variables);
253
+ } else if (inst.type === 'branch') {
254
+ const ok = evaluateCondition(inst.condition, this.state.variables);
255
+ this.state.currentLabel = ok ? inst.thenLabel : (inst.elseLabel || inst.thenLabel);
256
+ this.state.instructionPointer = 0;
257
+ } else if (inst.type === 'return') {
258
+ this.state.isFinished = true;
203
259
  }
204
- this.state.isFinished = true;
205
- break;
206
260
  }
207
- const inst = list[this.state.instructionPointer++];
208
- if (inst.type === 'scene') {
209
- this.state.visual.background = inst.background;
210
- this.state.visual.characters = {};
211
- } else if (inst.type === 'show') {
212
- this.state.visual.characters[inst.character] = {
213
- expression: inst.expression,
214
- position: inst.position || 'center'
215
- };
216
- } else if (inst.type === 'hide') {
217
- delete this.state.visual.characters[inst.character];
218
- } else if (inst.type === 'dialogue') {
219
- const charDef = inst.speaker ? this.story.characters[inst.speaker] : null;
220
- this.state.dialogue = {
221
- speaker: inst.speaker,
222
- speakerDisplayName: charDef ? charDef.name : inst.speaker,
223
- speakerColor: charDef ? charDef.color : null,
224
- text: inst.text
225
- };
226
- this.state.isWaitingForInput = true;
227
- } else if (inst.type === 'choice') {
228
- this.state.choices = inst.choices;
229
- this.state.isWaitingForInput = true;
230
- } else if (inst.type === 'jump') {
231
- this.state.currentLabel = inst.targetLabel;
232
- this.state.instructionPointer = 0;
233
- } else if (inst.type === 'set') {
234
- const curr = this.state.variables[inst.variable];
235
- this.state.variables[inst.variable] = applySetOp(curr, inst.operator, inst.value, this.state.variables);
236
- } else if (inst.type === 'branch') {
237
- const ok = evaluateCondition(inst.condition, this.state.variables);
238
- this.state.currentLabel = ok ? inst.thenLabel : (inst.elseLabel || inst.thenLabel);
239
- this.state.instructionPointer = 0;
240
- } else if (inst.type === 'return') {
241
- this.state.isFinished = true;
261
+ if (this.state.isWaitingForInput) {
262
+ this.snapshotStack.push(JSON.parse(JSON.stringify(this.state)));
242
263
  }
243
- }
244
- if (this.state.isWaitingForInput) {
245
- this.snapshotStack.push(JSON.parse(JSON.stringify(this.state)));
264
+ } finally {
265
+ this.isExecuting = false;
246
266
  }
247
267
  this.notify();
248
268
  }
@@ -252,6 +272,7 @@ export function buildProject(projectDir = '.', options = {}) {
252
272
  constructor(vm, container) {
253
273
  this.vm = vm;
254
274
  this.container = container;
275
+ this.isChoicePending = false;
255
276
  this.build();
256
277
  vm.onStateChange(s => this.render(s));
257
278
  this.render(vm.getState());
@@ -271,12 +292,14 @@ export function buildProject(projectDir = '.', options = {}) {
271
292
  </div>
272
293
  <nav class="kawa-quick-menu">
273
294
  <button class="kawa-btn kawa-back">Back</button>
295
+ <button class="kawa-btn kawa-hist">History</button>
274
296
  <button class="kawa-btn kawa-save">Save</button>
275
297
  <button class="kawa-btn kawa-load">Load</button>
276
298
  </nav>
277
299
  </div>
278
300
  </div>
279
301
  </div>\`;
302
+ this.rootEl = this.container.querySelector('.kawa-root');
280
303
  this.bgEl = this.container.querySelector('.kawa-background');
281
304
  this.charsEl = this.container.querySelector('.kawa-characters');
282
305
  this.boxEl = this.container.querySelector('.kawa-dialogue-box');
@@ -284,23 +307,34 @@ export function buildProject(projectDir = '.', options = {}) {
284
307
  this.txtEl = this.container.querySelector('.kawa-dialogue-text');
285
308
  this.choiceEl = this.container.querySelector('.kawa-choice-container');
286
309
  this.backBtn = this.container.querySelector('.kawa-back');
310
+ this.histBtn = this.container.querySelector('.kawa-hist');
287
311
  this.saveBtn = this.container.querySelector('.kawa-save');
288
312
  this.loadBtn = this.container.querySelector('.kawa-load');
289
313
 
290
314
  this.boxEl.addEventListener('click', () => this.vm.next());
291
315
  this.backBtn.addEventListener('click', (e) => { e.stopPropagation(); this.vm.rollback(); });
292
- this.saveBtn.addEventListener('click', async (e) => { e.stopPropagation(); await this.vm.save('1'); alert('Saved to Slot 1'); });
293
- this.loadBtn.addEventListener('click', async (e) => { e.stopPropagation(); if (await this.vm.load('1')) alert('Loaded Slot 1'); });
316
+ this.histBtn.addEventListener('click', (e) => { e.stopPropagation(); this.showHistory(); });
317
+ this.saveBtn.addEventListener('click', (e) => { e.stopPropagation(); this.showSaveLoad('save'); });
318
+ this.loadBtn.addEventListener('click', (e) => { e.stopPropagation(); this.showSaveLoad('load'); });
294
319
  window.addEventListener('keydown', (e) => {
320
+ const modal = this.rootEl.querySelector('.kawa-modal-overlay');
321
+ if (modal) {
322
+ if (e.key === 'Escape') modal.remove();
323
+ return;
324
+ }
295
325
  if (e.code === 'Space' || e.code === 'Enter') { e.preventDefault(); this.vm.next(); }
296
326
  if (e.code === 'Backspace') { e.preventDefault(); this.vm.rollback(); }
327
+ if (e.key === 's' || e.key === 'S') this.showSaveLoad('save');
328
+ if (e.key === 'l' || e.key === 'L') this.showSaveLoad('load');
329
+ if (e.key === 'h' || e.key === 'H') this.showHistory();
297
330
  });
298
331
  }
299
332
  render(state) {
333
+ this.isChoicePending = false;
300
334
  this.backBtn.disabled = !this.vm.canRollback();
301
335
  if (state.visual.background) {
302
336
  const bg = state.visual.background.replace(/^bg\\s+/, '');
303
- this.bgEl.style.backgroundImage = 'url("./assets/backgrounds/' + bg + (bg.includes('.') ? '' : '.png') + '")';
337
+ this.bgEl.style.backgroundImage = 'url("./assets/backgrounds/' + bg + (bg.includes('.') ? '' : '.svg') + '"), url("./assets/backgrounds/' + bg + '.png")';
304
338
  this.bgEl.style.opacity = '1';
305
339
  } else {
306
340
  this.bgEl.style.opacity = '0';
@@ -312,15 +346,22 @@ export function buildProject(projectDir = '.', options = {}) {
312
346
  div.className = 'kawa-sprite kawa-pos-' + (char.position || 'center');
313
347
  const img = document.createElement('img');
314
348
  const expr = char.expression ? '/' + char.expression : '';
315
- img.src = './assets/characters/' + id + expr + '.png';
349
+ img.src = './assets/characters/' + id + expr + '.svg';
316
350
  img.alt = id;
351
+ let fallback = 0;
317
352
  img.onerror = () => {
318
- img.style.display = 'none';
319
- div.style.width = '200px'; div.style.height = '400px';
320
- div.style.background = 'rgba(244,63,94,0.3)'; div.style.border = '2px dashed #f43f5e';
321
- div.style.borderRadius = '16px'; div.style.display = 'flex'; div.style.alignItems = 'center';
322
- div.style.justifyContent = 'center'; div.style.color = '#fff';
323
- div.textContent = id + (char.expression ? ' (' + char.expression + ')' : '');
353
+ fallback++;
354
+ if (fallback === 1) img.src = './assets/characters/' + id + expr + '.png';
355
+ else if (fallback === 2 && char.expression) img.src = './assets/characters/' + id + '_' + char.expression + '.svg';
356
+ else if (fallback === 3 && char.expression) img.src = './assets/characters/' + id + '_' + char.expression + '.png';
357
+ else {
358
+ img.style.display = 'none';
359
+ div.style.width = '220px'; div.style.height = '420px';
360
+ div.style.background = 'rgba(244,63,94,0.25)'; div.style.border = '2px dashed #f43f5e';
361
+ div.style.borderRadius = '16px'; div.style.display = 'flex'; div.style.alignItems = 'center';
362
+ div.style.justifyContent = 'center'; div.style.color = '#fff'; div.style.fontWeight = '600';
363
+ div.textContent = id + (char.expression ? ' (' + char.expression + ')' : '');
364
+ }
324
365
  };
325
366
  div.appendChild(img);
326
367
  this.charsEl.appendChild(div);
@@ -343,17 +384,122 @@ export function buildProject(projectDir = '.', options = {}) {
343
384
  if (state.choices && state.choices.length > 0) {
344
385
  this.choiceEl.innerHTML = '';
345
386
  this.choiceEl.style.display = 'flex';
387
+ this.choiceEl.style.pointerEvents = 'auto';
388
+ this.choiceEl.style.opacity = '1';
346
389
  state.choices.forEach((c, idx) => {
347
390
  const btn = document.createElement('button');
348
391
  btn.className = 'kawa-choice-btn kawa-choice';
349
392
  btn.textContent = c.text;
350
- btn.addEventListener('click', (e) => { e.stopPropagation(); this.vm.choose(idx); });
393
+ btn.addEventListener('click', (e) => {
394
+ e.stopPropagation();
395
+ if (this.isChoicePending) return;
396
+ this.isChoicePending = true;
397
+ this.choiceEl.style.pointerEvents = 'none';
398
+ this.choiceEl.style.opacity = '0.5';
399
+ this.vm.choose(idx);
400
+ });
351
401
  this.choiceEl.appendChild(btn);
352
402
  });
353
403
  } else {
354
404
  this.choiceEl.style.display = 'none';
355
405
  }
356
406
  }
407
+ async showSaveLoad(mode) {
408
+ const ex = this.rootEl.querySelector('.kawa-modal-overlay');
409
+ if (ex) ex.remove();
410
+ const ov = document.createElement('div');
411
+ ov.className = 'kawa-modal-overlay';
412
+ const card = document.createElement('div');
413
+ card.className = 'kawa-modal-card';
414
+ card.innerHTML = \`
415
+ <div class="kawa-modal-header">
416
+ <div class="kawa-modal-title">\${mode === 'save' ? '💾 Save Game' : '📂 Load Game'}</div>
417
+ <button class="kawa-btn kawa-close-btn">✕ Close</button>
418
+ </div>
419
+ <div class="kawa-modal-body"><div class="kawa-slots-grid"></div></div>\`;
420
+ card.querySelector('.kawa-close-btn').addEventListener('click', () => ov.remove());
421
+ const grid = card.querySelector('.kawa-slots-grid');
422
+ const slots = await this.vm.saveManager.listSlots(6);
423
+ slots.forEach((s, i) => {
424
+ const num = String(i + 1);
425
+ const c = document.createElement('div');
426
+ c.className = 'kawa-slot-card';
427
+ c.innerHTML = \`
428
+ <div class="kawa-slot-header">
429
+ <span class="kawa-slot-badge">Slot \${num}</span>
430
+ <span class="kawa-slot-time">\${s ? new Date(s.timestamp).toLocaleTimeString() : 'Empty'}</span>
431
+ </div>
432
+ <div class="kawa-slot-preview">\${s ? (s.previewText || 'Game in progress') : '<span class="kawa-slot-empty-text">No save data</span>'}</div>
433
+ <div class="kawa-slot-actions"></div>\`;
434
+ const act = c.querySelector('.kawa-slot-actions');
435
+ if (mode === 'save') {
436
+ const b = document.createElement('button');
437
+ b.className = 'kawa-slot-btn kawa-slot-btn-save';
438
+ b.textContent = 'Save Here';
439
+ b.addEventListener('click', async () => {
440
+ await this.vm.save(num);
441
+ ov.remove();
442
+ this.showSaveLoad('save');
443
+ });
444
+ act.appendChild(b);
445
+ } else if (s) {
446
+ const b = document.createElement('button');
447
+ b.className = 'kawa-slot-btn kawa-slot-btn-load';
448
+ b.textContent = 'Load';
449
+ b.addEventListener('click', async () => {
450
+ if (await this.vm.load(num)) ov.remove();
451
+ });
452
+ act.appendChild(b);
453
+ }
454
+ if (s) {
455
+ const d = document.createElement('button');
456
+ d.className = 'kawa-slot-btn kawa-slot-btn-del';
457
+ d.textContent = '🗑';
458
+ d.addEventListener('click', async () => {
459
+ await this.vm.saveManager.deleteSlot(num);
460
+ ov.remove();
461
+ this.showSaveLoad(mode);
462
+ });
463
+ act.appendChild(d);
464
+ }
465
+ grid.appendChild(c);
466
+ });
467
+ ov.appendChild(card);
468
+ this.rootEl.appendChild(ov);
469
+ }
470
+ showHistory() {
471
+ const ex = this.rootEl.querySelector('.kawa-modal-overlay');
472
+ if (ex) ex.remove();
473
+ const ov = document.createElement('div');
474
+ ov.className = 'kawa-modal-overlay';
475
+ const card = document.createElement('div');
476
+ card.className = 'kawa-modal-card';
477
+ card.innerHTML = \`
478
+ <div class="kawa-modal-header">
479
+ <div class="kawa-modal-title">📜 Dialogue History</div>
480
+ <button class="kawa-btn kawa-close-btn">✕ Close</button>
481
+ </div>
482
+ <div class="kawa-modal-body"></div>\`;
483
+ card.querySelector('.kawa-close-btn').addEventListener('click', () => ov.remove());
484
+ const body = card.querySelector('.kawa-modal-body');
485
+ if (this.vm.history.length === 0) {
486
+ body.innerHTML = '<div style="opacity:0.6">No dialogue history yet.</div>';
487
+ } else {
488
+ this.vm.history.forEach(h => {
489
+ const item = document.createElement('div');
490
+ item.className = 'kawa-history-item';
491
+ if (h.speakerDisplayName) {
492
+ item.innerHTML = '<div class="kawa-history-speaker">' + h.speakerDisplayName + '</div>';
493
+ }
494
+ const txt = document.createElement('div');
495
+ txt.textContent = h.text;
496
+ item.appendChild(txt);
497
+ body.appendChild(item);
498
+ });
499
+ }
500
+ ov.appendChild(card);
501
+ this.rootEl.appendChild(ov);
502
+ }
357
503
  }
358
504
 
359
505
  const vm = new StoryVM(story);
@@ -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":"AAAA,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;AAM7E,MAAM,UAAU,YAAY,CAAC,UAAU,GAAG,GAAG,EAAE,UAAwB,EAAE;IACvE,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,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,IAAI,MAAM,CAAC,CAAC;IAE/D,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,cAAc,OAAO,EAAE,CAAC,CAAC;IACrC,OAAO,CAAC,GAAG,CAAC,cAAc,MAAM,IAAI,CAAC,CAAC;IAEtC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,KAAK,CAAC,yBAAyB,UAAU,0DAA0D,CAAC,CAAC;QAC7G,OAAO,KAAK,CAAC;IACf,CAAC;IAED,yBAAyB;IACzB,IAAI,YAAY,CAAC;IACjB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACpD,YAAY,GAAG,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC;QAChE,OAAO,CAAC,GAAG,CAAC,mCAAmC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,MAAM,WAAW,CAAC,CAAC;IACrG,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,IAAI,GAAG,YAAY,SAAS,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YACpD,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;QAC1D,CAAC;aAAM,IAAI,GAAG,YAAY,KAAK,EAAE,CAAC;YAChC,OAAO,CAAC,KAAK,CAAC,wBAAwB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACvD,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,8BAA8B;IAC9B,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,CAAC;IACD,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE1C,iBAAiB;IACjB,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACjD,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7B,sBAAsB,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;IACjD,CAAC;IAED,iCAAiC;IACjC,IAAI,WAAW,GAAG,oCAAoC,CAAC;IACvD,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;IAC/I,IAAI,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAChC,WAAW,IAAI,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC;IACjE,CAAC;IACD,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7B,WAAW,IAAI,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC5D,CAAC;IACD,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;IACvE,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;IAEtD,0CAA0C;IAC1C,MAAM,WAAW,GAAG;;;;;WAKX,YAAY,CAAC,IAAI,CAAC,KAAK,IAAI,sBAAsB;;;;;;;;;;oBAUxC,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAsbjD,CAAC;IAEP,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;IACxE,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;IACnE,OAAO,CAAC,GAAG,CAAC,kFAAkF,CAAC,CAAC;IAChG,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,sBAAsB,CAAC,GAAW,EAAE,IAAY;IACvD,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACxC,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAE7D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAE7C,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,sBAAsB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC5C,CAAC;aAAM,CAAC;YACN,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -210,6 +210,16 @@ function getInlineRuntimeScript() {
210
210
  const raw = this.storage.getItem('kawaijs_save_' + id);
211
211
  return raw ? JSON.parse(raw) : null;
212
212
  }
213
+ async deleteSlot(id) {
214
+ this.storage.removeItem('kawaijs_save_' + id);
215
+ }
216
+ async listSlots(total = 6) {
217
+ const slots = [];
218
+ for (let i = 1; i <= total; i++) {
219
+ slots.push(await this.loadSlot(String(i)));
220
+ }
221
+ return slots;
222
+ }
213
223
  }
214
224
  function evaluateCondition(cond, vars) {
215
225
  const t = (cond || '').trim();
@@ -264,19 +274,22 @@ function getInlineRuntimeScript() {
264
274
  };
265
275
  this.snapshotStack = [];
266
276
  this.listeners = new Set();
277
+ this.audioListeners = new Set();
267
278
  this.history = [];
268
279
  this.saveManager = new SaveManager();
280
+ this.isExecuting = false;
269
281
  }
270
282
  getState() { return this.state; }
271
283
  onStateChange(cb) { this.listeners.add(cb); return () => this.listeners.delete(cb); }
284
+ onAudioEvent(cb) { this.audioListeners.add(cb); return () => this.audioListeners.delete(cb); }
272
285
  start() { this.execute(); }
273
286
  next() {
274
- if (this.state.isFinished || (this.state.choices && this.state.choices.length > 0)) return;
287
+ if (this.state.isFinished || this.isExecuting || (this.state.choices && this.state.choices.length > 0)) return;
275
288
  this.state.isWaitingForInput = false;
276
289
  this.execute();
277
290
  }
278
291
  choose(idx) {
279
- if (!this.state.choices || !this.state.choices[idx]) return;
292
+ if (this.isExecuting || !this.state.choices || !this.state.choices[idx]) return;
280
293
  const choice = this.state.choices[idx];
281
294
  this.state.choices = null;
282
295
  this.state.isWaitingForInput = false;
@@ -297,71 +310,77 @@ function getInlineRuntimeScript() {
297
310
  }
298
311
  canRollback() { return this.snapshotStack.length > 1; }
299
312
  async save(slot) {
300
- await this.saveManager.saveSlot(slot, this.state, this.state.dialogue ? this.state.dialogue.text : '');
313
+ await this.saveManager.saveSlot(slot, JSON.parse(JSON.stringify(this.state)), this.state.dialogue ? this.state.dialogue.text : '');
301
314
  }
302
315
  async load(slot) {
303
316
  const data = await this.saveManager.loadSlot(slot);
304
317
  if (data && data.snapshot) {
305
- this.state = JSON.parse(JSON.stringify(data.snapshot));
306
- this.snapshotStack = [this.state];
318
+ this.state = JSON.parse(JSON.stringify(data.snapshot.state || data.snapshot));
319
+ this.snapshotStack = [JSON.parse(JSON.stringify(this.state))];
307
320
  this.notify();
308
321
  return true;
309
322
  }
310
323
  return false;
311
324
  }
312
325
  execute() {
313
- while (!this.state.isWaitingForInput && !this.state.isFinished) {
314
- const list = this.story.labels[this.state.currentLabel];
315
- if (!list || this.state.instructionPointer >= list.length) {
316
- if (this.state.callStack.length > 0) {
317
- const frame = this.state.callStack.pop();
318
- this.state.currentLabel = frame.returnLabel;
319
- this.state.instructionPointer = frame.returnPointer;
320
- continue;
326
+ if (this.isExecuting) return;
327
+ this.isExecuting = true;
328
+ try {
329
+ while (!this.state.isWaitingForInput && !this.state.isFinished) {
330
+ const list = this.story.labels[this.state.currentLabel];
331
+ if (!list || this.state.instructionPointer >= list.length) {
332
+ if (this.state.callStack.length > 0) {
333
+ const frame = this.state.callStack.pop();
334
+ this.state.currentLabel = frame.returnLabel;
335
+ this.state.instructionPointer = frame.returnPointer;
336
+ continue;
337
+ }
338
+ this.state.isFinished = true;
339
+ break;
340
+ }
341
+ const inst = list[this.state.instructionPointer++];
342
+ if (inst.type === 'scene') {
343
+ this.state.visual.background = inst.background;
344
+ this.state.visual.characters = {};
345
+ } else if (inst.type === 'show') {
346
+ this.state.visual.characters[inst.character] = {
347
+ expression: inst.expression,
348
+ position: inst.position || 'center'
349
+ };
350
+ } else if (inst.type === 'hide') {
351
+ delete this.state.visual.characters[inst.character];
352
+ } else if (inst.type === 'dialogue') {
353
+ const charDef = inst.speaker ? this.story.characters[inst.speaker] : null;
354
+ this.state.dialogue = {
355
+ speaker: inst.speaker,
356
+ speakerDisplayName: charDef ? charDef.name : inst.speaker,
357
+ speakerColor: charDef ? charDef.color : null,
358
+ text: inst.text
359
+ };
360
+ this.state.isWaitingForInput = true;
361
+ this.history.push(this.state.dialogue);
362
+ } else if (inst.type === 'choice') {
363
+ this.state.choices = inst.choices;
364
+ this.state.isWaitingForInput = true;
365
+ } else if (inst.type === 'jump') {
366
+ this.state.currentLabel = inst.targetLabel;
367
+ this.state.instructionPointer = 0;
368
+ } else if (inst.type === 'set') {
369
+ const curr = this.state.variables[inst.variable];
370
+ this.state.variables[inst.variable] = applySetOp(curr, inst.operator, inst.value, this.state.variables);
371
+ } else if (inst.type === 'branch') {
372
+ const ok = evaluateCondition(inst.condition, this.state.variables);
373
+ this.state.currentLabel = ok ? inst.thenLabel : (inst.elseLabel || inst.thenLabel);
374
+ this.state.instructionPointer = 0;
375
+ } else if (inst.type === 'return') {
376
+ this.state.isFinished = true;
321
377
  }
322
- this.state.isFinished = true;
323
- break;
324
378
  }
325
- const inst = list[this.state.instructionPointer++];
326
- if (inst.type === 'scene') {
327
- this.state.visual.background = inst.background;
328
- this.state.visual.characters = {};
329
- } else if (inst.type === 'show') {
330
- this.state.visual.characters[inst.character] = {
331
- expression: inst.expression,
332
- position: inst.position || 'center'
333
- };
334
- } else if (inst.type === 'hide') {
335
- delete this.state.visual.characters[inst.character];
336
- } else if (inst.type === 'dialogue') {
337
- const charDef = inst.speaker ? this.story.characters[inst.speaker] : null;
338
- this.state.dialogue = {
339
- speaker: inst.speaker,
340
- speakerDisplayName: charDef ? charDef.name : inst.speaker,
341
- speakerColor: charDef ? charDef.color : null,
342
- text: inst.text
343
- };
344
- this.state.isWaitingForInput = true;
345
- this.history.push(this.state.dialogue);
346
- } else if (inst.type === 'choice') {
347
- this.state.choices = inst.choices;
348
- this.state.isWaitingForInput = true;
349
- } else if (inst.type === 'jump') {
350
- this.state.currentLabel = inst.targetLabel;
351
- this.state.instructionPointer = 0;
352
- } else if (inst.type === 'set') {
353
- const curr = this.state.variables[inst.variable];
354
- this.state.variables[inst.variable] = applySetOp(curr, inst.operator, inst.value, this.state.variables);
355
- } else if (inst.type === 'branch') {
356
- const ok = evaluateCondition(inst.condition, this.state.variables);
357
- this.state.currentLabel = ok ? inst.thenLabel : (inst.elseLabel || inst.thenLabel);
358
- this.state.instructionPointer = 0;
359
- } else if (inst.type === 'return') {
360
- this.state.isFinished = true;
379
+ if (this.state.isWaitingForInput) {
380
+ this.snapshotStack.push(JSON.parse(JSON.stringify(this.state)));
361
381
  }
362
- }
363
- if (this.state.isWaitingForInput) {
364
- this.snapshotStack.push(JSON.parse(JSON.stringify(this.state)));
382
+ } finally {
383
+ this.isExecuting = false;
365
384
  }
366
385
  this.notify();
367
386
  }
@@ -371,6 +390,7 @@ function getInlineRuntimeScript() {
371
390
  constructor(vm, container) {
372
391
  this.vm = vm;
373
392
  this.container = container;
393
+ this.isChoicePending = false;
374
394
  this.build();
375
395
  vm.onStateChange(s => this.render(s));
376
396
  this.render(vm.getState());
@@ -390,12 +410,14 @@ function getInlineRuntimeScript() {
390
410
  </div>
391
411
  <nav class="kawa-quick-menu">
392
412
  <button class="kawa-btn kawa-back">Back</button>
413
+ <button class="kawa-btn kawa-hist">History</button>
393
414
  <button class="kawa-btn kawa-save">Save</button>
394
415
  <button class="kawa-btn kawa-load">Load</button>
395
416
  </nav>
396
417
  </div>
397
418
  </div>
398
419
  </div>\`;
420
+ this.rootEl = this.container.querySelector('.kawa-root');
399
421
  this.bgEl = this.container.querySelector('.kawa-background');
400
422
  this.charsEl = this.container.querySelector('.kawa-characters');
401
423
  this.boxEl = this.container.querySelector('.kawa-dialogue-box');
@@ -403,23 +425,34 @@ function getInlineRuntimeScript() {
403
425
  this.txtEl = this.container.querySelector('.kawa-dialogue-text');
404
426
  this.choiceEl = this.container.querySelector('.kawa-choice-container');
405
427
  this.backBtn = this.container.querySelector('.kawa-back');
428
+ this.histBtn = this.container.querySelector('.kawa-hist');
406
429
  this.saveBtn = this.container.querySelector('.kawa-save');
407
430
  this.loadBtn = this.container.querySelector('.kawa-load');
408
431
 
409
432
  this.boxEl.addEventListener('click', () => this.vm.next());
410
433
  this.backBtn.addEventListener('click', (e) => { e.stopPropagation(); this.vm.rollback(); });
411
- this.saveBtn.addEventListener('click', async (e) => { e.stopPropagation(); await this.vm.save('1'); alert('Saved to Slot 1'); });
412
- this.loadBtn.addEventListener('click', async (e) => { e.stopPropagation(); if (await this.vm.load('1')) alert('Loaded Slot 1'); });
434
+ this.histBtn.addEventListener('click', (e) => { e.stopPropagation(); this.showHistory(); });
435
+ this.saveBtn.addEventListener('click', (e) => { e.stopPropagation(); this.showSaveLoad('save'); });
436
+ this.loadBtn.addEventListener('click', (e) => { e.stopPropagation(); this.showSaveLoad('load'); });
413
437
  window.addEventListener('keydown', (e) => {
438
+ const modal = this.rootEl.querySelector('.kawa-modal-overlay');
439
+ if (modal) {
440
+ if (e.key === 'Escape') modal.remove();
441
+ return;
442
+ }
414
443
  if (e.code === 'Space' || e.code === 'Enter') { e.preventDefault(); this.vm.next(); }
415
444
  if (e.code === 'Backspace') { e.preventDefault(); this.vm.rollback(); }
445
+ if (e.key === 's' || e.key === 'S') this.showSaveLoad('save');
446
+ if (e.key === 'l' || e.key === 'L') this.showSaveLoad('load');
447
+ if (e.key === 'h' || e.key === 'H') this.showHistory();
416
448
  });
417
449
  }
418
450
  render(state) {
451
+ this.isChoicePending = false;
419
452
  this.backBtn.disabled = !this.vm.canRollback();
420
453
  if (state.visual.background) {
421
454
  const bg = state.visual.background.replace(/^bg\\s+/, '');
422
- this.bgEl.style.backgroundImage = 'url("/assets/backgrounds/' + bg + (bg.includes('.') ? '' : '.png') + '")';
455
+ this.bgEl.style.backgroundImage = 'url("/assets/backgrounds/' + bg + (bg.includes('.') ? '' : '.svg') + '"), url("/assets/backgrounds/' + bg + '.png")';
423
456
  this.bgEl.style.opacity = '1';
424
457
  } else {
425
458
  this.bgEl.style.opacity = '0';
@@ -431,15 +464,22 @@ function getInlineRuntimeScript() {
431
464
  div.className = 'kawa-sprite kawa-pos-' + (char.position || 'center');
432
465
  const img = document.createElement('img');
433
466
  const expr = char.expression ? '/' + char.expression : '';
434
- img.src = '/assets/characters/' + id + expr + '.png';
467
+ img.src = '/assets/characters/' + id + expr + '.svg';
435
468
  img.alt = id;
469
+ let fallback = 0;
436
470
  img.onerror = () => {
437
- img.style.display = 'none';
438
- div.style.width = '200px'; div.style.height = '400px';
439
- div.style.background = 'rgba(244,63,94,0.3)'; div.style.border = '2px dashed #f43f5e';
440
- div.style.borderRadius = '16px'; div.style.display = 'flex'; div.style.alignItems = 'center';
441
- div.style.justifyContent = 'center'; div.style.color = '#fff';
442
- div.textContent = id + (char.expression ? ' (' + char.expression + ')' : '');
471
+ fallback++;
472
+ if (fallback === 1) img.src = '/assets/characters/' + id + expr + '.png';
473
+ else if (fallback === 2 && char.expression) img.src = '/assets/characters/' + id + '_' + char.expression + '.svg';
474
+ else if (fallback === 3 && char.expression) img.src = '/assets/characters/' + id + '_' + char.expression + '.png';
475
+ else {
476
+ img.style.display = 'none';
477
+ div.style.width = '220px'; div.style.height = '420px';
478
+ div.style.background = 'rgba(244,63,94,0.25)'; div.style.border = '2px dashed #f43f5e';
479
+ div.style.borderRadius = '16px'; div.style.display = 'flex'; div.style.alignItems = 'center';
480
+ div.style.justifyContent = 'center'; div.style.color = '#fff'; div.style.fontWeight = '600';
481
+ div.textContent = id + (char.expression ? ' (' + char.expression + ')' : '');
482
+ }
443
483
  };
444
484
  div.appendChild(img);
445
485
  this.charsEl.appendChild(div);
@@ -462,17 +502,122 @@ function getInlineRuntimeScript() {
462
502
  if (state.choices && state.choices.length > 0) {
463
503
  this.choiceEl.innerHTML = '';
464
504
  this.choiceEl.style.display = 'flex';
505
+ this.choiceEl.style.pointerEvents = 'auto';
506
+ this.choiceEl.style.opacity = '1';
465
507
  state.choices.forEach((c, idx) => {
466
508
  const btn = document.createElement('button');
467
509
  btn.className = 'kawa-choice-btn kawa-choice';
468
510
  btn.textContent = c.text;
469
- btn.addEventListener('click', (e) => { e.stopPropagation(); this.vm.choose(idx); });
511
+ btn.addEventListener('click', (e) => {
512
+ e.stopPropagation();
513
+ if (this.isChoicePending) return;
514
+ this.isChoicePending = true;
515
+ this.choiceEl.style.pointerEvents = 'none';
516
+ this.choiceEl.style.opacity = '0.5';
517
+ this.vm.choose(idx);
518
+ });
470
519
  this.choiceEl.appendChild(btn);
471
520
  });
472
521
  } else {
473
522
  this.choiceEl.style.display = 'none';
474
523
  }
475
524
  }
525
+ async showSaveLoad(mode) {
526
+ const ex = this.rootEl.querySelector('.kawa-modal-overlay');
527
+ if (ex) ex.remove();
528
+ const ov = document.createElement('div');
529
+ ov.className = 'kawa-modal-overlay';
530
+ const card = document.createElement('div');
531
+ card.className = 'kawa-modal-card';
532
+ card.innerHTML = \`
533
+ <div class="kawa-modal-header">
534
+ <div class="kawa-modal-title">\${mode === 'save' ? '💾 Save Game' : '📂 Load Game'}</div>
535
+ <button class="kawa-btn kawa-close-btn">✕ Close</button>
536
+ </div>
537
+ <div class="kawa-modal-body"><div class="kawa-slots-grid"></div></div>\`;
538
+ card.querySelector('.kawa-close-btn').addEventListener('click', () => ov.remove());
539
+ const grid = card.querySelector('.kawa-slots-grid');
540
+ const slots = await this.vm.saveManager.listSlots(6);
541
+ slots.forEach((s, i) => {
542
+ const num = String(i + 1);
543
+ const c = document.createElement('div');
544
+ c.className = 'kawa-slot-card';
545
+ c.innerHTML = \`
546
+ <div class="kawa-slot-header">
547
+ <span class="kawa-slot-badge">Slot \${num}</span>
548
+ <span class="kawa-slot-time">\${s ? new Date(s.timestamp).toLocaleTimeString() : 'Empty'}</span>
549
+ </div>
550
+ <div class="kawa-slot-preview">\${s ? (s.previewText || 'Game in progress') : '<span class="kawa-slot-empty-text">No save data</span>'}</div>
551
+ <div class="kawa-slot-actions"></div>\`;
552
+ const act = c.querySelector('.kawa-slot-actions');
553
+ if (mode === 'save') {
554
+ const b = document.createElement('button');
555
+ b.className = 'kawa-slot-btn kawa-slot-btn-save';
556
+ b.textContent = 'Save Here';
557
+ b.addEventListener('click', async () => {
558
+ await this.vm.save(num);
559
+ ov.remove();
560
+ this.showSaveLoad('save');
561
+ });
562
+ act.appendChild(b);
563
+ } else if (s) {
564
+ const b = document.createElement('button');
565
+ b.className = 'kawa-slot-btn kawa-slot-btn-load';
566
+ b.textContent = 'Load';
567
+ b.addEventListener('click', async () => {
568
+ if (await this.vm.load(num)) ov.remove();
569
+ });
570
+ act.appendChild(b);
571
+ }
572
+ if (s) {
573
+ const d = document.createElement('button');
574
+ d.className = 'kawa-slot-btn kawa-slot-btn-del';
575
+ d.textContent = '🗑';
576
+ d.addEventListener('click', async () => {
577
+ await this.vm.saveManager.deleteSlot(num);
578
+ ov.remove();
579
+ this.showSaveLoad(mode);
580
+ });
581
+ act.appendChild(d);
582
+ }
583
+ grid.appendChild(c);
584
+ });
585
+ ov.appendChild(card);
586
+ this.rootEl.appendChild(ov);
587
+ }
588
+ showHistory() {
589
+ const ex = this.rootEl.querySelector('.kawa-modal-overlay');
590
+ if (ex) ex.remove();
591
+ const ov = document.createElement('div');
592
+ ov.className = 'kawa-modal-overlay';
593
+ const card = document.createElement('div');
594
+ card.className = 'kawa-modal-card';
595
+ card.innerHTML = \`
596
+ <div class="kawa-modal-header">
597
+ <div class="kawa-modal-title">📜 Dialogue History</div>
598
+ <button class="kawa-btn kawa-close-btn">✕ Close</button>
599
+ </div>
600
+ <div class="kawa-modal-body"></div>\`;
601
+ card.querySelector('.kawa-close-btn').addEventListener('click', () => ov.remove());
602
+ const body = card.querySelector('.kawa-modal-body');
603
+ if (this.vm.history.length === 0) {
604
+ body.innerHTML = '<div style="opacity:0.6">No dialogue history yet.</div>';
605
+ } else {
606
+ this.vm.history.forEach(h => {
607
+ const item = document.createElement('div');
608
+ item.className = 'kawa-history-item';
609
+ if (h.speakerDisplayName) {
610
+ item.innerHTML = '<div class="kawa-history-speaker">' + h.speakerDisplayName + '</div>';
611
+ }
612
+ const txt = document.createElement('div');
613
+ txt.textContent = h.text;
614
+ item.appendChild(txt);
615
+ body.appendChild(item);
616
+ });
617
+ }
618
+ ov.appendChild(card);
619
+ this.rootEl.appendChild(ov);
620
+ }
476
621
  }
477
622
  function mountKawaApp(story, container) {
478
623
  const vm = new StoryVM(story);
@@ -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":"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"}
package/dist/index.d.ts CHANGED
@@ -2,6 +2,8 @@ export * from '@kawaijs/ast';
2
2
  export * from '@kawaijs/parser';
3
3
  export * from '@kawaijs/runtime';
4
4
  export * from '@kawaijs/renderer-dom';
5
+ export * from '@kawaijs/audio';
6
+ export * from '@kawaijs/vite-plugin';
5
7
  import { createProject } from './commands/create.js';
6
8
  import { validateProject } from './commands/validate.js';
7
9
  import { startDevServer } from './commands/dev.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC;AAEtC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC;AAExE,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAoE3C"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC;AACtC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,sBAAsB,CAAC;AAErC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC;AAExE,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA4E3C"}
package/dist/index.js CHANGED
@@ -2,6 +2,8 @@ export * from '@kawaijs/ast';
2
2
  export * from '@kawaijs/parser';
3
3
  export * from '@kawaijs/runtime';
4
4
  export * from '@kawaijs/renderer-dom';
5
+ export * from '@kawaijs/audio';
6
+ export * from '@kawaijs/vite-plugin';
5
7
  import { createProject } from './commands/create.js';
6
8
  import { validateProject } from './commands/validate.js';
7
9
  import { startDevServer } from './commands/dev.js';
@@ -39,7 +41,7 @@ export function runCLI(args) {
39
41
  case 'version':
40
42
  case '-v':
41
43
  case '--version': {
42
- console.log('Kawaijs v0.1.1');
44
+ console.log('Kawaijs v0.1.2');
43
45
  break;
44
46
  }
45
47
  case 'help':
@@ -61,6 +63,14 @@ Commands:
61
63
  help Show this help message
62
64
  version Show version information
63
65
 
66
+ Keyboard Shortcuts in Game:
67
+ Space / Enter Advance dialogue
68
+ Backspace Rollback (step back)
69
+ S Open Save Game menu
70
+ L Open Load Game menu
71
+ H Open Dialogue History
72
+ Escape Close active modal
73
+
64
74
  Example:
65
75
  kawa create my-novel
66
76
  cd my-novel
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC;AAEtC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC;AAExE,MAAM,UAAU,MAAM,CAAC,IAAc;IACnC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAExB,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,WAAW,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC;YAC1C,aAAa,CAAC,WAAW,CAAC,CAAC;YAC3B,MAAM;QACR,CAAC;QAED,KAAK,KAAK,CAAC,CAAC,CAAC;YACX,MAAM,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;YAClC,cAAc,CAAC,UAAU,CAAC,CAAC;YAC3B,MAAM;QACR,CAAC;QAED,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;YAClC,MAAM,EAAE,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;YACpC,IAAI,CAAC,EAAE,EAAE,CAAC;gBACR,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACvB,CAAC;YACD,MAAM;QACR,CAAC;QAED,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,MAAM,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;YAClC,MAAM,EAAE,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC;YACvC,IAAI,CAAC,EAAE,EAAE,CAAC;gBACR,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACvB,CAAC;YACD,MAAM;QACR,CAAC;QAED,KAAK,SAAS,CAAC;QACf,KAAK,IAAI,CAAC;QACV,KAAK,WAAW,CAAC,CAAC,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;YAC9B,MAAM;QACR,CAAC;QAED,KAAK,MAAM,CAAC;QACZ,KAAK,IAAI,CAAC;QACV,KAAK,QAAQ,CAAC;QACd,OAAO,CAAC,CAAC,CAAC;YACR,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;CAmBjB,CAAC,CAAC;YACG,MAAM;QACR,CAAC;IACH,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC;AACtC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,sBAAsB,CAAC;AAErC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC;AAExE,MAAM,UAAU,MAAM,CAAC,IAAc;IACnC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAExB,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,WAAW,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC;YAC1C,aAAa,CAAC,WAAW,CAAC,CAAC;YAC3B,MAAM;QACR,CAAC;QAED,KAAK,KAAK,CAAC,CAAC,CAAC;YACX,MAAM,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;YAClC,cAAc,CAAC,UAAU,CAAC,CAAC;YAC3B,MAAM;QACR,CAAC;QAED,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;YAClC,MAAM,EAAE,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;YACpC,IAAI,CAAC,EAAE,EAAE,CAAC;gBACR,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACvB,CAAC;YACD,MAAM;QACR,CAAC;QAED,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,MAAM,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;YAClC,MAAM,EAAE,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC;YACvC,IAAI,CAAC,EAAE,EAAE,CAAC;gBACR,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACvB,CAAC;YACD,MAAM;QACR,CAAC;QAED,KAAK,SAAS,CAAC;QACf,KAAK,IAAI,CAAC;QACV,KAAK,WAAW,CAAC,CAAC,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;YAC9B,MAAM;QACR,CAAC;QAED,KAAK,MAAM,CAAC;QACZ,KAAK,IAAI,CAAC;QACV,KAAK,QAAQ,CAAC;QACd,OAAO,CAAC,CAAC,CAAC;YACR,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2BjB,CAAC,CAAC;YACG,MAAM;QACR,CAAC;IACH,CAAC;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kawaijs",
3
- "version": "0.1.2",
3
+ "version": "0.1.3",
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,10 +31,12 @@
31
31
  "typecheck": "tsc --noEmit"
32
32
  },
33
33
  "dependencies": {
34
- "@kawaijs/ast": "^0.1.2",
35
- "@kawaijs/parser": "^0.1.2",
36
- "@kawaijs/runtime": "^0.1.2",
37
- "@kawaijs/renderer-dom": "^0.1.2"
34
+ "@kawaijs/ast": "^0.1.3",
35
+ "@kawaijs/parser": "^0.1.3",
36
+ "@kawaijs/runtime": "^0.1.3",
37
+ "@kawaijs/renderer-dom": "^0.1.3",
38
+ "@kawaijs/audio": "^0.1.3",
39
+ "@kawaijs/vite-plugin": "^0.1.3"
38
40
  },
39
41
  "keywords": [
40
42
  "kawaijs",