novel-maker 2.2.0
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/LICENSE +21 -0
- package/README.md +209 -0
- package/bin/novel-maker.js +229 -0
- package/package.json +33 -0
- package/skill/CHANGELOG.md +82 -0
- package/skill/QUICK-REF.md +168 -0
- package/skill/README.md +75 -0
- package/skill/SKILL.md +715 -0
- package/skill/agents/README.md +59 -0
- package/skill/agents/auditor.md +234 -0
- package/skill/agents/coordinator.md +150 -0
- package/skill/agents/planner.md +220 -0
- package/skill/agents/reviewer.md +249 -0
- package/skill/agents/reviser.md +144 -0
- package/skill/agents/writer.md +213 -0
- package/skill/arc-templates/README.md +43 -0
- package/skill/arc-templates/apocalypse/ability.md +81 -0
- package/skill/arc-templates/apocalypse/faction.md +81 -0
- package/skill/arc-templates/apocalypse/humanity.md +81 -0
- package/skill/arc-templates/apocalypse/survival.md +81 -0
- package/skill/arc-templates/game/competition.md +81 -0
- package/skill/arc-templates/game/dungeon.md +81 -0
- package/skill/arc-templates/game/guild-war.md +81 -0
- package/skill/arc-templates/game/leveling.md +80 -0
- package/skill/arc-templates/general/challenge.md +44 -0
- package/skill/arc-templates/general/conflict.md +71 -0
- package/skill/arc-templates/general/explore.md +71 -0
- package/skill/arc-templates/general/growth.md +71 -0
- package/skill/arc-templates/general/mystery.md +71 -0
- package/skill/arc-templates/general/relation.md +71 -0
- package/skill/arc-templates/history/battle.md +71 -0
- package/skill/arc-templates/history/politics.md +71 -0
- package/skill/arc-templates/history/reform.md +71 -0
- package/skill/arc-templates/infinite-flow/boss.md +71 -0
- package/skill/arc-templates/infinite-flow/dungeon.md +71 -0
- package/skill/arc-templates/infinite-flow/enhance.md +71 -0
- package/skill/arc-templates/infinite-flow/team.md +71 -0
- package/skill/arc-templates/mystery/case.md +71 -0
- package/skill/arc-templates/mystery/deduction.md +71 -0
- package/skill/arc-templates/mystery/twist.md +71 -0
- package/skill/arc-templates/romance/angst.md +80 -0
- package/skill/arc-templates/romance/chase.md +71 -0
- package/skill/arc-templates/romance/slow-burn.md +71 -0
- package/skill/arc-templates/romance/sweet.md +80 -0
- package/skill/arc-templates/sci-fi/awakening.md +81 -0
- package/skill/arc-templates/sci-fi/breakthrough.md +81 -0
- package/skill/arc-templates/sci-fi/contact.md +81 -0
- package/skill/arc-templates/sci-fi/exploration.md +81 -0
- package/skill/arc-templates/urban/business.md +71 -0
- package/skill/arc-templates/urban/revenge.md +71 -0
- package/skill/arc-templates/urban/rise.md +71 -0
- package/skill/arc-templates/urban/romance.md +71 -0
- package/skill/arc-templates/western-fantasy/adventure.md +80 -0
- package/skill/arc-templates/western-fantasy/kingdom.md +71 -0
- package/skill/arc-templates/western-fantasy/magic-awakening.md +71 -0
- package/skill/arc-templates/western-fantasy/racial-conflict.md +71 -0
- package/skill/arc-templates/wuxia/breakthrough.md +71 -0
- package/skill/arc-templates/wuxia/grudge.md +71 -0
- package/skill/arc-templates/wuxia/hero-path.md +71 -0
- package/skill/arc-templates/wuxia/sect-war.md +71 -0
- package/skill/arc-templates/xianxia/breakthrough.md +71 -0
- package/skill/arc-templates/xianxia/dungeon.md +71 -0
- package/skill/arc-templates/xianxia/tournament.md +71 -0
- package/skill/arc-templates/xianxia/tribulation.md +71 -0
- package/skill/docs/examples.md +61 -0
- package/skill/docs/faq.md +81 -0
- package/skill/docs/installation.md +87 -0
- package/skill/docs/quickstart.md +83 -0
- package/skill/genre-packs/README.md +47 -0
- package/skill/genre-packs/_default/arc-types.md +153 -0
- package/skill/genre-packs/_default/rules.md +56 -0
- package/skill/genre-packs/_default/templates.md +135 -0
- package/skill/genre-packs/apocalypse/arc-types.md +109 -0
- package/skill/genre-packs/apocalypse/rules.md +113 -0
- package/skill/genre-packs/apocalypse/settings.md +106 -0
- package/skill/genre-packs/apocalypse/templates.md +192 -0
- package/skill/genre-packs/game/arc-types.md +109 -0
- package/skill/genre-packs/game/rules.md +113 -0
- package/skill/genre-packs/game/settings.md +103 -0
- package/skill/genre-packs/game/templates.md +173 -0
- package/skill/genre-packs/history/arc-types.md +109 -0
- package/skill/genre-packs/history/rules.md +107 -0
- package/skill/genre-packs/history/settings.md +126 -0
- package/skill/genre-packs/history/templates.md +179 -0
- package/skill/genre-packs/infinite-flow/arc-types.md +101 -0
- package/skill/genre-packs/infinite-flow/rules.md +75 -0
- package/skill/genre-packs/infinite-flow/settings.md +102 -0
- package/skill/genre-packs/infinite-flow/templates.md +226 -0
- package/skill/genre-packs/mystery/arc-types.md +109 -0
- package/skill/genre-packs/mystery/rules.md +107 -0
- package/skill/genre-packs/mystery/settings.md +103 -0
- package/skill/genre-packs/mystery/templates.md +178 -0
- package/skill/genre-packs/romance/arc-types.md +130 -0
- package/skill/genre-packs/romance/rules.md +88 -0
- package/skill/genre-packs/romance/settings.md +146 -0
- package/skill/genre-packs/romance/templates.md +245 -0
- package/skill/genre-packs/sci-fi/arc-types.md +109 -0
- package/skill/genre-packs/sci-fi/rules.md +113 -0
- package/skill/genre-packs/sci-fi/settings.md +99 -0
- package/skill/genre-packs/sci-fi/templates.md +170 -0
- package/skill/genre-packs/urban/arc-types.md +101 -0
- package/skill/genre-packs/urban/rules.md +75 -0
- package/skill/genre-packs/urban/settings.md +82 -0
- package/skill/genre-packs/urban/templates.md +212 -0
- package/skill/genre-packs/western-fantasy/arc-types.md +128 -0
- package/skill/genre-packs/western-fantasy/rules.md +88 -0
- package/skill/genre-packs/western-fantasy/settings.md +160 -0
- package/skill/genre-packs/western-fantasy/templates.md +225 -0
- package/skill/genre-packs/wuxia/arc-types.md +126 -0
- package/skill/genre-packs/wuxia/rules.md +86 -0
- package/skill/genre-packs/wuxia/settings.md +150 -0
- package/skill/genre-packs/wuxia/templates.md +195 -0
- package/skill/genre-packs/xianxia/arc-types.md +101 -0
- package/skill/genre-packs/xianxia/rules.md +74 -0
- package/skill/genre-packs/xianxia/settings.md +107 -0
- package/skill/genre-packs/xianxia/templates.md +202 -0
- package/skill/hooks/README.md +102 -0
- package/skill/hooks/chapter-complete.md +176 -0
- package/skill/hooks/context-injection.md +152 -0
- package/skill/hooks/intent-detection.md +183 -0
- package/skill/hooks/review-trigger.md +219 -0
- package/skill/hooks/summary-trigger.md +185 -0
- package/skill/references/act-guidance.md +228 -0
- package/skill/references/audit-core.md +130 -0
- package/skill/references/audit-dimensions.md +202 -0
- package/skill/references/character-voice-card.md +196 -0
- package/skill/references/consistency-checker.md +209 -0
- package/skill/references/content-expansion.md +68 -0
- package/skill/references/creative-constraints.md +200 -0
- package/skill/references/data-agent.md +286 -0
- package/skill/references/dialogue-writing.md +104 -0
- package/skill/references/editorial-perspective.md +166 -0
- package/skill/references/emotion-curve.md +127 -0
- package/skill/references/genre-rules.md +389 -0
- package/skill/references/golden-opening.md +81 -0
- package/skill/references/memory-system.md +288 -0
- package/skill/references/pacing-analysis.md +201 -0
- package/skill/references/platform-rules.md +244 -0
- package/skill/references/plot-structures.md +108 -0
- package/skill/references/reader-feedback.md +119 -0
- package/skill/references/rhythm-system.md +204 -0
- package/skill/references/style-imitation.md +193 -0
- package/skill/references/sweet-spot-tracking.md +182 -0
- package/skill/references/usage-guide.md +174 -0
- package/skill/references/writing-methods.md +169 -0
- package/skill/rules/anti-ai-expressions.md +206 -0
- package/skill/rules/character-voice.md +184 -0
- package/skill/rules/consistency-check.md +232 -0
- package/skill/rules/smart-query.md +263 -0
- package/skill/scripts/README.md +380 -0
- package/skill/scripts/auditor/chapter_transition.py +217 -0
- package/skill/scripts/auditor/consistency_scan.py +194 -0
- package/skill/scripts/auditor/dialogue_checker.py +194 -0
- package/skill/scripts/auditor/hook_report.py +115 -0
- package/skill/scripts/auditor/pacing_optimizer.py +303 -0
- package/skill/scripts/auditor/pacing_report.py +275 -0
- package/skill/scripts/auditor/pre_audit.py +203 -0
- package/skill/scripts/auditor/style_check.py +158 -0
- package/skill/scripts/auditor/worldbuilding_checker.py +637 -0
- package/skill/scripts/common/analyze.py +129 -0
- package/skill/scripts/common/init_guide.py +796 -0
- package/skill/scripts/common/install.py +169 -0
- package/skill/scripts/common/nm_utils.py +296 -0
- package/skill/scripts/common/validate.py +215 -0
- package/skill/scripts/coordinator/stats_report.py +165 -0
- package/skill/scripts/coordinator/volume_batch.py +121 -0
- package/skill/scripts/planner/outline_extractor.py +89 -0
- package/skill/scripts/planner/planner_context.py +220 -0
- package/skill/scripts/planner/query_engine.py +289 -0
- package/skill/scripts/reviewer/chapter_diff.py +143 -0
- package/skill/scripts/reviewer/character_arc_tracker.py +191 -0
- package/skill/scripts/reviewer/emotion_curve.py +340 -0
- package/skill/scripts/reviewer/foreshadowing_tracker.py +286 -0
- package/skill/scripts/reviewer/subplot_tracker.py +207 -0
- package/skill/scripts/reviewer/summary_generator.py +130 -0
- package/skill/scripts/reviewer/truth_diff.py +227 -0
- package/skill/scripts/reviewer/truth_manager.py +120 -0
- package/skill/scripts/test_scripts.py +366 -0
- package/skill/scripts/writer/build_write_context.py +255 -0
- package/skill/scripts/writer/chapter_info.py +67 -0
- package/skill/scripts/writer/check_wordcount.py +115 -0
- package/skill/scripts/writer/scene_builder.py +227 -0
- package/skill/scripts/writer/style_anchor.py +135 -0
- package/skill/styles/author-styles.md +53 -0
- package/skill/styles/authors//344/270/245/350/260/250/350/256/276/345/256/232/346/265/201//345/277/230/350/257/255.md +110 -0
- package/skill/styles/authors//344/270/245/350/260/250/350/256/276/345/256/232/346/265/201//347/210/261/346/275/234/346/260/264/347/232/204/344/271/214/350/264/274.md +110 -0
- package/skill/styles/authors//344/270/245/350/260/250/350/256/276/345/256/232/346/265/201//350/250/200/345/275/222/346/255/243/344/274/240.md +110 -0
- package/skill/styles/authors//345/244/232/347/245/236/350/257/235/347/203/255/350/241/200/346/265/201//344/270/211/344/271/235/351/237/263/345/237/237.md +108 -0
- package/skill/styles/authors//346/202/254/347/226/221/346/216/250/347/220/206/346/265/201//346/235/200/350/231/253/351/230/237/351/230/237/345/221/230.md +108 -0
- package/skill/styles/authors//346/220/236/347/254/221/345/271/275/351/273/230/346/265/201//344/270/211/345/244/251/344/270/244/350/247/211.md +110 -0
- package/skill/styles/authors//346/220/236/347/254/221/345/271/275/351/273/230/346/265/201//344/274/232/350/257/264/350/257/235/347/232/204/350/202/230/345/255/220.md +110 -0
- package/skill/styles/authors//346/220/236/347/254/221/345/271/275/351/273/230/346/265/201//345/215/226/346/212/245/345/260/217/351/203/216/345/220/233.md +108 -0
- package/skill/styles/authors//346/220/236/347/254/221/345/271/275/351/273/230/346/265/201//345/274/210/351/235/222/345/263/260.md +123 -0
- package/skill/styles/authors//347/203/255/350/241/200/345/215/207/347/272/247/346/265/201//345/224/220/345/256/266/344/270/211/345/260/221.md +109 -0
- package/skill/styles/authors//347/203/255/350/241/200/345/215/207/347/272/247/346/265/201//345/244/251/350/232/225/345/234/237/350/261/206.md +110 -0
- package/skill/styles/authors//347/203/255/350/241/200/345/215/207/347/272/247/346/265/201//346/210/221/345/220/203/350/245/277/347/272/242/346/237/277.md +108 -0
- package/skill/styles/authors//347/203/255/350/241/200/345/215/207/347/272/247/346/265/201//346/273/232/345/274/200.md +109 -0
- package/skill/styles/authors//347/203/255/350/241/200/345/215/207/347/272/247/346/265/201//350/276/260/344/270/234.md +109 -0
- package/skill/styles/authors//347/211/271/350/211/262/351/242/206/345/237/237/346/265/201//345/244/251/344/270/213/351/234/270/345/224/261.md +110 -0
- package/skill/styles/authors//347/211/271/350/211/262/351/242/206/345/237/237/346/265/201//346/234/210/345/205/263.md +108 -0
- package/skill/styles/authors//347/211/271/350/211/262/351/242/206/345/237/237/346/265/201//350/220/247/351/274/216.md +109 -0
- package/skill/styles/authors//347/211/271/350/211/262/351/242/206/345/237/237/346/265/201//350/235/264/350/235/266/350/223/235.md +112 -0
- package/skill/styles/authors//347/273/206/350/205/273/346/226/207/351/235/222/346/265/201//346/204/244/346/200/222/347/232/204/351/246/231/350/225/211.md +109 -0
- package/skill/styles/authors//347/273/206/350/205/273/346/226/207/351/235/222/346/265/201//347/203/275/347/201/253/346/210/217/350/257/270/344/276/257.md +109 -0
- package/skill/styles/authors//347/273/206/350/205/273/346/226/207/351/235/222/346/265/201//347/214/253/350/205/273.md +110 -0
- package/skill/styles/authors//347/273/206/350/205/273/346/226/207/351/235/222/346/265/201//350/200/263/346/240/271.md +109 -0
- package/skill/templates/INDEX.md +48 -0
- package/skill/templates/act-plan.md +72 -0
- package/skill/templates/chapter.md +53 -0
- package/skill/templates/character-profile.md +107 -0
- package/skill/templates/character-voice.md +106 -0
- package/skill/templates/constitution.md +90 -0
- package/skill/templates/emotional-arcs.md +37 -0
- package/skill/templates/hook-template.md +68 -0
- package/skill/templates/outline.md +155 -0
- package/skill/templates/plot-card.md +432 -0
- package/skill/templates/power-system.md +124 -0
- package/skill/templates/presets.json +69 -0
- package/skill/templates/review-report.md +135 -0
- package/skill/templates/scene-plan.md +221 -0
- package/skill/templates/scene-template.md +78 -0
- package/skill/templates/subplot-board.md +48 -0
- package/skill/templates/summary-10chapters.md +79 -0
- package/skill/templates/summary-50chapters.md +131 -0
- package/skill/templates/summary-volume.md +148 -0
- package/skill/templates/timeline.md +37 -0
- package/skill/templates/volume-plan.md +44 -0
- package/skill/templates/world-setting.md +151 -0
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
"""
|
|
4
|
+
章节字数检查脚本
|
|
5
|
+
检查中文字数是否符合项目设定的字数区间(默认2200-2800字,可自定义)
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import os
|
|
9
|
+
import sys
|
|
10
|
+
from pathlib import Path
|
|
11
|
+
|
|
12
|
+
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', 'common'))
|
|
13
|
+
from nm_utils import count_chinese, extract_content_from_chapter
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def check_chapter(file_path, min_words=2200, max_words=2800):
|
|
17
|
+
path = Path(file_path)
|
|
18
|
+
if not path.exists():
|
|
19
|
+
return {'file': str(path), 'exists': False, 'word_count': 0, 'status': 'error', 'message': f'文件不存在: {file_path}'}
|
|
20
|
+
main_content = extract_content_from_chapter(path)
|
|
21
|
+
word_count = count_chinese(main_content)
|
|
22
|
+
if word_count < min_words:
|
|
23
|
+
status = 'short'
|
|
24
|
+
message = f'字数: {word_count} (✗ 不足,需要至少 {min_words} 字)'
|
|
25
|
+
elif word_count > max_words:
|
|
26
|
+
status = 'long'
|
|
27
|
+
message = f'字数: {word_count} (⚠ 超标,建议精简至 {max_words} 字以内)'
|
|
28
|
+
else:
|
|
29
|
+
status = 'pass'
|
|
30
|
+
message = f'字数: {word_count} (✓ 符合区间 {min_words}-{max_words} 字)'
|
|
31
|
+
return {'file': str(path), 'exists': True, 'word_count': word_count, 'status': status, 'message': message}
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def check_all_chapters(directory, pattern='第*.md', min_words=2200, max_words=2800):
|
|
35
|
+
dir_path = Path(directory)
|
|
36
|
+
if not dir_path.exists():
|
|
37
|
+
print(f'错误: 目录不存在 - {directory}')
|
|
38
|
+
return []
|
|
39
|
+
chapter_files = sorted(dir_path.glob(pattern))
|
|
40
|
+
return [check_chapter(str(f), min_words, max_words) for f in chapter_files]
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def print_results(results, min_words=2200, max_words=2800):
|
|
44
|
+
if not results:
|
|
45
|
+
print('没有找到章节文件')
|
|
46
|
+
return
|
|
47
|
+
total_words = 0
|
|
48
|
+
passed = short = long = error = 0
|
|
49
|
+
print('\n' + '=' * 60)
|
|
50
|
+
print('章节字数检查报告')
|
|
51
|
+
print(f'目标区间: {min_words}-{max_words} 字')
|
|
52
|
+
print('=' * 60)
|
|
53
|
+
for result in results:
|
|
54
|
+
if not result['exists']:
|
|
55
|
+
error += 1
|
|
56
|
+
icon = '✗'
|
|
57
|
+
elif result['status'] == 'pass':
|
|
58
|
+
passed += 1
|
|
59
|
+
icon = '✓'
|
|
60
|
+
total_words += result['word_count']
|
|
61
|
+
elif result['status'] == 'short':
|
|
62
|
+
short += 1
|
|
63
|
+
icon = '⚠'
|
|
64
|
+
total_words += result['word_count']
|
|
65
|
+
elif result['status'] == 'long':
|
|
66
|
+
long += 1
|
|
67
|
+
icon = '▲'
|
|
68
|
+
total_words += result['word_count']
|
|
69
|
+
else:
|
|
70
|
+
error += 1
|
|
71
|
+
icon = '✗'
|
|
72
|
+
print(f'\n{icon} {Path(result["file"]).name}')
|
|
73
|
+
print(f' {result["message"]}')
|
|
74
|
+
print('\n' + '-' * 60)
|
|
75
|
+
print(f'总计: {len(results)} 章 | {passed} 达标 | {short} 不足 | {long} 超标 | 总字数: {total_words:,}')
|
|
76
|
+
print('-' * 60)
|
|
77
|
+
if short > 0:
|
|
78
|
+
print(f'\n⚠ 有 {short} 章内容不足,可使用 /novel-maker expand 扩充')
|
|
79
|
+
if long > 0:
|
|
80
|
+
print(f'\n▲ 有 {long} 章内容超标,建议精简')
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def main():
|
|
84
|
+
min_words = 2200
|
|
85
|
+
max_words = 2800
|
|
86
|
+
if len(sys.argv) < 2:
|
|
87
|
+
print('用法: python check_wordcount.py <章节文件路径> [最小字数] [最大字数]')
|
|
88
|
+
print(' python check_wordcount.py --all <目录路径> [最小字数] [最大字数]')
|
|
89
|
+
print(f' 默认字数区间: {min_words}-{max_words}')
|
|
90
|
+
return
|
|
91
|
+
if sys.argv[1] == '--all':
|
|
92
|
+
if len(sys.argv) < 3:
|
|
93
|
+
print('错误: 使用 --all 时需要指定目录路径')
|
|
94
|
+
return
|
|
95
|
+
directory = sys.argv[2]
|
|
96
|
+
if len(sys.argv) >= 5:
|
|
97
|
+
min_words = int(sys.argv[3])
|
|
98
|
+
max_words = int(sys.argv[4])
|
|
99
|
+
elif len(sys.argv) == 4:
|
|
100
|
+
min_words = int(sys.argv[3])
|
|
101
|
+
results = check_all_chapters(directory, min_words=min_words, max_words=max_words)
|
|
102
|
+
print_results(results, min_words, max_words)
|
|
103
|
+
else:
|
|
104
|
+
file_path = sys.argv[1]
|
|
105
|
+
if len(sys.argv) >= 4:
|
|
106
|
+
min_words = int(sys.argv[2])
|
|
107
|
+
max_words = int(sys.argv[3])
|
|
108
|
+
elif len(sys.argv) == 3:
|
|
109
|
+
min_words = int(sys.argv[2])
|
|
110
|
+
result = check_chapter(file_path, min_words, max_words)
|
|
111
|
+
print_results([result], min_words, max_words)
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
if __name__ == '__main__':
|
|
115
|
+
main()
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
"""
|
|
4
|
+
场景构建辅助脚本
|
|
5
|
+
根据场景类型、角色、情绪目标,生成场景结构建议。
|
|
6
|
+
供写手在写作前快速构建场景骨架,减少构思时间。
|
|
7
|
+
|
|
8
|
+
用法:
|
|
9
|
+
python scripts/writer/scene_builder.py --type 冲突 --chars 林风,苏婉 --emotion 紧张 --json
|
|
10
|
+
python scripts/writer/scene_builder.py --type 日常 --chars 林风 --emotion 温馨
|
|
11
|
+
python scripts/writer/scene_builder.py --list # 列出所有场景类型
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
import argparse
|
|
15
|
+
import json
|
|
16
|
+
import os
|
|
17
|
+
import sys
|
|
18
|
+
|
|
19
|
+
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', 'common'))
|
|
20
|
+
|
|
21
|
+
# ─── 场景类型模板 ───────────────────────────────
|
|
22
|
+
SCENE_TYPES = {
|
|
23
|
+
'冲突': {
|
|
24
|
+
'description': '角色间的对抗、争执或战斗',
|
|
25
|
+
'structure': [
|
|
26
|
+
'1. 冲突起因(导火索/积累爆发)',
|
|
27
|
+
'2. 对抗升级(言语→行动→高潮)',
|
|
28
|
+
'3. 转折点(意外因素/第三方介入)',
|
|
29
|
+
'4. 结果(胜负/妥协/两败俱伤)',
|
|
30
|
+
'5. 余波(关系变化/后续影响)'
|
|
31
|
+
],
|
|
32
|
+
'tips': [
|
|
33
|
+
'冲突要有层次,不要一步到位',
|
|
34
|
+
'给双方合理的动机',
|
|
35
|
+
'用动作和对话推动,减少内心独白',
|
|
36
|
+
'结局要有意外但合理'
|
|
37
|
+
],
|
|
38
|
+
'word_distribution': {'起因': '15%', '升级': '35%', '转折': '20%', '结果': '20%', '余波': '10%'}
|
|
39
|
+
},
|
|
40
|
+
'日常': {
|
|
41
|
+
'description': '角色间的日常互动、生活场景',
|
|
42
|
+
'structure': [
|
|
43
|
+
'1. 场景设定(时间/地点/氛围)',
|
|
44
|
+
'2. 角色互动(对话/动作/细节)',
|
|
45
|
+
'3. 情感推进(关系变化/内心感受)',
|
|
46
|
+
'4. 小高潮(意外/趣事/感悟)',
|
|
47
|
+
'5. 收尾(自然过渡到下一场景)'
|
|
48
|
+
],
|
|
49
|
+
'tips': [
|
|
50
|
+
'用细节展现角色性格',
|
|
51
|
+
'对话要符合角色身份',
|
|
52
|
+
'适当加入环境描写烘托氛围',
|
|
53
|
+
'日常中埋下后续伏笔'
|
|
54
|
+
],
|
|
55
|
+
'word_distribution': {'设定': '10%', '互动': '40%', '情感': '25%', '高潮': '15%', '收尾': '10%'}
|
|
56
|
+
},
|
|
57
|
+
'修炼': {
|
|
58
|
+
'description': '角色修炼、突破、领悟的场景',
|
|
59
|
+
'structure': [
|
|
60
|
+
'1. 修炼背景(为何修炼/当前瓶颈)',
|
|
61
|
+
'2. 修炼过程(方法/困难/坚持)',
|
|
62
|
+
'3. 突破契机(领悟/外力帮助/生死关头)',
|
|
63
|
+
'4. 突破结果(实力提升/新技能)',
|
|
64
|
+
'5. 后续影响(实力变化/他人反应)'
|
|
65
|
+
],
|
|
66
|
+
'tips': [
|
|
67
|
+
'修炼过程要有具体描写',
|
|
68
|
+
'突破要有铺垫,不要突兀',
|
|
69
|
+
'可以加入内心挣扎或回忆',
|
|
70
|
+
'突破后要有实力展示'
|
|
71
|
+
],
|
|
72
|
+
'word_distribution': {'背景': '15%', '过程': '35%', '契机': '20%', '结果': '20%', '影响': '10%'}
|
|
73
|
+
},
|
|
74
|
+
'揭秘': {
|
|
75
|
+
'description': '揭露真相、身份或秘密的场景',
|
|
76
|
+
'structure': [
|
|
77
|
+
'1. 线索积累(之前的伏笔/疑点)',
|
|
78
|
+
'2. 关键证据(决定性线索出现)',
|
|
79
|
+
'3. 推理过程(角色分析/逻辑推导)',
|
|
80
|
+
'4. 真相揭露(核心秘密公开)',
|
|
81
|
+
'5. 各方反应(震惊/愤怒/释然)'
|
|
82
|
+
],
|
|
83
|
+
'tips': [
|
|
84
|
+
'之前要埋好伏笔',
|
|
85
|
+
'揭露要有冲击力',
|
|
86
|
+
'给读者"原来如此"的感觉',
|
|
87
|
+
'真相要影响后续剧情'
|
|
88
|
+
],
|
|
89
|
+
'word_distribution': {'线索': '20%', '证据': '20%', '推理': '25%', '揭露': '20%', '反应': '15%'}
|
|
90
|
+
},
|
|
91
|
+
'离别': {
|
|
92
|
+
'description': '角色分离、告别或牺牲的场景',
|
|
93
|
+
'structure': [
|
|
94
|
+
'1. 离别原因(任务/危险/误会)',
|
|
95
|
+
'2. 告别场景(对话/动作/情感)',
|
|
96
|
+
'3. 内心独白(不舍/决心/回忆)',
|
|
97
|
+
'4. 分离时刻(转身/远去/消失)',
|
|
98
|
+
'5. 后续影响(思念/成长/重逢伏笔)'
|
|
99
|
+
],
|
|
100
|
+
'tips': [
|
|
101
|
+
'情感要真挚,避免矫情',
|
|
102
|
+
'用细节表现不舍',
|
|
103
|
+
'可以加入回忆闪回',
|
|
104
|
+
'为重逢埋下伏笔'
|
|
105
|
+
],
|
|
106
|
+
'word_distribution': {'原因': '15%', '告别': '30%', '独白': '20%', '分离': '20%', '影响': '15%'}
|
|
107
|
+
},
|
|
108
|
+
'重逢': {
|
|
109
|
+
'description': '角色再次相遇的场景',
|
|
110
|
+
'structure': [
|
|
111
|
+
'1. 重逢背景(时间流逝/各自经历)',
|
|
112
|
+
'2. 相遇瞬间(意外/期待/紧张)',
|
|
113
|
+
'3. 情感碰撞(喜悦/尴尬/复杂)',
|
|
114
|
+
'4. 交流互动(对话/试探/坦白)',
|
|
115
|
+
'5. 关系重建(和解/疏远/新开始)'
|
|
116
|
+
],
|
|
117
|
+
'tips': [
|
|
118
|
+
'突出时间带来的变化',
|
|
119
|
+
'情感要复杂,不要单一',
|
|
120
|
+
'可以加入对比(过去vs现在)',
|
|
121
|
+
'为后续发展定调'
|
|
122
|
+
],
|
|
123
|
+
'word_distribution': {'背景': '15%', '相遇': '20%', '情感': '25%', '交流': '25%', '重建': '15%'}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
# ─── 情绪目标建议 ───────────────────────────────
|
|
128
|
+
EMOTION_TIPS = {
|
|
129
|
+
'紧张': ['加快节奏', '短句为主', '多用动作描写', '减少环境描写'],
|
|
130
|
+
'温馨': ['放慢节奏', '加入细节', '多用感官描写', '对话柔和'],
|
|
131
|
+
'悲伤': ['节奏缓慢', '环境烘托', '内心独白', '回忆穿插'],
|
|
132
|
+
'兴奋': ['快节奏', '感叹句', '动作连贯', '情绪高涨'],
|
|
133
|
+
'悬疑': ['制造疑问', '信息控制', '氛围营造', '节奏起伏'],
|
|
134
|
+
'愤怒': ['短句爆发', '动作激烈', '对话尖锐', '情绪递进']
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
def build_scene(scene_type, characters=None, emotion=None):
|
|
139
|
+
"""Build a scene structure based on type, characters, and emotion."""
|
|
140
|
+
if scene_type not in SCENE_TYPES:
|
|
141
|
+
return {'error': f'未知场景类型: {scene_type}。可用类型: {", ".join(SCENE_TYPES.keys())}'}
|
|
142
|
+
|
|
143
|
+
template = SCENE_TYPES[scene_type]
|
|
144
|
+
result = {
|
|
145
|
+
'scene_type': scene_type,
|
|
146
|
+
'description': template['description'],
|
|
147
|
+
'characters': characters or [],
|
|
148
|
+
'emotion_target': emotion,
|
|
149
|
+
'structure': template['structure'],
|
|
150
|
+
'word_distribution': template['word_distribution'],
|
|
151
|
+
'tips': template['tips'].copy()
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
if emotion and emotion in EMOTION_TIPS:
|
|
155
|
+
result['emotion_tips'] = EMOTION_TIPS[emotion]
|
|
156
|
+
result['tips'].extend([f'[情绪:{emotion}] {tip}' for tip in EMOTION_TIPS[emotion]])
|
|
157
|
+
|
|
158
|
+
return result
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
def list_scene_types():
|
|
162
|
+
"""List all available scene types."""
|
|
163
|
+
return {
|
|
164
|
+
'available_types': list(SCENE_TYPES.keys()),
|
|
165
|
+
'types_detail': {
|
|
166
|
+
name: info['description']
|
|
167
|
+
for name, info in SCENE_TYPES.items()
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
def main():
|
|
173
|
+
parser = argparse.ArgumentParser(description='场景构建辅助脚本')
|
|
174
|
+
parser.add_argument('--type', '-t', help='场景类型')
|
|
175
|
+
parser.add_argument('--chars', '-c', help='角色列表,逗号分隔')
|
|
176
|
+
parser.add_argument('--emotion', '-e', help='情绪目标')
|
|
177
|
+
parser.add_argument('--list', '-l', action='store_true', help='列出所有场景类型')
|
|
178
|
+
parser.add_argument('--json', action='store_true', help='JSON输出')
|
|
179
|
+
args = parser.parse_args()
|
|
180
|
+
|
|
181
|
+
if args.list:
|
|
182
|
+
result = list_scene_types()
|
|
183
|
+
if args.json:
|
|
184
|
+
print(json.dumps(result, ensure_ascii=False, indent=2))
|
|
185
|
+
else:
|
|
186
|
+
print("\n=== 可用场景类型 ===\n")
|
|
187
|
+
for name, desc in result['types_detail'].items():
|
|
188
|
+
print(f" {name}: {desc}")
|
|
189
|
+
print(f"\n共 {len(result['available_types'])} 种场景类型")
|
|
190
|
+
return
|
|
191
|
+
|
|
192
|
+
if not args.type:
|
|
193
|
+
parser.print_help()
|
|
194
|
+
return
|
|
195
|
+
|
|
196
|
+
characters = args.chars.split(',') if args.chars else []
|
|
197
|
+
result = build_scene(args.type, characters, args.emotion)
|
|
198
|
+
|
|
199
|
+
if args.json:
|
|
200
|
+
print(json.dumps(result, ensure_ascii=False, indent=2))
|
|
201
|
+
else:
|
|
202
|
+
if 'error' in result:
|
|
203
|
+
print(result['error'])
|
|
204
|
+
return
|
|
205
|
+
|
|
206
|
+
print(f"\n=== {result['scene_type']}场景构建 ===\n")
|
|
207
|
+
print(f"描述: {result['description']}")
|
|
208
|
+
if result['characters']:
|
|
209
|
+
print(f"角色: {', '.join(result['characters'])}")
|
|
210
|
+
if result['emotion_target']:
|
|
211
|
+
print(f"情绪目标: {result['emotion_target']}")
|
|
212
|
+
|
|
213
|
+
print(f"\n场景结构:")
|
|
214
|
+
for item in result['structure']:
|
|
215
|
+
print(f" {item}")
|
|
216
|
+
|
|
217
|
+
print(f"\n字数分配建议:")
|
|
218
|
+
for part, pct in result['word_distribution'].items():
|
|
219
|
+
print(f" {part}: {pct}")
|
|
220
|
+
|
|
221
|
+
print(f"\n写作要点:")
|
|
222
|
+
for tip in result['tips']:
|
|
223
|
+
print(f" • {tip}")
|
|
224
|
+
|
|
225
|
+
|
|
226
|
+
if __name__ == '__main__':
|
|
227
|
+
main()
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
风格锚点提取脚本
|
|
4
|
+
|
|
5
|
+
从最近的章节中提取写作风格特征,生成 style-anchor.json
|
|
6
|
+
|
|
7
|
+
使用方式:
|
|
8
|
+
python skill/scripts/style_anchor.py --chapters novels/volume-01/chapters/
|
|
9
|
+
python skill/scripts/style_anchor.py --chapter novels/volume-01/chapters/ch01.md
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
import argparse
|
|
13
|
+
import json
|
|
14
|
+
import re
|
|
15
|
+
from pathlib import Path
|
|
16
|
+
from collections import Counter
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def extract_style_features(content: str) -> dict:
|
|
20
|
+
"""提取单个章节的风格特征"""
|
|
21
|
+
lines = content.strip().split('\n')
|
|
22
|
+
sentences = re.split(r'[。!?]', content)
|
|
23
|
+
sentences = [s.strip() for s in sentences if s.strip()]
|
|
24
|
+
|
|
25
|
+
# 对话行
|
|
26
|
+
dialogue_lines = [l for l in lines if l.strip().startswith('"') or l.strip().startswith('\u201c')]
|
|
27
|
+
|
|
28
|
+
# 非对话行
|
|
29
|
+
narrative_lines = [l for l in lines if not (l.strip().startswith('"') or l.strip().startswith('\u201c'))]
|
|
30
|
+
|
|
31
|
+
# 句子长度分布
|
|
32
|
+
sentence_lengths = [len(s) for s in sentences]
|
|
33
|
+
|
|
34
|
+
# 高频词(去除停用词)
|
|
35
|
+
words = re.findall(r'[\u4e00-\u9fff]+', content)
|
|
36
|
+
word_counter = Counter(words)
|
|
37
|
+
|
|
38
|
+
# 标点频率
|
|
39
|
+
punctuation = re.findall(r'[,。!?、;:""''()]', content)
|
|
40
|
+
punct_counter = Counter(punctuation)
|
|
41
|
+
|
|
42
|
+
# 对话比例
|
|
43
|
+
dialogue_chars = sum(len(l) for l in dialogue_lines)
|
|
44
|
+
total_chars = len(content)
|
|
45
|
+
dialogue_ratio = dialogue_chars / total_chars if total_chars > 0 else 0
|
|
46
|
+
|
|
47
|
+
return {
|
|
48
|
+
'sentence_count': len(sentences),
|
|
49
|
+
'avg_sentence_length': round(sum(sentence_lengths) / len(sentence_lengths), 1) if sentence_lengths else 0,
|
|
50
|
+
'max_sentence_length': max(sentence_lengths) if sentence_lengths else 0,
|
|
51
|
+
'dialogue_ratio': round(dialogue_ratio, 3),
|
|
52
|
+
'dialogue_line_count': len(dialogue_lines),
|
|
53
|
+
'narrative_line_count': len(narrative_lines),
|
|
54
|
+
'top50_words': dict(word_counter.most_common(50)),
|
|
55
|
+
'punctuation_freq': dict(punct_counter),
|
|
56
|
+
'paragraph_count': len([l for l in lines if l.strip()]),
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def extract_style_anchor(chapter_paths: list[Path]) -> dict:
|
|
61
|
+
"""从多个章节提取风格锚点"""
|
|
62
|
+
all_features = []
|
|
63
|
+
|
|
64
|
+
for path in chapter_paths:
|
|
65
|
+
if path.exists():
|
|
66
|
+
content = path.read_text(encoding='utf-8')
|
|
67
|
+
features = extract_style_features(content)
|
|
68
|
+
features['chapter'] = path.stem
|
|
69
|
+
all_features.append(features)
|
|
70
|
+
|
|
71
|
+
if not all_features:
|
|
72
|
+
return {}
|
|
73
|
+
|
|
74
|
+
# 汇总统计
|
|
75
|
+
avg_sentence_lengths = [f['avg_sentence_length'] for f in all_features]
|
|
76
|
+
dialogue_ratios = [f['dialogue_ratio'] for f in all_features]
|
|
77
|
+
|
|
78
|
+
# 合并高频词
|
|
79
|
+
all_words = Counter()
|
|
80
|
+
for f in all_features:
|
|
81
|
+
all_words.update(f['top50_words'])
|
|
82
|
+
|
|
83
|
+
# 合并标点频率
|
|
84
|
+
all_punct = Counter()
|
|
85
|
+
for f in all_features:
|
|
86
|
+
all_punct.update(f['punctuation_freq'])
|
|
87
|
+
|
|
88
|
+
return {
|
|
89
|
+
'chapter_count': len(all_features),
|
|
90
|
+
'avg_sentence_length': round(sum(avg_sentence_lengths) / len(avg_sentence_lengths), 1),
|
|
91
|
+
'dialogue_ratio': round(sum(dialogue_ratios) / len(dialogue_ratios), 3),
|
|
92
|
+
'top50_words': dict(all_words.most_common(50)),
|
|
93
|
+
'punctuation_freq': dict(all_punct.most_common()),
|
|
94
|
+
'chapters': all_features,
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def main():
|
|
99
|
+
parser = argparse.ArgumentParser(description='风格锚点提取脚本')
|
|
100
|
+
parser.add_argument('--chapters', help='章节目录')
|
|
101
|
+
parser.add_argument('--chapter', help='单个章节文件')
|
|
102
|
+
parser.add_argument('--output', default='style-anchor.json', help='输出文件')
|
|
103
|
+
args = parser.parse_args()
|
|
104
|
+
|
|
105
|
+
chapter_paths = []
|
|
106
|
+
|
|
107
|
+
if args.chapters:
|
|
108
|
+
chapters_dir = Path(args.chapters)
|
|
109
|
+
chapter_paths = sorted(chapters_dir.glob('ch*.md'))
|
|
110
|
+
elif args.chapter:
|
|
111
|
+
chapter_paths = [Path(args.chapter)]
|
|
112
|
+
else:
|
|
113
|
+
parser.print_help()
|
|
114
|
+
return
|
|
115
|
+
|
|
116
|
+
if not chapter_paths:
|
|
117
|
+
print('未找到章节文件')
|
|
118
|
+
return
|
|
119
|
+
|
|
120
|
+
# 只取最近5章
|
|
121
|
+
chapter_paths = chapter_paths[-5:]
|
|
122
|
+
|
|
123
|
+
anchor = extract_style_anchor(chapter_paths)
|
|
124
|
+
|
|
125
|
+
output_path = Path(args.output)
|
|
126
|
+
output_path.write_text(json.dumps(anchor, ensure_ascii=False, indent=2), encoding='utf-8')
|
|
127
|
+
|
|
128
|
+
print(f'风格锚点已保存到 {output_path}')
|
|
129
|
+
print(f'分析了 {anchor["chapter_count"]} 个章节')
|
|
130
|
+
print(f'平均句长: {anchor["avg_sentence_length"]} 字')
|
|
131
|
+
print(f'对话比例: {anchor["dialogue_ratio"]*100:.1f}%')
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
if __name__ == '__main__':
|
|
135
|
+
main()
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# 优秀作者文风库
|
|
2
|
+
|
|
3
|
+
> 收录网文大神的写作风格特征,用于AI模仿学习
|
|
4
|
+
|
|
5
|
+
## 使用说明
|
|
6
|
+
|
|
7
|
+
在创作宪法中指定要模仿的作者:
|
|
8
|
+
|
|
9
|
+
```markdown
|
|
10
|
+
## 文风模仿
|
|
11
|
+
- **目标作者**:弈青峰
|
|
12
|
+
- **学习要点**:幽默搞笑、接地气、角色人设丰满
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
AI会根据该文风特征生成内容。
|
|
16
|
+
|
|
17
|
+
## 内置文风列表
|
|
18
|
+
|
|
19
|
+
### 搞笑幽默流
|
|
20
|
+
- **[弈青峰](authors/搞笑幽默流/弈青峰.md)** - 搞笑接地气,《开局地摊卖大力》
|
|
21
|
+
- **[会说话的肘子](authors/搞笑幽默流/会说话的肘子.md)** - 幽默脑洞,《大王饶命》
|
|
22
|
+
- **[三天两觉](authors/搞笑幽默流/三天两觉.md)** - 吐槽玩梗,《惊悚乐园》
|
|
23
|
+
- **[卖报小郎君](authors/搞笑幽默流/卖报小郎君.md)** - 探案搞笑,《大奉打更人》
|
|
24
|
+
|
|
25
|
+
### 热血升级流
|
|
26
|
+
- **[天蚕土豆](authors/热血升级流/天蚕土豆.md)** - 热血逆袭,《斗破苍穹》
|
|
27
|
+
- **[唐家三少](authors/热血升级流/唐家三少.md)** - 热血励志,《斗罗大陆》
|
|
28
|
+
- **[我吃西红柿](authors/热血升级流/我吃西红柿.md)** - 升级宏大,《星辰变》
|
|
29
|
+
- **[辰东](authors/热血升级流/辰东.md)** - 宏大悬念,《遮天》
|
|
30
|
+
- **[滚开](authors/热血升级流/滚开.md)** - 极道加点,《极道天魔》
|
|
31
|
+
|
|
32
|
+
### 细腻文青流
|
|
33
|
+
- **[猫腻](authors/细腻文青流/猫腻.md)** - 细腻哲理,《庆余年》
|
|
34
|
+
- **[烽火戏诸侯](authors/细腻文青流/烽火戏诸侯.md)** - 文笔江湖,《雪中悍刀行》
|
|
35
|
+
- **[愤怒的香蕉](authors/细腻文青流/愤怒的香蕉.md)** - 细腻深度,《赘婿》
|
|
36
|
+
- **[耳根](authors/细腻文青流/耳根.md)** - 深沉宿命,《仙逆》
|
|
37
|
+
|
|
38
|
+
### 严谨设定流
|
|
39
|
+
- **[爱潜水的乌贼](authors/严谨设定流/爱潜水的乌贼.md)** - 设定严谨,《诡秘之主》
|
|
40
|
+
- **[忘语](authors/严谨设定流/忘语.md)** - 凡人流,《凡人修仙传》
|
|
41
|
+
- **[言归正传](authors/严谨设定流/言归正传.md)** - 稳健苟道,《我师兄实在太稳健了》
|
|
42
|
+
|
|
43
|
+
### 特色领域流
|
|
44
|
+
- **[蝴蝶蓝](authors/特色领域流/蝴蝶蓝.md)** - 电竞群像,《全职高手》
|
|
45
|
+
- **[天下霸唱](authors/特色领域流/天下霸唱.md)** - 盗墓探险,《鬼吹灯》
|
|
46
|
+
- **[月关](authors/特色领域流/月关.md)** - 历史穿越,《回到明朝当王爷》
|
|
47
|
+
- **[萧鼎](authors/特色领域流/萧鼎.md)** - 古典仙侠,《诛仙》
|
|
48
|
+
|
|
49
|
+
### 多神话热血流
|
|
50
|
+
- **[三九音域](authors/多神话热血流/三九音域.md)** - 多神话融合+家国情怀,《我在精神病院学斩神》
|
|
51
|
+
|
|
52
|
+
### 悬疑推理流
|
|
53
|
+
- **[杀虫队队员](authors/悬疑推理流/杀虫队队员.md)** - 反爽文+智商博弈,《十日终焉》
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
# 忘语 文风配置
|
|
2
|
+
|
|
3
|
+
> 用于AI模仿忘语的写作风格
|
|
4
|
+
|
|
5
|
+
## 作者信息
|
|
6
|
+
- **代表作**:《凡人修仙传》
|
|
7
|
+
- **题材**:仙侠
|
|
8
|
+
- **风格标签**:#严谨 #凡人流 #稳健 #资源至上
|
|
9
|
+
|
|
10
|
+
## 核心写作原则
|
|
11
|
+
|
|
12
|
+
### 1. 凡人修仙
|
|
13
|
+
- 主角资质平庸,无特殊天赋
|
|
14
|
+
- 靠努力和机缘一步步逆袭
|
|
15
|
+
- 修炼艰难,步步为营,不跳跃升级
|
|
16
|
+
- 资源才是硬道理,精打细算
|
|
17
|
+
|
|
18
|
+
### 2. 稳健谨慎
|
|
19
|
+
- 主角从不冒险,做事留有后手
|
|
20
|
+
- 低调行事,不张扬
|
|
21
|
+
- 生存第一,利益第二
|
|
22
|
+
- 遇到危险先想退路
|
|
23
|
+
|
|
24
|
+
### 3. 细节丰富
|
|
25
|
+
- 修炼过程详细描写
|
|
26
|
+
- 资源获取和使用精细计算
|
|
27
|
+
- 丹药、法宝、材料都有详细说明
|
|
28
|
+
- 战斗靠智慧和准备,不靠运气
|
|
29
|
+
|
|
30
|
+
## 高频句式
|
|
31
|
+
```
|
|
32
|
+
"修仙之路,步步艰难"
|
|
33
|
+
"资源才是硬道理"
|
|
34
|
+
"稳妥起见,还是..."
|
|
35
|
+
"韩老魔从不冒险"
|
|
36
|
+
"此物珍贵,不可浪费"
|
|
37
|
+
"先观察,再行动"
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## 描写规则
|
|
41
|
+
|
|
42
|
+
### 动作描写
|
|
43
|
+
- 动作谨慎细致
|
|
44
|
+
- 每个动作都有目的
|
|
45
|
+
- 不轻易出手
|
|
46
|
+
|
|
47
|
+
### 场景描写
|
|
48
|
+
- 环境描写简洁
|
|
49
|
+
- 重点在资源分布
|
|
50
|
+
- 突出危险感
|
|
51
|
+
|
|
52
|
+
### 情感描写
|
|
53
|
+
- 情感内敛
|
|
54
|
+
- 不轻易表露真心
|
|
55
|
+
- 用行动表示关心
|
|
56
|
+
|
|
57
|
+
### 战斗描写
|
|
58
|
+
- 以弱胜强,靠智谋
|
|
59
|
+
- 战斗前充分准备
|
|
60
|
+
- 战斗中冷静分析
|
|
61
|
+
- 战斗后清点收获
|
|
62
|
+
|
|
63
|
+
## 爽点设置
|
|
64
|
+
|
|
65
|
+
### 常用爽点
|
|
66
|
+
1. 精心准备后反杀
|
|
67
|
+
2. 低调获得大机缘
|
|
68
|
+
3. 算计对手成功
|
|
69
|
+
4. 资源积累丰厚
|
|
70
|
+
5. 越级战斗靠智慧
|
|
71
|
+
|
|
72
|
+
### 爽点节奏
|
|
73
|
+
- 不追求密集爽点
|
|
74
|
+
- 每10章一个小高潮
|
|
75
|
+
- 稳步升级的成就感
|
|
76
|
+
|
|
77
|
+
## 禁忌
|
|
78
|
+
|
|
79
|
+
- ❌ 不要主角突然开挂
|
|
80
|
+
- ❌ 不要无脑越级挑战
|
|
81
|
+
- ❌ 不要主角性格大变
|
|
82
|
+
- ❌ 不要资源来源不明
|
|
83
|
+
- ❌ 不要战斗全靠运气
|
|
84
|
+
- ❌ 不要过度使用AI套话
|
|
85
|
+
|
|
86
|
+
## 开篇公式
|
|
87
|
+
|
|
88
|
+
```
|
|
89
|
+
平庸主角 → 获得机缘 → 谨慎修炼 → 低调成长 → 稳步逆袭
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
## 适用题材
|
|
93
|
+
|
|
94
|
+
- 凡人流修仙
|
|
95
|
+
- 稳健升级
|
|
96
|
+
- 资源争夺
|
|
97
|
+
- 低调逆袭
|
|
98
|
+
- 智谋型主角
|
|
99
|
+
|
|
100
|
+
## 使用指令
|
|
101
|
+
|
|
102
|
+
在对话中说:
|
|
103
|
+
```
|
|
104
|
+
请使用忘语的文风写作
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
或:
|
|
108
|
+
```
|
|
109
|
+
模仿忘语风格,写一段...
|
|
110
|
+
```
|