@oh-story/dsh 0.1.11 → 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.
Files changed (264) hide show
  1. package/README.md +17 -11
  2. package/lib/client.js +85 -35
  3. package/lib/client.js.map +3 -3
  4. package/lib/drama/manifest.json +41 -36
  5. package/lib/drama/skills/short-drama/scripts/creator_markdown_check.py +340 -13
  6. package/lib/drama/skills/short-drama-assets/references/voice-direction.md +4 -2
  7. package/lib/drama/skills/short-drama-edit/SKILL.md +32 -12
  8. package/lib/drama/skills/short-drama-edit/references/still-cuts.md +90 -0
  9. package/lib/drama/skills/short-drama-edit/scripts/edit_tool.py +1035 -145
  10. package/lib/drama/skills/short-drama-edit/scripts/selftest.py +48 -0
  11. package/lib/drama/skills/short-drama-produce/SKILL.md +6 -1
  12. package/lib/drama/skills/short-drama-produce/references/adapter-contract.md +12 -0
  13. package/lib/drama/skills/short-drama-produce/scripts/production_tool.py +138 -9
  14. package/lib/drama/skills/short-drama-produce/scripts/provider_adapters.py +6 -0
  15. package/lib/drama/skills/short-drama-storyboard/SKILL.md +2 -0
  16. package/lib/drama/skills/short-drama-storyboard/references/production-shot-grammar.md +3 -1
  17. package/lib/drama/skills/short-drama-video-prompts/SKILL.md +7 -0
  18. package/lib/drama/skills/short-drama-video-prompts/references/performance-action-timing.md +14 -0
  19. package/lib/drama/skills/short-drama-video-prompts/references/seedance-2.5.md +19 -6
  20. package/lib/drama/skills/short-drama-video-prompts/references/stage-contract.md +1 -0
  21. package/lib/drama/skills/short-drama-video-prompts/references/target-model-profile.md +5 -0
  22. package/lib/drama/skills/short-drama-video-prompts/references/wan-3.0.md +4 -1
  23. package/lib/index.js +16 -7
  24. package/lib/index.js.map +2 -2
  25. package/lib/novel-to-game/README.md +98 -44
  26. package/lib/novel-to-game/README_ZH.md +100 -46
  27. package/lib/novel-to-game/VERSION +1 -1
  28. package/lib/novel-to-game/examples/jin-ping-mei/build/BUILD_BRIEF.md +27 -202
  29. package/lib/novel-to-game/examples/jin-ping-mei/build/app/RUN.md +23 -115
  30. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/bg/chamber.webp +0 -0
  31. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/bg/court_night.webp +0 -0
  32. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/bg/court_rain.webp +0 -0
  33. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/bg/garden.webp +0 -0
  34. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/bg/hall.webp +0 -0
  35. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/bg/kitchen.webp +0 -0
  36. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/bg/street.webp +0 -0
  37. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/bg/street_dawn.webp +0 -0
  38. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/bg/temple.webp +0 -0
  39. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/yue/moon.webp +0 -0
  40. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/meng/angry.webp +0 -0
  41. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/meng/blush.webp +0 -0
  42. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/meng/neutral.webp +0 -0
  43. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/meng/sad.webp +0 -0
  44. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/meng/smile.webp +0 -0
  45. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/meng/surprised.webp +0 -0
  46. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/pan/angry.webp +0 -0
  47. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/pan/blush.webp +0 -0
  48. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/pan/neutral.webp +0 -0
  49. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/pan/sad.webp +0 -0
  50. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/pan/smile.webp +0 -0
  51. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/pan/surprised.webp +0 -0
  52. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/pinger/angry.webp +0 -0
  53. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/pinger/blush.webp +0 -0
  54. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/pinger/neutral.webp +0 -0
  55. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/pinger/sad.webp +0 -0
  56. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/pinger/smile.webp +0 -0
  57. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/pinger/surprised.webp +0 -0
  58. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/xuee/angry.webp +0 -0
  59. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/xuee/blush.webp +0 -0
  60. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/xuee/neutral.webp +0 -0
  61. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/xuee/sad.webp +0 -0
  62. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/xuee/smile.webp +0 -0
  63. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/xuee/surprised.webp +0 -0
  64. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/yue/angry.webp +0 -0
  65. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/yue/blush.webp +0 -0
  66. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/yue/neutral.webp +0 -0
  67. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/yue/sad.webp +0 -0
  68. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/yue/smile.webp +0 -0
  69. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/sprite/yue/surprised.webp +0 -0
  70. package/lib/novel-to-game/examples/jin-ping-mei/build/app/css/style.css +326 -2503
  71. package/lib/novel-to-game/examples/jin-ping-mei/build/app/index.html +71 -4
  72. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/adv.js +221 -0
  73. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/audio.js +113 -257
  74. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/main.js +511 -3026
  75. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/menus.js +277 -0
  76. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/petals.js +67 -0
  77. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/stage.js +180 -0
  78. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/store.js +70 -0
  79. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/story/common.js +198 -0
  80. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/story/common2.js +204 -0
  81. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/story/common3.js +198 -0
  82. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/story/dates.js +186 -0
  83. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/story/index.js +122 -0
  84. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/story/meng.js +190 -0
  85. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/story/pan.js +212 -0
  86. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/story/pinger.js +198 -0
  87. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/story/xuee.js +199 -0
  88. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/story/yue.js +214 -0
  89. package/lib/novel-to-game/examples/jin-ping-mei/build/app/package.json +2 -2
  90. package/lib/novel-to-game/examples/jin-ping-mei/build/art/generated-art.json +182 -45
  91. package/lib/novel-to-game/examples/jin-ping-mei/qa/README.md +7 -17
  92. package/lib/novel-to-game/examples/jin-ping-mei/qa/verification.json +9 -9
  93. package/lib/novel-to-game/manifest.json +303 -78
  94. package/lib/novel-to-game/skills/game-art-direction/references/art-direction-method.md +7 -2
  95. package/lib/novel-to-game/skills/game-concept/references/concept-method.md +2 -0
  96. package/lib/novel-to-game/skills/game-world-design/references/narrative-design-method.md +2 -0
  97. package/lib/novel-to-game/skills/game-world-design/references/world-design-method.md +9 -0
  98. package/lib/types/client/drama-production-view.d.ts +11 -0
  99. package/lib/types/client/drama-production-view.d.ts.map +1 -1
  100. package/lib/types/client/file-activity.d.ts +1 -1
  101. package/lib/types/client/file-activity.d.ts.map +1 -1
  102. package/lib/types/client/production-prompts.d.ts +7 -1
  103. package/lib/types/client/production-prompts.d.ts.map +1 -1
  104. package/lib/types/client/production-runtime.d.ts +7 -2
  105. package/lib/types/client/production-runtime.d.ts.map +1 -1
  106. package/lib/types/drama-adapters.d.ts.map +1 -1
  107. package/lib/types/skill-provider.d.ts.map +1 -1
  108. package/lib/types/video-project.d.ts.map +1 -1
  109. package/lib/video-recap/CHANGELOG.md +108 -1
  110. package/lib/video-recap/README.en.md +18 -14
  111. package/lib/video-recap/README.md +18 -14
  112. package/lib/video-recap/manifest.json +297 -321
  113. package/lib/video-recap/skills/video-assemble/SKILL.md +18 -16
  114. package/lib/video-recap/skills/video-assemble/references/explicit-audio-mix.md +3 -1
  115. package/lib/video-recap/skills/video-assemble/references/jianying/SOURCE.md +5 -5
  116. package/lib/video-recap/skills/video-assemble/references/packaging.md +4 -4
  117. package/lib/video-recap/skills/video-assemble/references/subtitle-track.md +10 -10
  118. package/lib/video-recap/skills/video-assemble/scripts/adoption/audio_mix_binding.py +13 -2
  119. package/lib/video-recap/skills/video-assemble/scripts/adoption/av_clock.py +109 -0
  120. package/lib/video-recap/skills/video-assemble/scripts/adoption/strict_publish.py +4 -1
  121. package/lib/video-recap/skills/video-assemble/scripts/artifacts.py +2 -9
  122. package/lib/video-recap/skills/video-assemble/scripts/assemble.py +188 -51
  123. package/lib/video-recap/skills/video-assemble/scripts/assemble_constants.py +0 -1
  124. package/lib/video-recap/skills/video-assemble/scripts/assembly_contract.py +32 -75
  125. package/lib/video-recap/skills/video-assemble/scripts/assembly_settings.py +8 -15
  126. package/lib/video-recap/skills/video-assemble/scripts/audio_mix.py +202 -161
  127. package/lib/video-recap/skills/video-assemble/scripts/codec_peak.py +112 -0
  128. package/lib/video-recap/skills/video-assemble/scripts/export_jianying.py +10 -101
  129. package/lib/video-recap/skills/video-assemble/scripts/jianying/builders.py +44 -475
  130. package/lib/video-recap/skills/video-assemble/scripts/jianying/model.py +1 -22
  131. package/lib/video-recap/skills/video-assemble/scripts/jianying/templates.py +0 -3
  132. package/lib/video-recap/skills/video-assemble/scripts/jianying/timeline_contract.py +36 -103
  133. package/lib/video-recap/skills/video-assemble/scripts/jianying/tracks.py +0 -8
  134. package/lib/video-recap/skills/video-assemble/scripts/jianying/writer.py +28 -203
  135. package/lib/video-recap/skills/video-assemble/scripts/lib.py +20 -34
  136. package/lib/video-recap/skills/video-assemble/scripts/loudness.py +332 -0
  137. package/lib/video-recap/skills/video-assemble/scripts/media.py +158 -38
  138. package/lib/video-recap/skills/video-assemble/scripts/narration_audio.py +30 -16
  139. package/lib/video-recap/skills/video-assemble/scripts/render_preflight.py +49 -8
  140. package/lib/video-recap/skills/video-assemble/scripts/source_subtitles.py +17 -6
  141. package/lib/video-recap/skills/video-assemble/scripts/subtitles/core.py +24 -2
  142. package/lib/video-recap/skills/video-assemble/scripts/subtitles/track.py +2 -5
  143. package/lib/video-recap/skills/video-assemble/scripts/subtitles/track_binding.py +2 -9
  144. package/lib/video-recap/skills/video-assemble/scripts/timeline.py +12 -34
  145. package/lib/video-recap/skills/video-assemble/scripts/timeline_emit.py +3 -4
  146. package/lib/video-recap/skills/video-assemble/scripts/visual_render.py +28 -2
  147. package/lib/video-recap/skills/video-cut/SKILL.md +37 -11
  148. package/lib/video-recap/skills/video-cut/references/shot-review.md +1 -1
  149. package/lib/video-recap/skills/video-cut/scripts/cut.py +2 -34
  150. package/lib/video-recap/skills/video-cut/scripts/cut_cli.py +96 -124
  151. package/lib/video-recap/skills/video-cut/scripts/cut_contract.py +97 -182
  152. package/lib/video-recap/skills/video-cut/scripts/cut_render.py +177 -166
  153. package/lib/video-recap/skills/video-cut/scripts/frame_grid.py +249 -0
  154. package/lib/video-recap/skills/video-cut/scripts/lib.py +0 -3
  155. package/lib/video-recap/skills/video-cut/scripts/media_geometry.py +173 -7
  156. package/lib/video-recap/skills/video-cut/scripts/sentence_boundaries.py +234 -151
  157. package/lib/video-recap/skills/video-cut/scripts/sentence_gate.py +189 -0
  158. package/lib/video-recap/skills/video-cut/scripts/shot_review.py +2 -6
  159. package/lib/video-recap/skills/video-recap/SKILL.md +24 -27
  160. package/lib/video-recap/skills/video-recap/references/audio-routing.md +8 -6
  161. package/lib/video-recap/skills/video-recap/references/config-playbook.md +8 -11
  162. package/lib/video-recap/skills/video-recap/references/data-schema.md +131 -74
  163. package/lib/video-recap/skills/video-recap/references/resource-library.md +17 -1
  164. package/lib/video-recap/skills/video-recap/scripts/doctor.py +51 -268
  165. package/lib/video-recap/skills/video-recap/scripts/final_qc.py +89 -254
  166. package/lib/video-recap/skills/video-recap/scripts/lib.py +81 -70
  167. package/lib/video-recap/skills/video-recap/scripts/library.py +40 -4
  168. package/lib/video-recap/skills/video-recap/scripts/materials.py +13 -80
  169. package/lib/video-recap/skills/video-recap/scripts/recap_cli.py +49 -17
  170. package/lib/video-recap/skills/video-recap/scripts/recap_inspect.py +1 -3
  171. package/lib/video-recap/skills/video-recap/scripts/recap_runner.py +86 -116
  172. package/lib/video-recap/skills/video-recap/scripts/recap_runtime.py +87 -23
  173. package/lib/video-recap/skills/video-recap/scripts/recap_source.py +0 -39
  174. package/lib/video-recap/skills/video-recap/scripts/recap_stage_qc.py +37 -135
  175. package/lib/video-recap/skills/video-recap/scripts/recap_timeline.py +118 -127
  176. package/lib/video-recap/skills/video-recap/scripts/resources/__init__.py +4 -0
  177. package/lib/video-recap/skills/video-recap/scripts/{resource_lock.py → resources/lock.py} +1 -1
  178. package/lib/video-recap/skills/video-recap/scripts/{project_binding.py → resources/project_binding.py} +78 -17
  179. package/lib/video-recap/skills/video-reference/SKILL.md +108 -0
  180. package/lib/video-recap/skills/video-reference/references/reference-schema.md +139 -0
  181. package/lib/video-recap/skills/video-reference/scripts/lib.py +85 -0
  182. package/lib/video-recap/skills/video-reference/scripts/reference.py +96 -0
  183. package/lib/video-recap/skills/video-reference/scripts/reference_check.py +553 -0
  184. package/lib/video-recap/skills/video-reference/scripts/reference_frames.py +122 -0
  185. package/lib/video-recap/skills/video-reference/scripts/reference_measure.py +253 -0
  186. package/lib/video-recap/skills/video-reference/scripts/reference_profile.py +271 -0
  187. package/lib/video-recap/skills/video-script/SKILL.md +9 -7
  188. package/lib/video-recap/skills/video-script/scripts/agent_text.py +18 -267
  189. package/lib/video-recap/skills/video-script/scripts/deslop_qc.py +12 -30
  190. package/lib/video-recap/skills/video-script/scripts/entry_suggestion.py +125 -0
  191. package/lib/video-recap/skills/video-script/scripts/evidence_bundle.py +2 -26
  192. package/lib/video-recap/skills/video-script/scripts/lib.py +5 -15
  193. package/lib/video-recap/skills/video-script/scripts/lint_summary.py +184 -0
  194. package/lib/video-recap/skills/video-script/scripts/narration_lint.py +120 -100
  195. package/lib/video-recap/skills/video-script/scripts/review.py +3 -34
  196. package/lib/video-recap/skills/video-script/scripts/review_grounding.py +20 -46
  197. package/lib/video-recap/skills/video-script/scripts/review_response.py +120 -258
  198. package/lib/video-recap/skills/video-script/scripts/review_runner.py +2 -10
  199. package/lib/video-recap/skills/video-script/scripts/speech_ownership.py +89 -5
  200. package/lib/video-recap/skills/video-script/scripts/validate.py +26 -34
  201. package/lib/video-recap/skills/video-understanding/SKILL.md +29 -4
  202. package/lib/video-recap/skills/video-understanding/references/data-schema.md +5 -22
  203. package/lib/video-recap/skills/video-understanding/scripts/agent_text.py +24 -121
  204. package/lib/video-recap/skills/video-understanding/scripts/asr.py +11 -5
  205. package/lib/video-recap/skills/video-understanding/scripts/asr_timing_evidence.py +15 -24
  206. package/lib/video-recap/skills/video-understanding/scripts/briefing/builder.py +59 -25
  207. package/lib/video-recap/skills/video-understanding/scripts/briefing/context.py +39 -3
  208. package/lib/video-recap/skills/video-understanding/scripts/briefing/inputs.py +15 -27
  209. package/lib/video-recap/skills/video-understanding/scripts/briefing/timeline.py +136 -37
  210. package/lib/video-recap/skills/video-understanding/scripts/consolidate.py +121 -37
  211. package/lib/video-recap/skills/video-understanding/scripts/detect.py +118 -16
  212. package/lib/video-recap/skills/video-understanding/scripts/index_normalize.py +359 -0
  213. package/lib/video-recap/skills/video-understanding/scripts/lib.py +62 -21
  214. package/lib/video-recap/skills/video-understanding/scripts/storyboard.py +181 -51
  215. package/lib/video-recap/skills/video-understanding/scripts/timeline_fusion.py +0 -26
  216. package/lib/video-recap/skills/video-understanding/scripts/understanding_brief.py +37 -14
  217. package/lib/video-recap/skills/video-understanding/scripts/understanding_cache.py +40 -32
  218. package/lib/video-recap/skills/video-understanding/scripts/understanding_runner.py +100 -127
  219. package/lib/video-recap/skills/video-understanding/scripts/understanding_storyboard.py +182 -30
  220. package/lib/video-recap/skills/video-understanding/scripts/vlm.py +30 -27
  221. package/lib/video-recap/skills/video-voiceover/SKILL.md +19 -12
  222. package/lib/video-recap/skills/video-voiceover/references/index-tts.md +3 -3
  223. package/lib/video-recap/skills/video-voiceover/scripts/approved_text_policy.py +3 -1
  224. package/lib/video-recap/skills/video-voiceover/scripts/dub.py +60 -135
  225. package/lib/video-recap/skills/video-voiceover/scripts/lib.py +9 -34
  226. package/lib/video-recap/skills/video-voiceover/scripts/providers/fish_audio.py +6 -1
  227. package/lib/video-recap/skills/video-voiceover/scripts/tts_audio.py +64 -1
  228. package/lib/video-recap/skills/video-voiceover/scripts/tts_cache.py +99 -0
  229. package/lib/video-recap/skills/video-voiceover/scripts/voiceover.py +177 -200
  230. package/package.json +45 -45
  231. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/group/inner_court_accord_five.webp +0 -0
  232. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/cg/group/public_day15.webp +0 -0
  233. package/lib/novel-to-game/examples/jin-ping-mei/build/app/assets/household/li_jiaoer.webp +0 -0
  234. package/lib/novel-to-game/examples/jin-ping-mei/build/app/css/new-guofeng.css +0 -1494
  235. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/assets.js +0 -147
  236. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/data.js +0 -7470
  237. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/engine.js +0 -13066
  238. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/text.js +0 -32
  239. package/lib/novel-to-game/examples/jin-ping-mei/qa/playable-model.json +0 -99
  240. package/lib/novel-to-game/examples/jin-ping-mei/qa/verify_playable_model.mjs +0 -152
  241. package/lib/video-recap/skills/video-assemble/references/foreground-compose.md +0 -118
  242. package/lib/video-recap/skills/video-assemble/references/jianying/empty_jy_combination_segment.json +0 -84
  243. package/lib/video-recap/skills/video-assemble/references/jianying/empty_jy_combination_video_material.json +0 -98
  244. package/lib/video-recap/skills/video-assemble/references/jianying/empty_jy_draft.json +0 -204
  245. package/lib/video-recap/skills/video-assemble/references/pair-media.md +0 -74
  246. package/lib/video-recap/skills/video-assemble/scripts/compose_foreground.py +0 -293
  247. package/lib/video-recap/skills/video-assemble/scripts/pair_media.py +0 -216
  248. package/lib/video-recap/skills/video-recap/references/shift-left-qc-schema.md +0 -23
  249. package/lib/video-recap/skills/video-recap/scripts/mimo_qc.py +0 -33
  250. package/lib/video-recap/skills/video-recap/scripts/qc/__init__.py +0 -1
  251. package/lib/video-recap/skills/video-recap/scripts/qc/mimo_client.py +0 -13
  252. package/lib/video-recap/skills/video-recap/scripts/qc/mimo_contract.py +0 -9
  253. package/lib/video-recap/skills/video-recap/scripts/qc/mimo_evidence.py +0 -287
  254. package/lib/video-recap/skills/video-recap/scripts/qc/mimo_observations.py +0 -175
  255. package/lib/video-recap/skills/video-recap/scripts/qc/mimo_payload.py +0 -206
  256. package/lib/video-recap/skills/video-recap/scripts/qc/mimo_report.py +0 -318
  257. package/lib/video-recap/skills/video-recap/scripts/qc/mimo_runner.py +0 -130
  258. package/lib/video-recap/skills/video-recap/scripts/qc_contract.py +0 -320
  259. package/lib/video-recap/skills/video-script/scripts/timeline_fusion.py +0 -108
  260. package/lib/video-recap/skills/video-understanding/scripts/brief.py +0 -9
  261. package/lib/video-recap/skills/video-understanding/scripts/deslop_qc.py +0 -211
  262. package/lib/video-recap/skills/video-understanding/scripts/narration_lint.py +0 -707
  263. package/lib/video-recap/skills/video-understanding/scripts/speech_ownership.py +0 -143
  264. /package/lib/video-recap/skills/video-cut/scripts/{narration_mapping.py → cut_qc.py} +0 -0
