@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
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
// 吴月娘线 · 拜月(第二十一回月娘焚香拜斗、夫妻回心为本)
|
|
2
|
+
export default String.raw`
|
|
3
|
+
# yue_route
|
|
4
|
+
@hide all
|
|
5
|
+
@bg court_night fade
|
|
6
|
+
@bgm tender
|
|
7
|
+
@chapter 吴月娘篇|正院的门
|
|
8
|
+
你往正院走去。
|
|
9
|
+
这条路你走过上千回,今夜却觉得长。正院的门没关,门里的灯,比别处亮一些。
|
|
10
|
+
@bg hall fade
|
|
11
|
+
@show yue 中 惊
|
|
12
|
+
月娘(惊):……官人?
|
|
13
|
+
她正在卸妆,簪子拔了一半,见是你,又插了回去,整了整衣襟,像在正堂见客。
|
|
14
|
+
月娘(平):今日席上累了,官人怎么不去歇着。
|
|
15
|
+
西门庆:我来这儿歇。
|
|
16
|
+
月娘:……这儿?
|
|
17
|
+
她怔了一下,给你倒茶。茶杯放下时,碰出一声很轻的响。
|
|
18
|
+
月娘(哀):官人,你我之间,有些日子没好好说话了。我知道外头怎么说我——说大娘子度量小,容不下新人。
|
|
19
|
+
月娘:我容得下瓶儿。我容不下的,是那天你回来,说“人我已经定了”。就那一句。定了。我是这家的正头娘子,可那件事,我是最后一个知道的。
|
|
20
|
+
她说得很平静,平静得像这些话已经在心里抄过许多遍。
|
|
21
|
+
@choice
|
|
22
|
+
- “那件事,是我不对。我该先问你。” -> y1_sorry {yue+1}
|
|
23
|
+
- “娶瓶儿,也是为了这个家好。” -> y1_excuse
|
|
24
|
+
|
|
25
|
+
# y1_sorry
|
|
26
|
+
月娘抬起眼看你。她大约准备了许多话来应你的辩解,没想到你一句都不辩。
|
|
27
|
+
月娘(哀):……你这人。认错认得这样快,倒叫我不知道怎么生气了。
|
|
28
|
+
她低头喝茶,茶是烫的,她喝得很急。
|
|
29
|
+
@jump y1_end
|
|
30
|
+
|
|
31
|
+
# y1_excuse
|
|
32
|
+
月娘(平):为了这个家。……是,官人做什么都是为了这个家。
|
|
33
|
+
她点点头,没有再争。可她把茶杯往桌心推了推,那是她不想再说下去的意思。
|
|
34
|
+
@jump y1_end
|
|
35
|
+
|
|
36
|
+
# y1_end
|
|
37
|
+
月娘(平):夜深了。官人今夜……还是回书房吧。
|
|
38
|
+
月娘:不是赶你。是我还没想好,该拿什么样的脸对你。
|
|
39
|
+
你走到门口时,她又叫住了你。
|
|
40
|
+
月娘(羞):清明那支簪……我收着了。
|
|
41
|
+
@hide all
|
|
42
|
+
@jump yue_date
|
|
43
|
+
|
|
44
|
+
# yue_r2
|
|
45
|
+
@bg hall fade
|
|
46
|
+
@bgm tension
|
|
47
|
+
@chapter 吴月娘篇|家法
|
|
48
|
+
清明过后第三天,正堂里吵了起来。
|
|
49
|
+
@cg pan_yue
|
|
50
|
+
月娘把各房的月钱单摊在桌上:席面花多了,花家的事也耗了银子,往后三个月,各房的脂粉钱,减三成。
|
|
51
|
+
金莲(怒):减三成?大姐好会算。六妹妹有箱子,三姐有嫁妆,减了也不疼——我呢?我这房,就靠这几两脂粉钱撑着体面!
|
|
52
|
+
月娘(平):账是这么算的,不是冲着谁。
|
|
53
|
+
金莲(怒):账是死的,人是活的!官人,你说句话——这家里,到底是你当家,还是大姐当家?
|
|
54
|
+
@cg off
|
|
55
|
+
@show yue 左 平
|
|
56
|
+
@show pan 右 怒
|
|
57
|
+
满屋子人都看着你。月娘没有看你,她只是把那张单子按得更平了些。
|
|
58
|
+
@choice
|
|
59
|
+
- “家里的账,大姐管。她说减,就减。” -> y2_back {yue+2 pan-1 f:yue_trust}
|
|
60
|
+
- “金莲那一份,照旧给。别为几两银子闹。” -> y2_over {pan+1 yue-2 f:yue_hurt}
|
|
61
|
+
- “这事……改日再议。” -> y2_dodge
|
|
62
|
+
|
|
63
|
+
# y2_back
|
|
64
|
+
金莲(怒):……好。你们是一家人,我是外人。
|
|
65
|
+
金莲甩袖子走了。屋里的人也散了。月娘还站在桌边,像是没回过神。
|
|
66
|
+
@hide pan
|
|
67
|
+
@show yue 中 惊
|
|
68
|
+
月娘(惊):官人……当着她们的面,你从没这么说过。
|
|
69
|
+
西门庆:账为什么要减?你不是小气的人。
|
|
70
|
+
她看了你很久,终于从袖里取出一串钥匙,放在桌上。
|
|
71
|
+
@cg yue_mid
|
|
72
|
+
月娘(哀):这是库房、银柜、当铺的钥匙。官人在外头花的,官面上送的,我一笔一笔都记着。
|
|
73
|
+
月娘:进的多,出的更多。官人,这宅子看着热闹,底下是空的。我减脂粉钱,是想给这个家,多留一年的底。
|
|
74
|
+
月娘(哀):我不怕人说我小气。我怕的是哪一天,这些钥匙开出来的,全是空柜子。
|
|
75
|
+
你第一次看清,她手里那串钥匙有多沉。
|
|
76
|
+
@cg off
|
|
77
|
+
@jump yue_r3
|
|
78
|
+
|
|
79
|
+
# y2_over
|
|
80
|
+
金莲(笑):还是官人疼人。
|
|
81
|
+
月娘把单子收了起来,一张一张,叠得很齐。
|
|
82
|
+
@hide pan
|
|
83
|
+
@show yue 中 平
|
|
84
|
+
月娘(平):官人说照旧,那就照旧。
|
|
85
|
+
她把钥匙解下来,搁在桌上。
|
|
86
|
+
月娘:往后公中的账,官人自己看吧。我管不动了。
|
|
87
|
+
她说完就走了。那串钥匙在桌上,一直没人去拿。
|
|
88
|
+
@jump yue_r3
|
|
89
|
+
|
|
90
|
+
# y2_dodge
|
|
91
|
+
金莲哼了一声,也没再闹。月娘把单子收起,什么也没说。
|
|
92
|
+
事情就这么搁下了。可那天晚饭,正院的饭桌上,少了一副碗筷——月娘说她不饿。
|
|
93
|
+
@jump yue_r3
|
|
94
|
+
|
|
95
|
+
# yue_r3
|
|
96
|
+
@hide all
|
|
97
|
+
@bg court_night fade
|
|
98
|
+
@bgm night
|
|
99
|
+
@chapter 吴月娘篇|拜月
|
|
100
|
+
那夜你睡不着。
|
|
101
|
+
月色很好,你披衣出门,不知不觉又走到正院外头。墙里有烟,有香——是有人在院子里焚香。
|
|
102
|
+
你从门缝里看进去。
|
|
103
|
+
@if f:yue_hurt -> y3_bad
|
|
104
|
+
@cg yue_moon
|
|
105
|
+
月娘跪在一张小香案前,对着月亮,头发全放了下来,像个寻常人家的妇人。
|
|
106
|
+
月娘:……上天在上,吴氏不求别的。只求我家官人,早早回心,少在外头奔走,保重身子。
|
|
107
|
+
月娘(哀):不拘我们姐妹六个里头哪一个,早早给他添个孩子,好叫这个家,有个往后……
|
|
108
|
+
月娘:至于我自己——我只求,他有一日肯回头看看这个院子。看一眼就够了。
|
|
109
|
+
她磕了一个头,很久没有起来。
|
|
110
|
+
你在门外站着,忽然觉得这些年,从没真正认识过这个女人。
|
|
111
|
+
@choice
|
|
112
|
+
- 推门进去,叫她一声“月娘” -> y3_open
|
|
113
|
+
- 不惊动她,悄悄离开 -> y3_leave
|
|
114
|
+
|
|
115
|
+
# y3_bad
|
|
116
|
+
院子里的香案前,月娘听见了门响,回过头来。
|
|
117
|
+
@show yue 中 平
|
|
118
|
+
月娘(平):……官人。
|
|
119
|
+
她站起来,拍了拍膝上的土,脸上什么也看不出来。
|
|
120
|
+
月娘(平):夜里凉,官人自便吧。钥匙在正堂桌上,你明日记得拿。
|
|
121
|
+
门在你面前关上了。门闩落下去的声音,很轻,也很稳。
|
|
122
|
+
@bgm sad
|
|
123
|
+
那串钥匙,后来一直在正堂桌上放着。她再也没有拿回去。
|
|
124
|
+
@ending yue_bad
|
|
125
|
+
@fate yue
|
|
126
|
+
@end
|
|
127
|
+
|
|
128
|
+
# y3_leave
|
|
129
|
+
你没有推门。你只是在门外站到那炷香燃尽,才转身回去。
|
|
130
|
+
@jump y3_normal
|
|
131
|
+
|
|
132
|
+
# y3_normal
|
|
133
|
+
@hide all
|
|
134
|
+
@bg hall fade
|
|
135
|
+
第二天一早,正堂上照常摆着早饭。月娘坐在上首,神色如常。
|
|
136
|
+
@show yue 中 平
|
|
137
|
+
月娘(平):官人昨夜睡得好么。
|
|
138
|
+
西门庆:……好。
|
|
139
|
+
月娘(笑):那就好。
|
|
140
|
+
那一夜的事,谁也没有再提。只是从那天起,正堂的灯,每夜都替你留到很晚。
|
|
141
|
+
@bgm tender
|
|
142
|
+
你们没有再吵过。也没有再走近过。像一张对得很齐的账,一两不差,却也一两不多。
|
|
143
|
+
@ending yue_normal
|
|
144
|
+
@fate yue
|
|
145
|
+
@end
|
|
146
|
+
|
|
147
|
+
# y3_open
|
|
148
|
+
@if yue<7 -> y3_leave_soft
|
|
149
|
+
@bgm tender
|
|
150
|
+
月娘(惊):……官人?你、你什么时候——
|
|
151
|
+
西门庆:从“早早回心”那句。
|
|
152
|
+
月娘(羞):你……!
|
|
153
|
+
她一下子红了脸,想站起来,膝盖却跪麻了,一个踉跄跌进你怀里。
|
|
154
|
+
月娘(哀):你都听见了。……那我也不必装了。
|
|
155
|
+
月娘(哀):官人,我不是要做什么贤惠的正头娘子。我只是想,这个家里,有一个人,是你肯回头看的。
|
|
156
|
+
西门庆:我回头了。
|
|
157
|
+
她靠在你肩上,很久没有说话。香炉里最后一点烟,散进月光里。
|
|
158
|
+
@jump yue_good
|
|
159
|
+
|
|
160
|
+
# y3_leave_soft
|
|
161
|
+
她听见了门响,回过头来,看见是你。
|
|
162
|
+
月娘(羞):……官人怎么来了。
|
|
163
|
+
她慌忙把香案上的东西收拾起来,像是被人撞见了什么不该被看见的事。
|
|
164
|
+
月娘(平):没什么,拜拜月亮。夜里凉,官人早些回去吧。
|
|
165
|
+
你们之间,好像只差一步。可这一步,今夜谁也没有走。
|
|
166
|
+
@jump y3_normal
|
|
167
|
+
|
|
168
|
+
# yue_good
|
|
169
|
+
@bg chamber fade
|
|
170
|
+
@bgm tender
|
|
171
|
+
@scene yue_night 月下焚香
|
|
172
|
+
月娘的屋里只点了一盏灯。她坐在妆台前,背对着你,一支一支地拔下头上的簪子。
|
|
173
|
+
@show yue 中 羞
|
|
174
|
+
月娘(羞):……成亲这些年,官人还没见过我散着头发的样子吧。
|
|
175
|
+
月娘:在人前,我得是正头娘子。可在这间屋里……我想只做月娘。
|
|
176
|
+
她最后拔下的,是清明那日的那支金簪。她把它放进你手心,指尖有点凉。
|
|
177
|
+
@choice
|
|
178
|
+
- 握住她的手,留下 -> yue_h
|
|
179
|
+
- 只陪她坐着,等天亮 -> yue_dawn
|
|
180
|
+
|
|
181
|
+
# yue_h
|
|
182
|
+
@hide all
|
|
183
|
+
@cg yue_h1
|
|
184
|
+
她没有躲。灯芯“噼”地响了一声,她伸手把灯捻低了。
|
|
185
|
+
月娘:……官人,今夜别走。
|
|
186
|
+
@cg yue_h2
|
|
187
|
+
后来的事,月亮都看见了。它没有说,你们也没有。
|
|
188
|
+
只记得她在你怀里,很轻地叫了一声你的名字——不是“官人”,是名字。
|
|
189
|
+
@endscene
|
|
190
|
+
@jump yue_end
|
|
191
|
+
|
|
192
|
+
# yue_dawn
|
|
193
|
+
@hide all
|
|
194
|
+
@bg chamber fade
|
|
195
|
+
@show yue 中 笑
|
|
196
|
+
你们就那样坐着,说了一夜的话。说她小时候在吴千户家学算盘,说你头一回骑马摔进泥塘。
|
|
197
|
+
月娘(笑):……原来官人也有这么傻的时候。
|
|
198
|
+
天亮时,她靠着你的肩睡着了,头发散了一枕。
|
|
199
|
+
@endscene
|
|
200
|
+
@jump yue_end
|
|
201
|
+
|
|
202
|
+
# yue_end
|
|
203
|
+
@hide all
|
|
204
|
+
@bg hall fade
|
|
205
|
+
@cg yue_end
|
|
206
|
+
第二天,正堂的桌上摆着那本账,旁边是那串钥匙。
|
|
207
|
+
月娘把钥匙一把一把地分开,系上不同颜色的穗子:这把给玉楼管客,这把给雪娥管仓,这把留给瓶儿自己的箱子。
|
|
208
|
+
月娘(笑):一个人攥着所有钥匙,是会累的。官人教我的。
|
|
209
|
+
她把最后一把——正院的钥匙——放进了你手里。
|
|
210
|
+
月娘:这一把,你自己收着。往后什么时候回来,都不用敲门。
|
|
211
|
+
@ending yue_good
|
|
212
|
+
@fate yue
|
|
213
|
+
@end
|
|
214
|
+
`;
|
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
"name": "jinpingmei-fengyue-ledger",
|
|
3
3
|
"private": true,
|
|
4
4
|
"type": "module",
|
|
5
|
-
"description": "《金瓶梅·风月总账》
|
|
5
|
+
"description": "《金瓶梅·风月总账》18+ 古风恋爱 ADV:共通线、五位女主路线、十六个结局与原著命数",
|
|
6
6
|
"scripts": {
|
|
7
7
|
"start": "python3 -m http.server 5173",
|
|
8
|
-
"verify:model": "node
|
|
8
|
+
"verify:model": "node test/lint_script.mjs",
|
|
9
9
|
"verify:visual": "python3 test/verify_visual.py --write-evidence"
|
|
10
10
|
}
|
|
11
11
|
}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"schemaVersion": 3,
|
|
3
3
|
"generatedAt": "2026-08-25",
|
|
4
4
|
"toolVersion": "Codex built-in image_gen",
|
|
5
|
-
"usage": "
|
|
5
|
+
"usage": "《金瓶梅·风月总账》78 张运行图:2026-08 二维新国风重塑(含身份母版)留用 38 张,2026-10-02 galgame 改造新增 40 张",
|
|
6
6
|
"reason": "旧棕黑 CG、古画册页样张、真人古装样张和现代时尚样张分别被判定为太暗、太旧、太真实和太现代。最终批准方向为完整晚明世界中的成熟理想化二维叙事游戏插画。",
|
|
7
7
|
"externalStyleResearch": {
|
|
8
8
|
"source": "https://github.com/freestylefly/awesome-gpt-image-2",
|
|
@@ -68,12 +68,6 @@
|
|
|
68
68
|
"path": "app/assets/heroine/xuee/night.webp",
|
|
69
69
|
"sourceOutput": "codex-imagegen:exec-262bebeb-8053-46d6-a1ff-5afd4a8811fa.png",
|
|
70
70
|
"anchors": "琥珀与深青、米账、仓绳、灶火"
|
|
71
|
-
},
|
|
72
|
-
{
|
|
73
|
-
"character": "李娇儿",
|
|
74
|
-
"path": "app/assets/household/li_jiaoer.webp",
|
|
75
|
-
"sourceOutput": "codex-imagegen:exec-24cda691-c334-48cc-b23b-e4feefe8e8c8.png",
|
|
76
|
-
"anchors": "梅紫与赭金、契纸、银秤、印匣"
|
|
77
71
|
}
|
|
78
72
|
],
|
|
79
73
|
"batches": [
|
|
@@ -81,59 +75,138 @@
|
|
|
81
75
|
"usage": "世界与入口",
|
|
82
76
|
"promptSummary": "春日高机位宅院和明亮门槛催账;压力由契纸、人物姿态和受阻门槛表达。",
|
|
83
77
|
"assets": [
|
|
84
|
-
[
|
|
85
|
-
|
|
78
|
+
[
|
|
79
|
+
"app/assets/bg/compound_new_guofeng.webp",
|
|
80
|
+
"codex-imagegen:exec-c623d43c-e15a-4472-b9f4-f748ad848b56.png"
|
|
81
|
+
],
|
|
82
|
+
[
|
|
83
|
+
"app/assets/scene/gate_collector.webp",
|
|
84
|
+
"codex-imagegen:exec-a7b0d1b1-e316-41b6-ad57-86d009bfbada.png"
|
|
85
|
+
]
|
|
86
86
|
]
|
|
87
87
|
},
|
|
88
88
|
{
|
|
89
89
|
"usage": "五人前奏与关系落定",
|
|
90
90
|
"promptSummary": "同一身份母版的夜间关系 CG;以目光、开掌、钥匙、出口和共享日用表达成年人的主动选择,完整着装,无性行为。",
|
|
91
91
|
"assets": [
|
|
92
|
-
[
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
[
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
[
|
|
101
|
-
|
|
92
|
+
[
|
|
93
|
+
"app/assets/cg/yue/prelude.webp",
|
|
94
|
+
"codex-imagegen:exec-1ac36cb6-30a6-413d-812c-4b1b482b8b2a.png"
|
|
95
|
+
],
|
|
96
|
+
[
|
|
97
|
+
"app/assets/cg/yue/explicit.webp",
|
|
98
|
+
"codex-imagegen:exec-65126819-70a1-4773-9759-706eaf51e6e1.png"
|
|
99
|
+
],
|
|
100
|
+
[
|
|
101
|
+
"app/assets/cg/pan/prelude.webp",
|
|
102
|
+
"codex-imagegen:exec-dcd0c85d-b0b1-4ae3-973f-40f8e2fa65e5.png"
|
|
103
|
+
],
|
|
104
|
+
[
|
|
105
|
+
"app/assets/cg/pan/explicit.webp",
|
|
106
|
+
"codex-imagegen:exec-ae6c99ab-27ce-4652-81d1-2af468e8260a.png"
|
|
107
|
+
],
|
|
108
|
+
[
|
|
109
|
+
"app/assets/cg/pinger/prelude.webp",
|
|
110
|
+
"codex-imagegen:exec-01830d1b-2d87-4e97-b97c-92f15ced287c.png"
|
|
111
|
+
],
|
|
112
|
+
[
|
|
113
|
+
"app/assets/cg/pinger/explicit.webp",
|
|
114
|
+
"codex-imagegen:exec-a985ad93-a833-4272-b41e-ed493997eca4.png"
|
|
115
|
+
],
|
|
116
|
+
[
|
|
117
|
+
"app/assets/cg/meng/prelude.webp",
|
|
118
|
+
"codex-imagegen:exec-f6a3adb4-0335-497b-8509-ee2c09f61780.png"
|
|
119
|
+
],
|
|
120
|
+
[
|
|
121
|
+
"app/assets/cg/meng/explicit.webp",
|
|
122
|
+
"codex-imagegen:exec-00c1529b-543e-42fc-8dad-3de16000a529.png"
|
|
123
|
+
],
|
|
124
|
+
[
|
|
125
|
+
"app/assets/cg/xuee/prelude.webp",
|
|
126
|
+
"codex-imagegen:exec-48622697-5ef3-443e-9a34-83e4a9c25859.png"
|
|
127
|
+
],
|
|
128
|
+
[
|
|
129
|
+
"app/assets/cg/xuee/explicit.webp",
|
|
130
|
+
"codex-imagegen:exec-216df76e-b036-443a-9e70-529f2b12cdba.png"
|
|
131
|
+
]
|
|
102
132
|
]
|
|
103
133
|
},
|
|
104
134
|
{
|
|
105
135
|
"usage": "五人公开关系与共同办事",
|
|
106
136
|
"promptSummary": "五人以交叉视线、递证、按账、留座和轮值器物形成真实关系动作,不做并排群像。",
|
|
107
137
|
"assets": [
|
|
108
|
-
[
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
[
|
|
113
|
-
|
|
138
|
+
[
|
|
139
|
+
"app/assets/cg/group/public_day5.webp",
|
|
140
|
+
"codex-imagegen:exec-32d97fcc-b83b-41f4-8bae-d8e5bf286910.png"
|
|
141
|
+
],
|
|
142
|
+
[
|
|
143
|
+
"app/assets/cg/group/public_day10.webp",
|
|
144
|
+
"codex-imagegen:exec-60f375a8-ae0f-426d-9de2-fdbda4649142.png"
|
|
145
|
+
],
|
|
146
|
+
[
|
|
147
|
+
"app/assets/cg/group/inner_court_alliance.webp",
|
|
148
|
+
"codex-imagegen:exec-7651ef0d-f27b-4ed1-86f7-7aaa5d049f99.png"
|
|
149
|
+
],
|
|
150
|
+
[
|
|
151
|
+
"app/assets/cg/group/inner_court_afterglow_five.webp",
|
|
152
|
+
"codex-imagegen:exec-19692392-08c1-4eeb-8c63-ea86b1a2e07b.png"
|
|
153
|
+
]
|
|
114
154
|
]
|
|
115
155
|
},
|
|
116
156
|
{
|
|
117
157
|
"usage": "五组双院结果",
|
|
118
158
|
"promptSummary": "两名对应成年女性共同作用于一件证物;脸、衣色、器物和方法冲突继承身份母版。",
|
|
119
159
|
"assets": [
|
|
120
|
-
[
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
[
|
|
160
|
+
[
|
|
161
|
+
"app/assets/cg/joint/yue_pan.webp",
|
|
162
|
+
"codex-imagegen:exec-74e2b0e8-c46f-45c7-8ee6-e4ee651bd56d.png"
|
|
163
|
+
],
|
|
164
|
+
[
|
|
165
|
+
"app/assets/cg/joint/yue_pinger.webp",
|
|
166
|
+
"codex-imagegen:exec-35f35c39-8dfc-40b2-bfaa-f6071929cdb0.png"
|
|
167
|
+
],
|
|
168
|
+
[
|
|
169
|
+
"app/assets/cg/joint/pan_pinger.webp",
|
|
170
|
+
"codex-imagegen:exec-a0bb4acc-0a64-444d-9c5a-30b2d0fad595.png"
|
|
171
|
+
],
|
|
172
|
+
[
|
|
173
|
+
"app/assets/cg/joint/yue_meng.webp",
|
|
174
|
+
"codex-imagegen:exec-02c5f590-a171-4fa0-8a79-b0324079a512.png"
|
|
175
|
+
],
|
|
176
|
+
[
|
|
177
|
+
"app/assets/cg/joint/pan_xuee.webp",
|
|
178
|
+
"codex-imagegen:exec-5af38352-b063-4dbe-9b4a-af807faa2f94.png"
|
|
179
|
+
]
|
|
125
180
|
]
|
|
126
181
|
},
|
|
127
182
|
{
|
|
128
183
|
"usage": "五张个人终章与命数空宅",
|
|
129
184
|
"promptSummary": "人物用钥匙、席位、退路、名帖、停灶和轮值执行最后规则;命数页以无人空宅、六把钥匙和五张名签承接固定历史。",
|
|
130
185
|
"assets": [
|
|
131
|
-
[
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
[
|
|
136
|
-
|
|
186
|
+
[
|
|
187
|
+
"app/assets/cg/finale/yue.webp",
|
|
188
|
+
"codex-imagegen:exec-a0272894-bfa1-44e7-a15f-a749322db57f.png"
|
|
189
|
+
],
|
|
190
|
+
[
|
|
191
|
+
"app/assets/cg/finale/pan.webp",
|
|
192
|
+
"codex-imagegen:exec-4ab8a42b-3d8b-4f81-8864-82ec3366b40f.png"
|
|
193
|
+
],
|
|
194
|
+
[
|
|
195
|
+
"app/assets/cg/finale/pinger.webp",
|
|
196
|
+
"codex-imagegen:exec-8c08054f-b78f-492d-8187-6b80dcaecc73.png"
|
|
197
|
+
],
|
|
198
|
+
[
|
|
199
|
+
"app/assets/cg/finale/meng.webp",
|
|
200
|
+
"codex-imagegen:exec-d3764cf3-67a3-4ae7-b98d-1b4f26083aea.png"
|
|
201
|
+
],
|
|
202
|
+
[
|
|
203
|
+
"app/assets/cg/finale/xuee.webp",
|
|
204
|
+
"codex-imagegen:exec-ed7203e7-bcbb-4829-b1c1-417ee44cedf8.png"
|
|
205
|
+
],
|
|
206
|
+
[
|
|
207
|
+
"app/assets/cg/finale/fate_coda.webp",
|
|
208
|
+
"codex-imagegen:exec-c29af8f8-fca4-4f71-aef0-5af5a4dd4d2a.png"
|
|
209
|
+
]
|
|
137
210
|
],
|
|
138
211
|
"editNote": "月娘、瓶儿、雪娥终章使用 image_gen 二次编辑清除模型伪文字。"
|
|
139
212
|
},
|
|
@@ -141,21 +214,85 @@
|
|
|
141
214
|
"usage": "五张中局转折",
|
|
142
215
|
"promptSummary": "空主位与轮值钥匙、矛盾口风与封口银、破锁空匣与退路、名帖网络、冷灶拒印分别成为可读危机。",
|
|
143
216
|
"assets": [
|
|
144
|
-
[
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
[
|
|
217
|
+
[
|
|
218
|
+
"app/assets/cg/milestone/yue.webp",
|
|
219
|
+
"codex-imagegen:exec-a84bb537-8fc2-4844-9d40-f6552b28fb4c.png"
|
|
220
|
+
],
|
|
221
|
+
[
|
|
222
|
+
"app/assets/cg/milestone/pan.webp",
|
|
223
|
+
"codex-imagegen:exec-debb4c41-2c4e-41b8-8eff-3e1a272184ec.png"
|
|
224
|
+
],
|
|
225
|
+
[
|
|
226
|
+
"app/assets/cg/milestone/pinger.webp",
|
|
227
|
+
"codex-imagegen:exec-43cace36-0bee-41d1-aa84-798882ad6d49.png"
|
|
228
|
+
],
|
|
229
|
+
[
|
|
230
|
+
"app/assets/cg/milestone/meng.webp",
|
|
231
|
+
"codex-imagegen:exec-3adba92b-e8cf-4103-adf7-ac81026dbf41.png"
|
|
232
|
+
],
|
|
233
|
+
[
|
|
234
|
+
"app/assets/cg/milestone/xuee.webp",
|
|
235
|
+
"codex-imagegen:exec-de699d51-80ee-4cc5-93d7-c0553f705f0f.png"
|
|
236
|
+
]
|
|
149
237
|
],
|
|
150
238
|
"editNote": "月娘、玉楼、雪娥转折图使用 image_gen 二次编辑清除模型伪文字。"
|
|
239
|
+
},
|
|
240
|
+
{
|
|
241
|
+
"date": "2026-10-02",
|
|
242
|
+
"tool": "codex exec 内置 image_gen(编辑模式以已批准身份母版为参考)",
|
|
243
|
+
"purpose": "galgame 改造:透明底立绘五人×六张(平+五种表情)、九张全屏场景、一张月娘拜月 CG",
|
|
244
|
+
"assets": [
|
|
245
|
+
"app/assets/sprite/yue/neutral.webp",
|
|
246
|
+
"app/assets/sprite/yue/smile.webp",
|
|
247
|
+
"app/assets/sprite/yue/angry.webp",
|
|
248
|
+
"app/assets/sprite/yue/sad.webp",
|
|
249
|
+
"app/assets/sprite/yue/blush.webp",
|
|
250
|
+
"app/assets/sprite/yue/surprised.webp",
|
|
251
|
+
"app/assets/sprite/pan/neutral.webp",
|
|
252
|
+
"app/assets/sprite/pan/smile.webp",
|
|
253
|
+
"app/assets/sprite/pan/angry.webp",
|
|
254
|
+
"app/assets/sprite/pan/sad.webp",
|
|
255
|
+
"app/assets/sprite/pan/blush.webp",
|
|
256
|
+
"app/assets/sprite/pan/surprised.webp",
|
|
257
|
+
"app/assets/sprite/pinger/neutral.webp",
|
|
258
|
+
"app/assets/sprite/pinger/smile.webp",
|
|
259
|
+
"app/assets/sprite/pinger/angry.webp",
|
|
260
|
+
"app/assets/sprite/pinger/sad.webp",
|
|
261
|
+
"app/assets/sprite/pinger/blush.webp",
|
|
262
|
+
"app/assets/sprite/pinger/surprised.webp",
|
|
263
|
+
"app/assets/sprite/meng/neutral.webp",
|
|
264
|
+
"app/assets/sprite/meng/smile.webp",
|
|
265
|
+
"app/assets/sprite/meng/angry.webp",
|
|
266
|
+
"app/assets/sprite/meng/sad.webp",
|
|
267
|
+
"app/assets/sprite/meng/blush.webp",
|
|
268
|
+
"app/assets/sprite/meng/surprised.webp",
|
|
269
|
+
"app/assets/sprite/xuee/neutral.webp",
|
|
270
|
+
"app/assets/sprite/xuee/smile.webp",
|
|
271
|
+
"app/assets/sprite/xuee/angry.webp",
|
|
272
|
+
"app/assets/sprite/xuee/sad.webp",
|
|
273
|
+
"app/assets/sprite/xuee/blush.webp",
|
|
274
|
+
"app/assets/sprite/xuee/surprised.webp",
|
|
275
|
+
"app/assets/bg/hall.webp",
|
|
276
|
+
"app/assets/bg/garden.webp",
|
|
277
|
+
"app/assets/bg/chamber.webp",
|
|
278
|
+
"app/assets/bg/court_night.webp",
|
|
279
|
+
"app/assets/bg/street.webp",
|
|
280
|
+
"app/assets/bg/street_dawn.webp",
|
|
281
|
+
"app/assets/bg/kitchen.webp",
|
|
282
|
+
"app/assets/bg/court_rain.webp",
|
|
283
|
+
"app/assets/bg/temple.webp",
|
|
284
|
+
"app/assets/cg/yue/moon.webp"
|
|
285
|
+
],
|
|
286
|
+
"promptSummary": "立绘:以 heroine/<名>/night.webp 为身份参考,生成 1024×1536 透明底腰上至大腿立绘,成年、完整着装、非露骨;差分以基础立绘为编辑输入,只改表情。场景:以 compound_new_guofeng.webp 为画风参考,平视、前景地面留给立绘,无人物无文字。月娘拜月 CG:以 heroine/yue/night.webp 为身份参考,月下庭院拜月,成年、完整着装、非成人内容。",
|
|
287
|
+
"postProcessing": "立绘统一缩放到 800×1200 webp q84,不裁切以保证差分逐帧对齐;场景 1536×1024 webp q80。CG 保持原始比例 webp。"
|
|
151
288
|
}
|
|
152
289
|
],
|
|
153
290
|
"postProcessing": {
|
|
154
291
|
"command": "cwebp -q 88 -m 6 -metadata none",
|
|
155
|
-
"assetCount":
|
|
156
|
-
"totalBytes":
|
|
157
|
-
"intermediatePolicy": "image_gen 原始 PNG
|
|
292
|
+
"assetCount": 78,
|
|
293
|
+
"totalBytes": 18714684,
|
|
294
|
+
"intermediatePolicy": "image_gen 原始 PNG 留在工具缓存,不复制进仓库;运行目录只保留本账目所列 WebP。",
|
|
158
295
|
"reproducible": false
|
|
159
296
|
},
|
|
160
|
-
"acceptance": "
|
|
297
|
+
"acceptance": "人工巡检身份母版、立绘差分逐帧对齐、个人夜景、群像与终章;浏览器 QA(test/verify_visual.py)验证完整路径上的图片解码、目标视口、流程输入和控制台。"
|
|
161
298
|
}
|
|
@@ -1,26 +1,16 @@
|
|
|
1
1
|
# QA 证据说明
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
唯一权威命令(真实 Chromium + Playwright,自启临时本地服务):
|
|
4
4
|
|
|
5
5
|
```bash
|
|
6
6
|
cd examples/jin-ping-mei/build/app
|
|
7
7
|
python3 test/verify_visual.py --write-evidence
|
|
8
8
|
```
|
|
9
9
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
一条完整路径:年龄门(确认前零成人资源请求)→ 动画标题 → 设置里把文字速度调到瞬间 → 开始游戏 →
|
|
11
|
+
鼠标点击与回车推进 → 共通线六章(途中快存、快读回到同一句、滚轮打开回看)→ 分岔夜选月娘 →
|
|
12
|
+
月娘线 → 良缘结局卡 → 原著命数页 → 回标题 → 重新开始回到序章第一句。成功后写 `verification.json`、
|
|
13
|
+
`evidence/run.json`、`evidence/ending.jpg` 与 `../screenshots/title.jpg`、`../screenshots/adv.jpg`。
|
|
13
14
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
穷举其他结局,不复测全键盘或五档完整二十日矩阵,也不证明主观吸引力。
|
|
17
|
-
|
|
18
|
-
仓内另提供一条不依赖浏览器的可执行改编合同:
|
|
19
|
-
|
|
20
|
-
```bash
|
|
21
|
-
node examples/jin-ping-mei/qa/verify_playable_model.mjs
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
它对照 `playable-model.json` 与实际 `data.js` / `engine.js`,验证两种正堂起手的差异、三拍回响、非空
|
|
25
|
-
回调载荷、证物来源与消费边界、同 seed 确定性、存档重演与分支污染拒绝。它不调用第 5/15/20 日、
|
|
26
|
-
结局、一月笺或命数消费者,是设计回归,不冒充上面的真实渲染、输入或完整二十日证据。
|
|
15
|
+
CI 另跑 `npm run verify:model`(`test/lint_script.mjs`,无浏览器):剧本跳转与资源登记完整,穷举全部选择后十六个结局都可达。
|
|
16
|
+
它不证明渲染或输入,只防止剧本改动造成死路。
|
|
@@ -6,10 +6,10 @@
|
|
|
6
6
|
"exitCode": 0
|
|
7
7
|
},
|
|
8
8
|
"completeRun": {
|
|
9
|
-
"id": "jin-ping-mei-
|
|
9
|
+
"id": "jin-ping-mei-galgame-2026-10",
|
|
10
10
|
"cleanContext": true,
|
|
11
|
-
"terminal": "
|
|
12
|
-
"restart": "
|
|
11
|
+
"terminal": "yue_good",
|
|
12
|
+
"restart": "prologue-first-line",
|
|
13
13
|
"evidence": "qa/evidence/run.json"
|
|
14
14
|
},
|
|
15
15
|
"checks": {
|
|
@@ -23,19 +23,19 @@
|
|
|
23
23
|
"limitations": [
|
|
24
24
|
{
|
|
25
25
|
"scope": "路径覆盖",
|
|
26
|
-
"reason": "
|
|
26
|
+
"reason": "浏览器只走月娘良缘一条完整路径;其余 15 个结局由 test/lint_script.mjs 穷举选择证明可达,未逐一在浏览器渲染。"
|
|
27
27
|
},
|
|
28
28
|
{
|
|
29
|
-
"scope": "
|
|
30
|
-
"reason": "
|
|
29
|
+
"scope": "成人画面",
|
|
30
|
+
"reason": "权威路径选择不进入亲密场景,成人 CG 的显示与帘幕替代只做过人工抽查。"
|
|
31
31
|
},
|
|
32
32
|
{
|
|
33
|
-
"scope": "
|
|
34
|
-
"reason": "
|
|
33
|
+
"scope": "视口与浏览器",
|
|
34
|
+
"reason": "只在 1440×900 Chromium 运行;窄屏布局与其他浏览器未纳入本次运行。"
|
|
35
35
|
},
|
|
36
36
|
{
|
|
37
37
|
"scope": "体验判断",
|
|
38
|
-
"reason": "
|
|
38
|
+
"reason": "自动化只证明能启动、渲染、输入、走到结局并重开,不判断剧情是否动人或节奏是否合适。"
|
|
39
39
|
}
|
|
40
40
|
]
|
|
41
41
|
}
|