cocos02
bca137535b
fix: hoist prompt toast to App.vue so it survives ChoicePanel unmount after selection
2026-06-09 16:55:57 +08:00
cocos02
bf4b85f727
feat: choice conditions with variables, demo updates, roadmap update
2026-06-09 16:46:06 +08:00
cocos02
beb1e5cfd5
docs: update roadmap
2026-06-09 16:19:55 +08:00
cocos02
fddef6d1fc
docs: scope P14 SFX to UI feedback only, scene audio belongs in video production
2026-06-09 16:18:11 +08:00
cocos02
7a7c6c935c
docs: update roadmap
2026-06-09 16:08:08 +08:00
cocos02
f044ed0b60
refactor: switch to key-based i18n for choices, revert inline textEn approach
2026-06-09 15:54:55 +08:00
cocos02
8e7f77bc38
feat: inline bilingual choice text (textEn), lang-aware choice rendering
2026-06-09 15:51:37 +08:00
cocos02
daec24d69b
fix: App.vue updates
2026-06-09 15:45:58 +08:00
cocos02
59aed77199
feat: i18n system, lang switch component, english subtitles, UI improvements, roadmap update
2026-06-09 15:40:51 +08:00
cocos02
6b4114af43
feat: press Esc to open menu during gameplay, close with Esc
2026-06-09 15:40:01 +08:00
cocos02
72e442f2c3
feat: UI polish, chapter select improvements, save system enhancements, roadmap update
2026-06-09 15:19:53 +08:00
cocos02
2748b2c16f
fix: remove absolute positioning from PlaybackBar to prevent overlap with top-bar buttons
2026-06-09 15:03:18 +08:00
cocos02
66c7028b32
fix: move skippable flag from QTE result scenes to the triggering scene
2026-06-09 14:57:46 +08:00
cocos02
0a6d26ecb0
fix: suppress videoEnd during QTE, clear QTE UI on game end and chapter restart
2026-06-09 14:55:13 +08:00
cocos02
660fa9347c
feat: playback bar component, save system improvements, demo and roadmap updates
2026-06-09 14:21:41 +08:00
cocos02
ca71b6d52e
docs: update README
2026-06-09 12:35:55 +08:00
cocos02
652162f565
fix: restore opacity when replaying same video after image scene
2026-06-09 12:32:48 +08:00
cocos02
ed435f790f
refactor: extract enterScene as single source of truth for scene transitions
2026-06-09 12:26:38 +08:00
cocos02
bdf62bf0a6
fix: set currentScene before image branch in resumeScene so hotspots are clickable
2026-06-09 12:18:42 +08:00
cocos02
9e339c7c16
refactor: inline event registration at setup level, remove registerEvents duplication across entry points
2026-06-09 12:06:40 +08:00
cocos02
ace5ed1fb3
feat: chapter select system, multi-chapter support, scene manager refactor, and docs update
2026-06-09 11:35:11 +08:00
cocos02
655b9a23d0
feat: fullscreen composable, roadmap update, and future plans doc
2026-06-09 10:47:14 +08:00
cocos02
4bfdfbc27d
feat: audio system, demo scene updates, docs, and engine improvements
2026-06-08 23:18:33 +08:00
cocos02
514c8f5207
fix: shorten stay subtitle cue to avoid overlap with loop segment
2026-06-08 22:02:19 +08:00
cocos02
0dbe1b097d
feat: video loop support for hotspot scenes, demo updates, docs, and engine fixes
2026-06-08 21:48:47 +08:00
cocos02
5b40781d0a
fix: hide old video frame before crossfade when coming from image scene
2026-06-08 21:24:28 +08:00
cocos02
972738572f
fix: filter stale timeupdate events by tracking sceneVideo element
2026-06-08 21:09:10 +08:00
cocos02
6c0deea0e2
fix: pause old video before switching to prevent stale timeupdate triggering wrong hotspot states
2026-06-08 15:29:28 +08:00
cocos02
17c479525d
fix: emit initial hotspot state immediately after sceneChange to prevent flash
2026-06-08 15:17:43 +08:00
cocos02
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
cocos02
d81042174a
fix: skip crossfade when switching to same video, replay from start
2026-06-08 14:32:34 +08:00
cocos02
fa7c333214
fix: use v-show instead of v-if for GamePlayer to prevent video element detach during image scenes
2026-06-08 14:26:21 +08:00
cocos02
6b67989007
feat: engine improvements, new scenes, videos, subtitles, hotspot component and docs update
2026-06-08 14:01:58 +08:00
cocos02
e68ed9c962
fix: await nextTick before setting video src on first preview
2026-06-08 13:48:50 +08:00
cocos02
a0749261bf
feat: highlight upstream/downstream edges when node selected
2026-06-08 13:09:47 +08:00
cocos02
a16f34acd9
docs: add graph layout optimization record to editor README
2026-06-08 13:07:18 +08:00
cocos02
b542660095
feat: replace BFS layout with dagre for professional graph layout
2026-06-08 13:01:17 +08:00
cocos02
e323f7973a
fix: pass SmoothStepEdge component instead of string to default-edge-type
2026-06-08 12:49:42 +08:00
cocos02
a008c927a5
feat: use smoothstep edge type for orthogonal lines
2026-06-08 12:24:42 +08:00
cocos02
419bfab1f4
fix: remove animated edges
2026-06-08 12:22:41 +08:00
cocos02
23f8fb97a6
feat: BFS-based left-to-right tree layout for scene graph
2026-06-08 12:21:05 +08:00
cocos02
f439f7784e
fix: add immediate:true to watcher so initial data renders on first mount
2026-06-08 12:14:57 +08:00
cocos02
b48a760a1e
fix: use local refs for nodes/edges, only useVueFlow for events and fitView
2026-06-08 12:10:18 +08:00
cocos02
518c451a59
fix: remove redundant :nodes/:edges props from VueFlow, useVueFlow already provides them via inject
2026-06-08 12:05:54 +08:00
cocos02
4d48463164
refactor: rewrite editor with immutable state, async-safe Vue Flow, and loading guard
2026-06-07 23:18:43 +08:00
cocos02
45461b4ed7
fix: prevent Vue Flow edge render crash by clearing edges before structural node changes
2026-06-07 23:01:52 +08:00
cocos02
dad5e9b8c3
docs: add editor README with usage guide
2026-06-07 22:51:56 +08:00
cocos02
a22dd8497e
fix: move critical layout CSS to index.html, revert broken absolute positioning
2026-06-07 22:50:20 +08:00
cocos02
469fc1ff33
fix: ensure Vue Flow parent container has explicit dimensions
2026-06-07 22:41:51 +08:00
cocos02
f9ee24197a
chore: update roadmap and session log
2026-06-07 22:00:30 +08:00
cocos02
3b4c6d7024
feat: P3 - visual scenario editor with Vue Flow
...
- editor/: stand-alone Vite multi-page app for visual scenario editing
- editor/components/SceneGraph.vue: Vue Flow graph with scene nodes, branch/default/QTE edges
- editor/components/NodeEditor.vue: right panel editing video/subtitle paths, choices, QTE params
- editor/components/PreviewPanel.vue: embedded video player previewing selected scene
- editor/composables/useGraphEditor.ts: bidirectional graph<->JSON sync
- editor/App.vue: toolbar (new scene, import/export JSON, load demo, start scene selector)
- @vue-flow/core|background|controls: graph visualization dependencies
- vite.config.ts: multi-page build (main + editor)
- ROADMAP: mark P3 as completed
2026-06-07 21:38:08 +08:00
cocos02
65c26e0972
fix: clear old subtitle cues when switching to scene without subtitles
...
Previously when subtitleUrl became null, the old cues array was retained
and would replay from the beginning on the next scene.
2026-06-07 21:22:45 +08:00
cocos02
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
cocos02
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
cocos02
bb657b3547
fix: capture save thumbnail on videoEnd instead of sceneChange
...
Previously thumbnail was captured during sceneChange (before video starts
playing), so readyState was low and capture was skipped. Now capture on
videoEnd when frame is guaranteed visible, store in lastThumbnail, and
reuse for both auto-save (slot 0) and manual save.
2026-06-07 21:11:18 +08:00
cocos02
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
cocos02
e2670c50d4
refactor: rename Subtitles prop videoUrl to subtitleUrl
2026-06-07 20:48:39 +08:00
cocos02
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
cocos02
ef00babdb7
feat: add dump() method to GameStore for debugging
2026-06-07 20:30:39 +08:00
cocos02
64a474a741
feat: expose store as window.__store for debugging
2026-06-07 20:29:14 +08:00
cocos02
12d30cc128
docs: add QTE explanation comment in QTESystem
2026-06-07 19:50:45 +08:00
cocos02
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
cocos02
c168e30e52
tweak: reduce intro timeLimit from 15s to 5s for faster testing
2026-06-07 19:00:16 +08:00
cocos02
fa84ed909a
test: add timeLimit to intro scene for timer feature testing
...
First intro choice has 15s limit, times out to left_door if user doesn't act
2026-06-07 18:59:37 +08:00
cocos02
7826d789a7
docs: add unit comment for Choice.timeLimit
2026-06-07 18:57:16 +08:00
cocos02
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
cocos02
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
cocos02
c61826e87c
feat: auto-save on scene change + resume from auto-save
...
- useGameEngine: auto-save to slot 0 on every sceneChange event
- useGameEngine: add resumeAutoSave() for continuing from auto-save
- useGameEngine: extract registerEvents() to share between start and resume
- SaveLoadMenu: show slot 0 as '自动存档' with distinct styling and read-only button
- App.vue: check auto-save on load, show '继续上次进度' button if available
2026-06-07 18:42:34 +08:00
cocos02
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
cocos02
b96a12a2f3
docs: add comment explaining waitReady logic
2026-06-07 17:05:59 +08:00
cocos02
937e45c203
feat: P1 core - seamless video switching, conditional branches, save/load
...
- VideoManager: A/B dual-buffered video with crossfade transitions and candidate preloading
- Engine: condition-based choice filtering, ChoiceSystem timer, resumeScene for save/load
- SceneManager: getCandidateUrls for preloading next scenes
- SaveSystem: Dexie.js IndexedDB multi-slot save/load
- ChoiceSystem: timed choices with countdown and auto-default on timeout
- GamePlayer: dual video elements with crossfade CSS
- ChoicePanel: timer progress bar and countdown text
- SaveLoadMenu: save/load UI component
- App.vue: menu trigger, dual video refs, save/load integration
- gameStore: timer state, saves list
- demo.json: conditional choice example (secret ending, requires trust >= 80)
- ROADMAP: mark P1 as completed
2026-06-07 16:48:52 +08:00
cocos02
42181fe185
chore: remove unused imports in useGameEngine
2026-06-07 16:18:05 +08:00
cocos02
058e688f6e
add feature idea: AI-generated story from player choices
2026-06-07 16:03:05 +08:00
cocos02
7aed2b46ca
fix: add start button to satisfy browser autoplay policy
...
Replace auto-start after loading with a '开始游戏' button overlay.
The user click provides the required user gesture for autoplay with sound,
fixing the issue where play() was silently rejected and choices never appeared.
2026-06-07 15:44:31 +08:00
cocos02
192ecbbce2
fix: wait for video metadata before playing and set onEnd before play
...
- Reorder onEnd callback before play() in Engine.goToScene to prevent
missed ended event if video ends synchronously
- Wait for loadedmetadata event in VideoManager.play() before seeking
to ensure currentTime reset works correctly on new video sources
2026-06-07 14:34:15 +08:00
cocos02
fb93782331
fix: wait for DOM update before attaching video element
2026-06-07 14:16:20 +08:00
cocos02
3729b90be9
add README
2026-06-07 14:05:01 +08:00
cocos02
aeb6dc46a4
init
2026-06-07 13:50:05 +08:00