503496ea0e
fix: only switch quality during active playback, not after video ended
2026-06-12 17:51:01 +08:00
d46a2194f4
fix: switchQuality reset currentTime=0 to unset ended flag
2026-06-12 17:42:43 +08:00
a465009086
fix: switchQuality add load() to reset HLS state after video ended
2026-06-12 17:39:58 +08:00
b6231e4efd
feat: adaptive bitrate support, engine improvements, demo updates, and electron preload
2026-06-12 17:15:30 +08:00
215a8db829
feat: chapter boundary gateway nodes in flow, prevent cross-chapter BFS expansion
2026-06-12 12:28:31 +08:00
9baa7b5ab3
feat: add scene thumbnails to TreeFlow nodes with auto-generated demo thumbs
2026-06-12 12:08:39 +08:00
0379548a29
feat: full-screen StoryGallery with flow layout, startAtScene engine method, clickable flow nodes
2026-06-12 11:37:14 +08:00
ae7721d70e
feat: story gallery progress, type updates, roadmap, cleanup old session file
2026-06-11 21:08:29 +08:00
03c4ee3a65
feat: i18n for choice prompt via promptKey, with fallback
2026-06-10 16:51:50 +08:00
2f9f9a4117
feat: i18n achievement UI labels and data layer title/description
2026-06-10 16:36:24 +08:00
e51b5e234e
feat: i18n StoryGallery UI labels and data layer chapter/ending names
2026-06-10 16:29:25 +08:00
d057beb82d
feat: QTE prompt i18n via promptKey, fallback to prompt text
2026-06-10 16:21:23 +08:00
0a1147c2fe
fix: hotspot, demo, i18n and type updates
2026-06-10 16:10:23 +08:00
76581d0326
feat: intro video, asset updates, roadmap and engine improvements
2026-06-10 14:47:45 +08:00
bb289f5438
feat: switch hotspot coordinates from container percentage to absolute content pixels
2026-06-10 12:45:41 +08:00
86a0aebdc8
feat: configurable locales path per story, dynamic language switching from story data
2026-06-10 12:17:52 +08:00
937e709dca
feat: global assetBase for scene JSON, convert demo to relative paths
2026-06-10 11:01:21 +08:00
c9d29019a0
feat: accessibility settings, subtitle/QTE improvements, docs update
2026-06-09 19:42:08 +08:00
906965c963
fix: wire up EndingGallery click to open ChapterRecap via chapterId
2026-06-09 17:57:21 +08:00
9297117544
feat: P15 ending gallery, chapter recap, visited tracking, save system v6
2026-06-09 17:49:07 +08:00
451c6ea025
chore: sync latest changes
2026-06-09 17:21:54 +08:00
bf4b85f727
feat: choice conditions with variables, demo updates, roadmap update
2026-06-09 16:46:06 +08:00
f044ed0b60
refactor: switch to key-based i18n for choices, revert inline textEn approach
2026-06-09 15:54:55 +08:00
8e7f77bc38
feat: inline bilingual choice text (textEn), lang-aware choice rendering
2026-06-09 15:51:37 +08:00
59aed77199
feat: i18n system, lang switch component, english subtitles, UI improvements, roadmap update
2026-06-09 15:40:51 +08:00
0a6d26ecb0
fix: suppress videoEnd during QTE, clear QTE UI on game end and chapter restart
2026-06-09 14:55:13 +08:00
660fa9347c
feat: playback bar component, save system improvements, demo and roadmap updates
2026-06-09 14:21:41 +08:00
652162f565
fix: restore opacity when replaying same video after image scene
2026-06-09 12:32:48 +08:00
ed435f790f
refactor: extract enterScene as single source of truth for scene transitions
2026-06-09 12:26:38 +08:00
bdf62bf0a6
fix: set currentScene before image branch in resumeScene so hotspots are clickable
2026-06-09 12:18:42 +08:00
ace5ed1fb3
feat: chapter select system, multi-chapter support, scene manager refactor, and docs update
2026-06-09 11:35:11 +08:00
4bfdfbc27d
feat: audio system, demo scene updates, docs, and engine improvements
2026-06-08 23:18:33 +08:00
0dbe1b097d
feat: video loop support for hotspot scenes, demo updates, docs, and engine fixes
2026-06-08 21:48:47 +08:00
5b40781d0a
fix: hide old video frame before crossfade when coming from image scene
2026-06-08 21:24:28 +08:00
972738572f
fix: filter stale timeupdate events by tracking sceneVideo element
2026-06-08 21:09:10 +08:00
6c0deea0e2
fix: pause old video before switching to prevent stale timeupdate triggering wrong hotspot states
2026-06-08 15:29:28 +08:00
17c479525d
fix: emit initial hotspot state immediately after sceneChange to prevent flash
2026-06-08 15:17:43 +08:00
077de2a64e
fix: emit sceneChange before video start to avoid hotspot flash, prevent game end for hotspot-only scenes
2026-06-08 15:02:38 +08:00
d81042174a
fix: skip crossfade when switching to same video, replay from start
2026-06-08 14:32:34 +08:00
6b67989007
feat: engine improvements, new scenes, videos, subtitles, hotspot component and docs update
2026-06-08 14:01:58 +08:00
a34d787336
fix: register checkQTE once in constructor instead of per-scene
...
Previously goToScene added a new checkQTE closure to onTimeUpdate on
every scene transition, accumulating stale closures that re-triggered
old QTE. Now checkQTE is an arrow property registered once in the
constructor, reading this.currentScene directly — no closure, no stale
references, no guard condition needed.
2026-06-07 21:16:31 +08:00
4da4d65d5e
fix: checkQTE guard against stale scene closures
...
Since onTimeUpdate callbacks are now additive (Set), goToScene closures
for old scenes persist. Add currentScene?.id !== scene.id check to
prevent QTE from re-triggering for past scenes after scene transitions.
2026-06-07 21:14:40 +08:00
b6eb3c3959
fix: QTE false race condition + restore auto-save slot in menu
...
- QTESystem: add if (!this.active) return guard in setInterval/setTimeout
callbacks to prevent false result from firing after successful key press
- SaveLoadMenu: restore auto-save slot 0 row with blue styling, thumbnail,
scene label, and read-only load button
2026-06-07 21:07:21 +08:00
b3bbe7b39d
fix: support multiple onTimeUpdate callbacks in VideoManager
...
Previously onTimeCallback was a single nullable function pointer, so
registerEvents()'s store.setVideoTime callback was overwritten by
goToScene()'s checkQTE callback, causing videoTime to stay at 0.
Changed to a Set to support multiple concurrent listeners.
2026-06-07 20:38:24 +08:00
12d30cc128
docs: add QTE explanation comment in QTESystem
2026-06-07 19:50:45 +08:00
319a379921
feat: P2 - QTE system, subtitles, save thumbnails
...
- QTESystem: trigger detection via timeupdate, multi-key matching, timeout handling
- QTEOverlay: SVG countdown ring + key prompts + success/fail animation
- Engine: integrate QTE (timeupdate check, conditional branching, effect application)
- Subtitles: WebVTT parsing + synchronized subtitle rendering
- GamePlayer: overlay QTE and subtitle components
- SaveSystem: DB v2 with thumbnail field, canvas snapshot at 320x180 JPEG
- SaveLoadMenu: thumbnail preview for save slots
- VideoManager: getActiveVideoElement() for canvas capture
- App.vue: QTE/subtitle integration, thumbnail capture on save
- stores: QTE state management, save list with thumbnails
- demo.json: QTE scene (right_door), subtitles, new event types
- ROADMAP: mark P2 as completed
2026-06-07 19:35:14 +08:00
7826d789a7
docs: add unit comment for Choice.timeLimit
2026-06-07 18:57:16 +08:00
c7d035bd8f
fix: interpret Choice.timeLimit as seconds, convert to ms internally
...
Previously maxLimit was passed directly to setTimeout/setInterval (ms),
so a JSON value of 10 meant 10ms instead of the intended 10 seconds.
Now timeLimit in JSON represents seconds, engine multiplies by 1000.
2026-06-07 18:56:30 +08:00
25ea9ce9fd
fix: consistent timer unit (seconds) in ChoiceSystem first onUpdate
...
The first onUpdate call used raw milliseconds (e.g. total: 10000),
while subsequent ticks used seconds (total: 10). This caused the
progress bar to jump on the first interval tick.
2026-06-07 18:53:05 +08:00
2de9f99a81
feat: add StateManager.dump() and expose window.__sm for debugging
...
- StateManager.dump(): console.table formatted dump of variables, flags, history
- window.__sm: exposes engine.stateManager in dev mode for console inspection
2026-06-07 17:27:52 +08:00