@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.
- 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
|
@@ -1,147 +0,0 @@
|
|
|
1
|
-
// 视觉键表:发布模式对所有首屏、人物近景与奖励 CG 采用 fail-closed,不静默回退。
|
|
2
|
-
|
|
3
|
-
export const ASSET_PATHS = Object.freeze({
|
|
4
|
-
// 标题与全套 CG 使用同一批二维新国风叙事母版:角色集中在中右区域,
|
|
5
|
-
// 左侧春庭留白交给真实 HTML 标题,既保留古代世界,也给玩家想象空间。
|
|
6
|
-
cover: 'assets/cg/group/title_new_guofeng.webp',
|
|
7
|
-
compound: 'assets/bg/compound_new_guofeng.webp',
|
|
8
|
-
// 催账到期那两个早晨的门前画面:来人、契纸与受阻门槛承担压力,不靠压黑画面。
|
|
9
|
-
// 不进 CRITICAL_CG_KEYS——报条文字已经把账说清楚,缺图不该拦住一局。
|
|
10
|
-
'scene/gate_collector': 'assets/scene/gate_collector.webp',
|
|
11
|
-
// 门卡与对话使用同一张二维身份母版,脸、发式、衣色与器物贯穿所有剧情 CG。
|
|
12
|
-
'heroine/yue': 'assets/heroine/yue/night.webp',
|
|
13
|
-
'heroine/pan': 'assets/heroine/pan/night.webp',
|
|
14
|
-
'heroine/pinger': 'assets/heroine/pinger/night.webp',
|
|
15
|
-
'heroine/meng': 'assets/heroine/meng/night.webp',
|
|
16
|
-
'heroine/xuee': 'assets/heroine/xuee/night.webp',
|
|
17
|
-
'household/jiaoer': 'assets/household/li_jiaoer.webp',
|
|
18
|
-
// 日常近景、门卡与人物身份母版统一;夜间专属图只改变关系动作与灯月,不更换画风。
|
|
19
|
-
'heroine/yue/close': 'assets/heroine/yue/night.webp',
|
|
20
|
-
'heroine/pan/close': 'assets/heroine/pan/night.webp',
|
|
21
|
-
'heroine/pinger/close': 'assets/heroine/pinger/night.webp',
|
|
22
|
-
'heroine/meng/close': 'assets/heroine/meng/night.webp',
|
|
23
|
-
'heroine/xuee/close': 'assets/heroine/xuee/night.webp',
|
|
24
|
-
'cg/yue/prelude': 'assets/cg/yue/prelude.webp',
|
|
25
|
-
'cg/yue/explicit': 'assets/cg/yue/explicit.webp',
|
|
26
|
-
'cg/pan/prelude': 'assets/cg/pan/prelude.webp',
|
|
27
|
-
'cg/pan/explicit': 'assets/cg/pan/explicit.webp',
|
|
28
|
-
'cg/pinger/prelude': 'assets/cg/pinger/prelude.webp',
|
|
29
|
-
'cg/pinger/explicit': 'assets/cg/pinger/explicit.webp',
|
|
30
|
-
'cg/meng/prelude': 'assets/cg/meng/prelude.webp',
|
|
31
|
-
'cg/meng/explicit': 'assets/cg/meng/explicit.webp',
|
|
32
|
-
'cg/xuee/prelude': 'assets/cg/xuee/prelude.webp',
|
|
33
|
-
'cg/xuee/explicit': 'assets/cg/xuee/explicit.webp',
|
|
34
|
-
'cg/group/public_day5': 'assets/cg/group/public_day5.webp',
|
|
35
|
-
'cg/group/public_day10': 'assets/cg/group/public_day10.webp',
|
|
36
|
-
'cg/group/public_day15': 'assets/cg/group/public_day15.webp',
|
|
37
|
-
'cg/group/inner_court_alliance': 'assets/cg/group/inner_court_alliance.webp',
|
|
38
|
-
'cg/group/inner_court_accord': 'assets/cg/group/inner_court_accord_five.webp',
|
|
39
|
-
'cg/group/inner_court_afterglow': 'assets/cg/group/inner_court_afterglow_five.webp',
|
|
40
|
-
'cg/joint/yue_pan': 'assets/cg/joint/yue_pan.webp',
|
|
41
|
-
'cg/joint/yue_pinger': 'assets/cg/joint/yue_pinger.webp',
|
|
42
|
-
'cg/joint/pan_pinger': 'assets/cg/joint/pan_pinger.webp',
|
|
43
|
-
'cg/joint/yue_meng': 'assets/cg/joint/yue_meng.webp',
|
|
44
|
-
'cg/joint/pan_xuee': 'assets/cg/joint/pan_xuee.webp',
|
|
45
|
-
// 第二十夜的一院终章不是把旧门卡放大:五个人各有一张能读出
|
|
46
|
-
// 她的核心边界与另外四院善后方式的安全终章画面。
|
|
47
|
-
'cg/finale/yue': 'assets/cg/finale/yue.webp',
|
|
48
|
-
'cg/finale/pan': 'assets/cg/finale/pan.webp',
|
|
49
|
-
'cg/finale/pinger': 'assets/cg/finale/pinger.webp',
|
|
50
|
-
'cg/finale/meng': 'assets/cg/finale/meng.webp',
|
|
51
|
-
'cg/finale/xuee': 'assets/cg/finale/xuee.webp',
|
|
52
|
-
// 命数三页不用任何人物遗照消费悲剧;空宅、六把钥匙、五张名签、
|
|
53
|
-
// 药碗与未写完的账页承担第 30—100 回的长期回声。
|
|
54
|
-
'cg/finale/fate_coda': 'assets/cg/finale/fate_coda.webp',
|
|
55
|
-
'cg/milestone/yue': 'assets/cg/milestone/yue.webp',
|
|
56
|
-
'cg/milestone/pan': 'assets/cg/milestone/pan.webp',
|
|
57
|
-
'cg/milestone/pinger': 'assets/cg/milestone/pinger.webp',
|
|
58
|
-
'cg/milestone/meng': 'assets/cg/milestone/meng.webp',
|
|
59
|
-
'cg/milestone/xuee': 'assets/cg/milestone/xuee.webp',
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
export const CRITICAL_CG_KEYS = Object.freeze([
|
|
63
|
-
'cover', 'heroine/yue', 'heroine/pan', 'heroine/pinger', 'heroine/meng', 'heroine/xuee',
|
|
64
|
-
'household/jiaoer',
|
|
65
|
-
'heroine/yue/close', 'heroine/pan/close', 'heroine/pinger/close', 'heroine/meng/close', 'heroine/xuee/close',
|
|
66
|
-
'cg/yue/prelude', 'cg/yue/explicit', 'cg/pan/prelude', 'cg/pan/explicit',
|
|
67
|
-
'cg/pinger/prelude', 'cg/pinger/explicit', 'cg/meng/prelude', 'cg/meng/explicit',
|
|
68
|
-
'cg/xuee/prelude', 'cg/xuee/explicit', 'cg/group/public_day5', 'cg/group/public_day10', 'cg/group/public_day15',
|
|
69
|
-
'cg/group/inner_court_alliance', 'cg/group/inner_court_accord', 'cg/group/inner_court_afterglow',
|
|
70
|
-
'cg/joint/yue_pan', 'cg/joint/yue_pinger', 'cg/joint/pan_pinger', 'cg/joint/yue_meng', 'cg/joint/pan_xuee',
|
|
71
|
-
'cg/finale/yue', 'cg/finale/pan', 'cg/finale/pinger', 'cg/finale/meng', 'cg/finale/xuee', 'cg/finale/fate_coda',
|
|
72
|
-
'cg/milestone/yue', 'cg/milestone/pan', 'cg/milestone/pinger', 'cg/milestone/meng', 'cg/milestone/xuee',
|
|
73
|
-
]);
|
|
74
|
-
|
|
75
|
-
export const BOOT_ASSET_KEYS = Object.freeze(['cover', 'compound']);
|
|
76
|
-
export const ADULT_ASSET_KEYS = Object.freeze([
|
|
77
|
-
'cg/yue/prelude', 'cg/yue/explicit', 'cg/pan/prelude', 'cg/pan/explicit',
|
|
78
|
-
'cg/pinger/prelude', 'cg/pinger/explicit', 'cg/meng/prelude', 'cg/meng/explicit',
|
|
79
|
-
'cg/xuee/prelude', 'cg/xuee/explicit', 'cg/group/inner_court_afterglow',
|
|
80
|
-
]);
|
|
81
|
-
export const FINALE_ASSET_KEYS = Object.freeze([
|
|
82
|
-
'cg/finale/yue', 'cg/finale/pan', 'cg/finale/pinger', 'cg/finale/meng', 'cg/finale/xuee', 'cg/finale/fate_coda',
|
|
83
|
-
]);
|
|
84
|
-
export const MILESTONE_ASSET_KEYS = Object.freeze([
|
|
85
|
-
'cg/milestone/yue', 'cg/milestone/pan', 'cg/milestone/pinger', 'cg/milestone/meng', 'cg/milestone/xuee',
|
|
86
|
-
]);
|
|
87
|
-
// 终章画是安全内容,但不该在玩家刚过年龄门时就把五张结局一起下载。
|
|
88
|
-
// 第四幕再闲时预取,真正进入终章时浏览器也会从相同 URL 直接复用缓存。
|
|
89
|
-
export const SAFE_GAME_ASSET_KEYS = Object.freeze(CRITICAL_CG_KEYS.filter((key) => (
|
|
90
|
-
!ADULT_ASSET_KEYS.includes(key) && !FINALE_ASSET_KEYS.includes(key) && !MILESTONE_ASSET_KEYS.includes(key)
|
|
91
|
-
)));
|
|
92
|
-
|
|
93
|
-
const loaded = new Map();
|
|
94
|
-
const requested = new Set();
|
|
95
|
-
const inflight = new Map();
|
|
96
|
-
|
|
97
|
-
function loadOne(key, path) {
|
|
98
|
-
if (loaded.get(key)?.ok === true) return Promise.resolve();
|
|
99
|
-
if (inflight.has(key)) return inflight.get(key);
|
|
100
|
-
requested.add(key);
|
|
101
|
-
const promise = new Promise((resolve) => {
|
|
102
|
-
const image = new Image();
|
|
103
|
-
image.onload = () => { loaded.set(key, { ok: true, width: image.naturalWidth, height: image.naturalHeight }); inflight.delete(key); resolve(); };
|
|
104
|
-
image.onerror = () => { loaded.set(key, { ok: false, width: 0, height: 0 }); inflight.delete(key); resolve(); };
|
|
105
|
-
image.src = path;
|
|
106
|
-
});
|
|
107
|
-
inflight.set(key, promise);
|
|
108
|
-
return promise;
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
export async function loadAssets(keys = BOOT_ASSET_KEYS) {
|
|
112
|
-
await Promise.all(keys.map((key) => loadOne(key, ASSET_PATHS[key])));
|
|
113
|
-
return assetReport();
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
export function preloadSafeAssets() {
|
|
117
|
-
return loadAssets(SAFE_GAME_ASSET_KEYS);
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
export function preloadFinaleAssets() {
|
|
121
|
-
return loadAssets(FINALE_ASSET_KEYS);
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
export function assetReport() {
|
|
125
|
-
const missingCritical = CRITICAL_CG_KEYS.filter((key) => requested.has(key) && loaded.get(key)?.ok === false);
|
|
126
|
-
const bootReady = BOOT_ASSET_KEYS.every((key) => loaded.get(key)?.ok === true);
|
|
127
|
-
return {
|
|
128
|
-
missingCritical,
|
|
129
|
-
loaded: Object.fromEntries([...loaded.entries()]),
|
|
130
|
-
requested: [...requested],
|
|
131
|
-
adultRequested: ADULT_ASSET_KEYS.filter((key) => requested.has(key)),
|
|
132
|
-
bootReady,
|
|
133
|
-
complete: CRITICAL_CG_KEYS.every((key) => loaded.get(key)?.ok === true),
|
|
134
|
-
ok: bootReady && missingCritical.length === 0,
|
|
135
|
-
};
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
export function urlFor(key) {
|
|
139
|
-
const path = ASSET_PATHS[key] ?? '';
|
|
140
|
-
return globalThis.document ? new URL(path, document.baseURI).href : path;
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
export function assertCriticalAssetSchema() {
|
|
144
|
-
const missingKeys = CRITICAL_CG_KEYS.filter((key) => !ASSET_PATHS[key]);
|
|
145
|
-
if (missingKeys.length) throw new Error(`关键 CG 未登记:${missingKeys.join(', ')}`);
|
|
146
|
-
return true;
|
|
147
|
-
}
|