@oh-story/dsh 0.1.12 → 0.1.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +17 -11
- package/lib/client.js +85 -35
- package/lib/client.js.map +3 -3
- package/lib/drama/manifest.json +41 -36
- package/lib/drama/skills/short-drama/scripts/creator_markdown_check.py +340 -13
- package/lib/drama/skills/short-drama-assets/references/voice-direction.md +4 -2
- package/lib/drama/skills/short-drama-edit/SKILL.md +32 -12
- package/lib/drama/skills/short-drama-edit/references/still-cuts.md +90 -0
- package/lib/drama/skills/short-drama-edit/scripts/edit_tool.py +1035 -145
- package/lib/drama/skills/short-drama-edit/scripts/selftest.py +48 -0
- package/lib/drama/skills/short-drama-produce/SKILL.md +6 -1
- package/lib/drama/skills/short-drama-produce/references/adapter-contract.md +12 -0
- package/lib/drama/skills/short-drama-produce/scripts/production_tool.py +138 -9
- package/lib/drama/skills/short-drama-produce/scripts/provider_adapters.py +6 -0
- package/lib/drama/skills/short-drama-storyboard/SKILL.md +2 -0
- package/lib/drama/skills/short-drama-storyboard/references/production-shot-grammar.md +3 -1
- package/lib/drama/skills/short-drama-video-prompts/SKILL.md +7 -0
- package/lib/drama/skills/short-drama-video-prompts/references/performance-action-timing.md +14 -0
- package/lib/drama/skills/short-drama-video-prompts/references/seedance-2.5.md +19 -6
- package/lib/drama/skills/short-drama-video-prompts/references/stage-contract.md +1 -0
- package/lib/drama/skills/short-drama-video-prompts/references/target-model-profile.md +5 -0
- package/lib/drama/skills/short-drama-video-prompts/references/wan-3.0.md +4 -1
- package/lib/index.js +16 -7
- package/lib/index.js.map +2 -2
- package/lib/novel-to-game/README.md +98 -44
- package/lib/novel-to-game/README_ZH.md +100 -46
- package/lib/novel-to-game/VERSION +1 -1
- package/lib/novel-to-game/examples/jin-ping-mei/build/BUILD_BRIEF.md +27 -202
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/RUN.md +23 -115
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/bg/chamber.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/bg/court_night.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/bg/court_rain.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/bg/garden.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/bg/hall.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/bg/kitchen.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/bg/street.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/bg/street_dawn.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/bg/temple.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/yue/moon.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/meng/angry.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/meng/blush.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/meng/neutral.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/meng/sad.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/meng/smile.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/meng/surprised.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/pan/angry.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/pan/blush.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/pan/neutral.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/pan/sad.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/pan/smile.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/pan/surprised.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/pinger/angry.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/pinger/blush.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/pinger/neutral.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/pinger/sad.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/pinger/smile.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/pinger/surprised.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/xuee/angry.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/xuee/blush.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/xuee/neutral.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/xuee/sad.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/xuee/smile.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/xuee/surprised.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/yue/angry.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/yue/blush.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/yue/neutral.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/yue/sad.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/yue/smile.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/yue/surprised.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/css/style.css +326 -2503
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/index.html +71 -4
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/adv.js +221 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/audio.js +113 -257
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/main.js +511 -3026
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/menus.js +277 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/petals.js +67 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/stage.js +180 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/store.js +70 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/story/common.js +198 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/story/common2.js +204 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/story/common3.js +198 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/story/dates.js +186 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/story/index.js +122 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/story/meng.js +190 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/story/pan.js +212 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/story/pinger.js +198 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/story/xuee.js +199 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/story/yue.js +214 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/package.json +2 -2
- package/lib/novel-to-game/examples/jin-ping-mei/build/art/generated-art.json +182 -45
- package/lib/novel-to-game/examples/jin-ping-mei/qa/README.md +7 -17
- package/lib/novel-to-game/examples/jin-ping-mei/qa/verification.json +9 -9
- package/lib/novel-to-game/manifest.json +303 -78
- package/lib/novel-to-game/skills/game-art-direction/references/art-direction-method.md +7 -2
- package/lib/novel-to-game/skills/game-concept/references/concept-method.md +2 -0
- package/lib/novel-to-game/skills/game-world-design/references/narrative-design-method.md +2 -0
- package/lib/novel-to-game/skills/game-world-design/references/world-design-method.md +9 -0
- package/lib/types/client/drama-production-view.d.ts +11 -0
- package/lib/types/client/drama-production-view.d.ts.map +1 -1
- package/lib/types/client/file-activity.d.ts +1 -1
- package/lib/types/client/file-activity.d.ts.map +1 -1
- package/lib/types/client/production-prompts.d.ts +7 -1
- package/lib/types/client/production-prompts.d.ts.map +1 -1
- package/lib/types/client/production-runtime.d.ts +7 -2
- package/lib/types/client/production-runtime.d.ts.map +1 -1
- package/lib/types/drama-adapters.d.ts.map +1 -1
- package/lib/types/skill-provider.d.ts.map +1 -1
- package/lib/types/video-project.d.ts.map +1 -1
- package/lib/video-recap/CHANGELOG.md +108 -1
- package/lib/video-recap/README.en.md +18 -14
- package/lib/video-recap/README.md +18 -14
- package/lib/video-recap/manifest.json +297 -321
- package/lib/video-recap/skills/video-assemble/SKILL.md +18 -16
- package/lib/video-recap/skills/video-assemble/references/explicit-audio-mix.md +3 -1
- package/lib/video-recap/skills/video-assemble/references/jianying/SOURCE.md +5 -5
- package/lib/video-recap/skills/video-assemble/references/packaging.md +4 -4
- package/lib/video-recap/skills/video-assemble/references/subtitle-track.md +10 -10
- package/lib/video-recap/skills/video-assemble/scripts/adoption/audio_mix_binding.py +13 -2
- package/lib/video-recap/skills/video-assemble/scripts/adoption/av_clock.py +109 -0
- package/lib/video-recap/skills/video-assemble/scripts/adoption/strict_publish.py +4 -1
- package/lib/video-recap/skills/video-assemble/scripts/artifacts.py +2 -9
- package/lib/video-recap/skills/video-assemble/scripts/assemble.py +188 -51
- package/lib/video-recap/skills/video-assemble/scripts/assemble_constants.py +0 -1
- package/lib/video-recap/skills/video-assemble/scripts/assembly_contract.py +32 -75
- package/lib/video-recap/skills/video-assemble/scripts/assembly_settings.py +8 -15
- package/lib/video-recap/skills/video-assemble/scripts/audio_mix.py +202 -161
- package/lib/video-recap/skills/video-assemble/scripts/codec_peak.py +112 -0
- package/lib/video-recap/skills/video-assemble/scripts/export_jianying.py +10 -101
- package/lib/video-recap/skills/video-assemble/scripts/jianying/builders.py +44 -475
- package/lib/video-recap/skills/video-assemble/scripts/jianying/model.py +1 -22
- package/lib/video-recap/skills/video-assemble/scripts/jianying/templates.py +0 -3
- package/lib/video-recap/skills/video-assemble/scripts/jianying/timeline_contract.py +36 -103
- package/lib/video-recap/skills/video-assemble/scripts/jianying/tracks.py +0 -8
- package/lib/video-recap/skills/video-assemble/scripts/jianying/writer.py +28 -203
- package/lib/video-recap/skills/video-assemble/scripts/lib.py +20 -34
- package/lib/video-recap/skills/video-assemble/scripts/loudness.py +332 -0
- package/lib/video-recap/skills/video-assemble/scripts/media.py +158 -38
- package/lib/video-recap/skills/video-assemble/scripts/narration_audio.py +30 -16
- package/lib/video-recap/skills/video-assemble/scripts/render_preflight.py +49 -8
- package/lib/video-recap/skills/video-assemble/scripts/source_subtitles.py +17 -6
- package/lib/video-recap/skills/video-assemble/scripts/subtitles/core.py +24 -2
- package/lib/video-recap/skills/video-assemble/scripts/subtitles/track.py +2 -5
- package/lib/video-recap/skills/video-assemble/scripts/subtitles/track_binding.py +2 -9
- package/lib/video-recap/skills/video-assemble/scripts/timeline.py +12 -34
- package/lib/video-recap/skills/video-assemble/scripts/timeline_emit.py +3 -4
- package/lib/video-recap/skills/video-assemble/scripts/visual_render.py +28 -2
- package/lib/video-recap/skills/video-cut/SKILL.md +37 -11
- package/lib/video-recap/skills/video-cut/references/shot-review.md +1 -1
- package/lib/video-recap/skills/video-cut/scripts/cut.py +2 -34
- package/lib/video-recap/skills/video-cut/scripts/cut_cli.py +96 -124
- package/lib/video-recap/skills/video-cut/scripts/cut_contract.py +97 -182
- package/lib/video-recap/skills/video-cut/scripts/cut_render.py +177 -166
- package/lib/video-recap/skills/video-cut/scripts/frame_grid.py +249 -0
- package/lib/video-recap/skills/video-cut/scripts/lib.py +0 -3
- package/lib/video-recap/skills/video-cut/scripts/media_geometry.py +173 -7
- package/lib/video-recap/skills/video-cut/scripts/sentence_boundaries.py +234 -151
- package/lib/video-recap/skills/video-cut/scripts/sentence_gate.py +189 -0
- package/lib/video-recap/skills/video-cut/scripts/shot_review.py +2 -6
- package/lib/video-recap/skills/video-recap/SKILL.md +24 -27
- package/lib/video-recap/skills/video-recap/references/audio-routing.md +8 -6
- package/lib/video-recap/skills/video-recap/references/config-playbook.md +8 -11
- package/lib/video-recap/skills/video-recap/references/data-schema.md +131 -74
- package/lib/video-recap/skills/video-recap/references/resource-library.md +17 -1
- package/lib/video-recap/skills/video-recap/scripts/doctor.py +51 -268
- package/lib/video-recap/skills/video-recap/scripts/final_qc.py +89 -254
- package/lib/video-recap/skills/video-recap/scripts/lib.py +81 -70
- package/lib/video-recap/skills/video-recap/scripts/library.py +40 -4
- package/lib/video-recap/skills/video-recap/scripts/materials.py +13 -80
- package/lib/video-recap/skills/video-recap/scripts/recap_cli.py +49 -17
- package/lib/video-recap/skills/video-recap/scripts/recap_inspect.py +1 -3
- package/lib/video-recap/skills/video-recap/scripts/recap_runner.py +86 -116
- package/lib/video-recap/skills/video-recap/scripts/recap_runtime.py +87 -23
- package/lib/video-recap/skills/video-recap/scripts/recap_source.py +0 -39
- package/lib/video-recap/skills/video-recap/scripts/recap_stage_qc.py +37 -135
- package/lib/video-recap/skills/video-recap/scripts/recap_timeline.py +118 -127
- package/lib/video-recap/skills/video-recap/scripts/resources/__init__.py +4 -0
- package/lib/video-recap/skills/video-recap/scripts/{resource_lock.py → resources/lock.py} +1 -1
- package/lib/video-recap/skills/video-recap/scripts/{project_binding.py → resources/project_binding.py} +78 -17
- package/lib/video-recap/skills/video-reference/SKILL.md +108 -0
- package/lib/video-recap/skills/video-reference/references/reference-schema.md +139 -0
- package/lib/video-recap/skills/video-reference/scripts/lib.py +85 -0
- package/lib/video-recap/skills/video-reference/scripts/reference.py +96 -0
- package/lib/video-recap/skills/video-reference/scripts/reference_check.py +553 -0
- package/lib/video-recap/skills/video-reference/scripts/reference_frames.py +122 -0
- package/lib/video-recap/skills/video-reference/scripts/reference_measure.py +253 -0
- package/lib/video-recap/skills/video-reference/scripts/reference_profile.py +271 -0
- package/lib/video-recap/skills/video-script/SKILL.md +9 -7
- package/lib/video-recap/skills/video-script/scripts/agent_text.py +18 -267
- package/lib/video-recap/skills/video-script/scripts/deslop_qc.py +12 -30
- package/lib/video-recap/skills/video-script/scripts/entry_suggestion.py +125 -0
- package/lib/video-recap/skills/video-script/scripts/evidence_bundle.py +2 -26
- package/lib/video-recap/skills/video-script/scripts/lib.py +5 -15
- package/lib/video-recap/skills/video-script/scripts/lint_summary.py +184 -0
- package/lib/video-recap/skills/video-script/scripts/narration_lint.py +120 -100
- package/lib/video-recap/skills/video-script/scripts/review.py +3 -34
- package/lib/video-recap/skills/video-script/scripts/review_grounding.py +20 -46
- package/lib/video-recap/skills/video-script/scripts/review_response.py +120 -258
- package/lib/video-recap/skills/video-script/scripts/review_runner.py +2 -10
- package/lib/video-recap/skills/video-script/scripts/speech_ownership.py +89 -5
- package/lib/video-recap/skills/video-script/scripts/validate.py +26 -34
- package/lib/video-recap/skills/video-understanding/SKILL.md +29 -4
- package/lib/video-recap/skills/video-understanding/references/data-schema.md +5 -22
- package/lib/video-recap/skills/video-understanding/scripts/agent_text.py +24 -121
- package/lib/video-recap/skills/video-understanding/scripts/asr.py +11 -5
- package/lib/video-recap/skills/video-understanding/scripts/asr_timing_evidence.py +15 -24
- package/lib/video-recap/skills/video-understanding/scripts/briefing/builder.py +59 -25
- package/lib/video-recap/skills/video-understanding/scripts/briefing/context.py +39 -3
- package/lib/video-recap/skills/video-understanding/scripts/briefing/inputs.py +15 -27
- package/lib/video-recap/skills/video-understanding/scripts/briefing/timeline.py +136 -37
- package/lib/video-recap/skills/video-understanding/scripts/consolidate.py +121 -37
- package/lib/video-recap/skills/video-understanding/scripts/detect.py +118 -16
- package/lib/video-recap/skills/video-understanding/scripts/index_normalize.py +359 -0
- package/lib/video-recap/skills/video-understanding/scripts/lib.py +62 -21
- package/lib/video-recap/skills/video-understanding/scripts/storyboard.py +181 -51
- package/lib/video-recap/skills/video-understanding/scripts/timeline_fusion.py +0 -26
- package/lib/video-recap/skills/video-understanding/scripts/understanding_brief.py +37 -14
- package/lib/video-recap/skills/video-understanding/scripts/understanding_cache.py +40 -32
- package/lib/video-recap/skills/video-understanding/scripts/understanding_runner.py +100 -127
- package/lib/video-recap/skills/video-understanding/scripts/understanding_storyboard.py +182 -30
- package/lib/video-recap/skills/video-understanding/scripts/vlm.py +30 -27
- package/lib/video-recap/skills/video-voiceover/SKILL.md +19 -12
- package/lib/video-recap/skills/video-voiceover/references/index-tts.md +3 -3
- package/lib/video-recap/skills/video-voiceover/scripts/approved_text_policy.py +3 -1
- package/lib/video-recap/skills/video-voiceover/scripts/dub.py +60 -135
- package/lib/video-recap/skills/video-voiceover/scripts/lib.py +9 -34
- package/lib/video-recap/skills/video-voiceover/scripts/providers/fish_audio.py +6 -1
- package/lib/video-recap/skills/video-voiceover/scripts/tts_audio.py +64 -1
- package/lib/video-recap/skills/video-voiceover/scripts/tts_cache.py +99 -0
- package/lib/video-recap/skills/video-voiceover/scripts/voiceover.py +177 -200
- package/package.json +45 -45
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/group/inner_court_accord_five.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/group/public_day15.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/household/li_jiaoer.webp +0 -0
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/css/new-guofeng.css +0 -1494
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/assets.js +0 -147
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/data.js +0 -7470
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/engine.js +0 -13066
- package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/text.js +0 -32
- package/lib/novel-to-game/examples/jin-ping-mei/qa/playable-model.json +0 -99
- package/lib/novel-to-game/examples/jin-ping-mei/qa/verify_playable_model.mjs +0 -152
- package/lib/video-recap/skills/video-assemble/references/foreground-compose.md +0 -118
- package/lib/video-recap/skills/video-assemble/references/jianying/empty_jy_combination_segment.json +0 -84
- package/lib/video-recap/skills/video-assemble/references/jianying/empty_jy_combination_video_material.json +0 -98
- package/lib/video-recap/skills/video-assemble/references/jianying/empty_jy_draft.json +0 -204
- package/lib/video-recap/skills/video-assemble/references/pair-media.md +0 -74
- package/lib/video-recap/skills/video-assemble/scripts/compose_foreground.py +0 -293
- package/lib/video-recap/skills/video-assemble/scripts/pair_media.py +0 -216
- package/lib/video-recap/skills/video-recap/references/shift-left-qc-schema.md +0 -23
- package/lib/video-recap/skills/video-recap/scripts/mimo_qc.py +0 -33
- package/lib/video-recap/skills/video-recap/scripts/qc/__init__.py +0 -1
- package/lib/video-recap/skills/video-recap/scripts/qc/mimo_client.py +0 -13
- package/lib/video-recap/skills/video-recap/scripts/qc/mimo_contract.py +0 -9
- package/lib/video-recap/skills/video-recap/scripts/qc/mimo_evidence.py +0 -287
- package/lib/video-recap/skills/video-recap/scripts/qc/mimo_observations.py +0 -175
- package/lib/video-recap/skills/video-recap/scripts/qc/mimo_payload.py +0 -206
- package/lib/video-recap/skills/video-recap/scripts/qc/mimo_report.py +0 -318
- package/lib/video-recap/skills/video-recap/scripts/qc/mimo_runner.py +0 -130
- package/lib/video-recap/skills/video-recap/scripts/qc_contract.py +0 -320
- package/lib/video-recap/skills/video-script/scripts/timeline_fusion.py +0 -108
- package/lib/video-recap/skills/video-understanding/scripts/brief.py +0 -9
- package/lib/video-recap/skills/video-understanding/scripts/deslop_qc.py +0 -211
- package/lib/video-recap/skills/video-understanding/scripts/narration_lint.py +0 -707
- package/lib/video-recap/skills/video-understanding/scripts/speech_ownership.py +0 -143
- /package/lib/video-recap/skills/video-cut/scripts/{narration_mapping.py → cut_qc.py} +0 -0
|
@@ -39,33 +39,39 @@ Each game links to the adaptation workspace behind it: source provenance, the co
|
|
|
39
39
|
|
|
40
40
|
### Journey to the West · Three Borrowings of the Banana Fan
|
|
41
41
|
|
|
42
|
-
|
|
42
|
+
<p>
|
|
43
|
+
<a href="https://xiyouji.vibecoco.ai"><img src="examples/journey-to-the-west/screenshots/hero.jpg" alt="Wukong's party in the painted Flame Mountain village, with minimap, quest tracker, chat log and function buttons in the corners" width="49%"></a>
|
|
44
|
+
<a href="https://xiyouji.vibecoco.ai"><img src="examples/journey-to-the-west/screenshots/battle.jpg" alt="Jilei Mountain battle: the Bull Demon King's side on the left, Wukong's party on the right, action-order bar above and command panel below" width="49%"></a>
|
|
45
|
+
</p>
|
|
43
46
|
|
|
44
|
-
**One wave of a fan blew you fifty thousand li.
|
|
47
|
+
**One wave of a fan blew you fifty thousand li. Walk back, take the quest, and win the mountain one turn at a time.**
|
|
45
48
|
|
|
46
|
-
|
|
49
|
+
A Fantasy Westward Journey-style turn-based RPG built on chapters 59–61. Click to walk four painted scene maps, find the NPCs marked "!", let the quest tracker auto-path you there, and take the repeatable demon-bounty daily between story fights. Earn experience and silver, shop, swap gear, study skills and field a pet; then win command-turn battles with the five-element wheel, rage stunts and Wukong's seventy-two transformations, until a demon king who outclasses you ends as rain over the Mountain of Flames.
|
|
47
50
|
|
|
48
51
|
**[Play in browser](https://xiyouji.vibecoco.ai)** · [Adaptation workspace](examples/journey-to-the-west/) · design estimate: 45–90 min · all ages · playable prototype
|
|
49
52
|
|
|
50
53
|
### Jin Ping Mei · Ledger of Desire
|
|
51
54
|
|
|
52
|
-
|
|
55
|
+
<p>
|
|
56
|
+
<a href="https://jinpingmei.vibecoco.ai"><img src="examples/jin-ping-mei/screenshots/title.jpg" alt="Animated title screen: the five women of the Ximen household in a spring courtyard beside the title and menu" width="49%"></a>
|
|
57
|
+
<a href="https://jinpingmei.vibecoco.ai"><img src="examples/jin-ping-mei/screenshots/adv.jpg" alt="Dinner scene: three heroines standing in the hall while Meng Yulou speaks in a name-plated text box above the ADV control bar" width="49%"></a>
|
|
58
|
+
</p>
|
|
53
59
|
|
|
54
|
-
**
|
|
60
|
+
**That spring, five doors kept a lamp lit for you. Whatever you say, they remember.**
|
|
55
61
|
|
|
56
|
-
|
|
62
|
+
A galgame-style romance ADV set in the Ximen household the spring after Li Ping'er marries in. A common route puts all five women at one table, in one night of rain and at one Qingming feast; what your choices build with each of them decides which courtyard doors are still lit on the night the routes split. Each of the five heroine routes has a good, an ordinary and a missed ending (16 endings, counting the one where no lamp is left), and every heroine ending turns to a fixed page of what the novel does to her (the no-lamp ending turns to Ximen Qing's death and the household scattering). Auto, read-only skip, backlog, hide, quick save, thumbnail saves and rollback are there, with a CG gallery, scene replay, music room and ending flowchart.
|
|
57
63
|
|
|
58
|
-
**[Play in browser](https://jinpingmei.vibecoco.ai)** · [Adaptation workspace](examples/jin-ping-mei/) · design estimate:
|
|
64
|
+
**[Play in browser](https://jinpingmei.vibecoco.ai)** · [Adaptation workspace](examples/jin-ping-mei/) · design estimate: 20–30 min per route, 1–1.5 h for all five · 18+ · playable prototype
|
|
59
65
|
|
|
60
66
|
### Project Plateau · The Lost World · 3D
|
|
61
67
|
|
|
62
|
-
A real-time **first-person 3D field-photography game** adapted from Arthur Conan Doyle's *The Lost World*.
|
|
68
|
+
A real-time **first-person 3D field-photography game** adapted from Arthur Conan Doyle's *The Lost World*. Under a low western sun, walk out from Fort Challenger through knee-high grass, keep to a band of thorn arches for cover, and expose four glass plates through a long lens. Each plate is graded on the spot from what the live camera actually framed, with stamps and a line from the sceptical Summerlee. A pterodactyl circles before it dives, a stegosaurus may come down to drink at the brook, and you have 300 seconds of light to bring the plates back.
|
|
63
69
|
|
|
64
|
-
Play the full expedition on desktop, or watch the 15-second gameplay preview on other devices.
|
|
70
|
+
Play the full expedition on desktop, or watch the 15-second gameplay preview on other devices. It is a real capture of the current build.
|
|
65
71
|
|
|
66
|
-
https://github.com/user-attachments/assets/
|
|
72
|
+
https://github.com/user-attachments/assets/5ad62a58-1abe-4d73-b86e-1c8c6563fdb2
|
|
67
73
|
|
|
68
|
-
**[Play in your browser — no install](https://plateau.vibecoco.ai)** · [Adaptation workspace](examples/project-plateau/) · [Share feedback](https://github.com/zenstory-ai/novel-to-game/discussions/7) · design estimate:
|
|
74
|
+
**[Play in your browser — no install](https://plateau.vibecoco.ai)** · [Adaptation workspace](examples/project-plateau/) · [Share feedback](https://github.com/zenstory-ai/novel-to-game/discussions/7) · design estimate: 5–10 min (300 s of light per run) · desktop WebGL2 · playable prototype
|
|
69
75
|
|
|
70
76
|
## What it is
|
|
71
77
|
|
|
@@ -73,14 +79,20 @@ There is no GPU, no hosted service, and no bundled engine: the skills run on the
|
|
|
73
79
|
|
|
74
80
|
- **Every design decision cites the novel.** Analysis reads the whole book and writes a `SOURCE_BIBLE` where every hard rule, key character goal, turning point and ending, and signature anchor carries its chapter or file location, and every adaptation-boundary row cites its evidence. Source facts are labelled `immutable`, `adaptable`, `open`, or `conflicted`; anything the novel does not define is marked a design invention, never smuggled in as fact.
|
|
75
81
|
- **The game shape is a documented decision, not a default.** The concept stage compares real alternatives and kills directions with named hard vetoes (the core loop ignores the novel's central tension; strip the proper nouns and a generic template remains; the player only spends resources to release a fixed plot). Concept, world design, and art direction are written by different stages into different documents, and the build may not quietly redesign them.
|
|
82
|
+
- **A borrowed genre comes with its shell.** Players recognise a genre by more than its core mechanic, so a systems game lists which parts of the genre's shell (entering the world, objective guidance, progression and reasons to return) it implements, degrades, or drops and why, and what the first minute shows. A Fantasy Westward Journey-style RPG is not shipped as a bare chain of fights.
|
|
76
83
|
- **Built for the runtime the brief locks.** The product brief, the one-page requirements sheet the agent drafts first (in `quick` it stops for your decision only on blocking items such as platform, rights, or adult content), locks platform, engine, target runtime, and the runtime actually available for testing. A missing toolchain may not silently become a web build. The design documents are engine-independent Markdown you own.
|
|
77
84
|
- **QA is one real run, six checks, and honest limitations.** The build is launched on the tested runtime and one complete execution proves `launch`, `render`, `input`, `coreLoop`, `outcome`, and `restart`. Fun, balance, other browsers, and rights are written as limitations, never as PASS.
|
|
78
85
|
- **Voice is opt-in and generated at build time by default.** No line goes to a text-to-speech provider unless art direction chooses voice; runtime synthesis needs the product brief's explicit approval, and the novel and design documents are never uploaded.
|
|
79
86
|
|
|
80
|
-
Interactive fiction is a first-class track: continuous scenes, dialogue, testimony, and key choices can carry the whole game, held to the same agency and evidence requirements as a systems game.
|
|
87
|
+
Interactive fiction is a first-class track: continuous scenes, dialogue, testimony, and key choices can carry the whole game, held to the same agency and evidence requirements as a systems game. On a character route, a key choice targets that character's own wound or agenda, and the relationship shows in reactions, forms of address, the places that open to you and what you are trusted with, not in an on-screen number.
|
|
81
88
|
|
|
82
89
|
## Install
|
|
83
90
|
|
|
91
|
+
### ClawHub
|
|
92
|
+
|
|
93
|
+
ClawHub distribution is governed by the repository's [explicit publish inventory](.clawhub/publish.json), with discovery through [ClawHub](https://clawhub.ai/). A skill-specific link is added here only after its publisher, version, and anonymous accessibility are verified, so this README never presents a nonexistent listing as live.
|
|
94
|
+
|
|
95
|
+
|
|
84
96
|
Prerequisite: you already use Claude Code, Codex, or Kimi Code, and `npx` (Node.js) runs in your terminal.
|
|
85
97
|
|
|
86
98
|
| Agent CLI | Install | Invoke |
|
|
@@ -132,7 +144,7 @@ codex plugin add novel-to-game@novel-to-game-skills
|
|
|
132
144
|
|
|
133
145
|
## See what it produces
|
|
134
146
|
|
|
135
|
-
Every excerpt below is copied from a file in this repository; the two Chinese examples keep their documents in Simplified Chinese, so
|
|
147
|
+
Every excerpt below is copied from a file in this repository; the two Chinese examples keep their documents in Simplified Chinese, so their Markdown excerpts are translated here and marked as such, while JSON records are quoted as they are and glossed in the surrounding text. The originals are linked. Cuts are marked with "…".
|
|
136
148
|
|
|
137
149
|
### What the design documents look like
|
|
138
150
|
|
|
@@ -171,14 +183,28 @@ taking down the White Bull's true form with your companion beast and transformat
|
|
|
171
183
|
and dragging it out means you will be killed in turn, so "when to open the third wave" is the core decision of the finale.
|
|
172
184
|
```
|
|
173
185
|
|
|
174
|
-
|
|
186
|
+
The same document lists the genre's shell around those battles, and what was implemented, degraded, or dropped (translated; 4 of the table's 8 rows):
|
|
175
187
|
|
|
176
188
|
```markdown
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
189
|
+
| Genre shell | State | How / why |
|
|
190
|
+
|---|---|---|
|
|
191
|
+
| Entering the world and moving | Implemented | Four walkable 3/4 scenes (Flame Mountain village, Cuiyun Mountain, the fire mouth, Jilei Mountain); click-to-walk, arrow-key walking, teal teleport circles (click the circle or its name) |
|
|
192
|
+
| Objective guidance / tracking | Implemented | "!" above main-quest NPCs; one click on the quest tracker on the right auto-paths, across maps too; minimap at top left |
|
|
193
|
+
…
|
|
194
|
+
| Pets | Degraded | Two fixed pets (the Water-Repelling Golden-Eyed Beast and a catchable fire demon), one in battle; no collection pool, breeding, or rerolling — a 45–90 minute campaign has no use for them |
|
|
195
|
+
…
|
|
196
|
+
| Parties / trading / PVP | Not done | A single-player offline game with no second player; master and three disciples are the fixed party |
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
[`design/ART_DIRECTION.md`](examples/journey-to-the-west/design/ART_DIRECTION.md) sets the bar as the genre's own screenshots, then gives each wave of the fan its own effect and saves the lasting change to the world for the ending (translated):
|
|
200
|
+
|
|
201
|
+
```markdown
|
|
202
|
+
**Any in-game screenshot, taken at random, should look like a game screen from a turn-based Journey to the West online game such as Fantasy Westward Journey or Wen Dao**: painted 3/4 top-down walking scenes,
|
|
203
|
+
small HUD cards pinned to the four corners, names and quest markers over heads; battles with two rows of standing figures, enemy left and party right, an action-order bar along the top and a command panel at the bottom.
|
|
204
|
+
What is borrowed is the genre's form and readability, not their chibi big heads, outlines, or specific character designs.
|
|
205
|
+
…
|
|
206
|
+
5. **The true fan's three waves**: each wave gets a teal-outlined banner, followed by two or three seconds of full-screen tint and particles — ash settling as the fire is quelled, wind streaks, rain lines.
|
|
207
|
+
The lasting change to the world belongs to the ending: the Mountain of Flames becomes a new rain-soaked landscape with no open flame (`huoyan-rain`), with the restart button always visible.
|
|
182
208
|
```
|
|
183
209
|
|
|
184
210
|
And [`qa/verification.json`](examples/journey-to-the-west/qa/verification.json) records the real browser run that reached that ending and started over:
|
|
@@ -203,36 +229,50 @@ And [`qa/verification.json`](examples/journey-to-the-west/qa/verification.json)
|
|
|
203
229
|
|
|
204
230
|
### How a choice is written so the game remembers it
|
|
205
231
|
|
|
206
|
-
[Jin Ping Mei](examples/jin-ping-mei/) is the
|
|
232
|
+
[Jin Ping Mei](examples/jin-ping-mei/) is the romance-ADV example. It was rebuilt from a 20-day household-ledger simulation into a galgame, and [`concepts/CONCEPT.md`](examples/jin-ping-mei/concepts/CONCEPT.md) now gives each heroine something she wants and a wound only the player gets to see, each pinned to chapters (translated; 3 of the table's 5 rows):
|
|
207
233
|
|
|
208
234
|
```markdown
|
|
209
|
-
Core sentence: **
|
|
235
|
+
Core sentence: **Whatever you said, they remember.**
|
|
210
236
|
…
|
|
211
|
-
|
|
|
212
|
-
|
|
213
|
-
|
|
|
214
|
-
|
|
215
|
-
|
|
|
216
|
-
| Management and relationships supply each other's actions | Each of the five women's abilities handles one thing: accounts, lies, goods, connections, or physical evidence | The optimal play is to skip the character content |
|
|
237
|
+
| Character | What she wants | Her wound | Source basis |
|
|
238
|
+
|---|---|---|---|
|
|
239
|
+
| Wu Yueniang | To be asked first about what matters | She is the principal wife only in front of others | Chapters 1, 21 |
|
|
240
|
+
| Pan Jinlian | To be seen, to be chosen first | Apart from the way you look at her, she has nothing | Chapters 8, 9, 38 |
|
|
241
|
+
| Li Ping'er | Safety and certainty | Seen first as a trunk of valuables, only later as a person | Chapters 14, 16, 19 |
|
|
217
242
|
```
|
|
218
243
|
|
|
219
|
-
[`design/GAME_DESIGN.md`](examples/jin-ping-mei/design/GAME_DESIGN.md)
|
|
244
|
+
[`design/GAME_DESIGN.md`](examples/jin-ping-mei/design/GAME_DESIGN.md) keeps affection off the screen, aims each route's key choice at her wound, and says what decides the ending (translated; 2 of the route table's 5 rows):
|
|
220
245
|
|
|
221
246
|
```markdown
|
|
222
|
-
|
|
223
|
-
|
|
247
|
+
Choices show no numbers. Affection has only three outlets: her expression and lines; whether her courtyard door is "lit" on the night the routes split; and an optional "feelings" glance in the system menu
|
|
248
|
+
(only her look and "the lamp is lit / the lamp is going out", no tiers and no numbers). Yueniang states the rule in the first chapter: on the night the Qingming feast breaks up, only a door still lit can be entered.
|
|
249
|
+
…
|
|
250
|
+
| Character | Source basis | Key choice (the right move) | Good | Ordinary | Missed |
|
|
251
|
+
|---|---|---|---|---|---|
|
|
252
|
+
…
|
|
253
|
+
| Pan Jinlian | Chapters 8, 38: sends verses longing for him; plays the pipa on a snowy night | Do not open Ping'er's trunks for her, but stay with her tonight | The pipa is not cold | The side gate left ajar | The fan falls |
|
|
254
|
+
| Li Ping'er | Chapters 14, 19: entrusts herself over the garden wall; met coldly when she marries in | Do not take her keys; say in front of everyone that her silver is hers | The keys in her hand | Tea under the window | The trunks |
|
|
255
|
+
…
|
|
256
|
+
Ending rule: get the key choice wrong → Missed; get it right, with her affection ≥7 and the truth told at the last question → Good; otherwise → Ordinary.
|
|
224
257
|
```
|
|
225
258
|
|
|
226
|
-
|
|
259
|
+
Every heroine ending then turns to a page of what the novel does to her, and the same document is plain about it: the ending decides only what the two of you made of this one spring, and the page footer says it cannot change where she goes in the book.
|
|
260
|
+
|
|
261
|
+
The QA record is candid about how much of that was played. In [`qa/verification.json`](examples/jin-ping-mei/qa/verification.json), the complete browser run ends at `yue_good` and all six checks pass; the first and last limitations read:
|
|
227
262
|
|
|
228
263
|
```json
|
|
229
264
|
{
|
|
230
265
|
"scope": "路径覆盖",
|
|
231
|
-
"reason": "
|
|
266
|
+
"reason": "浏览器只走月娘良缘一条完整路径;其余 15 个结局由 test/lint_script.mjs 穷举选择证明可达,未逐一在浏览器渲染。"
|
|
267
|
+
},
|
|
268
|
+
…
|
|
269
|
+
{
|
|
270
|
+
"scope": "体验判断",
|
|
271
|
+
"reason": "自动化只证明能启动、渲染、输入、走到结局并重开,不判断剧情是否动人或节奏是否合适。"
|
|
232
272
|
}
|
|
233
273
|
```
|
|
234
274
|
|
|
235
|
-
That is: the
|
|
275
|
+
That is: the browser walked only Wu Yueniang's good-ending route, and the other 15 endings were shown reachable by exhausting the choices in `test/lint_script.mjs`, not rendered one by one. Automation proves the game launches, renders, takes input, reaches an ending and restarts; it does not judge whether the story moves anyone or whether the pacing is right.
|
|
236
276
|
|
|
237
277
|
### What the QA record admits it did not test
|
|
238
278
|
|
|
@@ -249,7 +289,7 @@ plate, or if recording never changes a later route or defense decision. `GAME_DE
|
|
|
249
289
|
must define that causal chain and preserve the non-lethal scout fantasy.
|
|
250
290
|
```
|
|
251
291
|
|
|
252
|
-
`npm run verify` drives the real build with keyboard and mouse events and writes the input trace and `qa/verification.json` in the same run. The trace in [`build/evidence/current-run/report.json`](examples/project-plateau/build/evidence/current-run/report.json) is the whole expedition:
|
|
292
|
+
`npm run verify` drives the real build with keyboard and mouse events and writes the input trace and `qa/verification.json` in the same run. The trace in [`build/evidence/current-run/report.json`](examples/project-plateau/build/evidence/current-run/report.json) is the whole expedition, out along the thorn band to the blind and back:
|
|
253
293
|
|
|
254
294
|
```json
|
|
255
295
|
"inputTrace": [
|
|
@@ -257,16 +297,17 @@ must define that causal chain and preserve the non-lethal scout fantasy.
|
|
|
257
297
|
"Right Mouse + Left Mouse: record the brook",
|
|
258
298
|
"KeyW: reach the basalt shelf",
|
|
259
299
|
"Right Mouse + Left Mouse: record basalt scale",
|
|
260
|
-
"KeyA:
|
|
261
|
-
"hold KeyC under cover: let the attack widen",
|
|
262
|
-
"KeyW: reach the glade",
|
|
263
|
-
"Right Mouse + Left Mouse: record young at play",
|
|
300
|
+
"KeyA: step under the thorn arches",
|
|
264
301
|
…
|
|
265
|
-
"
|
|
266
|
-
|
|
302
|
+
"KeyW: settle in the glade-edge blind",
|
|
303
|
+
"Right Mouse + Left Mouse: record young at play from the blind",
|
|
304
|
+
"hold KeyC under cover: crouch until the wings lose interest",
|
|
305
|
+
…
|
|
306
|
+
"KeyS: back up the thorn band to Fort"
|
|
307
|
+
]
|
|
267
308
|
```
|
|
268
309
|
|
|
269
|
-
|
|
310
|
+
[`build/BUILD_BRIEF.md`](examples/project-plateau/build/BUILD_BRIEF.md) says exactly what that PASS means:
|
|
270
311
|
|
|
271
312
|
```markdown
|
|
272
313
|
…
|
|
@@ -275,7 +316,20 @@ desktop browser. It does not prove subjective visual quality, comfort, fun, bala
|
|
|
275
316
|
rights clearance, public hosting or other browsers, GPUs and devices.
|
|
276
317
|
```
|
|
277
318
|
|
|
278
|
-
|
|
319
|
+
And [`qa/verification.json`](examples/project-plateau/qa/verification.json) names what this run left out, including the new stegosaurus beat:
|
|
320
|
+
|
|
321
|
+
```json
|
|
322
|
+
{
|
|
323
|
+
"scope": "optional stegosaurus beat",
|
|
324
|
+
"reason": "The complete run does not photograph the stegosaurus; its framing rule is covered by one unit test only."
|
|
325
|
+
},
|
|
326
|
+
{
|
|
327
|
+
"scope": "look, sound and hitches",
|
|
328
|
+
"reason": "Visual quality is a reviewed judgment; the sound beds were not heard on laptop speakers and frame hitches were not measured on an unloaded or low-end machine."
|
|
329
|
+
}
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
The session length moved twice, once on evidence and once on an owner decision, and [`PRODUCT_BRIEF.md`](examples/project-plateau/PRODUCT_BRIEF.md) keeps both steps. The first measured run crossed the whole route in 55.2 seconds, which falsified the planned 5–8 minute session, so the boundary was cut to a 1–3 minute run with 180 seconds of light instead of padding the route with waits. When the owner later asked for a longer 5–10 minute visit, the light budget went to 300 seconds and was filled with new decisions (the optional Chapter XII stegosaurus beat and plate-by-plate grading) rather than more walking; a learned Strong path still finishes in about 90 seconds.
|
|
279
333
|
|
|
280
334
|
## Your first request
|
|
281
335
|
|
|
@@ -355,7 +409,7 @@ Say so in the request, as the second example above does. That locks `experienceP
|
|
|
355
409
|
|
|
356
410
|
### How long does a full run take, and what does it cost?
|
|
357
411
|
|
|
358
|
-
Longer than one prompt. The agent reads the whole novel, writes five design documents, builds, and runs QA, and each stage is a separate skill call, so a full run is long and may span more than one session
|
|
412
|
+
Longer than one prompt. The agent reads the whole novel, writes five design documents, builds, and runs QA, and each stage is a separate skill call, so a full run is long and may span more than one session. Token spend is whatever your coding agent bills; nothing else is paid unless art direction opts into image or voice generation (see the GPU question below). The public examples' progress files do not record wall-clock time or token counts, so this README does not quote a number.
|
|
359
413
|
|
|
360
414
|
### The session ended halfway. Can it continue?
|
|
361
415
|
|
|
@@ -367,7 +421,7 @@ You choose, and the product brief locks it: platform, production engine, target
|
|
|
367
421
|
|
|
368
422
|
### Do I need a GPU or my own model? Who pays for images and voice?
|
|
369
423
|
|
|
370
|
-
No GPU and no separate model: analysis, design, and code are written by the model of the coding agent you already use. External services are opt-in. Generated images are used only when art direction selects them, with the tool chosen in your environment after checking capability, licence, and cost (the Jin Ping Mei example records
|
|
424
|
+
No GPU and no separate model: analysis, design, and code are written by the model of the coding agent you already use. External services are opt-in. Generated images are used only when art direction selects them, with the tool chosen in your environment after checking capability, licence, and cost (the Jin Ping Mei example records most of its images, generated with Codex's built-in image tool, batch by batch in `build/art/generated-art.json`). Voice is off unless art direction chooses it; the default is build-time generation into local assets, only the per-line dialogue and any pronunciation notes are sent, and the novel and design documents are never uploaded. Paid services are one of the things the agent stops to ask about before it starts. See the [TTS production contract](skills/game-build/references/tts-production-contract.md) (Chinese).
|
|
371
425
|
|
|
372
426
|
### How do I know the game it built actually runs? What does the QA PASS mean?
|
|
373
427
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<!-- Last synced with README.md: 2026-
|
|
1
|
+
<!-- Last synced with README.md: 2026-10-02 -->
|
|
2
2
|
|
|
3
3
|
<p align="center">
|
|
4
4
|
<img src="https://zenstory.ai/brand/zenstory-ai-mark.svg" alt="" width="76" height="76">
|
|
@@ -41,33 +41,39 @@ NovelToGame 是装进你已在用的编码 Agent(Claude Code、Codex、Kimi Co
|
|
|
41
41
|
|
|
42
42
|
### 西游记 · 三借芭蕉扇
|
|
43
43
|
|
|
44
|
-
|
|
44
|
+
<p>
|
|
45
|
+
<a href="https://xiyouji.vibecoco.ai"><img src="examples/journey-to-the-west/screenshots/hero.jpg" alt="师徒一行站在彩绘的火焰山庄里,四角是小地图、任务追踪、聊天栏与功能按钮" width="49%"></a>
|
|
46
|
+
<a href="https://xiyouji.vibecoco.ai"><img src="examples/journey-to-the-west/screenshots/battle.jpg" alt="积雷山之战:牛魔王一方在左、悟空一行在右,上缘行动顺序条,下方指令面板" width="49%"></a>
|
|
47
|
+
</p>
|
|
45
48
|
|
|
46
|
-
|
|
49
|
+
**一扇吹出五万里。走回去,接任务,一回合一回合把火焰山打回来。**
|
|
47
50
|
|
|
48
|
-
|
|
51
|
+
一款以第五十九至六十一回为本的《梦幻西游》式回合制 RPG。在四张彩绘场景里点地行走,找头顶「!」的 NPC,点任务追踪自动寻路过去,主线之间还能领可重复的封妖令日常。攒历练与银两,逛商店、换装备、研习法术、带召唤兽上阵;再用五行相克、愤怒特技和悟空的七十二变打指令回合制战斗,把一个正面打不过的牛魔王,打成落在火焰山上的一场雨。
|
|
49
52
|
|
|
50
53
|
**[浏览器试玩](https://xiyouji.vibecoco.ai)** · [改编工作区](examples/journey-to-the-west/) · 设计估时 45–90 分钟 · 全年龄 · 可玩原型
|
|
51
54
|
|
|
52
55
|
### 金瓶梅 · 风月总账
|
|
53
56
|
|
|
54
|
-
|
|
57
|
+
<p>
|
|
58
|
+
<a href="https://jinpingmei.vibecoco.ai"><img src="examples/jin-ping-mei/screenshots/title.jpg" alt="动画标题:西门宅五人站在春日庭院里,旁边是书名与菜单" width="49%"></a>
|
|
59
|
+
<a href="https://jinpingmei.vibecoco.ai"><img src="examples/jin-ping-mei/screenshots/adv.jpg" alt="晚饭戏:三位女主站在堂中,孟玉楼在带名牌的文本框里说话,下方是 ADV 功能栏" width="49%"></a>
|
|
60
|
+
</p>
|
|
55
61
|
|
|
56
|
-
|
|
62
|
+
**那年春天,五扇门都为你留过灯。你说过的话,她们都记得。**
|
|
57
63
|
|
|
58
|
-
|
|
64
|
+
一款 galgame 式古风恋爱 ADV,时间是李瓶儿刚过门的那个春天。共通线把五个女人放到同一张饭桌、同一场夜雨、同一席清明宴上;你的选择在每个人那里攒下的心意,决定分岔那夜哪扇院门还亮着灯。五条个人线各有良缘、寻常、错过三种结局(连同无人留灯共十六个),每个个人结局之后都翻开一页原著里她的命数(无人留灯则翻到西门庆之死与宅门散去)。自动、只跳已读的快进、回看、隐藏、快存、缩略图存档和回到上一选项一应俱全,另有 CG 鉴赏、回想、音乐室和结局流程图。
|
|
59
65
|
|
|
60
|
-
**[浏览器试玩](https://jinpingmei.vibecoco.ai)** · [改编工作区](examples/jin-ping-mei/) ·
|
|
66
|
+
**[浏览器试玩](https://jinpingmei.vibecoco.ai)** · [改编工作区](examples/jin-ping-mei/) · 设计估时单周目 20–30 分钟,五线全收 1–1.5 小时 · 18+ · 可玩原型
|
|
61
67
|
|
|
62
68
|
### Project Plateau · 失落的世界 · 3D
|
|
63
69
|
|
|
64
|
-
这是一款由柯南·道尔《失落的世界》改编而来的实时**第一人称 3D
|
|
70
|
+
这是一款由柯南·道尔《失落的世界》改编而来的实时**第一人称 3D 野外摄影游戏**。西斜的低太阳下,从挑战者堡出发,穿过齐膝的草,沿一条荆棘拱廊找掩护,用长焦镜头曝光四张玻璃底片。每张底片当场按实时取景里真正框住的东西评定,盖上评语印章,再配一句多疑的萨默利教授的话。翼手龙先盘旋再俯冲,一头剑龙可能走下溪边饮水,你只有 300 秒天光把底片带回去。
|
|
65
71
|
|
|
66
|
-
桌面浏览器可完整试玩,其他设备可直接观看 15
|
|
72
|
+
桌面浏览器可完整试玩,其他设备可直接观看 15 秒实机预览,它录自当前构建。
|
|
67
73
|
|
|
68
|
-
https://github.com/user-attachments/assets/
|
|
74
|
+
https://github.com/user-attachments/assets/5ad62a58-1abe-4d73-b86e-1c8c6563fdb2
|
|
69
75
|
|
|
70
|
-
**[浏览器直接试玩,无需安装](https://plateau.vibecoco.ai)** · [改编工作区](examples/project-plateau/) · [反馈体验](https://github.com/zenstory-ai/novel-to-game/discussions/7) · 设计估时
|
|
76
|
+
**[浏览器直接试玩,无需安装](https://plateau.vibecoco.ai)** · [改编工作区](examples/project-plateau/) · [反馈体验](https://github.com/zenstory-ai/novel-to-game/discussions/7) · 设计估时 5–10 分钟(每局 300 秒天光) · 桌面 WebGL2 · 可玩原型
|
|
71
77
|
|
|
72
78
|
## 这是什么
|
|
73
79
|
|
|
@@ -75,14 +81,20 @@ https://github.com/user-attachments/assets/27819247-4e4d-4bf0-8f0f-43d4125c4d45
|
|
|
75
81
|
|
|
76
82
|
- **每个设计决定都引用原著。** 拆解阶段读完全书,写出 `SOURCE_BIBLE`:硬规则、关键角色目标、转折结局和标志性锚点都标注章回或文件位置,改编边界表每行带证据位置。原作事实分为 `immutable`、`adaptable`、`open`、`conflicted` 四种边界;原著没有定义的部分标为设计发明,不会被悄悄写成事实。
|
|
77
83
|
- **游戏形态是一个有记录的决定,不是默认值。** 概念阶段比较真实的替代方向,用具名的硬否决淘汰不合格方向(核心循环与原作中心张力无关;删掉专有名词后只剩通用模板;玩家只是花资源放行既定剧情)。概念、世界设计与美术方向分别由不同阶段写进各自的文档,构建阶段不得静默重做。
|
|
84
|
+
- **借成熟品类,就连同它的外壳一起借。** 玩家认出一类游戏,靠的不只是核心玩法;系统玩法项目要用一张短表写清该品类的外壳(进入世界、目标指引、成长与回访理由)哪些实现、哪些降级、哪些不做以及为什么,并写清第一分钟玩家看到什么。《梦幻西游》式的 RPG 不会只交出一串战斗关卡。
|
|
78
85
|
- **面向简报锁定的运行环境构建。** 产品简报(Agent 最先起草的一页需求单;`quick` 模式下只在平台、权利、尺度等阻断项上停下等你裁决)锁定平台、引擎、目标运行时和实际可用的测试运行时。工具链缺失时不得悄悄改做网页。设计文档是不绑定引擎的 Markdown,归你所有。
|
|
79
86
|
- **QA 是一次真实运行、六项检查和如实写下的限制。** 构建在测试运行时里真正启动,一次完整运行证明 `launch`、`render`、`input`、`coreLoop`、`outcome`、`restart` 六项。趣味、平衡、其他浏览器和权利只写成限制项(limitation),不写成 PASS。
|
|
80
87
|
- **语音默认关闭,默认在构建期生成。** 除非美术方向选用语音,没有任何台词会发给语音合成服务;运行时合成须经产品简报明确批准;小说和设计文档从不上传。
|
|
81
88
|
|
|
82
|
-
|
|
89
|
+
互动叙事是一等赛道:连续场景、对白、证词与关键选择可以承载整个游戏,但要满足与系统玩法同样的能动性和证据要求。人物路线的关键选择针对该人物自己的心结或议程,关系进展由人物反应、称呼、可进入的场所与可托付的事呈现,而不是屏幕上的数值。
|
|
83
90
|
|
|
84
91
|
## 安装
|
|
85
92
|
|
|
93
|
+
### ClawHub
|
|
94
|
+
|
|
95
|
+
ClawHub 分发由仓库中的 [显式发布清单](.clawhub/publish.json) 管理,并通过 [ClawHub](https://clawhub.ai/) 提供发现入口。具体 skill 链接只有在发布者、版本和匿名访问均验证后才会写入本文档,避免把尚不存在的条目当成已上架。
|
|
96
|
+
|
|
97
|
+
|
|
86
98
|
前提:你已经在用 Claude Code、Codex 或 Kimi Code,终端能运行 `npx`(Node.js)。
|
|
87
99
|
|
|
88
100
|
| Agent CLI | 安装命令 | 调用方式 |
|
|
@@ -134,7 +146,7 @@ codex plugin add novel-to-game@novel-to-game-skills
|
|
|
134
146
|
|
|
135
147
|
## 看看它的输出
|
|
136
148
|
|
|
137
|
-
|
|
149
|
+
下面每段节选都摘自本仓库的文件;两个中文示例的文档是简体中文,原样引用;Project Plateau 的文档是英文,其中 Markdown 节选译成中文并标注(译),JSON 记录保留英文原样,在前后正文里说明。原文均有链接。省略处以“…”标出。
|
|
138
150
|
|
|
139
151
|
### 设计文档长什么样
|
|
140
152
|
|
|
@@ -175,14 +187,28 @@ codex plugin add novel-to-game@novel-to-game-skills
|
|
|
175
187
|
拖下去必被反杀,所以「三扇何时开」是决战的核心决策。
|
|
176
188
|
```
|
|
177
189
|
|
|
178
|
-
|
|
190
|
+
同一份文档还列出了战斗之外的品类外壳,写明哪些实现、降级或不做(原表 8 行,节选 4 行):
|
|
179
191
|
|
|
180
192
|
```markdown
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
193
|
+
| 品类外壳 | 状态 | 做法 / 理由 |
|
|
194
|
+
|---|---|---|
|
|
195
|
+
| 进入世界与移动 | 实现 | 四张可走 3/4 场景(火焰山庄、翠云山、火口、积雷山),点地行走、方向键行走,青色传送阵(点阵或点阵名) |
|
|
196
|
+
| 目标指引 / 追踪 | 实现 | 主线 NPC 头顶「!」,右侧任务追踪点一下自动寻路、可跨图;左上小地图 |
|
|
197
|
+
…
|
|
198
|
+
| 召唤兽 | 降级 | 两只固定宠(辟水金睛兽、可捕的火妖)选一上阵;无收集池、繁殖、洗练——一段 45-90 分钟战役用不上 |
|
|
199
|
+
…
|
|
200
|
+
| 组队 / 交易 / PVP | 不做 | 单机离线作品,没有第二位玩家;师徒四人就是固定队伍 |
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
[`design/ART_DIRECTION.md`](examples/journey-to-the-west/design/ART_DIRECTION.md) 以同品类的实机截图为成色标尺,再给真扇每一扇各自的演出,把对世界的持久改变留给结局:
|
|
204
|
+
|
|
205
|
+
```markdown
|
|
206
|
+
**随手一张实机截图,应像《梦幻西游》《问道》这类回合制西游网游里的一张游戏画面**:3/4 俯视的
|
|
207
|
+
彩绘行走场景、四角压着 HUD 小卡、头顶名字与任务标记;战斗是敌左我右两排立绘、上缘行动顺序条、
|
|
208
|
+
底部指令面板。借的是品类的形制与可读性,不借它们的 Q 版大头、描边和具体角色设计。
|
|
209
|
+
…
|
|
210
|
+
5. **真扇三段**:每段一条青绿描边横幅,接一段两三秒的全屏着色与粒子——息火落灰、生风风痕、
|
|
211
|
+
落雨雨线。持久的世界改变放在结局:火焰山换成雨后无明火的新地景(`huoyan-rain`),重开按钮常驻。
|
|
186
212
|
```
|
|
187
213
|
|
|
188
214
|
而 [`qa/verification.json`](examples/journey-to-the-west/qa/verification.json) 记录了真实浏览器跑到这个结局并重开的那次运行:
|
|
@@ -207,37 +233,49 @@ codex plugin add novel-to-game@novel-to-game-skills
|
|
|
207
233
|
|
|
208
234
|
### 一个选择怎样被后文记住
|
|
209
235
|
|
|
210
|
-
[《金瓶梅》](examples/jin-ping-mei/)
|
|
236
|
+
[《金瓶梅》](examples/jin-ping-mei/)是恋爱 ADV 的示例。它从二十日宅门账务模拟重做成了 galgame,[`concepts/CONCEPT.md`](examples/jin-ping-mei/concepts/CONCEPT.md) 现在给每位女主写下她要什么、一道只有玩家看得到的伤口,各自钉到回目(原表 5 行,节选 3 行):
|
|
211
237
|
|
|
212
238
|
```markdown
|
|
213
|
-
|
|
214
|
-
…
|
|
215
|
-
| 支柱 | 可观察证据 | 否决现象 |
|
|
216
|
-
| --- | --- | --- |
|
|
217
|
-
| 五人都能主动改变局面 | 五名女主各有八段路线、独立拒绝和外部能力 | 只换名字、立绘或好感数 |
|
|
239
|
+
核心句:**你说过的话,她们都记得。**
|
|
218
240
|
…
|
|
219
|
-
|
|
|
220
|
-
|
|
241
|
+
| 人物 | 她要什么 | 她的伤口 | 原作依据 |
|
|
242
|
+
|---|---|---|---|
|
|
243
|
+
| 吴月娘 | 重要的事先问她 | 只在人前是正头娘子 | 第1、21回 |
|
|
244
|
+
| 潘金莲 | 被看见、被优先选择 | 除了你看她那一眼,什么都没有 | 第8、9、38回 |
|
|
245
|
+
| 李瓶儿 | 安全与确定 | 先被看成箱子,后被看成人 | 第14、16、19回 |
|
|
221
246
|
```
|
|
222
247
|
|
|
223
|
-
[`design/GAME_DESIGN.md`](examples/jin-ping-mei/design/GAME_DESIGN.md)
|
|
248
|
+
[`design/GAME_DESIGN.md`](examples/jin-ping-mei/design/GAME_DESIGN.md) 让好感不上屏,让每条路线的关键抉择对准她的伤口,并写明结局怎么判(路线表原 5 行,节选 2 行):
|
|
224
249
|
|
|
225
250
|
```markdown
|
|
226
|
-
|
|
227
|
-
|
|
251
|
+
选择不显示数值。好感只有三种出口:她的表情与台词;分岔夜院门是否「亮着灯」;系统菜单里可选的「心意」一瞥
|
|
252
|
+
(只有她的神色和「灯亮着/灯将熄」,不给档位与数字)。规则在第一章由月娘说出:清明席散那夜,还亮着灯的门才进得去。
|
|
253
|
+
…
|
|
254
|
+
| 人物 | 原作依据 | 关键抉择(正确做法) | 良缘 | 寻常 | 错过 |
|
|
255
|
+
|---|---|---|---|---|---|
|
|
256
|
+
…
|
|
257
|
+
| 潘金莲 | 第8、38回:寄词盼人、雪夜弄琵琶 | 不替她开瓶儿的箱子,但今夜陪她 | 琵琶不冷 | 半掩的角门 | 扇子落地 |
|
|
258
|
+
| 李瓶儿 | 第14、19回:过墙托付、入门受冷 | 不收她的钥匙;当众说她的银子是她的 | 钥匙在她手里 | 窗下的茶 | 箱笼 |
|
|
259
|
+
…
|
|
260
|
+
结局判定:关键抉择做错 → 错过;做对且该人心意 ≥7 并在最后一问说真话 → 良缘;其余 → 寻常。
|
|
228
261
|
```
|
|
229
262
|
|
|
230
|
-
|
|
263
|
+
每个个人结局之后都翻开一页原著里她的命数,同一份文档写得很直白:结局只决定这一春你们说成了什么,页脚明写改不了她在书里的去处。
|
|
264
|
+
|
|
265
|
+
这款游戏的 QA 记录对“玩到了多少”写得很坦白。[`qa/verification.json`](examples/jin-ping-mei/qa/verification.json) 里完整浏览器运行停在 `yue_good`,六项全部 PASS,第一条和最后一条限制项是:
|
|
231
266
|
|
|
232
267
|
```json
|
|
233
268
|
{
|
|
234
269
|
"scope": "路径覆盖",
|
|
235
|
-
"reason": "
|
|
270
|
+
"reason": "浏览器只走月娘良缘一条完整路径;其余 15 个结局由 test/lint_script.mjs 穷举选择证明可达,未逐一在浏览器渲染。"
|
|
271
|
+
},
|
|
272
|
+
…
|
|
273
|
+
{
|
|
274
|
+
"scope": "体验判断",
|
|
275
|
+
"reason": "自动化只证明能启动、渲染、输入、走到结局并重开,不判断剧情是否动人或节奏是否合适。"
|
|
236
276
|
}
|
|
237
277
|
```
|
|
238
278
|
|
|
239
|
-
设计文档自己也划了同一条线:自动化只证明内容存在、可达、可读且状态后果真实;主观吸引力、节奏与平衡不由机器下结论。
|
|
240
|
-
|
|
241
279
|
### QA 记录承认自己没测什么
|
|
242
280
|
|
|
243
281
|
[Project Plateau](examples/project-plateau/) 是 3D 示例,文档为英文。它的概念比较了三个各自锚定章节的方向——A · Proof Before Dark(野外观察与带着受损证据返回)、B · Fire Across the Lake(沿溪到湖、逃离追踪的猎食者)、C · The Eighteenth Cave(背着证据的洞穴下降)——并写下胜出方向应被放弃的条件,见 [`concepts/CONCEPT.md`](examples/project-plateau/concepts/CONCEPT.md)(译):
|
|
@@ -251,7 +289,7 @@ codex plugin add novel-to-game@novel-to-game-skills
|
|
|
251
289
|
则选定方向被证伪。`GAME_DESIGN.md` 必须定义这条因果链,并保住不致命的侦察幻想。
|
|
252
290
|
```
|
|
253
291
|
|
|
254
|
-
`npm run verify` 用键鼠事件驱动真实构建,在同一次运行里写出输入轨迹和 `qa/verification.json`。[`build/evidence/current-run/report.json`](examples/project-plateau/build/evidence/current-run/report.json)
|
|
292
|
+
`npm run verify` 用键鼠事件驱动真实构建,在同一次运行里写出输入轨迹和 `qa/verification.json`。[`build/evidence/current-run/report.json`](examples/project-plateau/build/evidence/current-run/report.json) 里的输入轨迹就是整次远征——沿荆棘带走到观察掩体,再原路退回:
|
|
255
293
|
|
|
256
294
|
```json
|
|
257
295
|
"inputTrace": [
|
|
@@ -259,16 +297,17 @@ codex plugin add novel-to-game@novel-to-game-skills
|
|
|
259
297
|
"Right Mouse + Left Mouse: record the brook",
|
|
260
298
|
"KeyW: reach the basalt shelf",
|
|
261
299
|
"Right Mouse + Left Mouse: record basalt scale",
|
|
262
|
-
"KeyA:
|
|
263
|
-
"hold KeyC under cover: let the attack widen",
|
|
264
|
-
"KeyW: reach the glade",
|
|
265
|
-
"Right Mouse + Left Mouse: record young at play",
|
|
300
|
+
"KeyA: step under the thorn arches",
|
|
266
301
|
…
|
|
267
|
-
"
|
|
268
|
-
|
|
302
|
+
"KeyW: settle in the glade-edge blind",
|
|
303
|
+
"Right Mouse + Left Mouse: record young at play from the blind",
|
|
304
|
+
"hold KeyC under cover: crouch until the wings lose interest",
|
|
305
|
+
…
|
|
306
|
+
"KeyS: back up the thorn band to Fort"
|
|
307
|
+
]
|
|
269
308
|
```
|
|
270
309
|
|
|
271
|
-
[`build/BUILD_BRIEF.md`](examples/project-plateau/build/BUILD_BRIEF.md)
|
|
310
|
+
[`build/BUILD_BRIEF.md`](examples/project-plateau/build/BUILD_BRIEF.md) 写明这个 PASS 到底意味着什么(译):
|
|
272
311
|
|
|
273
312
|
```markdown
|
|
274
313
|
…
|
|
@@ -277,7 +316,22 @@ PASS 只在记录下来的本地桌面浏览器里证明这六项效果。
|
|
|
277
316
|
已清权、公网托管,也不证明其他浏览器、GPU 和设备。
|
|
278
317
|
```
|
|
279
318
|
|
|
280
|
-
|
|
319
|
+
[`qa/verification.json`](examples/project-plateau/qa/verification.json) 则点名这次运行漏掉了什么,包括新加的剑龙段落:
|
|
320
|
+
|
|
321
|
+
```json
|
|
322
|
+
{
|
|
323
|
+
"scope": "optional stegosaurus beat",
|
|
324
|
+
"reason": "The complete run does not photograph the stegosaurus; its framing rule is covered by one unit test only."
|
|
325
|
+
},
|
|
326
|
+
{
|
|
327
|
+
"scope": "look, sound and hitches",
|
|
328
|
+
"reason": "Visual quality is a reviewed judgment; the sound beds were not heard on laptop speakers and frame hitches were not measured on an unloaded or low-end machine."
|
|
329
|
+
}
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
也就是:完整运行没有拍剑龙,它的取景规则只有一个单元测试覆盖;画面质量是人工评审的判断,环境声没在笔记本扬声器上听过,卡顿也没在空载或低端机器上测过。
|
|
333
|
+
|
|
334
|
+
单局时长改过两次,一次因为实测证据,一次出于负责人的决定,[`PRODUCT_BRIEF.md`](examples/project-plateau/PRODUCT_BRIEF.md) 把两步都留着。第一次实测跑完整条路线只用了 55.2 秒,推翻了原计划的 5–8 分钟单局,于是边界被压到 1–3 分钟一局、180 秒天光,而不是往路线里塞等待。后来负责人要求一次 5–10 分钟的到访,天光预算提到 300 秒,填进去的是新的决策(可选的第十二章剑龙段落和逐张底片评定),而不是更长的路;熟练的 Strong 路线仍约 90 秒跑完。
|
|
281
335
|
|
|
282
336
|
## 第一条请求
|
|
283
337
|
|
|
@@ -356,7 +410,7 @@ game-adaptations/<project>/
|
|
|
356
410
|
|
|
357
411
|
### 完整跑一次要多久、花多少钱?
|
|
358
412
|
|
|
359
|
-
不止一句提示词的事。Agent 要读完整本小说、写五份设计文档、构建并跑 QA,每个阶段都是一次独立的 skill
|
|
413
|
+
不止一句提示词的事。Agent 要读完整本小说、写五份设计文档、构建并跑 QA,每个阶段都是一次独立的 skill 调用,所以一次完整运行很长,可能跨多次会话。token 费用按你所用编码 Agent 的计费;除非美术方向选用图片或语音生成(见下面 GPU 一条),不产生其他费用。公开示例的进度文件没有记录耗时和 token 数,所以这里不给具体数字。
|
|
360
414
|
|
|
361
415
|
### 会话中途断了,能接着做吗?
|
|
362
416
|
|
|
@@ -368,7 +422,7 @@ game-adaptations/<project>/
|
|
|
368
422
|
|
|
369
423
|
### 需要 GPU 或自己的模型吗?图片和语音的钱谁出?
|
|
370
424
|
|
|
371
|
-
不需要 GPU,也不需要单独的模型:拆解、设计和代码都由你已在用的编码 Agent
|
|
425
|
+
不需要 GPU,也不需要单独的模型:拆解、设计和代码都由你已在用的编码 Agent 的模型完成。外部服务是可选项。生成图片只在美术方向选择它时使用,工具在你的环境里按能力、许可与费用核实后选择(金瓶梅示例的图由 Codex 内置的图像工具生成,大部分在 `build/art/generated-art.json` 里按批次记录)。语音默认关闭,除非美术方向选用;默认在构建期生成为本地资产,只发送逐句台词与必要读音,从不上传小说和设计文档。付费服务是 Agent 开始前会停下来问你的问题之一。见[语音资产生产合同](skills/game-build/references/tts-production-contract.md)。
|
|
372
426
|
|
|
373
427
|
### 怎么知道它做出来的游戏真的能跑?QA 里的 PASS 是什么意思?
|
|
374
428
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
0.
|
|
1
|
+
0.5.0
|