@@ -0,0 +1,186 @@
1
+ // 五条路线各一场「出门」:离开宅院的半日,让她露出宅里看不见的一面。
2
+ export default String.raw`
3
+ # yue_date
4
+ @hide all
5
+ @bg street fade
6
+ @bgm garden
7
+ @chapter 吴月娘篇|上香
8
+ 过了两日,月娘要去城外的永福寺还愿。往年都是玳安跟着,今年你说,你去。
9
+ 月娘坐在轿里,一路没说话。到了街口,她忽然叫轿子停下。
10
+ @show yue 中 平
11
+ 月娘(平):走两步吧。坐久了,腿麻。
12
+ 她下了轿,走在你半步之后。这是规矩——可走着走着,那半步就没了。
13
+ 街边有卖糖人的。她看了一眼,又看了一眼。
14
+ 西门庆:想要?
15
+ 月娘(羞):……胡说。我多大的人了。
16
+ @choice
17
+ - 买一只糖兔子塞给她 -> yd_candy {yue+1}
18
+ - 笑她:“正头娘子也嘴馋。” -> yd_tease
19
+
20
+ # yd_candy
21
+ 月娘(惊):你——
22
+ 她拿着那只糖兔子,左看右看,像拿着一件不知道该往哪儿放的东西。
23
+ 月娘(笑):小时候在吴家,过年才买一回。我爹说,千户家的姑娘,不能当街吃糖。
24
+ 她低头咬了一口兔子耳朵,赶紧用袖子挡住嘴。
25
+ 月娘(羞):……别看了。回去不许跟她们说。
26
+ @jump yd_end
27
+
28
+ # yd_tease
29
+ 月娘(怒):谁嘴馋了。
30
+ 她把脸一板,快步往前走了。可你看见,她走过糖人摊子的时候,又回头看了一眼。
31
+ @jump yd_end
32
+
33
+ # yd_end
34
+ @hide all
35
+ @bg temple fade
36
+ @show yue 中 平
37
+ 寺里香火很旺。她跪在佛前,许了很久的愿。你问她许了什么,她不说。
38
+ 月娘(平):说出来,就不灵了。
39
+ 回程的轿子里,她靠着轿壁睡着了。轿子一颠,她的头就歪到了你肩上。你没有动,她也没有醒——或者是装作没有醒。
40
+ @hide all
41
+ @jump yue_r2
42
+
43
+ # pan_date
44
+ @hide all
45
+ @bg street fade
46
+ @bgm garden
47
+ @chapter 潘金莲篇|街上
48
+ 第二天一早,金莲就来敲你的门。
49
+ @show pan 中 笑
50
+ 金莲(笑):官人昨夜说了,往后我不用等。那今日就别叫我等——陪我上街。
51
+ 金莲:我要去银楼挑一副耳坠子。六妹妹那对是珍珠的,我要比她亮的。
52
+ 她挽着你的胳膊,走在街心,专挑人多的地方走。卖花的、卖布的,个个都回头看。
53
+ 金莲(笑):看什么看,没见过西门大官人陪娘子逛街?
54
+ 到了银楼,掌柜捧出一盘耳坠,金的、玉的、珍珠的。她拿起这个比比,那个比比,最后停在一对红玛瑙上。
55
+ 金莲(平):……这对不贵。可我喜欢。
56
+ @choice
57
+ - “喜欢就买。再挑一对最贵的,换着戴。” -> pd_both {pan+1}
58
+ - “这对配你。” -> pd_one {pan+1}
59
+
60
+ # pd_both
61
+ 金莲(笑):这才是我的官人!
62
+ 她把两对都戴上试了,对着铜镜左照右照。可回去的路上,她只戴着那对红玛瑙。
63
+ 金莲(羞):贵的那对留着。哪天你惹我生气了,我戴给你看。
64
+ @jump pd_end
65
+
66
+ # pd_one
67
+ 金莲(惊):……配我?
68
+ 她对着铜镜看了很久。镜子里的人,眼尾红红的,耳垂也红红的。
69
+ 金莲(羞):你懂什么配不配。……买了。
70
+ @jump pd_end
71
+
72
+ # pd_end
73
+ 回去的路上,经过紫石街口,她的脚步慢了一下。那是她从前住的地方。
74
+ 金莲(平):……走快些。这条街,我不想多看。
75
+ 你没有问。她也没有说。只是挽着你的那只手,攥得更紧了。
76
+ @hide all
77
+ @jump pan_r2
78
+
79
+ # pinger_date
80
+ @hide all
81
+ @bg garden fade
82
+ @bgm garden
83
+ @chapter 李瓶儿篇|葡萄架
84
+ 过了几日,天晴得很好。瓶儿差丫头来问,官人得不得空,帮她在东院搭个葡萄架。
85
+ @show pinger 中 笑
86
+ 瓶儿(笑):我叫人买了两棵葡萄苗。听说要先搭架子,藤才爬得上去。
87
+ 你挽起袖子扛竹竿,她在底下扶着。竹竿歪了,她笑;绳子打成了死结,她也笑。
88
+ 瓶儿(笑):官人原来也有不会的事。
89
+ 西门庆:搭架子这种事,向来是下人做的。
90
+ 瓶儿(羞):那……今日这架子,是官人亲手搭的。往后葡萄结了,我数着,一颗一颗都是官人的。
91
+ 架子搭好了,歪歪扭扭的。她却退后两步看了又看,像在看一件宝贝。
92
+ 瓶儿(平):官人,我在大名府的时候,也住过很大的宅子。什么都有,就是没有一样东西,是有人陪我一起做的。
93
+ @choice
94
+ - “往后每年,我都陪你搭。” -> bd_promise {pinger+1}
95
+ - 拍掉她袖上的土:“下回叫小厮来,别累着。” -> bd_care
96
+
97
+ # bd_promise
98
+ 瓶儿(惊):……每年?
99
+ 她看着你,眼睛一点点亮起来,又怕亮得太快,赶紧低下头去扶那根歪竹竿。
100
+ 瓶儿(羞):那说好了。官人不许忘。
101
+ @jump bd_end
102
+
103
+ # bd_care
104
+ 瓶儿(笑):……嗯。官人心疼我,我知道。
105
+ 她笑着应了。只是你转身的时候,看见她自己又踮着脚,把那根歪了的竹竿扶正了。
106
+ @jump bd_end
107
+
108
+ # bd_end
109
+ 傍晚,她留你吃饭。菜不多,都是你爱吃的。你不记得跟她说过你爱吃什么。
110
+ 瓶儿(羞):我问的雪娥。……官人别笑。
111
+ @hide all
112
+ @jump pinger_r2
113
+
114
+ # meng_date
115
+ @hide all
116
+ @bg street fade
117
+ @bgm daily
118
+ @chapter 孟玉楼篇|铺子
119
+ 玉楼说要去绸缎铺看货,问你去不去。你去了,才知道她不是去看货——是去谈生意。
120
+ @show meng 中 平
121
+ 南边来的客商姓陈,嗓门大,开价狠。玉楼坐在他对面,慢慢喝茶,等他说完。
122
+ 玉楼(笑):陈掌柜这价,是对外人的价。对我,不是这个价吧?
123
+ 她不急不慢,把那批布的成色、走水路的日子、清河县这一季缺什么货,一样一样摆出来。陈掌柜的脸色,从红到白,又从白到红。
124
+ 最后那价钱,比开价少了三成。陈掌柜擦着汗走了,临走还冲她作了个揖。
125
+ 玉楼(笑):……官人看什么?我脸上有字?
126
+ @choice
127
+ - “有。写着‘了不起’。” -> md_praise {meng+1}
128
+ - “你这本事,比我铺子里的掌柜还强。” -> md_shop
129
+
130
+ # md_praise
131
+ 玉楼(羞):……官人今日嘴里抹了蜜。
132
+ 她拿扇子挡了一下脸,又放下来。
133
+ 玉楼(平):我头一个丈夫,从来不让我上铺子。他说,女人家抛头露面,不像话。
134
+ 玉楼(笑):官人今日没说这话。我记下了。
135
+ @jump md_end
136
+
137
+ # md_shop
138
+ 玉楼(笑):那官人要不要请我去当掌柜?工钱可不便宜。
139
+ 她说着玩笑话,眼睛却亮了一下。你知道,那不全是玩笑。
140
+ @jump md_end
141
+
142
+ # md_end
143
+ 回去的路上,她在一个卖曲本的小摊前停下,翻了一本又一本,最后买了一本旧的月琴谱。
144
+ 玉楼(平):这是我小时候学的第一支曲子。后来嫁人,谱子就丢了。
145
+ 她把曲本抱在怀里,一路上都没松手。
146
+ @hide all
147
+ @jump meng_r2
148
+
149
+ # xuee_date
150
+ @hide all
151
+ @bg street_dawn fade
152
+ @bgm daily
153
+ @chapter 孙雪娥篇|早市
154
+ 天还没亮透,雪娥就挎着篮子出门了。你在角门那儿等她。
155
+ @show xuee 中 惊
156
+ 雪娥(惊):官人?……你起这么早做什么。
157
+ 西门庆:陪你买菜。
158
+ 雪娥(怒):胡闹。哪有当家的跟着去买菜的,叫人看见要笑话。
159
+ 嘴上这么说,她还是把篮子塞给了你。
160
+ 早市上人挤人。她走得很快,哪家的菜新鲜、哪家的秤短,她一眼就知道。
161
+ 雪娥(笑):这家的豆腐好,可老板娘爱缺斤两。你看着——
162
+ 她跟老板娘一来一回讨了三句,硬是多要回来二两。老板娘气得直跺脚,她却笑得眉眼弯弯。
163
+ 你从没见过她这样笑。在宅子里,她从不这样笑。
164
+ @choice
165
+ - “你笑起来好看。往后在宅里也多笑笑。” -> xd_smile {xuee+1}
166
+ - 帮她把沉甸甸的篮子换到另一只手 -> xd_carry {xuee+1}
167
+
168
+ # xd_smile
169
+ 雪娥(羞):……谁、谁笑了。
170
+ 她把脸转过去,耳朵却红了。
171
+ 雪娥(哀):在宅里,笑给谁看呢。笑多了,人家说你没规矩;不笑,人家说你一脸怨气。
172
+ 雪娥(羞):……那往后,笑给官人看。
173
+ @jump xd_end
174
+
175
+ # xd_carry
176
+ 雪娥(惊):……放下,我自己拿得动。
177
+ 你没放。她瞪了你一眼,没再抢,只是走路的时候,离你近了一点。
178
+ @jump xd_end
179
+
180
+ # xd_end
181
+ 回去的路上,她在一个卖烧饼的摊子前停下,买了两个,一个塞给你。
182
+ 雪娥(笑):趁热吃。我每回出来买菜,都偷偷吃一个。这是我的规矩。
183
+ 雪娥(羞):……今日这规矩,算你一份。
184
+ @hide all
185
+ @jump xuee_r2
186
+ `;
@@ -0,0 +1,122 @@
1
+ // 人物、场景、CG、曲目、结局与原著命数登记。剧情正文在同目录的 common.js 与各人路线文件。
2
+ import common from './common.js';
3
+ import common2 from './common2.js';
4
+ import common3 from './common3.js';
5
+ import yue from './yue.js';
6
+ import pan from './pan.js';
7
+ import pinger from './pinger.js';
8
+ import meng from './meng.js';
9
+ import xuee from './xuee.js';
10
+ import dates from './dates.js';
11
+
12
+ export const SCRIPT_SOURCES = [common, common2, common3, yue, pan, pinger, meng, xuee, dates];
13
+
14
+ // 立绘差分:每人 neutral/smile/angry/sad/blush/surprised;换到 surprised 时立绘再轻轻一跳
15
+ export const CAST = {
16
+ yue: { name: '月娘', full: '吴月娘', color: '#3d5a9e', house: '正院', title: '正头娘子', line: '话要在正堂说清,心要在灯下说软。' },
17
+ pan: { name: '金莲', full: '潘金莲', color: '#c43b4b', house: '花园角门', title: '第五房', line: '你今夜来,是想我了,还是怕我闹?' },
18
+ pinger: { name: '瓶儿', full: '李瓶儿', color: '#b58a3c', house: '东院', title: '第六房', line: '钥匙我自己收着。人,你要不要?' },
19
+ meng: { name: '玉楼', full: '孟玉楼', color: '#8a6aa8', house: '西厢', title: '第三房', line: '我是自己选的这扇门,也记得门怎么开。' },
20
+ xuee: { name: '雪娥', full: '孙雪娥', color: '#3f7f73', house: '灶上', title: '第四房', line: '一屋子人吃的饭,总得有人起早。' },
21
+ };
22
+ export const SPEAKERS = ['西门庆', '春梅', '玳安', '应伯爵', '李娇儿', '花家老大', '众人', '媒婆'];
23
+ export const EXPRESSIONS = ['neutral', 'smile', 'angry', 'sad', 'blush', 'surprised'];
24
+
25
+ export const BG = {
26
+ hall: 'assets/bg/hall.webp',
27
+ garden: 'assets/bg/garden.webp',
28
+ chamber: 'assets/bg/chamber.webp',
29
+ court_night: 'assets/bg/court_night.webp',
30
+ court_rain: 'assets/bg/court_rain.webp',
31
+ temple: 'assets/bg/temple.webp',
32
+ street: 'assets/bg/street.webp',
33
+ kitchen: 'assets/bg/kitchen.webp',
34
+ compound: 'assets/bg/compound_new_guofeng.webp',
35
+ street_dawn: 'assets/bg/street_dawn.webp', // 同一条街,天亮前:冷青天色、晨雾、灯笼未熄
36
+ black: '',
37
+ };
38
+
39
+ // adult: 只在年龄门之后、且「设置 · 成人画面」开启时加载;关闭时以帘幕代替
40
+ // focus: 'right' — 人物在右、左侧留白的构图,显示时裁到右侧(stage.js FOCUS_ZOOM)
41
+ // group: 鉴赏里归到谁名下(默认按 id 前缀,无前缀归共通)
42
+ export const CG = {
43
+ title: { src: 'assets/cg/group/title_new_guofeng.webp', name: '春庭五人' },
44
+ dinner: { src: 'assets/cg/group/public_day5.webp', name: '五扇门的晚饭' },
45
+ intro_yue: { src: 'assets/heroine/yue/night.webp', name: '初见 · 吴月娘' },
46
+ intro_pan: { src: 'assets/heroine/pan/night.webp', name: '初见 · 潘金莲' },
47
+ intro_pinger: { src: 'assets/heroine/pinger/night.webp', name: '初见 · 李瓶儿' },
48
+ intro_meng: { src: 'assets/heroine/meng/night.webp', name: '初见 · 孟玉楼' },
49
+ intro_xuee: { src: 'assets/heroine/xuee/night.webp', name: '初见 · 孙雪娥' },
50
+ kitchen_quarrel: { src: 'assets/cg/joint/pan_xuee.webp', name: '灶上口角' },
51
+ garden_chest: { src: 'assets/cg/joint/pan_pinger.webp', name: '花园里的箱子' },
52
+ goods: { src: 'assets/cg/joint/yue_meng.webp', name: '沉香与胡椒' },
53
+ gate: { src: 'assets/scene/gate_collector.webp', name: '门前来人' },
54
+ rain_hall: { src: 'assets/cg/joint/yue_pinger.webp', name: '雨夜正堂' },
55
+ pan_yue: { src: 'assets/cg/joint/yue_pan.webp', name: '月娘与金莲', group: 'yue' },
56
+ qingming: { src: 'assets/cg/group/public_day10.webp', name: '清明荷亭' },
57
+ qingming_night: { src: 'assets/cg/group/inner_court_afterglow_five.webp', name: '席散之后' },
58
+ moon_five: { src: 'assets/cg/group/inner_court_alliance.webp', name: '五人同灯' },
59
+ yue_mid: { src: 'assets/cg/milestone/yue.webp', name: '月娘 · 钥匙串', focus: 'right' },
60
+ pan_mid: { src: 'assets/cg/milestone/pan.webp', name: '金莲 · 来信' },
61
+ pinger_mid: { src: 'assets/cg/milestone/pinger.webp', name: '瓶儿 · 空匣', focus: 'right' },
62
+ meng_mid: { src: 'assets/cg/milestone/meng.webp', name: '玉楼 · 名帖' },
63
+ xuee_mid: { src: 'assets/cg/milestone/xuee.webp', name: '雪娥 · 灶前', focus: 'right' },
64
+ yue_moon: { src: 'assets/cg/yue/moon.webp', name: '月娘 · 拜月' },
65
+ yue_end: { src: 'assets/cg/finale/yue.webp', name: '月娘 · 交钥' },
66
+ pan_end: { src: 'assets/cg/finale/pan.webp', name: '金莲 · 春风' },
67
+ pinger_end: { src: 'assets/cg/finale/pinger.webp', name: '瓶儿 · 开匣', focus: 'right' },
68
+ meng_end: { src: 'assets/cg/finale/meng.webp', name: '玉楼 · 自开门', focus: 'right' },
69
+ xuee_end: { src: 'assets/cg/finale/xuee.webp', name: '雪娥 · 两碗粥' },
70
+ yue_h1: { src: 'assets/cg/yue/prelude.webp', name: '月娘 · 卸簪', adult: true },
71
+ yue_h2: { src: 'assets/cg/yue/explicit.webp', name: '月娘 · 同衾', adult: true },
72
+ pan_h1: { src: 'assets/cg/pan/prelude.webp', name: '金莲 · 解扇', adult: true },
73
+ pan_h2: { src: 'assets/cg/pan/explicit.webp', name: '金莲 · 同衾', adult: true },
74
+ pinger_h1: { src: 'assets/cg/pinger/prelude.webp', name: '瓶儿 · 关窗', adult: true },
75
+ pinger_h2: { src: 'assets/cg/pinger/explicit.webp', name: '瓶儿 · 同衾', adult: true },
76
+ meng_h1: { src: 'assets/cg/meng/prelude.webp', name: '玉楼 · 开门', adult: true },
77
+ meng_h2: { src: 'assets/cg/meng/explicit.webp', name: '玉楼 · 同衾', adult: true },
78
+ xuee_h1: { src: 'assets/cg/xuee/prelude.webp', name: '雪娥 · 收火', adult: true },
79
+ xuee_h2: { src: 'assets/cg/xuee/explicit.webp', name: '雪娥 · 同衾', adult: true },
80
+ fate: { src: 'assets/cg/finale/fate_coda.webp', name: '命数' },
81
+ };
82
+
83
+ export const MUSIC = {
84
+ title: '春庭',
85
+ daily: '晨省',
86
+ garden: '花间',
87
+ tender: '灯下',
88
+ tension: '风波',
89
+ night: '更漏',
90
+ sad: '落花',
91
+ fate: '命数',
92
+ };
93
+
94
+ export const ENDINGS = {
95
+ yue_good: { who: 'yue', kind: 'good', title: '月下焚香' },
96
+ yue_normal: { who: 'yue', kind: 'normal', title: '正堂一盏灯' },
97
+ yue_bad: { who: 'yue', kind: 'bad', title: '官人自便' },
98
+ pan_good: { who: 'pan', kind: 'good', title: '琵琶不冷' },
99
+ pan_normal: { who: 'pan', kind: 'normal', title: '半掩的角门' },
100
+ pan_bad: { who: 'pan', kind: 'bad', title: '扇子落地' },
101
+ pinger_good: { who: 'pinger', kind: 'good', title: '钥匙在她手里' },
102
+ pinger_normal: { who: 'pinger', kind: 'normal', title: '窗下的茶' },
103
+ pinger_bad: { who: 'pinger', kind: 'bad', title: '箱笼' },
104
+ meng_good: { who: 'meng', kind: 'good', title: '她自己开的门' },
105
+ meng_normal: { who: 'meng', kind: 'normal', title: '一曲月琴' },
106
+ meng_bad: { who: 'meng', kind: 'bad', title: '名帖退回' },
107
+ xuee_good: { who: 'xuee', kind: 'good', title: '天亮前的两碗粥' },
108
+ xuee_normal: { who: 'xuee', kind: 'normal', title: '灶火未熄' },
109
+ xuee_bad: { who: 'xuee', kind: 'bad', title: '冷灶' },
110
+ lonely: { who: null, kind: 'bad', title: '无人留灯' },
111
+ };
112
+ export const ENDING_KIND = { good: '良缘', normal: '寻常', bad: '错过' };
113
+
114
+ // 原著命数:结局只决定这一春她与你之间说成了什么,不改写原著去处(SOURCE_BIBLE 人物名册)
115
+ export const FATES = {
116
+ yue: ['第七十九回,西门庆三十三岁而亡,同日孝哥儿出生。', '她守着孝,把一座大宅一点点收小,账一页页合上。', '第一百回,孝哥儿随普静出家。她把那一夜焚的香,一直焚到了老。'],
117
+ pan: ['第七十九回以后,家散了,人也散了。', '第八十七回,她死在武松刀下。', '那把琵琶后来不知落在谁手里。只是这一春,曾有人在角门外,等她把一曲弹完。'],
118
+ pinger: ['第三十回,她生下官哥儿,满宅的灯都为那孩子亮。', '第五十九回,官哥儿夭折;第六十二回,她病故。', '那把钥匙始终在她自己手里。这一春她曾说过:人,你要不要。'],
119
+ meng: ['第七十九回以后,宅门散去。', '第九十一回,她改嫁李衙内,自己选的门,自己走出去。', '临行那日,她没有回头。不是薄情——她一向记得门怎么开。'],
120
+ xuee: ['第七十九回以后,灶火渐冷,人手散尽。', '第九十回,她被拐出宅门;第九十四回,又被卖入火坑。', '原书没有给她一个好结局。这一春,至少有一个清晨,有人看见了她手上的灰。'],
121
+ lonely: ['第七十九回,西门庆三十三岁而亡。', '五扇门后来各自关上,各自走散。', '那年春天,原本有人等过你。'],
122
+ };
@@ -0,0 +1,190 @@
1
+ // 孟玉楼线 · 月琴(第七回薛嫂说娶、自择再嫁,第九十一回改嫁为本)
2
+ export default String.raw`
3
+ # meng_route
4
+ @hide all
5
+ @bg court_night fade
6
+ @bgm tender
7
+ @chapter 孟玉楼篇|西厢
8
+ 西厢的门开着一道缝,月琴声从里头漏出来,弹的是一支很俏皮的小调。
9
+ 你推门进去,琴声停也没停。
10
+ @show meng 中 笑
11
+ 玉楼(笑):我猜着官人今夜会来。门留了缝,曲子也特意挑了支热闹的——省得官人进门就觉得冷清。
12
+ 西门庆:你猜着?
13
+ 玉楼(笑):这几日,官人往西厢看了几眼,我都数着呢。
14
+ 她把月琴放下,给你倒酒,倒得不多不少,刚好七分。
15
+ 玉楼:今夜来,是谢我替你了了花家的事?还是只是来听曲儿?
16
+ @choice
17
+ - “来谢你,也来看你。” -> m1_both {meng+1}
18
+ - “来听曲儿。” -> m1_song
19
+
20
+ # m1_both
21
+ 玉楼(羞):……官人这张嘴,比我的月琴还会拨。
22
+ 她笑着,把酒杯推到你面前,自己也端起一杯,跟你碰了一下。
23
+ 玉楼(平):谢就收下了。看嘛——那就多看一会儿。
24
+ @jump m1_end
25
+
26
+ # m1_song
27
+ 玉楼(笑):那就听吧。
28
+ 她重新抱起月琴,弹得很好,好得挑不出一点错。可那支俏皮的小调,弹到一半,换成了一支慢曲。
29
+ @jump m1_end
30
+
31
+ # m1_end
32
+ 酒过两巡,她托着腮看你。
33
+ 玉楼(平):官人知道我为什么嫁你吗?
34
+ 玉楼:那年薛嫂来说亲,尚举人家也托了人。尚家门第高,人人都劝我去。
35
+ 玉楼(笑):我偏挑了你。不是你家银子多——我自己有银子。是那天相看,你问了我一句:“娘子自己愿意不愿意?”
36
+ 玉楼(羞):满城说亲的人,只有你问了这一句。
37
+ 她说完,就转过头去调弦,好像刚才那句话,是月琴自己说的。
38
+ @hide all
39
+ @jump meng_date
40
+
41
+ # meng_r2
42
+ @bg hall fade
43
+ @bgm daily
44
+ @chapter 孟玉楼篇|名帖
45
+ 过了几日,薛嫂上门来了。
46
+ 媒婆:哎哟,三娘子好本事!上回卖胡椒的那几位南边客商,回去一说,又有一船苏杭绸缎要找人合伙,点名要跟西门大官人做!
47
+ 媒婆:人家说了,这回立名帖,要写清楚是谁牵的线、谁担的保——这是规矩。
48
+ 应伯爵也在座,一听就拍了桌子。
49
+ 应伯爵:这还用问?名帖自然写哥的名字!三嫂子一个妇道人家,名字写上去,叫外人笑话。
50
+ @show meng 中 平
51
+ 玉楼没有说话。她只是低头喝茶,茶盏挡住了半张脸。
52
+ 可你看见,她捏着茶盏的手指,微微发白。
53
+ @cg meng_mid
54
+ 那天夜里你路过西厢,看见她一个人坐在桌前,把这些年攒下的名帖一张张摊开。每一张,都是她牵过的线、担过的保——没有一张,写着她的名字。
55
+ @cg off
56
+ 第二天,薛嫂来取名帖。
57
+ @choice
58
+ - “名帖上,写玉楼的名字。线是她牵的,保是她担的。” -> m2_trust {meng+2 f:meng_trust}
59
+ - “写我的名字,红利分她一半。” -> m2_half {meng+1}
60
+ - “伯爵说得对,写我的。” -> m2_hurt {meng-2 f:meng_hurt}
61
+
62
+ # m2_trust
63
+ 应伯爵(惊):哥,这……
64
+ 媒婆:哎哟!大官人好气量!
65
+ 玉楼抬起头来。她看了你很久,像在重新相看一个人。
66
+ 玉楼(羞):……官人可想好了。名字写上去,往后这条线,就是我的了。赚了是我的,赔了,也是我的。
67
+ 西门庆:本来就是你的。
68
+ 她低下头,在名帖上落笔。“孟玉楼”三个字,写得端端正正。
69
+ @jump meng_r3
70
+
71
+ # m2_half
72
+ 玉楼(笑):官人厚道。一半就一半。
73
+ 她笑着点了头,名帖上写了你的名字。红利后来也确实一分不少地送到了西厢。
74
+ 只是那一叠名帖,她又收回了匣子里,锁上了。
75
+ @jump meng_r3
76
+
77
+ # m2_hurt
78
+ 玉楼(平):……应二爷说得是。
79
+ 她亲手研了墨,把笔递给你,脸上还是笑着。
80
+ 名帖立好了,绸缎生意也做成了,赚了不少。玉楼照样打理,照样周到,挑不出一点错。
81
+ 只是那之后,西厢的月琴,你再也没有听见过。
82
+ @jump meng_r3
83
+
84
+ # meng_r3
85
+ @hide all
86
+ @bg court_night fade
87
+ @bgm night
88
+ @chapter 孟玉楼篇|自开门
89
+ 入夏的一个夜里,月亮很圆。
90
+ @if f:meng_hurt -> m3_bad
91
+ 你去西厢时,她正坐在廊下,月琴横在膝上,却没有弹。
92
+ @show meng 中 平
93
+ 玉楼(平):官人来得正好,我有句话,想了好些日子了。
94
+ 玉楼:我头一个丈夫死的时候,我在灵前跪了三天。不是哭他——是想明白一件事:女人这一辈子,门是别人开的,也是别人关的。
95
+ 玉楼(哀):所以官人,我今夜问你一句,你别恼。
96
+ 玉楼(平):若是有一日——不是现在,是很久以后——我想走了,你放不放我?
97
+ 月光落在她脸上,她没有笑。这是你第一次看见,她不笑的样子。
98
+ @choice
99
+ - “你的门,你自己开。我只求你走之前,告诉我一声。” -> m3_free
100
+ - “不放。你是我的人,走到哪儿都是。” -> m3_keep
101
+
102
+ # m3_free
103
+ @if !f:meng_trust -> m3_normal
104
+ @if meng<7 -> m3_normal
105
+ @bgm tender
106
+ 玉楼(惊):……
107
+ 她怔住了,月琴的弦被她无意间拨响了一声。
108
+ 玉楼(羞):你知道吗……满城的男人,说的都是“不放”。好像说了“不放”,就是情深。
109
+ 玉楼(哀):只有你,又一次问我,自己愿意不愿意。
110
+ 她把月琴放到一边,伸手握住你的手。
111
+ 玉楼(笑):那我告诉你——今夜,我不走。
112
+ @jump meng_good
113
+
114
+ # m3_keep
115
+ 玉楼(笑):……也是。官人疼我,才说不放。
116
+ 她笑了,又是那种滴水不漏的笑。
117
+ @jump m3_normal
118
+
119
+ # m3_normal
120
+ @hide all
121
+ @show meng 中 笑
122
+ 玉楼(笑):不说这些了。我给官人弹一曲吧。
123
+ 她抱起月琴,弹了一支你没听过的曲子。很好听,像一个人在月下慢慢地走,不回头,也不停。
124
+ @bgm sad
125
+ 那一夜很好。往后的许多夜也很好。她是宅里最周到的人,谁都挑不出她的错。
126
+ 只是你始终不知道,那支曲子叫什么名字。
127
+ @ending meng_normal
128
+ @fate meng
129
+ @end
130
+
131
+ # m3_bad
132
+ 你去西厢时,门是关着的。门缝里塞着一张纸。
133
+ 是那张名帖——绸缎生意的名帖。背面,是她的字:
134
+ “线已牵完,保已担尽。此帖奉还,两清。”
135
+ @show meng 中 平
136
+ 第二天你在正堂见到她,她照常请安,照常笑。
137
+ 玉楼(笑):官人早。今日的茶,是新到的雨前,官人尝尝。
138
+ @bgm sad
139
+ 客气得像宾客。她把你,也放进了她那只装名帖的匣子里,锁好了。
140
+ @ending meng_bad
141
+ @fate meng
142
+ @end
143
+
144
+ # meng_good
145
+ @bg chamber fade
146
+ @bgm tender
147
+ @scene meng_night 她自己开的门
148
+ 她领着你进了屋。门是她亲手闩上的,闩好了,她回头一笑。
149
+ @show meng 中 羞
150
+ 玉楼(羞):这扇门,今夜是我自己关的。明早,也由我自己开。
151
+ 玉楼:官人记着——不是你进了我的门,是我请你进来的。
152
+ 她抬手,取下发间那枚紫晶小簪,放在月琴旁边。
153
+ @choice
154
+ - 吻她的手背:“是,娘子请我的。” -> meng_h
155
+ - 请她再弹一曲 -> meng_dawn
156
+
157
+ # meng_h
158
+ @hide all
159
+ @cg meng_h1
160
+ 她笑出了声,笑声很轻,像琴弦最后的余音。
161
+ 玉楼:……官人今夜,倒是很懂礼数。
162
+ @cg meng_h2
163
+ 后来的事,月光从窗格里看见了一角,就害羞地退出去了。
164
+ 她枕在你臂弯里,用指尖在你掌心写了一个字。你问是什么,她不肯说。
165
+ @endscene
166
+ @jump meng_end
167
+
168
+ # meng_dawn
169
+ @hide all
170
+ @bg chamber fade
171
+ @show meng 中 笑
172
+ 她又抱起月琴,这回弹的,是那支你没听过的曲子。
173
+ 玉楼(笑):这曲子叫《自开门》。我自己编的,没弹给第二个人听过。
174
+ 西门庆:讲的什么?
175
+ 玉楼(羞):讲一个女人,走了很远的路,终于找着一扇,她愿意自己推开的门。
176
+ @endscene
177
+ @jump meng_end
178
+
179
+ # meng_end
180
+ @hide all
181
+ @bg hall fade
182
+ @cg meng_end
183
+ 第二天,西厢的门是她自己推开的。晨光照进来,桌上摊着那份绸缎名帖,“孟玉楼”三个字底下,她添了一行小字:
184
+ “合伙人:西门庆。”
185
+ 玉楼(笑):官人不是说,线是我牵的么?那合伙的人,自然由我来挑。
186
+ 她把笔搁下,冲你眨了眨眼。
187
+ @ending meng_good
188
+ @fate meng
189
+ @end
190
+ `;