@waterwx/dsh-novel-forge 1.3.1 → 1.3.2-alpha
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 +288 -279
- package/lib/client.js +56309 -12221
- package/lib/index.js +14239 -5595
- package/lib/types/action-guard.d.ts +61 -0
- package/lib/types/ai-scan.d.ts +36 -0
- package/lib/types/assets.d.ts +24 -9
- package/lib/types/assistant.d.ts +29 -0
- package/lib/types/author-assets.d.ts +25 -0
- package/lib/types/bookshelf.d.ts +11 -1
- package/lib/types/client/api.d.ts +186 -10
- package/lib/types/client/chip-prefs.d.ts +36 -0
- package/lib/types/client/docx.d.ts +2 -0
- package/lib/types/client/index.d.ts +1 -1
- package/lib/types/client/llmLive.d.ts +31 -0
- package/lib/types/client/locales.d.ts +28 -67
- package/lib/types/client/panel/AdaptModeView.d.ts +5 -0
- package/lib/types/client/panel/AiTag.d.ts +1 -0
- package/lib/types/client/panel/AssistantTab.d.ts +4 -1
- package/lib/types/client/panel/AuthorAssetsView.d.ts +4 -0
- package/lib/types/client/panel/AuthorHome.d.ts +34 -0
- package/lib/types/client/panel/BookAnalysisView.d.ts +4 -0
- package/lib/types/client/panel/CmdPalette.d.ts +12 -0
- package/lib/types/client/panel/CreateBookView.d.ts +5 -1
- package/lib/types/client/panel/DirectorView.d.ts +7 -0
- package/lib/types/client/panel/GlobalAssetLibraryView.d.ts +4 -0
- package/lib/types/client/panel/IdeaInspirationView.d.ts +6 -0
- package/lib/types/client/panel/ImportModal.d.ts +7 -0
- package/lib/types/client/panel/KnowledgeBaseView.d.ts +4 -0
- package/lib/types/client/panel/LiveFeedLog.d.ts +13 -0
- package/lib/types/client/panel/MarketRadarView.d.ts +5 -0
- package/lib/types/client/panel/ModelManager.d.ts +14 -0
- package/lib/types/client/panel/NovelPanel.d.ts +6 -1
- package/lib/types/client/panel/PageHeader.d.ts +18 -0
- package/lib/types/client/panel/ProgressConsole.d.ts +17 -0
- package/lib/types/client/panel/ProgressHomeView.d.ts +5 -0
- package/lib/types/client/panel/PromptSlotsView.d.ts +11 -0
- package/lib/types/client/panel/ReasoningSection.d.ts +10 -0
- package/lib/types/client/panel/SettingsView.d.ts +19 -0
- package/lib/types/client/panel/ShelfView.d.ts +12 -1
- package/lib/types/client/panel/SubPage.d.ts +27 -0
- package/lib/types/client/panel/TensionView.d.ts +18 -0
- package/lib/types/client/panel/TimelineView.d.ts +18 -0
- package/lib/types/client/panel/helpers.d.ts +5 -3
- package/lib/types/client/panel/toast.d.ts +2 -0
- package/lib/types/client/panel/views.d.ts +25 -7
- package/lib/types/client/run-status.d.ts +21 -0
- package/lib/types/client/text.d.ts +9 -0
- package/lib/types/docx-core.d.ts +16 -0
- package/lib/types/docx.d.ts +2 -3
- package/lib/types/engine.d.ts +186 -45
- package/lib/types/global-assets.d.ts +6 -0
- package/lib/types/index.d.ts +22 -8
- package/lib/types/llm-live.d.ts +75 -0
- package/lib/types/llm-retry.d.ts +38 -0
- package/lib/types/market-radar-scan.d.ts +19 -0
- package/lib/types/market-radar-sources.d.ts +31 -0
- package/lib/types/migrate-output.d.ts +25 -0
- package/lib/types/novel-context.d.ts +80 -0
- package/lib/types/prompt-slots.d.ts +57 -0
- package/lib/types/prompt-utils.d.ts +35 -0
- package/lib/types/prompting.d.ts +10 -0
- package/lib/types/protocol.d.ts +1362 -166
- package/lib/types/review-policy.d.ts +97 -0
- package/lib/types/revision.d.ts +76 -0
- package/lib/types/routes.d.ts +4 -0
- package/lib/types/run.d.ts +23 -1
- package/lib/types/snapshots.d.ts +46 -0
- package/lib/types/stage-contract.d.ts +60 -0
- package/lib/types/tension.d.ts +53 -0
- package/lib/types/timeline.d.ts +37 -0
- package/package.json +52 -28
- package/src/action-guard.ts +127 -0
- package/src/ai-scan.ts +179 -0
- package/src/assets.ts +1806 -520
- package/src/assistant.ts +1098 -770
- package/src/author-assets.ts +149 -0
- package/src/bookshelf.ts +187 -151
- package/src/client/api.ts +378 -21
- package/src/client/chip-prefs.ts +121 -0
- package/src/client/docx.ts +37 -69
- package/src/client/index.ts +3 -1
- package/src/client/llmLive.ts +111 -0
- package/src/client/locales.ts +28 -253
- package/src/client/mount.tsx +1 -1
- package/src/client/panel/AdaptModeView.tsx +535 -0
- package/src/client/panel/AiTag.tsx +7 -0
- package/src/client/panel/AssetsTab.tsx +448 -458
- package/src/client/panel/AssistantTab.tsx +355 -301
- package/src/client/panel/AuthorAssetsView.tsx +206 -0
- package/src/client/panel/AuthorHome.tsx +309 -0
- package/src/client/panel/BookAnalysisView.tsx +63 -0
- package/src/client/panel/CmdPalette.tsx +102 -0
- package/src/client/panel/CreateBookView.tsx +366 -348
- package/src/client/panel/DirectorView.tsx +200 -0
- package/src/client/panel/GlobalAssetLibraryView.tsx +168 -0
- package/src/client/panel/IdeaInspirationView.tsx +76 -0
- package/src/client/panel/ImportModal.tsx +303 -0
- package/src/client/panel/KnowledgeBaseView.tsx +125 -0
- package/src/client/panel/LiveFeedLog.tsx +204 -0
- package/src/client/panel/MarketRadarView.tsx +377 -0
- package/src/client/panel/ModelManager.tsx +205 -0
- package/src/client/panel/NovelPanel.tsx +3135 -2651
- package/src/client/panel/PageHeader.tsx +37 -0
- package/src/client/panel/ProgressConsole.tsx +63 -0
- package/src/client/panel/PromptSlotsView.tsx +97 -0
- package/src/client/panel/ReaderView.tsx +306 -306
- package/src/client/panel/ReasoningSection.tsx +31 -0
- package/src/client/panel/RunPanel.tsx +64 -32
- package/src/client/panel/SettingsView.tsx +354 -0
- package/src/client/panel/ShelfView.tsx +266 -236
- package/src/client/panel/SubPage.tsx +42 -0
- package/src/client/panel/TensionView.tsx +212 -0
- package/src/client/panel/TimelineView.tsx +208 -0
- package/src/client/panel/WorldTab.tsx +202 -202
- package/src/client/panel/helpers.ts +7 -5
- package/src/client/panel/panel.module.css +4481 -1655
- package/src/client/panel/toast.ts +51 -0
- package/src/client/panel/views.tsx +401 -314
- package/src/client/run-status.ts +171 -0
- package/src/client/sidebar-entry.ts +1 -1
- package/src/client/text.ts +28 -0
- package/src/docx-core.ts +53 -0
- package/src/docx.ts +44 -83
- package/src/engine.ts +4672 -2943
- package/src/global-assets.ts +59 -0
- package/src/index.ts +89 -33
- package/src/llm-live.ts +260 -0
- package/src/llm-retry.ts +77 -0
- package/src/market-radar-scan.ts +41 -0
- package/src/market-radar-sources.ts +173 -0
- package/src/migrate-output.ts +76 -0
- package/src/novel-context.ts +286 -0
- package/src/prompt-slots.ts +125 -0
- package/src/prompting.ts +26 -0
- package/src/protocol.ts +1388 -158
- package/src/review-policy.ts +161 -0
- package/src/revision.ts +283 -0
- package/src/routes.ts +1934 -434
- package/src/run.ts +118 -21
- package/src/snapshots.ts +174 -0
- package/src/stage-contract.ts +189 -0
- package/src/tension.ts +251 -0
- package/src/timeline.ts +159 -0
- package/lib/client.js.map +0 -1
- package/lib/index.js.map +0 -1
- package/lib/types/comic-presets.d.ts +0 -12
- package/scripts/assistant-frames.txt +0 -8
- package/scripts/diagnose-adapter.mts +0 -81
- package/scripts/diagnose-assistant.mjs +0 -58
- package/scripts/diagnose-bible.mjs +0 -72
- package/scripts/diagnose-harness.mts +0 -75
- package/scripts/novel-forge-restart.log +0 -10
- package/scripts/novel-forge-web.stderr.log +0 -2
- package/scripts/novel-forge-web.stdout.log +0 -1
- package/scripts/outline-sample.txt +0 -449
- package/scripts/probe.mjs +0 -6
- package/scripts/restart-web.ps1 +0 -88
- package/scripts/smoke.mts +0 -72
- package/scripts/upload-github.ps1 +0 -51
- package/src/client/panel/BookshelfBar.tsx +0 -170
- package/src/comic-presets.ts +0 -67
package/src/assets.ts
CHANGED
|
@@ -1,520 +1,1806 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Writing assets — 题材基底库 / 推进模式库 / 反 AI 规则 / 写法引擎.
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* - 8
|
|
6
|
-
* - 12
|
|
7
|
-
* -
|
|
8
|
-
* Assets persist with the project (novel-project.json) and are injected into
|
|
9
|
-
* generation / planning / review prompts, and available to the AI assistant.
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
import type { AntiAiRule, GenreNode, ProgressionMode, ProjectAssets, StyleAsset, StyleTemplate } from './protocol.ts'
|
|
13
|
-
|
|
14
|
-
// ------------------------------------------------------ built-in style templates
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
export const BUILTIN_STYLE_TEMPLATES: StyleTemplate[] = [
|
|
18
|
-
{
|
|
19
|
-
key: 'power-up-escalation',
|
|
20
|
-
name: '
|
|
21
|
-
description: '
|
|
22
|
-
category: '爽文流',
|
|
23
|
-
applicableGenres: [
|
|
24
|
-
|
|
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
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
'
|
|
76
|
-
'
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
'
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
'
|
|
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
|
-
'
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
'
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
'
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
'
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
'
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
'
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
'
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
'
|
|
198
|
-
'
|
|
199
|
-
'
|
|
200
|
-
],
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
],
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
]
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
],
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
],
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
],
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
]
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
name: '
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
}
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
'
|
|
512
|
-
'
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Writing assets — 题材基底库 / 推进模式库 / 反 AI 规则 / 写法引擎.
|
|
3
|
+
*
|
|
4
|
+
* 内置种子数据(本项目自研表述;结构参考了同类工具的功能划分):
|
|
5
|
+
* - 8 套预置叙事风格模板
|
|
6
|
+
* - 12 条带命中模式的反 AI 规则
|
|
7
|
+
* - 题材树 + 推进模式种子
|
|
8
|
+
* Assets persist with the project (novel-project.json) and are injected into
|
|
9
|
+
* generation / planning / review prompts, and available to the AI assistant.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import type { AntiAiRule, GenreNode, PlotBeatTemplate, ProgressionMode, ProjectAssets, StarterStyleProfile, StyleAsset, StyleTemplate } from './protocol.ts'
|
|
13
|
+
|
|
14
|
+
// ------------------------------------------------------ built-in style templates
|
|
15
|
+
|
|
16
|
+
/** 预置叙事风格模板(8 套,一键绑定无需样本文本)。 */
|
|
17
|
+
export const BUILTIN_STYLE_TEMPLATES: StyleTemplate[] = [
|
|
18
|
+
{
|
|
19
|
+
key: 'power-up-escalation',
|
|
20
|
+
name: '目标推进爽文流',
|
|
21
|
+
description: '冲突与收益逐级抬升,每章都要有可指认的目标推进与爽点兑现。',
|
|
22
|
+
category: '爽文流',
|
|
23
|
+
applicableGenres: [
|
|
24
|
+
'都市',
|
|
25
|
+
'玄幻',
|
|
26
|
+
'热血',
|
|
27
|
+
],
|
|
28
|
+
tags: ["推进感", "收益点", "冲突升级"],
|
|
29
|
+
analysisMarkdown: "每一段都要落在「推进」或「兑现」上:因果清楚,节奏逐段抬升。",
|
|
30
|
+
narrative: { progressionMode: "goal_driven", sceneUnitPattern: ["目标", "阻碍", "压制", "反转收益"], multiPov: false, looping: false, endingStyle: "hook", summary: "围绕本章目标滚进,尽快给出局部收益。" },
|
|
31
|
+
character: { allowSelfReflection: true, emotionExpression: "dialogue_and_action", defenseMechanisms: [], facePriority: false, dialogueStyle: "direct", summary: "表达直接,情绪跟着胜负走。" },
|
|
32
|
+
language: { register: "direct", roughness: 0.55, allowIncompleteSentences: false, allowSwearing: false, sentenceVariation: "medium", allowUselessDetails: false, summary: "句子利落,删掉不承担信息的枝节。" },
|
|
33
|
+
rhythm: { pace: "fast", paragraphDensity: "medium", allowFragmentedFlow: false, actionOverExplanation: true, summary: "先冲突后解释,不做停顿式铺垫。" },
|
|
34
|
+
proseRules: [
|
|
35
|
+
'每段都要有可指认的推进或兑现,不允许只做情绪铺垫。',
|
|
36
|
+
'场景按「立目标 → 遇阻 → 被压 → 反转收利」组织,节奏逐段抬升。',
|
|
37
|
+
'结尾用钩子收束,不写总结式段落。',
|
|
38
|
+
],
|
|
39
|
+
dialogueRules: [
|
|
40
|
+
'台词直来直去,情绪随胜负切换。',
|
|
41
|
+
'对话承担推进与信息交换,同时保留各角色的语气差别。',
|
|
42
|
+
],
|
|
43
|
+
languageRules: [
|
|
44
|
+
'句子清晰,删掉不承载信息的修饰。',
|
|
45
|
+
'表达明确,不做无谓铺垫。',
|
|
46
|
+
],
|
|
47
|
+
rhythmRules: [
|
|
48
|
+
'快节奏、段落密度中等,动作先于解释。',
|
|
49
|
+
'尽快兑现局部收益,避免拖沓。',
|
|
50
|
+
],
|
|
51
|
+
defaultAntiAiRuleKeys: ['forbid-theme-summary', 'risk-dialogue-too-functional', 'risk-three-paragraphs-exposition'],
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
key: 'bottom-loop-reality',
|
|
55
|
+
name: '底层循环写实流',
|
|
56
|
+
description: '用碎片化的日常和反复落空写人物困境,不给廉价出路。',
|
|
57
|
+
category: '现实流',
|
|
58
|
+
applicableGenres: [
|
|
59
|
+
'都市',
|
|
60
|
+
'现实',
|
|
61
|
+
'成长',
|
|
62
|
+
],
|
|
63
|
+
tags: ["第一人称", "口语化", "碎片叙事"],
|
|
64
|
+
analysisMarkdown: "靠时间推移与现实落差形成张力,结尾不解决核心困境。",
|
|
65
|
+
narrative: { progressionMode: "time_sequence", sceneUnitPattern: ["行为", "落差", "自我合理化"], multiPov: false, looping: true, endingStyle: "unresolved", summary: "碎片化推进,不做总括式回顾。" },
|
|
66
|
+
character: { allowSelfReflection: false, emotionExpression: "behavior_only", defenseMechanisms: ["嘴硬", "转移", "自我合理化"], facePriority: true, dialogueStyle: "short_colloquial", summary: "情绪靠动作和嘴硬,不做内心解说。" },
|
|
67
|
+
language: { register: "colloquial", roughness: 0.8, allowIncompleteSentences: true, allowSwearing: true, sentenceVariation: "high", allowUselessDetails: true, summary: "口语、粗粝,允许生活杂音。" },
|
|
68
|
+
rhythm: { pace: "medium_fast", paragraphDensity: "high", allowFragmentedFlow: true, actionOverExplanation: true, summary: "段落写实,先给动作再给解释。" },
|
|
69
|
+
proseRules: [
|
|
70
|
+
'用时间推移与现实落差构成张力,结尾不解决核心困境。',
|
|
71
|
+
'场景按「行为 → 落差 → 自我合理化」组织。',
|
|
72
|
+
'碎片化推进,不做总括式回顾。',
|
|
73
|
+
],
|
|
74
|
+
dialogueRules: [
|
|
75
|
+
'情绪通过动作与嘴硬体现,台词短促口语化。',
|
|
76
|
+
'对话保留生活杂音与无效信息。',
|
|
77
|
+
],
|
|
78
|
+
languageRules: [
|
|
79
|
+
'语言粗粝口语化,允许不完整句。',
|
|
80
|
+
'句长变化大,允许无意义细节。',
|
|
81
|
+
],
|
|
82
|
+
rhythmRules: [
|
|
83
|
+
'段落写实,先给动作再给解释。',
|
|
84
|
+
'中快节奏,允许碎片化流动。',
|
|
85
|
+
],
|
|
86
|
+
defaultAntiAiRuleKeys: ['forbid-explicit-psychology', 'forbid-ending-elevation', 'encourage-useless-action', 'encourage-reality-gap', 'encourage-hard-mouth-compensation'],
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
key: 'suspense-pressure',
|
|
90
|
+
name: '信息遮蔽压迫流',
|
|
91
|
+
description: '用信息遮蔽、细节异常与压力叠加制造不安。',
|
|
92
|
+
category: '悬疑流',
|
|
93
|
+
applicableGenres: [
|
|
94
|
+
'悬疑',
|
|
95
|
+
'惊悚',
|
|
96
|
+
'现实',
|
|
97
|
+
],
|
|
98
|
+
tags: ["压迫感", "信息差", "异常细节"],
|
|
99
|
+
analysisMarkdown: "异常细节、信息差与节奏收束一起给悬念加压。",
|
|
100
|
+
narrative: { progressionMode: "mystery_escalation", sceneUnitPattern: ["现场细节", "异常", "误判", "新风险"], multiPov: false, looping: false, endingStyle: "suspense", summary: "优先制造信息缺口与压迫氛围。" },
|
|
101
|
+
character: { allowSelfReflection: true, emotionExpression: "reaction_only", defenseMechanisms: ["压抑"], facePriority: false, dialogueStyle: "restrained", summary: "反应克制,恐惧从反应里透出来。" },
|
|
102
|
+
language: { register: "restrained", roughness: 0.45, allowIncompleteSentences: true, allowSwearing: false, sentenceVariation: "medium_high", allowUselessDetails: true, summary: "细节精确,留少量噪音增强现场感。" },
|
|
103
|
+
rhythm: { pace: "medium", paragraphDensity: "medium_high", allowFragmentedFlow: true, actionOverExplanation: true, summary: "用节奏收束与信息延迟制造压力。" },
|
|
104
|
+
proseRules: [
|
|
105
|
+
'以异常细节、信息差与节奏收束给悬念加压。',
|
|
106
|
+
'场景按「现场细节 → 异常 → 误判 → 新风险」组织。',
|
|
107
|
+
'优先制造信息缺口与压迫氛围。',
|
|
108
|
+
],
|
|
109
|
+
dialogueRules: [
|
|
110
|
+
'反应克制,恐惧从反应里透出来。',
|
|
111
|
+
'台词保持克制,不解释恐惧来源。',
|
|
112
|
+
],
|
|
113
|
+
languageRules: [
|
|
114
|
+
'细节写准,留一点杂音换现场感。',
|
|
115
|
+
'克制,句长变化中等偏高。',
|
|
116
|
+
],
|
|
117
|
+
rhythmRules: [
|
|
118
|
+
'用节奏收束与信息延迟制造压力。',
|
|
119
|
+
'中速,段落密度中等偏高。',
|
|
120
|
+
],
|
|
121
|
+
defaultAntiAiRuleKeys: ['forbid-explicit-psychology', 'forbid-theme-summary', 'risk-even-paragraph-length', 'encourage-reality-gap'],
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
key: 'emotional-tension',
|
|
125
|
+
name: '关系错位拉扯流',
|
|
126
|
+
description: '用错位表达、停顿与误读制造关系张力。',
|
|
127
|
+
category: '情感流',
|
|
128
|
+
applicableGenres: [
|
|
129
|
+
'言情',
|
|
130
|
+
'都市',
|
|
131
|
+
'群像',
|
|
132
|
+
],
|
|
133
|
+
tags: ["误读", "拉扯", "停顿感"],
|
|
134
|
+
analysisMarkdown: "核心情绪不直说,靠误读、停顿与反应推动关系变化。",
|
|
135
|
+
narrative: { progressionMode: "relationship_push_pull", sceneUnitPattern: ["动作", "言外之意", "误读", "回避"], multiPov: false, looping: false, endingStyle: "emotional_hook", summary: "靠关系错位推进,不直接说明。" },
|
|
136
|
+
character: { allowSelfReflection: true, emotionExpression: "subtext", defenseMechanisms: ["回避", "试探", "嘴硬"], facePriority: true, dialogueStyle: "subtext_heavy", summary: "情绪落在停顿、动作与言外之意上。" },
|
|
137
|
+
language: { register: "natural", roughness: 0.35, allowIncompleteSentences: true, allowSwearing: false, sentenceVariation: "high", allowUselessDetails: true, summary: "语言自然,允许停顿和留白。" },
|
|
138
|
+
rhythm: { pace: "medium_slow", paragraphDensity: "medium", allowFragmentedFlow: true, actionOverExplanation: false, summary: "给关系反应留空间,但不写空洞抒情。" },
|
|
139
|
+
proseRules: [
|
|
140
|
+
'核心情绪不直说,靠误读、停顿与反应推动关系。',
|
|
141
|
+
'场景按「动作 → 言外之意 → 误读 → 回避」组织。',
|
|
142
|
+
'靠关系错位推进,不靠旁白说明。',
|
|
143
|
+
],
|
|
144
|
+
dialogueRules: [
|
|
145
|
+
'情绪通过停顿、动作与言外之意体现。',
|
|
146
|
+
'台词充满潜台词与试探。',
|
|
147
|
+
],
|
|
148
|
+
languageRules: [
|
|
149
|
+
'语言自然,允许停顿和留白。',
|
|
150
|
+
'句长变化大,允许无意义细节。',
|
|
151
|
+
],
|
|
152
|
+
rhythmRules: [
|
|
153
|
+
'给关系反应留白,但不写空泛抒情。',
|
|
154
|
+
'中慢节奏,段落密度中等。',
|
|
155
|
+
],
|
|
156
|
+
defaultAntiAiRuleKeys: ['forbid-direct-preaching', 'forbid-ending-elevation', 'risk-dialogue-too-functional', 'encourage-useless-action'],
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
key: 'ensemble-weave',
|
|
160
|
+
name: '群像交叉推进流',
|
|
161
|
+
description: '多条人物行动线交叉推进,视角差异清晰可控。',
|
|
162
|
+
category: '群像流',
|
|
163
|
+
applicableGenres: [
|
|
164
|
+
'群像',
|
|
165
|
+
'都市',
|
|
166
|
+
'悬疑',
|
|
167
|
+
],
|
|
168
|
+
tags: ["多角色", "交织", "信息流动"],
|
|
169
|
+
analysisMarkdown: "多角色并行推进,但每人的表达与认知边界必须分清。",
|
|
170
|
+
narrative: { progressionMode: "multi_thread", sceneUnitPattern: ["角色动作", "局部信息", "交叉影响"], multiPov: true, looping: false, endingStyle: "cross_hook", summary: "多线并进,视角切换要有控制。" },
|
|
171
|
+
character: { allowSelfReflection: true, emotionExpression: "mixed", defenseMechanisms: [], facePriority: false, dialogueStyle: "distinct_by_role", summary: "不同角色的口吻必须拉开差距。" },
|
|
172
|
+
language: { register: "flexible", roughness: 0.45, allowIncompleteSentences: true, allowSwearing: false, sentenceVariation: "high", allowUselessDetails: false, summary: "保持角色差异,避免千人一腔。" },
|
|
173
|
+
rhythm: { pace: "balanced", paragraphDensity: "medium", allowFragmentedFlow: false, actionOverExplanation: true, summary: "几条线同时走,节奏别散。" },
|
|
174
|
+
proseRules: [
|
|
175
|
+
'多角色并行推进,各人的表达与认知边界必须分清。',
|
|
176
|
+
'多线并进,切视角要有节制。',
|
|
177
|
+
],
|
|
178
|
+
dialogueRules: [
|
|
179
|
+
'不同角色的口吻要拉开差距,避免所有人说话一样。',
|
|
180
|
+
],
|
|
181
|
+
languageRules: [
|
|
182
|
+
'保持角色差异,句长变化大。',
|
|
183
|
+
'砍掉不推进剧情的枝节信息。',
|
|
184
|
+
],
|
|
185
|
+
rhythmRules: [
|
|
186
|
+
'多线交织但节奏不乱,平衡推进。',
|
|
187
|
+
'动作先于解释。',
|
|
188
|
+
],
|
|
189
|
+
defaultAntiAiRuleKeys: ['risk-dialogue-too-functional', 'risk-repeated-sentence-structure', 'forbid-theme-summary'],
|
|
190
|
+
},
|
|
191
|
+
{
|
|
192
|
+
key: 'immersive-daily',
|
|
193
|
+
name: '日常浸没流',
|
|
194
|
+
description: '用生活细节与细微情绪变化建立持续沉浸。',
|
|
195
|
+
category: '日常流',
|
|
196
|
+
applicableGenres: [
|
|
197
|
+
'日常',
|
|
198
|
+
'治愈',
|
|
199
|
+
'都市',
|
|
200
|
+
],
|
|
201
|
+
tags: ["生活感", "沉浸", "细碎细节"],
|
|
202
|
+
analysisMarkdown: "允许生活性动作与无效信息,但核心情绪仍要从场景里自然流出。",
|
|
203
|
+
narrative: { progressionMode: "scene_immersion", sceneUnitPattern: ["动作", "环境", "关系反应"], multiPov: false, looping: false, endingStyle: "soft_open", summary: "重场景体验与关系温度。" },
|
|
204
|
+
character: { allowSelfReflection: true, emotionExpression: "light_behavior", defenseMechanisms: [], facePriority: false, dialogueStyle: "daily_natural", summary: "说话像日常,不端戏剧腔。" },
|
|
205
|
+
language: { register: "colloquial", roughness: 0.25, allowIncompleteSentences: true, allowSwearing: false, sentenceVariation: "medium_high", allowUselessDetails: true, summary: "保留生活细节与杂音,不追求工整。" },
|
|
206
|
+
rhythm: { pace: "slow", paragraphDensity: "medium", allowFragmentedFlow: true, actionOverExplanation: false, summary: "慢节奏沉浸,但不空转。" },
|
|
207
|
+
proseRules: [
|
|
208
|
+
'重场景体验与关系温度,核心情绪从场景自然流出。',
|
|
209
|
+
'允许保留生活性动作与无效信息。',
|
|
210
|
+
],
|
|
211
|
+
dialogueRules: [
|
|
212
|
+
'台词贴近日常说话,不端戏剧腔。',
|
|
213
|
+
'对话保留生活气息。',
|
|
214
|
+
],
|
|
215
|
+
languageRules: [
|
|
216
|
+
'保留生活细节与杂音,不追求工整。',
|
|
217
|
+
'口语化,句长变化中等偏高。',
|
|
218
|
+
],
|
|
219
|
+
rhythmRules: [
|
|
220
|
+
'节奏放慢,但不许原地打转。',
|
|
221
|
+
'允许碎片化流动。',
|
|
222
|
+
],
|
|
223
|
+
defaultAntiAiRuleKeys: ['forbid-ending-elevation', 'risk-even-paragraph-length', 'encourage-useless-action'],
|
|
224
|
+
},
|
|
225
|
+
{
|
|
226
|
+
key: 'cold-professional',
|
|
227
|
+
name: '专业事实压情绪流',
|
|
228
|
+
description: '用行业事实与程序细节压住情绪,形成克制的压力感。',
|
|
229
|
+
category: '专业流',
|
|
230
|
+
applicableGenres: [
|
|
231
|
+
'职场',
|
|
232
|
+
'现实',
|
|
233
|
+
'悬疑',
|
|
234
|
+
],
|
|
235
|
+
tags: ["专业细节", "克制", "事实压情绪"],
|
|
236
|
+
analysisMarkdown: "行业事实与程序细节优先;情绪不直说,信息密度高于抒情密度。",
|
|
237
|
+
narrative: { progressionMode: "fact_driven", sceneUnitPattern: ["事实", "动作", "专业判断", "后果"], multiPov: false, looping: false, endingStyle: "pressure_continue", summary: "让事实与程序细节扛住叙事重量。" },
|
|
238
|
+
character: { allowSelfReflection: false, emotionExpression: "suppressed", defenseMechanisms: ["克制"], facePriority: false, dialogueStyle: "informational", summary: "情绪藏在专业动作与事实选择里。" },
|
|
239
|
+
language: { register: "professional", roughness: 0.2, allowIncompleteSentences: false, allowSwearing: false, sentenceVariation: "medium", allowUselessDetails: false, summary: "术语与事实优先,避免廉价金句。" },
|
|
240
|
+
rhythm: { pace: "balanced", paragraphDensity: "medium_high", allowFragmentedFlow: false, actionOverExplanation: true, summary: "信息给得密,却不铺开解释。" },
|
|
241
|
+
proseRules: [
|
|
242
|
+
'行业事实与程序细节优先,情绪不直说,信息密度高于抒情密度。',
|
|
243
|
+
'场景按「事实 → 动作 → 专业判断 → 后果」组织。',
|
|
244
|
+
'让事实与程序细节扛住叙事重量。',
|
|
245
|
+
],
|
|
246
|
+
dialogueRules: [
|
|
247
|
+
'情绪藏在专业动作与事实选择里。',
|
|
248
|
+
'对话以信息性表达为主,克制。',
|
|
249
|
+
],
|
|
250
|
+
languageRules: [
|
|
251
|
+
'术语与事实优先,避免廉价金句。',
|
|
252
|
+
'语言正式、克制。',
|
|
253
|
+
],
|
|
254
|
+
rhythmRules: [
|
|
255
|
+
'信息给得密,却不铺开解释。',
|
|
256
|
+
'节奏平衡,段落密度中等偏高。',
|
|
257
|
+
],
|
|
258
|
+
defaultAntiAiRuleKeys: ['forbid-direct-preaching', 'forbid-theme-summary', 'risk-repeated-sentence-structure'],
|
|
259
|
+
},
|
|
260
|
+
{
|
|
261
|
+
key: 'absurd-dark-humor',
|
|
262
|
+
name: '反差黑色幽默流',
|
|
263
|
+
description: '用反差、冷感观察与荒诞细节制造黑色幽默。',
|
|
264
|
+
category: '黑色幽默',
|
|
265
|
+
applicableGenres: [
|
|
266
|
+
'都市',
|
|
267
|
+
'黑色幽默',
|
|
268
|
+
'现实',
|
|
269
|
+
],
|
|
270
|
+
tags: ["荒诞", "反差", "冷感"],
|
|
271
|
+
analysisMarkdown: "用反差与荒诞细节放大现实困境,笑点与压迫感并存。",
|
|
272
|
+
narrative: { progressionMode: "contrast_driven", sceneUnitPattern: ["现实细节", "荒诞偏差", "冷反应"], multiPov: false, looping: false, endingStyle: "bitter_aftertaste", summary: "靠反差与冷感观察,不靠热闹吐槽。" },
|
|
273
|
+
character: { allowSelfReflection: false, emotionExpression: "deadpan", defenseMechanisms: ["自嘲", "转移"], facePriority: true, dialogueStyle: "deadpan_colloquial", summary: "情绪藏在冷反应与嘴硬里。" },
|
|
274
|
+
language: { register: "colloquial", roughness: 0.5, allowIncompleteSentences: true, allowSwearing: true, sentenceVariation: "high", allowUselessDetails: true, summary: "允许夹带荒诞杂质与冷幽默节奏。" },
|
|
275
|
+
rhythm: { pace: "balanced", paragraphDensity: "medium_high", allowFragmentedFlow: true, actionOverExplanation: true, summary: "反差点要快落地,不解释笑点。" },
|
|
276
|
+
proseRules: [
|
|
277
|
+
'用反差与荒诞细节放大现实困境,笑点与压迫感并存。',
|
|
278
|
+
'场景按「现实细节 → 荒诞偏差 → 冷反应」组织。',
|
|
279
|
+
'靠反差与冷感观察,不靠热闹吐槽。',
|
|
280
|
+
],
|
|
281
|
+
dialogueRules: [
|
|
282
|
+
'情绪藏在冷反应与嘴硬里。',
|
|
283
|
+
'台词冷面口语化,允许自嘲与转移。',
|
|
284
|
+
],
|
|
285
|
+
languageRules: [
|
|
286
|
+
'允许夹带荒诞杂质与冷幽默节奏。',
|
|
287
|
+
'口语化,句长变化大。',
|
|
288
|
+
],
|
|
289
|
+
rhythmRules: [
|
|
290
|
+
'反差立刻见效,笑点不解释。',
|
|
291
|
+
'节奏平衡,段落密度中等偏高。',
|
|
292
|
+
],
|
|
293
|
+
defaultAntiAiRuleKeys: ['forbid-explicit-psychology', 'forbid-ending-elevation', 'encourage-reality-gap', 'encourage-hard-mouth-compensation'],
|
|
294
|
+
},
|
|
295
|
+
{
|
|
296
|
+
key: 'cultivation-breakthrough',
|
|
297
|
+
name: '修炼突破流',
|
|
298
|
+
description: '以境界突破、战力碾压和资源争夺为核心,强调突破前后的反差与爽感。',
|
|
299
|
+
category: '修炼流',
|
|
300
|
+
applicableGenres: ['仙侠', '玄幻', '都市异能'],
|
|
301
|
+
proseRules: [
|
|
302
|
+
'突破前铺垫压抑与困境,突破时释放能量与威压,突破后立即兑现碾压收益。',
|
|
303
|
+
'场景单元按「困境→闭关/机缘→突破→碾压→新目标」推进。',
|
|
304
|
+
'战力体系严格遵守道藏设定,不随意膨胀;每次突破有明确代价或限制。',
|
|
305
|
+
],
|
|
306
|
+
dialogueRules: [
|
|
307
|
+
'突破前角色隐忍克制,突破后语气自信但不浮夸。',
|
|
308
|
+
'对手从轻视到震惊的反应通过对话和动作体现,不直接解说。',
|
|
309
|
+
],
|
|
310
|
+
languageRules: [
|
|
311
|
+
'战斗场景用短句和动作词,突破场景用感官描写(光/声/压力)。',
|
|
312
|
+
'减少修炼过程的流水账,聚焦关键节点和突破瞬间。',
|
|
313
|
+
],
|
|
314
|
+
rhythmRules: [
|
|
315
|
+
'突破节奏先抑后扬,压抑段不超过3段,突破段要快且有冲击力。',
|
|
316
|
+
'每章至少一个战力或境界的明确进展点。',
|
|
317
|
+
],
|
|
318
|
+
defaultAntiAiRuleKeys: ['forbid-theme-summary', 'forbid-ending-elevation', 'risk-three-paragraphs-exposition'],
|
|
319
|
+
},
|
|
320
|
+
{
|
|
321
|
+
key: 'face-slapping',
|
|
322
|
+
name: '装逼打脸流',
|
|
323
|
+
description: '身份隐藏→被轻视→展露实力→全场震惊,强调反差爽感与节奏控制。',
|
|
324
|
+
category: '爽文流',
|
|
325
|
+
applicableGenres: ['都市', '玄幻', '仙侠', '重生'],
|
|
326
|
+
proseRules: [
|
|
327
|
+
'打脸前三段内必须建立轻视/挑衅,打脸过程不超过两段,震惊反应要充分。',
|
|
328
|
+
'场景单元按「隐藏→挑衅→展露→震惊→新挑衅」循环推进。',
|
|
329
|
+
'主角实力展露要有铺垫和依据,不凭空开挂。',
|
|
330
|
+
],
|
|
331
|
+
dialogueRules: [
|
|
332
|
+
'挑衅者台词要具体且有针对性,避免泛泛的"你也配"。',
|
|
333
|
+
'主角话少而精准,用行动和结果说话,不嘴炮解释。',
|
|
334
|
+
'围观者反应分层:先不信→再震惊→最后讨好/畏惧。',
|
|
335
|
+
],
|
|
336
|
+
languageRules: [
|
|
337
|
+
'打脸场景用短句和动作,震惊场景用群像反应。',
|
|
338
|
+
'避免"全场寂静""众人哗然"等套话,用具体人物反应代替。',
|
|
339
|
+
],
|
|
340
|
+
rhythmRules: [
|
|
341
|
+
'快节奏,打脸间隔不超过3章,每章至少一个小反转。',
|
|
342
|
+
'装逼要克制,主角不主动炫耀,被动展露更有爽感。',
|
|
343
|
+
],
|
|
344
|
+
defaultAntiAiRuleKeys: ['forbid-theme-summary', 'risk-dialogue-too-functional', 'risk-ai-cliche-high'],
|
|
345
|
+
},
|
|
346
|
+
{
|
|
347
|
+
key: 'power-struggle',
|
|
348
|
+
name: '权谋博弈流',
|
|
349
|
+
description: '以信息差、布局和反制为核心,强调对话潜台词与多方博弈。',
|
|
350
|
+
category: '权谋流',
|
|
351
|
+
applicableGenres: ['历史', '宫斗', '官场', '仙侠争霸'],
|
|
352
|
+
proseRules: [
|
|
353
|
+
'每章至少一次信息不对称的利用或破解,布局要有伏笔和回收。',
|
|
354
|
+
'场景单元按「情报→布局→试探→反制→结果」推进。',
|
|
355
|
+
'多方势力各有目标和底线,不做纯粹的工具人反派。',
|
|
356
|
+
],
|
|
357
|
+
dialogueRules: [
|
|
358
|
+
'对话充满潜台词,表面客气实则交锋,关键信息藏在半句和停顿里。',
|
|
359
|
+
'不同势力角色的语言风格和立场要明确区分。',
|
|
360
|
+
'避免角色直接说出计划和意图,通过行动和结果揭示。',
|
|
361
|
+
],
|
|
362
|
+
languageRules: [
|
|
363
|
+
'正式、克制的语言,避免口语化和现代网络用语。',
|
|
364
|
+
'用细节(眼神/手势/器物)暗示人物真实想法。',
|
|
365
|
+
],
|
|
366
|
+
rhythmRules: [
|
|
367
|
+
'中慢节奏,布局段可以慢,但反转和收网段要快。',
|
|
368
|
+
'每3-5章一个小高潮(布局见效或反制成功)。',
|
|
369
|
+
],
|
|
370
|
+
defaultAntiAiRuleKeys: ['forbid-explicit-psychology', 'forbid-direct-preaching', 'risk-dialogue-too-functional'],
|
|
371
|
+
},
|
|
372
|
+
{
|
|
373
|
+
key: 'sweet-romance',
|
|
374
|
+
name: '甜宠撒糖流',
|
|
375
|
+
description: '高糖互动+宠溺细节+情感升温,少虐多甜,强调心动瞬间。',
|
|
376
|
+
category: '言情流',
|
|
377
|
+
applicableGenres: ['现言', '古言', '甜宠', '校园'],
|
|
378
|
+
proseRules: [
|
|
379
|
+
'每章至少一个心动或撒糖细节,情感进展要有明确节点。',
|
|
380
|
+
'场景单元按「日常互动→心动瞬间→关系推进→新暧昧」推进。',
|
|
381
|
+
'误会不超过2章,冲突要小而温馨,不搞虐恋。',
|
|
382
|
+
],
|
|
383
|
+
dialogueRules: [
|
|
384
|
+
'对话自然亲昵,有专属称呼和互动习惯,避免书面化表白。',
|
|
385
|
+
'男主台词宠溺但不油腻,女主可以害羞但不傻白甜。',
|
|
386
|
+
'用对话中的停顿、转移话题暗示心动,不直接说"我喜欢你"。',
|
|
387
|
+
],
|
|
388
|
+
languageRules: [
|
|
389
|
+
'温暖、细腻的语言,多用感官细节(温度/气味/触感)。',
|
|
390
|
+
'避免"心如鹿撞""脸红心跳"等套话,用具体动作代替。',
|
|
391
|
+
],
|
|
392
|
+
rhythmRules: [
|
|
393
|
+
'中慢节奏,日常段可以慢,但心动瞬间要聚焦和放大。',
|
|
394
|
+
'每5章一个关系突破(牵手/拥抱/表白等)。',
|
|
395
|
+
],
|
|
396
|
+
defaultAntiAiRuleKeys: ['forbid-ending-elevation', 'forbid-explicit-psychology', 'encourage-useless-action'],
|
|
397
|
+
},
|
|
398
|
+
{
|
|
399
|
+
key: 'competitive-blood',
|
|
400
|
+
name: '竞技热血流',
|
|
401
|
+
description: '操作细节+战术博弈+赛事逆转,强调燃点密集与成长曲线。',
|
|
402
|
+
category: '竞技流',
|
|
403
|
+
applicableGenres: ['电竞', '体育', '网游', '卡牌'],
|
|
404
|
+
proseRules: [
|
|
405
|
+
'比赛场景要有具体操作/战术细节,不写"他很强"而是写"他怎么强"。',
|
|
406
|
+
'场景单元按「训练/准备→劣势→战术调整→逆转→赛后成长」推进。',
|
|
407
|
+
'对手要有实力和特点,不做纯粹的经验包。',
|
|
408
|
+
],
|
|
409
|
+
dialogueRules: [
|
|
410
|
+
'队友对话有战术讨论和互相鼓励,对手台词有挑衅和认可。',
|
|
411
|
+
'解说/旁白可以有,但不能代替比赛过程本身。',
|
|
412
|
+
'角色在高压下的语言要简短有力,避免长篇大论。',
|
|
413
|
+
],
|
|
414
|
+
languageRules: [
|
|
415
|
+
'比赛场景用短句和动作词,节奏快,有画面感。',
|
|
416
|
+
'操作描述要专业且准确,避免外行话。',
|
|
417
|
+
],
|
|
418
|
+
rhythmRules: [
|
|
419
|
+
'快节奏,比赛段要紧凑,日常训练段可以稍缓。',
|
|
420
|
+
'每场比赛至少一个逆转或高光时刻,每章一个小燃点。',
|
|
421
|
+
],
|
|
422
|
+
defaultAntiAiRuleKeys: ['forbid-theme-summary', 'risk-three-paragraphs-exposition', 'risk-ai-cliche-high'],
|
|
423
|
+
},
|
|
424
|
+
{
|
|
425
|
+
key: 'comedy-roast',
|
|
426
|
+
name: '吐槽搞笑流',
|
|
427
|
+
description: '旁白吐槽+角色反差+无厘头,节奏轻快,强调笑点密度。',
|
|
428
|
+
category: '搞笑流',
|
|
429
|
+
applicableGenres: ['轻小说', '二次元', '都市', '无限流'],
|
|
430
|
+
proseRules: [
|
|
431
|
+
'每章至少3个笑点,笑点来自反差、误解或吐槽,不依赖网络梗。',
|
|
432
|
+
'场景单元按「正常展开→反差/误解→吐槽→意外结果」推进。',
|
|
433
|
+
'搞笑不影响主线推进,笑点服务于剧情和人物。',
|
|
434
|
+
],
|
|
435
|
+
dialogueRules: [
|
|
436
|
+
'主角吐槽要精准且有个人风格,其他角色负责一本正经地制造槽点。',
|
|
437
|
+
'对话节奏快,有来有回,避免冷场。',
|
|
438
|
+
'允许打破第四面墙的吐槽,但不能滥用。',
|
|
439
|
+
],
|
|
440
|
+
languageRules: [
|
|
441
|
+
'口语化、轻快的语言,允许夸张和无厘头。',
|
|
442
|
+
'吐槽用括号或单独段落,不与叙事混淆。',
|
|
443
|
+
],
|
|
444
|
+
rhythmRules: [
|
|
445
|
+
'快节奏,笑点密集,不拖沓。',
|
|
446
|
+
'每段不超过3句,长段落要拆。',
|
|
447
|
+
],
|
|
448
|
+
defaultAntiAiRuleKeys: ['forbid-ending-elevation', 'forbid-direct-preaching', 'encourage-useless-action'],
|
|
449
|
+
},
|
|
450
|
+
{
|
|
451
|
+
key: 'atmosphere-horror',
|
|
452
|
+
name: '氛围惊悚流',
|
|
453
|
+
description: '环境细节+心理暗示+信息延迟,恐惧不直说,靠氛围营造。',
|
|
454
|
+
category: '恐怖流',
|
|
455
|
+
applicableGenres: ['灵异', '惊悚', '克苏鲁', '无限恐怖'],
|
|
456
|
+
proseRules: [
|
|
457
|
+
'恐惧来自未知和异常,不直接描写怪物/鬼魂,用反应和痕迹暗示。',
|
|
458
|
+
'场景单元按「日常→异常细节→误解/忽视→危机爆发→余悸」推进。',
|
|
459
|
+
'信息延迟:读者和主角同时发现异常,不提前剧透。',
|
|
460
|
+
],
|
|
461
|
+
dialogueRules: [
|
|
462
|
+
'角色对话克制,恐惧通过停顿、重复、语无伦次体现。',
|
|
463
|
+
'避免角色直接说"好可怕""有鬼",用行动和反应代替。',
|
|
464
|
+
'关键信息藏在半句和打断里。',
|
|
465
|
+
],
|
|
466
|
+
languageRules: [
|
|
467
|
+
'冷色调、精确的环境描写,多用听觉和触觉(视觉反而少)。',
|
|
468
|
+
'句子短而碎,制造紧张感;长句用于压抑和拖延。',
|
|
469
|
+
'避免"毛骨悚然""不寒而栗"等套话,用具体感官代替。',
|
|
470
|
+
],
|
|
471
|
+
rhythmRules: [
|
|
472
|
+
'慢节奏铺垫,快节奏爆发,爆发后留余悸。',
|
|
473
|
+
'每3章一个小高潮(异常确认或危机爆发)。',
|
|
474
|
+
],
|
|
475
|
+
defaultAntiAiRuleKeys: ['forbid-explicit-psychology', 'forbid-theme-summary', 'risk-even-paragraph-length'],
|
|
476
|
+
},
|
|
477
|
+
{
|
|
478
|
+
key: 'hard-scifi',
|
|
479
|
+
name: '硬核科技流',
|
|
480
|
+
description: '技术细节+逻辑推演+文明思辨,信息密度高,强调设定自洽。',
|
|
481
|
+
category: '科幻流',
|
|
482
|
+
applicableGenres: ['科幻', '星际', '赛博朋克', '机甲'],
|
|
483
|
+
proseRules: [
|
|
484
|
+
'科技设定要有逻辑自洽的原理,不做"黑箱"解释。',
|
|
485
|
+
'场景单元按「问题→技术分析→方案→实施→后果」推进。',
|
|
486
|
+
'技术服务于剧情和人物,不为炫技而炫技。',
|
|
487
|
+
],
|
|
488
|
+
dialogueRules: [
|
|
489
|
+
'专业对话有术语和逻辑,但要让非专业读者能理解核心。',
|
|
490
|
+
'角色争论要有技术依据,不做情绪化争吵。',
|
|
491
|
+
'避免角色直接解说设定,通过问题和讨论揭示。',
|
|
492
|
+
],
|
|
493
|
+
languageRules: [
|
|
494
|
+
'精确、理性的语言,避免模糊和情绪化表达。',
|
|
495
|
+
'技术描述要具体且可想象,不堆砌名词。',
|
|
496
|
+
],
|
|
497
|
+
rhythmRules: [
|
|
498
|
+
'中慢节奏,技术推演段可以慢,但行动段要快。',
|
|
499
|
+
'每5章一个技术突破或危机解决。',
|
|
500
|
+
],
|
|
501
|
+
defaultAntiAiRuleKeys: ['forbid-direct-preaching', 'forbid-theme-summary', 'risk-three-paragraphs-exposition'],
|
|
502
|
+
},]
|
|
503
|
+
|
|
504
|
+
// ---------------------------------------------------------- built-in rules
|
|
505
|
+
|
|
506
|
+
/** 内置全局反 AI 规则(12 条,随插件发布;项目可叠加自定义规则)。 */
|
|
507
|
+
export const BUILTIN_ANTI_AI_RULES: AntiAiRule[] = [
|
|
508
|
+
{
|
|
509
|
+
name: '不许直接解说心理',
|
|
510
|
+
avoid: '用「他感到」「他意识到」这类句式替读者总结人物内心。',
|
|
511
|
+
fix: '改成动作、语气、停顿、环境反馈或结果来呈现。',
|
|
512
|
+
detectPatterns: ['他感到', '她感到', '他意识到', '她意识到', '他明白了', '她明白了'],
|
|
513
|
+
builtin: true,
|
|
514
|
+
key: 'forbid-explicit-psychology',
|
|
515
|
+
severity: 'forbidden',
|
|
516
|
+
riskLevel: 'high',
|
|
517
|
+
autoRewrite: true,
|
|
518
|
+
globalBaselineEnabled: true,
|
|
519
|
+
},
|
|
520
|
+
{
|
|
521
|
+
name: '不许段尾拔高',
|
|
522
|
+
avoid: '在段落或章节收尾处放一句总结式升华(「生活就是…」「说到底…」)。',
|
|
523
|
+
fix: '删掉升华句,把收尾落回具体动作、现场或悬而未决的处境。',
|
|
524
|
+
detectPatterns: ['生活就是', '命运总会', '归根结底', '说到底', '这就是'],
|
|
525
|
+
builtin: true,
|
|
526
|
+
key: 'forbid-ending-elevation',
|
|
527
|
+
severity: 'forbidden',
|
|
528
|
+
riskLevel: 'high',
|
|
529
|
+
autoRewrite: true,
|
|
530
|
+
globalBaselineEnabled: true,
|
|
531
|
+
},
|
|
532
|
+
{
|
|
533
|
+
name: '不许概括主题',
|
|
534
|
+
avoid: '把段落写成中心思想总结或人生道理(「这说明…」「这意味着…」)。',
|
|
535
|
+
fix: '删掉概括,让信息从事态与结果里自然显出来。',
|
|
536
|
+
detectPatterns: ['这说明', '这意味着', '归根结底', '其实就是'],
|
|
537
|
+
builtin: true,
|
|
538
|
+
key: 'forbid-theme-summary',
|
|
539
|
+
severity: 'forbidden',
|
|
540
|
+
riskLevel: 'high',
|
|
541
|
+
autoRewrite: true,
|
|
542
|
+
globalBaselineEnabled: true,
|
|
543
|
+
},
|
|
544
|
+
{
|
|
545
|
+
name: '不许作者说教',
|
|
546
|
+
avoid: '作者替角色或读者下价值判断(「我们都应该…」「人总要学会…」)。',
|
|
547
|
+
fix: '换成角色的具体处境或台词,不做抽象说教。',
|
|
548
|
+
detectPatterns: ['我们都应该', '人总要学会', '真正重要的是'],
|
|
549
|
+
builtin: true,
|
|
550
|
+
key: 'forbid-direct-preaching',
|
|
551
|
+
severity: 'forbidden',
|
|
552
|
+
riskLevel: 'medium',
|
|
553
|
+
autoRewrite: true,
|
|
554
|
+
globalBaselineEnabled: true,
|
|
555
|
+
},
|
|
556
|
+
{
|
|
557
|
+
name: '段落长短过于均匀',
|
|
558
|
+
avoid: '段落长度与节奏过于平均,读起来像范文。',
|
|
559
|
+
fix: '打散段落长短,让句子与段落有自然起伏。',
|
|
560
|
+
detectPatterns: [],
|
|
561
|
+
builtin: true,
|
|
562
|
+
key: 'risk-even-paragraph-length',
|
|
563
|
+
severity: 'risk',
|
|
564
|
+
riskLevel: 'medium',
|
|
565
|
+
autoRewrite: false,
|
|
566
|
+
globalBaselineEnabled: true,
|
|
567
|
+
},
|
|
568
|
+
{
|
|
569
|
+
name: '连段交代没有动作',
|
|
570
|
+
avoid: '连续几段只在交代背景,没有动作与现场感。',
|
|
571
|
+
fix: '插入动作、对话、环境反馈,把连段说明拆开。',
|
|
572
|
+
detectPatterns: [],
|
|
573
|
+
builtin: true,
|
|
574
|
+
key: 'risk-three-paragraphs-exposition',
|
|
575
|
+
severity: 'risk',
|
|
576
|
+
riskLevel: 'high',
|
|
577
|
+
autoRewrite: false,
|
|
578
|
+
globalBaselineEnabled: true,
|
|
579
|
+
},
|
|
580
|
+
{
|
|
581
|
+
name: '对话只剩功能',
|
|
582
|
+
avoid: '对话只推进信息,没有语气差异与生活噪音(「告诉你…」「我们现在要…」)。',
|
|
583
|
+
fix: '补入停顿、绕弯、语气差异与无效信息。',
|
|
584
|
+
detectPatterns: ['告诉你', '我们现在要', '接下来就'],
|
|
585
|
+
builtin: true,
|
|
586
|
+
key: 'risk-dialogue-too-functional',
|
|
587
|
+
severity: 'forbidden',
|
|
588
|
+
riskLevel: 'high',
|
|
589
|
+
autoRewrite: true,
|
|
590
|
+
globalBaselineEnabled: true,
|
|
591
|
+
},
|
|
592
|
+
{
|
|
593
|
+
name: '句式重复率偏高',
|
|
594
|
+
avoid: '连续使用同构句式(「首先…然后…接着…最后…」),读起来机械。',
|
|
595
|
+
fix: '拉开句长与起句方式,打散结构。',
|
|
596
|
+
detectPatterns: ['首先', '然后', '接着', '最后'],
|
|
597
|
+
builtin: true,
|
|
598
|
+
key: 'risk-repeated-sentence-structure',
|
|
599
|
+
severity: 'forbidden',
|
|
600
|
+
riskLevel: 'high',
|
|
601
|
+
autoRewrite: true,
|
|
602
|
+
globalBaselineEnabled: true,
|
|
603
|
+
},
|
|
604
|
+
{
|
|
605
|
+
name: 'AI 高频套话',
|
|
606
|
+
avoid: '滥用"不禁""仿佛""一时间""不由得""顿时""然而""缓缓""轻轻""微微""似乎""终于"等模式词及套路比喻。',
|
|
607
|
+
fix: '用具体、有画面感的表达替换套话;每个比喻都应当是新造的。',
|
|
608
|
+
detectPatterns: ['不禁', '仿佛', '一时间', '不由得', '顿时', '缓缓', '轻轻', '微微'],
|
|
609
|
+
builtin: true,
|
|
610
|
+
key: 'risk-ai-cliche-high',
|
|
611
|
+
severity: 'forbidden',
|
|
612
|
+
riskLevel: 'high',
|
|
613
|
+
autoRewrite: true,
|
|
614
|
+
globalBaselineEnabled: true,
|
|
615
|
+
},
|
|
616
|
+
{
|
|
617
|
+
name: '多点无用小动作',
|
|
618
|
+
avoid: '(鼓励类)通篇没有真实但不推动剧情的小动作,人物显得空。',
|
|
619
|
+
fix: '补入挠头、点烟、抠包装、挪椅子之类的小动作,添人味与生活感。',
|
|
620
|
+
detectPatterns: [],
|
|
621
|
+
builtin: true,
|
|
622
|
+
key: 'encourage-useless-action',
|
|
623
|
+
severity: 'encourage',
|
|
624
|
+
riskLevel: 'low',
|
|
625
|
+
autoRewrite: false,
|
|
626
|
+
globalBaselineEnabled: false,
|
|
627
|
+
},
|
|
628
|
+
{
|
|
629
|
+
name: '多点预期落差',
|
|
630
|
+
avoid: '(鼓励类)人物预期与现实结果完全一致,没有落差。',
|
|
631
|
+
fix: '把预期与实际结果之间的差距写出来,制造张力。',
|
|
632
|
+
detectPatterns: [],
|
|
633
|
+
builtin: true,
|
|
634
|
+
key: 'encourage-reality-gap',
|
|
635
|
+
severity: 'encourage',
|
|
636
|
+
riskLevel: 'low',
|
|
637
|
+
autoRewrite: false,
|
|
638
|
+
globalBaselineEnabled: false,
|
|
639
|
+
},
|
|
640
|
+
{
|
|
641
|
+
name: '多点嘴硬找补',
|
|
642
|
+
avoid: '(鼓励类)人物吃瘪后没有任何维持体面的反应。',
|
|
643
|
+
fix: '补一句嘴硬找补或自我合理化,保住人设温度。',
|
|
644
|
+
detectPatterns: [],
|
|
645
|
+
builtin: true,
|
|
646
|
+
key: 'encourage-hard-mouth-compensation',
|
|
647
|
+
severity: 'encourage',
|
|
648
|
+
riskLevel: 'low',
|
|
649
|
+
autoRewrite: false,
|
|
650
|
+
globalBaselineEnabled: false,
|
|
651
|
+
},
|
|
652
|
+
{
|
|
653
|
+
name: '禁止心中暗道/脑海浮现',
|
|
654
|
+
avoid: '用"心中暗道""脑海中""心里想""暗自思忖"等句式直接暴露角色内心。',
|
|
655
|
+
fix: '把内心活动改成动作、表情、语气或行为结果,让读者自己推断。',
|
|
656
|
+
detectPatterns: ['心中暗道', '脑海中', '心里想', '暗自思忖', '心中暗想', '心里暗道'],
|
|
657
|
+
builtin: true,
|
|
658
|
+
key: 'forbid-inner-voice',
|
|
659
|
+
severity: 'forbidden',
|
|
660
|
+
riskLevel: 'high',
|
|
661
|
+
autoRewrite: true,
|
|
662
|
+
globalBaselineEnabled: true,
|
|
663
|
+
},
|
|
664
|
+
{
|
|
665
|
+
name: '禁止仿佛/好像比喻滥用',
|
|
666
|
+
avoid: '单章"仿佛""好像""犹如""宛如"等比喻词超过5次,产生AI套路感。',
|
|
667
|
+
fix: '减少比喻频率,每个比喻必须是新造的、有具体画面的,不用陈词滥调。',
|
|
668
|
+
detectPatterns: ['仿佛', '好像', '犹如', '宛如', '好似'],
|
|
669
|
+
builtin: true,
|
|
670
|
+
key: 'forbid-simile-overuse',
|
|
671
|
+
severity: 'forbidden',
|
|
672
|
+
riskLevel: 'high',
|
|
673
|
+
autoRewrite: true,
|
|
674
|
+
globalBaselineEnabled: true,
|
|
675
|
+
},
|
|
676
|
+
{
|
|
677
|
+
name: '禁止过度排比堆砌',
|
|
678
|
+
avoid: '连续3句以上相同句式或排比结构,显得机械和刻意。',
|
|
679
|
+
fix: '打散句式,用长短句交替,排比不超过2句。',
|
|
680
|
+
detectPatterns: [],
|
|
681
|
+
builtin: true,
|
|
682
|
+
key: 'forbid-over-parallelism',
|
|
683
|
+
severity: 'forbidden',
|
|
684
|
+
riskLevel: 'high',
|
|
685
|
+
autoRewrite: true,
|
|
686
|
+
globalBaselineEnabled: true,
|
|
687
|
+
},
|
|
688
|
+
{
|
|
689
|
+
name: '禁止角色全知泄露',
|
|
690
|
+
avoid: '角色说出或知道他/她不可能知道的信息,破坏视角一致性。',
|
|
691
|
+
fix: '严格遵守视角限制,角色只能基于已有信息行动和判断。',
|
|
692
|
+
detectPatterns: [],
|
|
693
|
+
builtin: true,
|
|
694
|
+
key: 'forbid-omniscient-leak',
|
|
695
|
+
severity: 'forbidden',
|
|
696
|
+
riskLevel: 'high',
|
|
697
|
+
autoRewrite: true,
|
|
698
|
+
globalBaselineEnabled: true,
|
|
699
|
+
},
|
|
700
|
+
{
|
|
701
|
+
name: '鼓励环境细节锚定',
|
|
702
|
+
avoid: '(鼓励类)情绪和氛围缺少具体环境物件锚定,全靠抽象形容词。',
|
|
703
|
+
fix: '用具体物件、光线、声音、温度等环境细节承载情绪,不直接说"紧张""悲伤"。',
|
|
704
|
+
detectPatterns: [],
|
|
705
|
+
builtin: true,
|
|
706
|
+
key: 'encourage-env-anchor',
|
|
707
|
+
severity: 'encourage',
|
|
708
|
+
riskLevel: 'low',
|
|
709
|
+
autoRewrite: false,
|
|
710
|
+
globalBaselineEnabled: false,
|
|
711
|
+
},
|
|
712
|
+
{
|
|
713
|
+
name: '鼓励角色语言差异化',
|
|
714
|
+
avoid: '(鼓励类)所有角色说话风格雷同,没有口头禅、用词习惯或句式差异。',
|
|
715
|
+
fix: '给每个主要角色设定独特的语言习惯(口头禅/用词偏好/句式长短),对话时严格区分。',
|
|
716
|
+
detectPatterns: [],
|
|
717
|
+
builtin: true,
|
|
718
|
+
key: 'encourage-voice-diff',
|
|
719
|
+
severity: 'encourage',
|
|
720
|
+
riskLevel: 'low',
|
|
721
|
+
autoRewrite: false,
|
|
722
|
+
globalBaselineEnabled: false,
|
|
723
|
+
},]
|
|
724
|
+
|
|
725
|
+
/** 内置题材基底库(常用网文题材树,跨书复用)。 */
|
|
726
|
+
export const BUILTIN_GENRE_LIBRARY: GenreNode[] = [
|
|
727
|
+
{
|
|
728
|
+
name: '仙侠修真',
|
|
729
|
+
description: '以修仙境界、宗门斗争、法宝丹药为核心,读者期待从凡人到强者的成长与长生问道。',
|
|
730
|
+
id: 'genre_xianxia',
|
|
731
|
+
template: '落笔在修行路径、因果代价与宗门抉择上。',
|
|
732
|
+
children: [
|
|
733
|
+
{ name: '凡人流', description: '资质平凡、步步为营,靠资源积累与心机博弈逆袭,强调真实感与代入感。', children: [] },
|
|
734
|
+
{ name: '苟道流', description: '主角苟且发育、藏锋敛芒,坐收渔利,强调生存智慧与反差爽点。', children: [] },
|
|
735
|
+
{ name: '争霸流', description: '宗门、王朝或大陆争锋,主角由弱到强整合势力,强调格局与权谋。', children: [] },
|
|
736
|
+
],
|
|
737
|
+
},
|
|
738
|
+
{
|
|
739
|
+
name: '都市异能',
|
|
740
|
+
description: '现代都市背景叠加超能力,读者期待隐藏身份、扮猪吃虎与日常反差。',
|
|
741
|
+
id: 'genre_urban_power',
|
|
742
|
+
template: '强调异能觉醒后的能力增长、都市隐藏与碾压打脸。',
|
|
743
|
+
children: [
|
|
744
|
+
{ name: '异能升级', description: '觉醒超能力后不断变强,隐藏于都市,遇敌碾压。', children: [] },
|
|
745
|
+
{ name: '重生复仇', description: '重生回到过去,利用先知先觉改变命运、清算仇敌。', children: [] },
|
|
746
|
+
{ name: '商业经营', description: '以超能力或见识经商扩张,建立商业帝国,强调经营爽感。', children: [] },
|
|
747
|
+
],
|
|
748
|
+
},
|
|
749
|
+
{
|
|
750
|
+
name: '悬疑推理',
|
|
751
|
+
description: '以谜题、案件与真相揭露为核心,读者期待线索层层展开与反转。',
|
|
752
|
+
id: 'genre_mystery',
|
|
753
|
+
template: '强调公平线索、逻辑推演与谜局层层递进、回收。',
|
|
754
|
+
children: [
|
|
755
|
+
{ name: '本格推理', description: '公平线索、逻辑推演,读者可与主角一同解谜。', children: [] },
|
|
756
|
+
{ name: '刑侦探案', description: '警察或侦探视角连续破案,案件串联主线,强调现实与人性。', children: [] },
|
|
757
|
+
{ name: '无限流', description: '主角穿梭于不同副本世界解谜求生,副本之间累积成长。', children: [] },
|
|
758
|
+
],
|
|
759
|
+
},
|
|
760
|
+
{
|
|
761
|
+
name: '玄幻奇幻',
|
|
762
|
+
description: '异世界或架空大陆的冒险成长,读者期待宏大世界观、奇遇与战力突破。',
|
|
763
|
+
id: 'genre_fantasy',
|
|
764
|
+
template: '强调金手指、打脸逆袭与世界/境界阶梯式扩展。',
|
|
765
|
+
children: [
|
|
766
|
+
{ name: '学院流', description: '入学修炼、同窗竞争、大赛扬名,强调青春感与阶梯式打脸。', children: [] },
|
|
767
|
+
{ name: '废柴逆袭', description: '开局废柴受辱,觉醒金手指后一路逆袭打脸,强调反差与爽点。', children: [] },
|
|
768
|
+
{ name: '诸天万界', description: '穿越诸天世界收集资源与能力,强调世界多样性与成长曲线。', children: [] },
|
|
769
|
+
],
|
|
770
|
+
},
|
|
771
|
+
{
|
|
772
|
+
name: '历史军事',
|
|
773
|
+
description: '以历史时代为背景的争霸、谋略或军旅故事,读者期待权谋博弈与时代质感。',
|
|
774
|
+
id: 'genre_history',
|
|
775
|
+
template: '强调乱世崛起、战略人心与时代质感。',
|
|
776
|
+
children: [
|
|
777
|
+
{ name: '王朝争霸', description: '乱世崛起、招贤纳士、逐鹿天下,强调战略与人心。', children: [] },
|
|
778
|
+
{ name: '穿越种田', description: '穿越古代发展生产、经营家族,强调建设感与生活细节。', children: [] },
|
|
779
|
+
],
|
|
780
|
+
},
|
|
781
|
+
{
|
|
782
|
+
name: '末世科幻',
|
|
783
|
+
description: '末世危机或科幻设定下的生存与重建,读者期待资源管理、危机升级与人性考验。',
|
|
784
|
+
id: 'genre_apocalypse',
|
|
785
|
+
template: '强调末世压力、基地建设与能力进化中的危机求生。',
|
|
786
|
+
children: [
|
|
787
|
+
{ name: '基地经营', description: '建立基地、收集资源、抵御危机,强调建设与扩张。', children: [] },
|
|
788
|
+
{ name: '进化觉醒', description: '末世异变中觉醒能力不断进化,强调战力成长与危机求生。', children: [] },
|
|
789
|
+
],
|
|
790
|
+
},
|
|
791
|
+
{
|
|
792
|
+
name: '都市生活',
|
|
793
|
+
description: '现代都市日常背景,无超能力或超能力为辅,读者期待身份反差、职场逆袭与生活烟火气。',
|
|
794
|
+
id: 'genre_urban_life',
|
|
795
|
+
template: '强调性格反差、生活细节与烟火气中的人情与反转。',
|
|
796
|
+
children: [
|
|
797
|
+
{ name: '赘婿逆袭', description: '开局隐忍赘婿,展露真实身份后一路打脸,强调身份反差与爽感。', children: [] },
|
|
798
|
+
{ name: '神医归来', description: '医术高超的主角回归都市,治病救人积累人脉,强调专业碾压与感恩回馈。', children: [] },
|
|
799
|
+
{ name: '兵王归隐', description: '退役兵王/特工回归都市,低调行事却屡被招惹,强调武力碾压与守护。', children: [] },
|
|
800
|
+
{ name: '奶爸日常', description: '主角带娃生活,温馨治愈与成长并行,强调亲子互动与生活细节。', children: [] },
|
|
801
|
+
{ name: '校园青春', description: '校园背景的成长与恋爱,强调青涩感、友情与梦想。', children: [] },
|
|
802
|
+
{ name: '鉴宝捡漏', description: '古玩/收藏/拍卖背景,主角凭眼力捡漏暴富,强调专业知识与反差爽感。', children: [] },
|
|
803
|
+
],
|
|
804
|
+
},
|
|
805
|
+
{
|
|
806
|
+
name: '言情',
|
|
807
|
+
description: '以情感关系为核心,读者期待心动、拉扯、甜虐交织与情感归宿。',
|
|
808
|
+
id: 'genre_romance',
|
|
809
|
+
template: '强调情感拉扯、关系升温与情绪节拍。',
|
|
810
|
+
children: [
|
|
811
|
+
{ name: '现言甜宠', description: '现代背景甜蜜恋爱,男主强势专一,强调撒糖与日常互动。', children: [] },
|
|
812
|
+
{ name: '古言宫斗', description: '古代后宫/宅斗背景,女主在权谋中求生与上位,强调心机与反转。', children: [] },
|
|
813
|
+
{ name: '虐恋重生', description: '前世被虐重生后改写命运,爱恨交织,强调复仇与情感救赎。', children: [] },
|
|
814
|
+
{ name: '快穿女配', description: '穿梭不同世界完成任务,女主逆袭原剧情,强调多变设定与成长。', children: [] },
|
|
815
|
+
{ name: '年代文', description: '七八十年代背景,家长里短与发家致富,强调时代质感与生活细节。', children: [] },
|
|
816
|
+
],
|
|
817
|
+
},
|
|
818
|
+
{
|
|
819
|
+
name: '游戏竞技',
|
|
820
|
+
description: '以游戏或体育竞技为舞台,读者期待操作碾压、战术博弈与冠军荣耀。',
|
|
821
|
+
id: 'genre_esports',
|
|
822
|
+
template: '强调操作细节、团队配合与赛事热血、逆转。',
|
|
823
|
+
children: [
|
|
824
|
+
{ name: '电竞荣耀', description: '职业电竞选手成长,强调操作细节、团队配合与赛事热血。', children: [] },
|
|
825
|
+
{ name: '网游重生', description: '重生回游戏开服前,凭先知优势抢占资源,强调攻略与碾压。', children: [] },
|
|
826
|
+
{ name: '体育竞技', description: '篮球/足球/赛车等体育项目,强调训练成长、比赛逆转与体育精神。', children: [] },
|
|
827
|
+
{ name: '卡牌桌游', description: '卡牌/桌游/战棋背景,强调策略构筑与阵容搭配。', children: [] },
|
|
828
|
+
],
|
|
829
|
+
},
|
|
830
|
+
{
|
|
831
|
+
name: '二次元轻小说',
|
|
832
|
+
description: 'ACG风格叙事,节奏轻快,设定新奇,读者期待脑洞展开与角色萌点。',
|
|
833
|
+
id: 'genre_light_novel',
|
|
834
|
+
template: '强调新奇设定、角色个性与轻松反套路的喜剧节奏。',
|
|
835
|
+
children: [
|
|
836
|
+
{ name: '异世界穿越', description: '穿越到异世界获得能力/身份,强调新奇设定与冒险展开。', children: [] },
|
|
837
|
+
{ name: '系统流', description: '主角获得系统辅助成长,任务/奖励驱动剧情,强调数值与反馈。', children: [] },
|
|
838
|
+
{ name: '搞笑日常', description: '以吐槽和反差制造笑点,角色个性鲜明,强调轻松愉快。', children: [] },
|
|
839
|
+
{ name: '反派转生', description: '转生成游戏/小说中的反派角色,利用剧情认知规避死亡结局,强调反转与谋略。', children: [] },
|
|
840
|
+
],
|
|
841
|
+
},
|
|
842
|
+
{
|
|
843
|
+
name: '武侠',
|
|
844
|
+
description: '江湖侠义背景,武功秘籍、门派恩怨、家国情怀,读者期待侠气与江湖质感。',
|
|
845
|
+
id: 'genre_wuxia',
|
|
846
|
+
template: '强调江湖恩怨、武功描写与侠义气的抉择。',
|
|
847
|
+
children: [
|
|
848
|
+
{ name: '传统武侠', description: '金庸/古龙风格,江湖恩怨与侠义精神,强调武功描写与人情世故。', children: [] },
|
|
849
|
+
{ name: '江湖恩怨', description: '门派/家族/帮会争斗,主角在江湖中成长与抉择,强调义气与复仇。', children: [] },
|
|
850
|
+
{ name: '庙堂江湖', description: '朝堂与江湖交织,武侠与权谋结合,强调格局与抉择。', children: [] },
|
|
851
|
+
],
|
|
852
|
+
},
|
|
853
|
+
{
|
|
854
|
+
name: '现实题材',
|
|
855
|
+
description: '贴近现实生活的行业/职场故事,读者期待专业质感、人性刻画与现实共鸣。',
|
|
856
|
+
id: 'genre_realistic',
|
|
857
|
+
template: '强调行业专业、人性博弈与现实质感。',
|
|
858
|
+
children: [
|
|
859
|
+
{ name: '职场商战', description: '商场/职场博弈,主角从底层崛起,强调商业谋略与人际周旋。', children: [] },
|
|
860
|
+
{ name: '官场沉浮', description: '体制内升迁与抉择,强调政治智慧与现实质感。', children: [] },
|
|
861
|
+
{ name: '医疗行业', description: '医院/医生视角,治病救人与行业生态,强调专业与人性。', children: [] },
|
|
862
|
+
{ name: '法律政律', description: '律师/法官视角,案件辩护与司法博弈,强调逻辑与正义。', children: [] },
|
|
863
|
+
],
|
|
864
|
+
},
|
|
865
|
+
{
|
|
866
|
+
name: '恐怖灵异',
|
|
867
|
+
description: '超自然/惊悚背景,读者期待氛围营造、悬念反转与心理恐惧。',
|
|
868
|
+
id: 'genre_horror',
|
|
869
|
+
template: '强调氛围营造、心理恐惧与规则/文化诡异。',
|
|
870
|
+
children: [
|
|
871
|
+
{ name: '灵异惊悚', description: '鬼魂/诅咒/灵异事件,强调氛围营造与心理恐惧。', children: [] },
|
|
872
|
+
{ name: '克苏鲁', description: '不可名状的未知存在与疯狂,强调悬疑与绝望感。', children: [] },
|
|
873
|
+
{ name: '民俗诡异', description: '中国民间习俗/禁忌/传说,强调地域文化与诡异氛围。', children: [] },
|
|
874
|
+
{ name: '无限恐怖', description: '穿梭恐怖副本求生,强调规则破解与团队协作。', children: [] },
|
|
875
|
+
],
|
|
876
|
+
},
|
|
877
|
+
{
|
|
878
|
+
name: '科幻',
|
|
879
|
+
description: '未来/太空/科技背景,读者期待宏大设定、技术想象与文明思辨。',
|
|
880
|
+
id: 'genre_sci_fi',
|
|
881
|
+
template: '强调科技想象、宇宙尺度与文明/命运抉择。',
|
|
882
|
+
children: [
|
|
883
|
+
{ name: '星际文明', description: '太空探索与文明碰撞,强调宇宙尺度与科技发展。', children: [] },
|
|
884
|
+
{ name: '机甲战争', description: '机甲驾驶与星际战争,强调战斗场面与军人成长。', children: [] },
|
|
885
|
+
{ name: '赛博朋克', description: '高科技低生活的近未来,义体/黑客/大企业,强调反差与反叛。', children: [] },
|
|
886
|
+
{ name: '时间穿梭', description: '时间旅行/平行世界,强调因果逻辑与命运抉择。', children: [] },
|
|
887
|
+
],
|
|
888
|
+
},]
|
|
889
|
+
|
|
890
|
+
/** 内置常用推进模式。 */
|
|
891
|
+
export const BUILTIN_PROGRESSION_MODES: ProgressionMode[] = [
|
|
892
|
+
{
|
|
893
|
+
name: '升级变强',
|
|
894
|
+
driver: '主角的实力、境界或能力持续增长,读者期待每次突破带来的碾压与认可。',
|
|
895
|
+
readerExpectation: '每隔几章有一次明确的实力提升或打脸兑现;大境界突破要有仪式感。',
|
|
896
|
+
payoffs: ['突破境界', '学会新技能', '越级战胜强敌', '当众打脸质疑者'],
|
|
897
|
+
risks: ['升级重复套路', '战力膨胀失控', '无铺垫强行突破'],
|
|
898
|
+
primary: false,
|
|
899
|
+
},
|
|
900
|
+
{
|
|
901
|
+
name: '经营扩张',
|
|
902
|
+
driver: '主角的产业、势力或领地不断扩张,资源复利滚雪球。',
|
|
903
|
+
readerExpectation: '经营投入有可感知的回报,扩张遇到新挑战并解决。',
|
|
904
|
+
payoffs: ['新产业上线', '规模翻倍', '吞并对手', '资源闭环成型'],
|
|
905
|
+
risks: ['过程枯燥', '扩张无阻力', '数值失衡'],
|
|
906
|
+
primary: false,
|
|
907
|
+
},
|
|
908
|
+
{
|
|
909
|
+
name: '解谜揭露',
|
|
910
|
+
driver: '主线谜团(身世、阴谋、世界观真相)持续牵引读者,每揭开一层又引出更深一层。',
|
|
911
|
+
readerExpectation: '定期有真相碎片放出,回收旧伏笔、埋设新伏笔。',
|
|
912
|
+
payoffs: ['伏笔回收', '身份揭露', '阴谋浮出水面', '反转打脸'],
|
|
913
|
+
risks: ['谜题拖太久', '伏笔忘记回收', '反转生硬'],
|
|
914
|
+
primary: false,
|
|
915
|
+
},
|
|
916
|
+
{
|
|
917
|
+
name: '渔翁得利',
|
|
918
|
+
driver: '强敌相互厮杀,主角躲在暗处观察、收割,风险由他人承担、果实由主角获取。',
|
|
919
|
+
readerExpectation: '冲突升级时主角以最小代价获取最大收益,且不暴露自身。',
|
|
920
|
+
payoffs: ['坐收渔利', '捡漏宝物', '敌人两败俱伤', '信息差获利'],
|
|
921
|
+
risks: ['重复套路', '收割太轻易', '主角全程无风险'],
|
|
922
|
+
primary: false,
|
|
923
|
+
},
|
|
924
|
+
{
|
|
925
|
+
name: '关系拉扯',
|
|
926
|
+
driver: '人物关系(知己、对手、师徒、情感线)的张力与变化持续推动剧情。',
|
|
927
|
+
readerExpectation: '关系有进有退、有误会与和解,情绪起伏带动阅读欲。',
|
|
928
|
+
payoffs: ['关系升温', '信任建立', '背叛与挽回', '并肩作战'],
|
|
929
|
+
risks: ['情感线停滞', '工业糖精', '为虐而虐'],
|
|
930
|
+
primary: false,
|
|
931
|
+
},
|
|
932
|
+
{
|
|
933
|
+
key: "story_mode_power_root",
|
|
934
|
+
name: "爽感推进",
|
|
935
|
+
template: "强调优势展示、局势翻转和清晰的读者爽点兑现。",
|
|
936
|
+
driver: "通过主角优势兑现、认知反差和局势翻转持续制造爽感。",
|
|
937
|
+
readerExpectation: "读者持续看到压制、立威、反转和规则被改写的满足感。",
|
|
938
|
+
payoffs: ["立威", "打破质疑", "扩大影响力", "阶段性碾压"],
|
|
939
|
+
risks: ["主角长期被动", "爽点迟迟不兑现"],
|
|
940
|
+
primary: true,
|
|
941
|
+
progressionUnits: ["立威", "打破质疑", "扩大影响力", "阶段性碾压"],
|
|
942
|
+
allowedConflictForms: ["身份压制", "认知偏差", "权力挑战", "规则重写"],
|
|
943
|
+
forbiddenConflictForms: ["长期弱势求生", "持续吃瘪不反击"],
|
|
944
|
+
conflictCeiling: "high",
|
|
945
|
+
chapterUnit: "每章推进一次压制、反转或立威结果。",
|
|
946
|
+
volumeReward: "卷末形成更大范围的承认、恐惧、臣服或秩序改写。",
|
|
947
|
+
mandatorySignals: ["优势感", "反差感", "立威场面"],
|
|
948
|
+
antiSignals: ["主角长期被动", "爽点迟迟不兑现"],
|
|
949
|
+
resolutionStyle: "尽快兑现主角优势,让冲突成为展示力量与地位的舞台。",
|
|
950
|
+
},
|
|
951
|
+
{
|
|
952
|
+
key: "story_mode_build_root",
|
|
953
|
+
name: "建设经营",
|
|
954
|
+
template: "让世界随着主角行动而变得更丰富、更稳固、更有回报。",
|
|
955
|
+
driver: "通过积累、扩张、经营和建设成果持续制造成就感。",
|
|
956
|
+
readerExpectation: "读者能看到资源变多、地盘变稳、系统变完整的满足感。",
|
|
957
|
+
payoffs: ["积累资源", "建设节点", "经营升级", "阶段性收成"],
|
|
958
|
+
risks: ["主驱动变成纯战斗文", "长期看不到收成"],
|
|
959
|
+
primary: true,
|
|
960
|
+
progressionUnits: ["积累资源", "建设节点", "经营升级", "阶段性收成"],
|
|
961
|
+
allowedConflictForms: ["资源压力", "经营竞争", "发展阻碍"],
|
|
962
|
+
forbiddenConflictForms: ["反派长期压过建设主线", "全靠大战推进"],
|
|
963
|
+
conflictCeiling: "medium",
|
|
964
|
+
chapterUnit: "每章推进一个可见的经营或建设单位。",
|
|
965
|
+
volumeReward: "卷末给出一个更稳、更大、更丰富的成果面貌。",
|
|
966
|
+
mandatorySignals: ["积累", "建设过程", "成果展示"],
|
|
967
|
+
antiSignals: ["主驱动变成纯战斗文", "长期看不到收成"],
|
|
968
|
+
resolutionStyle: "优先用经营、组织、建设和资源调度化解问题。",
|
|
969
|
+
},
|
|
970
|
+
{
|
|
971
|
+
key: "story_mode_healing_root",
|
|
972
|
+
name: "日常治愈",
|
|
973
|
+
template: "矛盾可以有,但不能破坏回暖感和陪伴感。",
|
|
974
|
+
driver: "通过陪伴、修复、生活细节和关系回暖持续吸引读者。",
|
|
975
|
+
readerExpectation: "读者反复获得安稳、温柔、回暖和情绪落地的满足感。",
|
|
976
|
+
payoffs: ["生活日常", "陪伴修复", "小问题解决", "关系回温"],
|
|
977
|
+
risks: ["高压主线喧宾夺主", "治愈感被反复打断"],
|
|
978
|
+
primary: true,
|
|
979
|
+
progressionUnits: ["生活日常", "陪伴修复", "小问题解决", "关系回温"],
|
|
980
|
+
allowedConflictForms: ["低到中烈度困境", "关系误差", "生活压力"],
|
|
981
|
+
forbiddenConflictForms: ["持续高压对抗", "黑化式推进", "无休止背刺"],
|
|
982
|
+
conflictCeiling: "low",
|
|
983
|
+
chapterUnit: "每章围绕一个生活片段或情绪修复点展开。",
|
|
984
|
+
volumeReward: "卷末让读者感到人物状态更稳、更暖、更愿意继续生活。",
|
|
985
|
+
mandatorySignals: ["生活感", "安抚点", "关系回暖"],
|
|
986
|
+
antiSignals: ["高压主线喧宾夺主", "治愈感被反复打断"],
|
|
987
|
+
resolutionStyle: "用陪伴、理解与日常小修补把问题化掉。",
|
|
988
|
+
},
|
|
989
|
+
{
|
|
990
|
+
key: "story_mode_comedy_root",
|
|
991
|
+
name: "喜剧整活",
|
|
992
|
+
template: "轻松不是语气标签,而是章节结构里持续兑现的笑点机制。",
|
|
993
|
+
driver: "通过反差、包袱、误会和整活节奏持续制造轻松爽快感。",
|
|
994
|
+
readerExpectation: "读者频繁获得笑点、反套路和情绪减压体验。",
|
|
995
|
+
payoffs: ["设包袱", "误会升级", "反差回收", "局面失控"],
|
|
996
|
+
risks: ["长时间严肃无包袱", "笑点全靠口癖与段子堆"],
|
|
997
|
+
primary: true,
|
|
998
|
+
progressionUnits: ["设包袱", "误会升级", "反差回收", "局面失控"],
|
|
999
|
+
allowedConflictForms: ["误会", "反差", "社死", "整活翻车"],
|
|
1000
|
+
forbiddenConflictForms: ["长篇沉重压抑线长期占主导", "笑点没有回收"],
|
|
1001
|
+
conflictCeiling: "medium",
|
|
1002
|
+
chapterUnit: "每章至少要推进一个有效笑点结构。",
|
|
1003
|
+
volumeReward: "卷末形成更大的整活名场面或误会共同体。",
|
|
1004
|
+
mandatorySignals: ["反差", "回收", "轻松释放"],
|
|
1005
|
+
antiSignals: ["长时间严肃无包袱", "笑点全靠口癖与段子堆"],
|
|
1006
|
+
resolutionStyle: "用包袱回收与失控场面完成释放。",
|
|
1007
|
+
},
|
|
1008
|
+
{
|
|
1009
|
+
key: "story_mode_mystery_root",
|
|
1010
|
+
name: "悬念博弈",
|
|
1011
|
+
template: "读者要持续感觉自己在往更深的真相推进。",
|
|
1012
|
+
driver: "通过信息差、推演和博弈升级持续制造想追下去的欲望。",
|
|
1013
|
+
readerExpectation: "读者不断获得谜面推进、推理快感和布局回收的满足。",
|
|
1014
|
+
payoffs: ["抛出疑点", "收集线索", "推演验证", "局势反转"],
|
|
1015
|
+
risks: ["谜团只堆不解", "答案靠天降"],
|
|
1016
|
+
primary: true,
|
|
1017
|
+
progressionUnits: ["抛出疑点", "收集线索", "推演验证", "局势反转"],
|
|
1018
|
+
allowedConflictForms: ["信息差", "隐藏动机", "智性对抗"],
|
|
1019
|
+
forbiddenConflictForms: ["为了保密故意不讲理", "纯拼体力,推演感被吃掉"],
|
|
1020
|
+
conflictCeiling: "high",
|
|
1021
|
+
chapterUnit: "每章推进一个新疑点或一个旧疑点的验证。",
|
|
1022
|
+
volumeReward: "卷末揭开一层更大的真相或完成一次关键博弈。",
|
|
1023
|
+
mandatorySignals: ["线索", "推演", "反制"],
|
|
1024
|
+
antiSignals: ["谜团只堆不解", "答案靠天降"],
|
|
1025
|
+
resolutionStyle: "通过证据链、推演和布局完成反制。",
|
|
1026
|
+
},
|
|
1027
|
+
{
|
|
1028
|
+
key: "story_mode_relationship_root",
|
|
1029
|
+
name: "关系情感",
|
|
1030
|
+
template: "重点不是单纯堆冲突,而是让关系状态持续变化并兑现读者期待。",
|
|
1031
|
+
driver: "通过人物关系的靠近、拉扯、错位与回收,持续制造追读动力。",
|
|
1032
|
+
readerExpectation: "读者不断获得关系变化、情感张力和关键情绪兑现。",
|
|
1033
|
+
payoffs: ["关系建立", "情绪拉扯", "信任变化", "节点兑现"],
|
|
1034
|
+
risks: ["关系原地踏步", "设定堆在那儿,互动没有"],
|
|
1035
|
+
primary: true,
|
|
1036
|
+
progressionUnits: ["关系建立", "情绪拉扯", "信任变化", "节点兑现"],
|
|
1037
|
+
allowedConflictForms: ["关系误差", "情感错位", "现实阻力", "价值观摩擦"],
|
|
1038
|
+
forbiddenConflictForms: ["关系线长期停滞", "无意义狗血来回打转", "情感推进长期被别的线吃掉"],
|
|
1039
|
+
conflictCeiling: "medium",
|
|
1040
|
+
chapterUnit: "每章推进一个关系节点、情绪变化或彼此认知变化。",
|
|
1041
|
+
volumeReward: "卷末让关键关系发生明确变化或完成一次高价值情感兑现。",
|
|
1042
|
+
mandatorySignals: ["关系张力", "情绪节点", "兑现感"],
|
|
1043
|
+
antiSignals: ["关系原地踏步", "设定堆在那儿,互动没有"],
|
|
1044
|
+
resolutionStyle: "靠情绪交流、关系行动与关键选择推进或修复。",
|
|
1045
|
+
},
|
|
1046
|
+
{
|
|
1047
|
+
key: "story_mode_growth_root",
|
|
1048
|
+
name: "成长冒险",
|
|
1049
|
+
template: "读者需要持续感知到人物能力、认知或世界边界在扩展。",
|
|
1050
|
+
driver: "通过成长曲线、探索推进和阶段突破持续制造前进感。",
|
|
1051
|
+
readerExpectation: "读者反复获得变强、解锁新区域和达成新门槛的满足。",
|
|
1052
|
+
payoffs: ["获得目标", "挑战升级", "突破瓶颈", "进入新区域"],
|
|
1053
|
+
risks: ["升级口头化", "冒险线停摆"],
|
|
1054
|
+
primary: true,
|
|
1055
|
+
progressionUnits: ["获得目标", "挑战升级", "突破瓶颈", "进入新区域"],
|
|
1056
|
+
allowedConflictForms: ["试炼", "探索风险", "阶段门槛", "成长阵痛"],
|
|
1057
|
+
forbiddenConflictForms: ["长期停滞不成长", "只见数值上涨,体验没有变化", "探索线长期缺席"],
|
|
1058
|
+
conflictCeiling: "high",
|
|
1059
|
+
chapterUnit: "每章推进一个成长动作、一次探索发现或一段闯关反馈。",
|
|
1060
|
+
volumeReward: "卷末让人物到达更高阶段,或打开一片更大的冒险空间。",
|
|
1061
|
+
mandatorySignals: ["成长感", "突破感", "世界扩展"],
|
|
1062
|
+
antiSignals: ["升级口头化", "冒险线停摆"],
|
|
1063
|
+
resolutionStyle: "通过训练、实践、探索和阶段性突破完成破局。",
|
|
1064
|
+
},
|
|
1065
|
+
{
|
|
1066
|
+
key: "story_mode_invincible",
|
|
1067
|
+
name: "无敌流",
|
|
1068
|
+
template: "尽快立住主角上限,重点写压制、破局、立威和改规则。",
|
|
1069
|
+
driver: "让主角以明显优势碾压阻力,并不断刷新他人认知。",
|
|
1070
|
+
readerExpectation: "读者每隔几章都能看到一次明确的压制和地位确立。",
|
|
1071
|
+
payoffs: ["展示底牌", "压制对手", "扩大威慑", "重写规则"],
|
|
1072
|
+
risks: ["主角像普通升级文一样长期弱势", "核心优势被硬生生封住"],
|
|
1073
|
+
primary: false,
|
|
1074
|
+
progressionUnits: ["展示底牌", "压制对手", "扩大威慑", "重写规则"],
|
|
1075
|
+
allowedConflictForms: ["身份误判", "势力挑衅", "高手试探"],
|
|
1076
|
+
forbiddenConflictForms: ["长期躲藏发育", "长时间挨打却无法反击"],
|
|
1077
|
+
conflictCeiling: "high",
|
|
1078
|
+
chapterUnit: "单章围绕一次压制、试探或立威展开。",
|
|
1079
|
+
volumeReward: "卷末形成新的权力格局或更大范围的承认。",
|
|
1080
|
+
mandatorySignals: ["强者气场", "围观震撼", "越级压制"],
|
|
1081
|
+
antiSignals: ["主角像普通升级文一样长期弱势", "核心优势被硬生生封住"],
|
|
1082
|
+
resolutionStyle: "用迅速反制与高位碾压把冲突收掉。",
|
|
1083
|
+
},
|
|
1084
|
+
{
|
|
1085
|
+
key: "story_mode_face_slap",
|
|
1086
|
+
name: "打脸流",
|
|
1087
|
+
template: "先蓄势误判,再精准反转,打脸要及时回收。",
|
|
1088
|
+
driver: "通过他人误判和后续反转持续兑现高频打脸快感。",
|
|
1089
|
+
readerExpectation: "读者不断看到轻视者被现场回收和反噬。",
|
|
1090
|
+
payoffs: ["误判铺垫", "身份反转", "公开回收", "舆论发酵"],
|
|
1091
|
+
risks: ["只挨打不回收", "回收力度太轻,爽不起来"],
|
|
1092
|
+
primary: false,
|
|
1093
|
+
progressionUnits: ["误判铺垫", "身份反转", "公开回收", "舆论发酵"],
|
|
1094
|
+
allowedConflictForms: ["轻视", "公开羞辱", "资源争夺"],
|
|
1095
|
+
forbiddenConflictForms: ["铺垫过长却没有回收", "打脸之后没有任何实际影响"],
|
|
1096
|
+
conflictCeiling: "medium",
|
|
1097
|
+
chapterUnit: "单章重点制造一次误判与回收闭环。",
|
|
1098
|
+
volumeReward: "卷末主角从被看轻者转为不可忽视的中心人物。",
|
|
1099
|
+
mandatorySignals: ["误判", "反转", "当场回收"],
|
|
1100
|
+
antiSignals: ["只挨打不回收", "回收力度太轻,爽不起来"],
|
|
1101
|
+
resolutionStyle: "在最需要证明的场合完成反转与回收。",
|
|
1102
|
+
},
|
|
1103
|
+
{
|
|
1104
|
+
key: "story_mode_misread",
|
|
1105
|
+
name: "迪化流",
|
|
1106
|
+
template: "误会要层层放大,并不断变成对主角有利的局面。",
|
|
1107
|
+
driver: "利用他人对主角的过度解读制造持续失控的优势局面。",
|
|
1108
|
+
readerExpectation: "读者反复获得‘别人自己脑补过头’的反差快感。",
|
|
1109
|
+
payoffs: ["误读", "脑补升级", "群体扩散", "误会兑现"],
|
|
1110
|
+
risks: ["误会强行", "所有人一眼就看穿"],
|
|
1111
|
+
primary: false,
|
|
1112
|
+
progressionUnits: ["误读", "脑补升级", "群体扩散", "误会兑现"],
|
|
1113
|
+
allowedConflictForms: ["信息不对称", "误会连锁", "群体解读偏差"],
|
|
1114
|
+
forbiddenConflictForms: ["直接解释清楚", "误会只演一次就收"],
|
|
1115
|
+
conflictCeiling: "medium",
|
|
1116
|
+
chapterUnit: "单章围绕一次误解升级和意外收益展开。",
|
|
1117
|
+
volumeReward: "卷末误读体系形成稳定共识或传奇形象。",
|
|
1118
|
+
mandatorySignals: ["脑补", "失控传播", "主角被动受益"],
|
|
1119
|
+
antiSignals: ["误会强行", "所有人一眼就看穿"],
|
|
1120
|
+
resolutionStyle: "让误会自然滚大,最后变成主角的资源或声望。",
|
|
1121
|
+
},
|
|
1122
|
+
{
|
|
1123
|
+
key: "story_mode_secret_identity",
|
|
1124
|
+
name: "马甲流",
|
|
1125
|
+
template: "马甲要各有功能,掉马风险要形成持续钩子。",
|
|
1126
|
+
driver: "通过多重身份切换、隐藏与掉马风险制造连续张力。",
|
|
1127
|
+
readerExpectation: "读者不断看到身份差、信息差和掉马边缘的刺激感。",
|
|
1128
|
+
payoffs: ["建立马甲", "切换身份", "险些掉马", "掉马兑现"],
|
|
1129
|
+
risks: ["身份线长期静止", "马甲只是换个名字,没有实际用途"],
|
|
1130
|
+
primary: false,
|
|
1131
|
+
progressionUnits: ["建立马甲", "切换身份", "险些掉马", "掉马兑现"],
|
|
1132
|
+
allowedConflictForms: ["身份隐藏", "关系错位", "能力来源误判"],
|
|
1133
|
+
forbiddenConflictForms: ["所有马甲功能重复", "掉马没有后果"],
|
|
1134
|
+
conflictCeiling: "medium",
|
|
1135
|
+
chapterUnit: "单章至少推进一次身份利用或风险逼近。",
|
|
1136
|
+
volumeReward: "卷末形成关键掉马或更复杂的身份网。",
|
|
1137
|
+
mandatorySignals: ["信息差", "身份切换", "掉马钩子"],
|
|
1138
|
+
antiSignals: ["身份线长期静止", "马甲只是换个名字,没有实际用途"],
|
|
1139
|
+
resolutionStyle: "用身份切换解局,再把压力推到下一层露馅风险上。",
|
|
1140
|
+
},
|
|
1141
|
+
{
|
|
1142
|
+
key: "story_mode_farming",
|
|
1143
|
+
name: "种田流",
|
|
1144
|
+
template: "重点写资源循环、土地或据点经营、关系熟化和阶段性收成。",
|
|
1145
|
+
driver: "通过一点点把生活与生产盘活,给读者稳定的回暖和积累感。",
|
|
1146
|
+
readerExpectation: "读者持续获得‘日子越来越好’和‘家底越来越厚’的满足感。",
|
|
1147
|
+
payoffs: ["播种准备", "生产积累", "邻里互动", "收成兑现"],
|
|
1148
|
+
risks: ["只剩打怪和阴谋", "看不到生活改善"],
|
|
1149
|
+
primary: false,
|
|
1150
|
+
progressionUnits: ["播种准备", "生产积累", "邻里互动", "收成兑现"],
|
|
1151
|
+
allowedConflictForms: ["资源短缺", "天气与环境压力", "小范围利益摩擦"],
|
|
1152
|
+
forbiddenConflictForms: ["长期高压生死线", "大反派主线永远收不掉"],
|
|
1153
|
+
conflictCeiling: "low",
|
|
1154
|
+
chapterUnit: "单章围绕一项劳作、一项建设或一段生活改善展开。",
|
|
1155
|
+
volumeReward: "卷末形成一个明显更稳定、更温暖的生活阶段。",
|
|
1156
|
+
mandatorySignals: ["生活感", "劳作细节", "阶段收成"],
|
|
1157
|
+
antiSignals: ["只剩打怪和阴谋", "看不到生活改善"],
|
|
1158
|
+
resolutionStyle: "通过勤劳、组织、互助和经营慢慢解决问题。",
|
|
1159
|
+
},
|
|
1160
|
+
{
|
|
1161
|
+
key: "story_mode_management",
|
|
1162
|
+
name: "经营流",
|
|
1163
|
+
template: "强调决策、运营、扩张、口碑和阶段性经营结果。",
|
|
1164
|
+
driver: "通过经营决策和组织扩张持续制造上升感。",
|
|
1165
|
+
readerExpectation: "读者反复看到业务跑起来、组织成型和口碑增长。",
|
|
1166
|
+
payoffs: ["找到突破口", "搭建流程", "扩大规模", "赢得市场"],
|
|
1167
|
+
risks: ["只讲结果不讲过程", "经营主线被反派线吞掉"],
|
|
1168
|
+
primary: false,
|
|
1169
|
+
progressionUnits: ["找到突破口", "搭建流程", "扩大规模", "赢得市场"],
|
|
1170
|
+
allowedConflictForms: ["经营竞争", "资源调配", "团队磨合"],
|
|
1171
|
+
forbiddenConflictForms: ["无关的恋爱狗血长期抢戏", "经营过程一笔带过"],
|
|
1172
|
+
conflictCeiling: "medium",
|
|
1173
|
+
chapterUnit: "单章推进一个经营动作或组织问题。",
|
|
1174
|
+
volumeReward: "卷末形成业务升级、品牌确立或组织跃迁。",
|
|
1175
|
+
mandatorySignals: ["策略感", "经营动作", "结果反馈"],
|
|
1176
|
+
antiSignals: ["只讲结果不讲过程", "经营主线被反派线吞掉"],
|
|
1177
|
+
resolutionStyle: "用策略、运营、分工与节奏管理解决问题。",
|
|
1178
|
+
},
|
|
1179
|
+
{
|
|
1180
|
+
key: "story_mode_territory_building",
|
|
1181
|
+
name: "领地建设",
|
|
1182
|
+
template: "重点写领地升级、人口汇聚、规则建立和防线稳固。",
|
|
1183
|
+
driver: "通过把一块地、一座城或一个据点逐步经营成型,持续制造扩张与稳固的成就感。",
|
|
1184
|
+
readerExpectation: "读者不断看到领地变强、秩序成型和安全感提升。",
|
|
1185
|
+
payoffs: ["招募与安置", "设施建设", "规则落地", "外部试探回击"],
|
|
1186
|
+
risks: ["只有战争没有建设", "领地越来越没存在感"],
|
|
1187
|
+
primary: false,
|
|
1188
|
+
progressionUnits: ["招募与安置", "设施建设", "规则落地", "外部试探回击"],
|
|
1189
|
+
allowedConflictForms: ["资源紧张", "边界摩擦", "管理压力", "治安危机"],
|
|
1190
|
+
forbiddenConflictForms: ["领地长期形同虚设", "主线被私人恩怨整个带偏"],
|
|
1191
|
+
conflictCeiling: "medium",
|
|
1192
|
+
chapterUnit: "单章推进一个领地建设动作、治理问题或外部试探应对。",
|
|
1193
|
+
volumeReward: "卷末让领地规模、秩序或影响力出现清晰跃升。",
|
|
1194
|
+
mandatorySignals: ["据点成长", "治理动作", "秩序成型"],
|
|
1195
|
+
antiSignals: ["只有战争没有建设", "领地越来越没存在感"],
|
|
1196
|
+
resolutionStyle: "用建设、治理、组织与局部反制先把局面稳住。",
|
|
1197
|
+
},
|
|
1198
|
+
{
|
|
1199
|
+
key: "story_mode_family_management",
|
|
1200
|
+
name: "家族经营",
|
|
1201
|
+
template: "把资源经营、家族分工和内部关系变化一起写活。",
|
|
1202
|
+
driver: "通过家业扩张、家族关系重组和责任传承维持故事推进。",
|
|
1203
|
+
readerExpectation: "读者既能看到家底变厚,也能看到家族成员关系越来越成体系。",
|
|
1204
|
+
payoffs: ["家业调整", "成员磨合", "资源积累", "家族地位提升"],
|
|
1205
|
+
risks: ["只剩吵架不见经营", "家族线缺少传承味道"],
|
|
1206
|
+
primary: false,
|
|
1207
|
+
progressionUnits: ["家业调整", "成员磨合", "资源积累", "家族地位提升"],
|
|
1208
|
+
allowedConflictForms: ["家务分歧", "利益分配", "外部竞争", "代际观念冲突"],
|
|
1209
|
+
forbiddenConflictForms: ["狗血撕裂长期压倒经营线", "家族人只剩功能位,关系毫无变化"],
|
|
1210
|
+
conflictCeiling: "medium",
|
|
1211
|
+
chapterUnit: "单章推进一次家业动作、一场家族互动或一项责任兑现。",
|
|
1212
|
+
volumeReward: "卷末让家族更稳固、更有凝聚力,或完成一次地位跃升。",
|
|
1213
|
+
mandatorySignals: ["家族协作", "家业动作", "关系重组"],
|
|
1214
|
+
antiSignals: ["只剩吵架不见经营", "家族线缺少传承味道"],
|
|
1215
|
+
resolutionStyle: "用协商、分工、经营成果与共同扛危机完成修复。",
|
|
1216
|
+
},
|
|
1217
|
+
{
|
|
1218
|
+
key: "story_mode_healing_daily",
|
|
1219
|
+
name: "治愈日常",
|
|
1220
|
+
template: "保持低烈度困境和高密度安抚点,让读者愿意停留。",
|
|
1221
|
+
driver: "靠日常陪伴和细小修复慢慢把人物带回稳定状态。",
|
|
1222
|
+
readerExpectation: "读者每几章都获得一次情绪被抚平的体验。",
|
|
1223
|
+
payoffs: ["日常互动", "情绪安抚", "关系熟化", "生活改善"],
|
|
1224
|
+
risks: ["冲突升级成高压大戏", "一章读完只剩焦虑"],
|
|
1225
|
+
primary: false,
|
|
1226
|
+
progressionUnits: ["日常互动", "情绪安抚", "关系熟化", "生活改善"],
|
|
1227
|
+
allowedConflictForms: ["生活小挫折", "关系别扭", "旧伤回响"],
|
|
1228
|
+
forbiddenConflictForms: ["大反派压顶", "极端痛苦长期不回收"],
|
|
1229
|
+
conflictCeiling: "low",
|
|
1230
|
+
chapterUnit: "每章围绕一个情绪节点和一个安抚点展开。",
|
|
1231
|
+
volumeReward: "卷末让角色和读者都感到状态明显回暖。",
|
|
1232
|
+
mandatorySignals: ["安抚感", "生活细节", "温柔互动"],
|
|
1233
|
+
antiSignals: ["冲突升级成高压大戏", "一章读完只剩焦虑"],
|
|
1234
|
+
resolutionStyle: "让人物在陪伴、倾听与具体行动里一点点被治好。",
|
|
1235
|
+
},
|
|
1236
|
+
{
|
|
1237
|
+
key: "story_mode_shop_daily",
|
|
1238
|
+
name: "小店日常",
|
|
1239
|
+
template: "顾客、邻里和经营琐事都应成为温柔推进器。",
|
|
1240
|
+
driver: "通过店铺经营、来客故事和社区互动形成持续新鲜感。",
|
|
1241
|
+
readerExpectation: "读者既能看到经营变化,也能得到温暖的陌生人故事。",
|
|
1242
|
+
payoffs: ["来客事件", "经营调整", "社区互动", "日常收束"],
|
|
1243
|
+
risks: ["只剩经营数据没有人情味", "店铺越来越没存在感"],
|
|
1244
|
+
primary: false,
|
|
1245
|
+
progressionUnits: ["来客事件", "经营调整", "社区互动", "日常收束"],
|
|
1246
|
+
allowedConflictForms: ["小店经营压力", "人情摩擦", "生活琐事"],
|
|
1247
|
+
forbiddenConflictForms: ["连续恶性打压", "悬疑过重或阴谋高压主导"],
|
|
1248
|
+
conflictCeiling: "medium",
|
|
1249
|
+
chapterUnit: "每章推进一次来客互动或经营小事件。",
|
|
1250
|
+
volumeReward: "卷末让小店更有人气、更有归属感。",
|
|
1251
|
+
mandatorySignals: ["小店空间感", "来客故事", "社区温度"],
|
|
1252
|
+
antiSignals: ["只剩经营数据没有人情味", "店铺越来越没存在感"],
|
|
1253
|
+
resolutionStyle: "靠待人接物、经营调整与社区互助自然化解。",
|
|
1254
|
+
},
|
|
1255
|
+
{
|
|
1256
|
+
key: "story_mode_slow_life",
|
|
1257
|
+
name: "慢生活",
|
|
1258
|
+
template: "让风景、劳作、饮食和相处方式都成为安稳体验的一部分。",
|
|
1259
|
+
driver: "通过缓慢但持续的生活改善与身心安定感推动读者停留。",
|
|
1260
|
+
readerExpectation: "读者反复获得放松、沉浸和‘终于缓下来’的满足感。",
|
|
1261
|
+
payoffs: ["日常作息", "环境熟悉", "生活改善", "情绪回稳"],
|
|
1262
|
+
risks: ["为了刺激频繁硬拗大冲突", "越写越躁,没有呼吸"],
|
|
1263
|
+
primary: false,
|
|
1264
|
+
progressionUnits: ["日常作息", "环境熟悉", "生活改善", "情绪回稳"],
|
|
1265
|
+
allowedConflictForms: ["轻微不适应", "生活小困扰", "疏远之后的重新磨合"],
|
|
1266
|
+
forbiddenConflictForms: ["持续高压倒计时", "强反派长期追杀,或阴谋压顶"],
|
|
1267
|
+
conflictCeiling: "low",
|
|
1268
|
+
chapterUnit: "单章围绕一个生活片段、一项微小改善或一次情绪缓冲展开。",
|
|
1269
|
+
volumeReward: "卷末让人物真正拥有一个更稳、更舒服的生活状态。",
|
|
1270
|
+
mandatorySignals: ["生活秩序", "松弛感", "细节沉浸"],
|
|
1271
|
+
antiSignals: ["为了刺激频繁硬拗大冲突", "越写越躁,没有呼吸"],
|
|
1272
|
+
resolutionStyle: "用时间、陪伴、规律生活与小步修补慢慢化解。",
|
|
1273
|
+
},
|
|
1274
|
+
{
|
|
1275
|
+
key: "story_mode_companion_healing",
|
|
1276
|
+
name: "陪伴疗愈",
|
|
1277
|
+
template: "矛盾要服务于靠近、信任和修复,而不是不断撕裂。",
|
|
1278
|
+
driver: "通过陪伴关系逐步建立、安全感逐步累积来带动情绪兑现。",
|
|
1279
|
+
readerExpectation: "读者不断获得被理解、被陪着走过低谷的温柔满足。",
|
|
1280
|
+
payoffs: ["接近与试探", "日常照料", "情绪松动", "关系确认"],
|
|
1281
|
+
risks: ["治愈线突然变虐恋拉扯", "陪伴关系没有实质进展"],
|
|
1282
|
+
primary: false,
|
|
1283
|
+
progressionUnits: ["接近与试探", "日常照料", "情绪松动", "关系确认"],
|
|
1284
|
+
allowedConflictForms: ["旧伤回避", "沟通迟滞", "生活压力", "短暂误解"],
|
|
1285
|
+
forbiddenConflictForms: ["反复背刺", "虐点长期不回收", "拉扯过火到失去控制"],
|
|
1286
|
+
conflictCeiling: "low",
|
|
1287
|
+
chapterUnit: "单章推进一次陪伴动作、一次关系松动或一次情绪落地。",
|
|
1288
|
+
volumeReward: "卷末让关键关系显著升温,人物更愿意相信他人和生活。",
|
|
1289
|
+
mandatorySignals: ["陪伴感", "信任增长", "修复落地"],
|
|
1290
|
+
antiSignals: ["治愈线突然变虐恋拉扯", "陪伴关系没有实质进展"],
|
|
1291
|
+
resolutionStyle: "靠耐心、陪伴与实际行动把关系一点点修回来。",
|
|
1292
|
+
},
|
|
1293
|
+
{
|
|
1294
|
+
key: "story_mode_comedy",
|
|
1295
|
+
name: "搞笑流",
|
|
1296
|
+
template: "笑点必须结构化出现,不能只靠零散金句。",
|
|
1297
|
+
driver: "靠高频包袱、反差和失控场面维持阅读快乐。",
|
|
1298
|
+
readerExpectation: "读者每章都能收获明确的轻松和好笑点。",
|
|
1299
|
+
payoffs: ["包袱铺设", "反差升级", "笑点回收", "场面翻车"],
|
|
1300
|
+
risks: ["整段都很严肃", "光有吐槽,没有结构"],
|
|
1301
|
+
primary: false,
|
|
1302
|
+
progressionUnits: ["包袱铺设", "反差升级", "笑点回收", "场面翻车"],
|
|
1303
|
+
allowedConflictForms: ["误会", "社死", "身份反差", "认知错位"],
|
|
1304
|
+
forbiddenConflictForms: ["长时间沉重苦情线", "笑点稀少,剧情也不动"],
|
|
1305
|
+
conflictCeiling: "medium",
|
|
1306
|
+
chapterUnit: "每章围绕至少一个有效包袱闭环展开。",
|
|
1307
|
+
volumeReward: "卷末形成标志性名场面或持续流传的笑料。",
|
|
1308
|
+
mandatorySignals: ["包袱", "回收", "场面感"],
|
|
1309
|
+
antiSignals: ["整段都很严肃", "光有吐槽,没有结构"],
|
|
1310
|
+
resolutionStyle: "靠回收与升级继续加码笑点,而不是转向沉重。",
|
|
1311
|
+
},
|
|
1312
|
+
{
|
|
1313
|
+
key: "story_mode_misunderstanding_comedy",
|
|
1314
|
+
name: "误会喜剧",
|
|
1315
|
+
template: "误会要层层放大,但每次都要带来新的局面。",
|
|
1316
|
+
driver: "通过多方信息差导致的误会扩散维持喜剧节奏。",
|
|
1317
|
+
readerExpectation: "读者不断看到误会越滚越大却越有趣的效果。",
|
|
1318
|
+
payoffs: ["误会建立", "多方误读", "失控扩散", "喜剧回收"],
|
|
1319
|
+
risks: ["误会无后劲", "澄清太快,节奏直接熄火"],
|
|
1320
|
+
primary: false,
|
|
1321
|
+
progressionUnits: ["误会建立", "多方误读", "失控扩散", "喜剧回收"],
|
|
1322
|
+
allowedConflictForms: ["误会", "错位沟通", "集体误读"],
|
|
1323
|
+
forbiddenConflictForms: ["误会太快澄清", "误会反复用同一个梗"],
|
|
1324
|
+
conflictCeiling: "medium",
|
|
1325
|
+
chapterUnit: "每章推进一层新的误解或回收节点。",
|
|
1326
|
+
volumeReward: "卷末形成一场大型误会名场面。",
|
|
1327
|
+
mandatorySignals: ["信息差", "误读", "扩散"],
|
|
1328
|
+
antiSignals: ["误会无后劲", "澄清太快,节奏直接熄火"],
|
|
1329
|
+
resolutionStyle: "把误会放在最好笑的位置回收,或升级成更大的笑点。",
|
|
1330
|
+
},
|
|
1331
|
+
{
|
|
1332
|
+
key: "story_mode_absurd_subversion",
|
|
1333
|
+
name: "沙雕反套路",
|
|
1334
|
+
template: "反套路不只是拆预期,还要持续给出更好玩的新局面。",
|
|
1335
|
+
driver: "通过不断拆解常规预期,再给出更离谱但更成立的结果维持新鲜感。",
|
|
1336
|
+
readerExpectation: "读者持续获得‘居然还能这么来’的惊喜和轻松感。",
|
|
1337
|
+
payoffs: ["建立预期", "突然拧转", "离谱升级", "反套路回收"],
|
|
1338
|
+
risks: ["为了搞怪牺牲可读性", "段子堆叠,故事不往前"],
|
|
1339
|
+
primary: false,
|
|
1340
|
+
progressionUnits: ["建立预期", "突然拧转", "离谱升级", "反套路回收"],
|
|
1341
|
+
allowedConflictForms: ["反差", "错位", "整活失控", "设定玩梗"],
|
|
1342
|
+
forbiddenConflictForms: ["只剩无意义发疯", "够离谱,却找不到逻辑支点", "连续沉重正剧化"],
|
|
1343
|
+
conflictCeiling: "medium",
|
|
1344
|
+
chapterUnit: "每章至少推进一个预期建立与反套路回收闭环。",
|
|
1345
|
+
volumeReward: "卷末形成高传播度的离谱名场面或反套路高潮。",
|
|
1346
|
+
mandatorySignals: ["意外感", "反套路", "回收闭环"],
|
|
1347
|
+
antiSignals: ["为了搞怪牺牲可读性", "段子堆叠,故事不往前"],
|
|
1348
|
+
resolutionStyle: "用更高一层的反套路把局面收回来,而不是跌回沉重正统冲突。",
|
|
1349
|
+
},
|
|
1350
|
+
{
|
|
1351
|
+
key: "story_mode_mystery_inference",
|
|
1352
|
+
name: "悬疑推演",
|
|
1353
|
+
template: "每段推演都要建立在清晰线索上,不要纯作者强解。",
|
|
1354
|
+
driver: "让读者跟着线索与推演不断靠近真相。",
|
|
1355
|
+
readerExpectation: "读者持续获得‘拼图正在成型’的智性满足。",
|
|
1356
|
+
payoffs: ["提出疑点", "补充线索", "推演收束", "揭开真相"],
|
|
1357
|
+
risks: ["故弄玄虚", "结论和线索脱节"],
|
|
1358
|
+
primary: false,
|
|
1359
|
+
progressionUnits: ["提出疑点", "补充线索", "推演收束", "揭开真相"],
|
|
1360
|
+
allowedConflictForms: ["线索冲突", "证词矛盾", "隐藏动机"],
|
|
1361
|
+
forbiddenConflictForms: ["关键证据凭空出现", "该说明的地方故意含糊拖节奏"],
|
|
1362
|
+
conflictCeiling: "medium",
|
|
1363
|
+
chapterUnit: "每章推进一个关键疑点的认知变化。",
|
|
1364
|
+
volumeReward: "卷末揭穿核心谜面或打开更大的悬念入口。",
|
|
1365
|
+
mandatorySignals: ["线索感", "逻辑链", "真相逼近"],
|
|
1366
|
+
antiSignals: ["故弄玄虚", "结论和线索脱节"],
|
|
1367
|
+
resolutionStyle: "通过线索联动和逻辑推演完成局面突破。",
|
|
1368
|
+
},
|
|
1369
|
+
{
|
|
1370
|
+
key: "story_mode_mind_game",
|
|
1371
|
+
name: "智斗流",
|
|
1372
|
+
template: "对手必须像对手,博弈必须可感知。",
|
|
1373
|
+
driver: "通过多轮布局和拆招形成高黏性的智斗快感。",
|
|
1374
|
+
readerExpectation: "读者不断看到算计、反算和预判回收。",
|
|
1375
|
+
payoffs: ["布局", "试探", "反制", "收网"],
|
|
1376
|
+
risks: ["胜负没有博弈过程", "对手工具化"],
|
|
1377
|
+
primary: false,
|
|
1378
|
+
progressionUnits: ["布局", "试探", "反制", "收网"],
|
|
1379
|
+
allowedConflictForms: ["策略对抗", "心理博弈", "资源算计"],
|
|
1380
|
+
forbiddenConflictForms: ["对手太蠢", "每次赢都靠主角的信息外挂"],
|
|
1381
|
+
conflictCeiling: "medium",
|
|
1382
|
+
chapterUnit: "每章推进一轮试探、布子或拆招。",
|
|
1383
|
+
volumeReward: "卷末完成一次大局收网或更高阶对手登场。",
|
|
1384
|
+
mandatorySignals: ["布局感", "对手压迫", "反制回收"],
|
|
1385
|
+
antiSignals: ["胜负没有博弈过程", "对手工具化"],
|
|
1386
|
+
resolutionStyle: "通过提前布局和关键反制赢下局面。",
|
|
1387
|
+
},
|
|
1388
|
+
{
|
|
1389
|
+
key: "story_mode_survival_game",
|
|
1390
|
+
name: "生存博弈",
|
|
1391
|
+
template: "高压可以存在,但必须服务于规则推演、抉择代价和局势反制。",
|
|
1392
|
+
driver: "通过资源稀缺、环境压力和规则对抗持续制造必须做出选择的张力。",
|
|
1393
|
+
readerExpectation: "读者反复获得局势求解、代价权衡和绝境翻盘的紧绷满足。",
|
|
1394
|
+
payoffs: ["压力逼近", "规则试探", "资源争夺", "短线反制"],
|
|
1395
|
+
risks: ["危机廉价化", "困境反复在同一类里打转"],
|
|
1396
|
+
primary: false,
|
|
1397
|
+
progressionUnits: ["压力逼近", "规则试探", "资源争夺", "短线反制"],
|
|
1398
|
+
allowedConflictForms: ["资源稀缺", "规则压迫", "环境威胁", "群体博弈"],
|
|
1399
|
+
forbiddenConflictForms: ["纯靠运气通关", "全是硬碰硬,没有策略", "同一种危机反复来"],
|
|
1400
|
+
conflictCeiling: "high",
|
|
1401
|
+
chapterUnit: "单章推进一轮生存压力、规则发现或关键抉择。",
|
|
1402
|
+
volumeReward: "卷末完成一次阶段求生成功、规则突破或阵营格局改写。",
|
|
1403
|
+
mandatorySignals: ["资源压力", "选择代价", "规则利用"],
|
|
1404
|
+
antiSignals: ["危机廉价化", "困境反复在同一类里打转"],
|
|
1405
|
+
resolutionStyle: "靠吃透规则、判断局势与有限资源调度破局。",
|
|
1406
|
+
},
|
|
1407
|
+
{
|
|
1408
|
+
key: "story_mode_romantic_tension",
|
|
1409
|
+
name: "恋爱拉扯",
|
|
1410
|
+
template: "拉扯要有温差和推进,不能只靠误会拖延。",
|
|
1411
|
+
driver: "通过双向吸引与现实阻力之间的反复拉扯维持情感张力。",
|
|
1412
|
+
readerExpectation: "读者不断看到关系升温、试探失控和情绪回收。",
|
|
1413
|
+
payoffs: ["试探靠近", "边界碰撞", "情绪失衡", "关系推进"],
|
|
1414
|
+
risks: ["只有误会拖延", "关系没有实质变化"],
|
|
1415
|
+
primary: false,
|
|
1416
|
+
progressionUnits: ["试探靠近", "边界碰撞", "情绪失衡", "关系推进"],
|
|
1417
|
+
allowedConflictForms: ["暧昧错位", "表达失败", "现实阻力", "价值观差异"],
|
|
1418
|
+
forbiddenConflictForms: ["故意降智不说人话", "拖太久不推进", "关系线被主线彻底盖住"],
|
|
1419
|
+
conflictCeiling: "medium",
|
|
1420
|
+
chapterUnit: "单章推进一个情感试探、认知变化或关系边界松动。",
|
|
1421
|
+
volumeReward: "卷末让关系进入新阶段,或完成一次高浓度情绪确认。",
|
|
1422
|
+
mandatorySignals: ["暧昧感", "双向张力", "靠近兑现"],
|
|
1423
|
+
antiSignals: ["只有误会拖延", "关系没有实质变化"],
|
|
1424
|
+
resolutionStyle: "靠互动升级、情绪承认与行动选择推进关系。",
|
|
1425
|
+
},
|
|
1426
|
+
{
|
|
1427
|
+
key: "story_mode_chasing_wife",
|
|
1428
|
+
name: "追妻火葬场",
|
|
1429
|
+
template: "核心是追偿和重建,不是单方面反复伤害。",
|
|
1430
|
+
driver: "通过失去后的追偿、悔改和关系重建制造强烈情绪牵引。",
|
|
1431
|
+
readerExpectation: "读者持续获得‘该追的在追、该还的在还、该痛的有回应’的满足。",
|
|
1432
|
+
payoffs: ["后悔显现", "追偿行动", "关系试炼", "重建兑现"],
|
|
1433
|
+
risks: ["只会口头道歉", "修复关系毫无代价"],
|
|
1434
|
+
primary: false,
|
|
1435
|
+
progressionUnits: ["后悔显现", "追偿行动", "关系试炼", "重建兑现"],
|
|
1436
|
+
allowedConflictForms: ["信任断裂", "旧伤反扑", "补偿落差", "现实阻碍"],
|
|
1437
|
+
forbiddenConflictForms: ["追偿只停留在嘴上", "反复受伤却始终没有出口", "被追的一方彻底失去主动权"],
|
|
1438
|
+
conflictCeiling: "medium",
|
|
1439
|
+
chapterUnit: "单章推进一次追偿动作、一次旧伤碰撞或一次关系松动。",
|
|
1440
|
+
volumeReward: "卷末形成清晰的关系修复阶段或强力情绪回收。",
|
|
1441
|
+
mandatorySignals: ["悔意落地", "行动补偿", "边界重建"],
|
|
1442
|
+
antiSignals: ["只会口头道歉", "修复关系毫无代价"],
|
|
1443
|
+
resolutionStyle: "用持续行动、承担代价与尊重边界推进关系重建。",
|
|
1444
|
+
},
|
|
1445
|
+
{
|
|
1446
|
+
key: "story_mode_ensemble_bond",
|
|
1447
|
+
name: "群像羁绊",
|
|
1448
|
+
template: "群像不是名单堆砌,而是每个角色都要在关系网里发挥作用。",
|
|
1449
|
+
driver: "通过多人互动和羁绊变化让故事始终有新的关系火花。",
|
|
1450
|
+
readerExpectation: "读者不断获得角色之间的新连接、站队变化和情感共振。",
|
|
1451
|
+
payoffs: ["关系串联", "群体事件", "立场变化", "羁绊加深"],
|
|
1452
|
+
risks: ["角色只报名字不干活", "群像散架,成了独角戏"],
|
|
1453
|
+
primary: false,
|
|
1454
|
+
progressionUnits: ["关系串联", "群体事件", "立场变化", "羁绊加深"],
|
|
1455
|
+
allowedConflictForms: ["立场差异", "责任分歧", "情感错位", "团队压力"],
|
|
1456
|
+
forbiddenConflictForms: ["群像角色长期工具化", "只剩主角独走", "人物关系始终原样不动"],
|
|
1457
|
+
conflictCeiling: "medium",
|
|
1458
|
+
chapterUnit: "单章推进一个群体互动节点或关键角色对之间的关系变化。",
|
|
1459
|
+
volumeReward: "卷末让群像结构更稳,或让队伍/关系网进入新阶段。",
|
|
1460
|
+
mandatorySignals: ["群体互动", "关系联动", "角色互相成就"],
|
|
1461
|
+
antiSignals: ["角色只报名字不干活", "群像散架,成了独角戏"],
|
|
1462
|
+
resolutionStyle: "靠团队互动、共同经历与角色选择推动关系演化。",
|
|
1463
|
+
},
|
|
1464
|
+
{
|
|
1465
|
+
key: "story_mode_growth_leveling",
|
|
1466
|
+
name: "升级成长",
|
|
1467
|
+
template: "升级不只写结果,还要写门槛、代价和兑现。",
|
|
1468
|
+
driver: "通过清晰可感的成长曲线和阶段突破持续拉动阅读。",
|
|
1469
|
+
readerExpectation: "读者不断看到能力、地位或认知层级获得实质提升。",
|
|
1470
|
+
payoffs: ["积累条件", "卡点受阻", "完成突破", "展示提升"],
|
|
1471
|
+
risks: ["升级像流水账", "能力提升不带来剧情后果"],
|
|
1472
|
+
primary: false,
|
|
1473
|
+
progressionUnits: ["积累条件", "卡点受阻", "完成突破", "展示提升"],
|
|
1474
|
+
allowedConflictForms: ["瓶颈", "试炼", "资源不足", "同层竞争"],
|
|
1475
|
+
forbiddenConflictForms: ["成长全靠旁白略过", "突破既无代价也无铺垫", "升级之后拿不到任何兑现"],
|
|
1476
|
+
conflictCeiling: "high",
|
|
1477
|
+
chapterUnit: "单章推进一次积累、一次卡点试探或一次成长兑现。",
|
|
1478
|
+
volumeReward: "卷末完成一个清晰等级、境界或阶段跃迁。",
|
|
1479
|
+
mandatorySignals: ["成长门槛", "突破反馈", "阶段变化"],
|
|
1480
|
+
antiSignals: ["升级像流水账", "能力提升不带来剧情后果"],
|
|
1481
|
+
resolutionStyle: "靠积累、训练、实战与关键顿悟完成成长突破。",
|
|
1482
|
+
},
|
|
1483
|
+
{
|
|
1484
|
+
key: "story_mode_adventure_exploration",
|
|
1485
|
+
name: "探索冒险",
|
|
1486
|
+
template: "探索要带来真正的新信息、新选择和新危险。",
|
|
1487
|
+
driver: "通过不断进入未知区域、接触新规则和发现新秘密保持阅读新鲜感。",
|
|
1488
|
+
readerExpectation: "读者持续获得开图、发现与未知感兑现。",
|
|
1489
|
+
payoffs: ["进入新区域", "发现新规则", "遭遇风险", "带出新认知"],
|
|
1490
|
+
risks: ["探索空转", "新区域没有存在的必要"],
|
|
1491
|
+
primary: false,
|
|
1492
|
+
progressionUnits: ["进入新区域", "发现新规则", "遭遇风险", "带出新认知"],
|
|
1493
|
+
allowedConflictForms: ["环境威胁", "未知规则", "探索竞争", "文明差异"],
|
|
1494
|
+
forbiddenConflictForms: ["场景只是换皮", "探索不产出新信息", "一直原地打转,世界边界不动"],
|
|
1495
|
+
conflictCeiling: "high",
|
|
1496
|
+
chapterUnit: "单章推进一次新发现、一次环境应对或一次地图探索。",
|
|
1497
|
+
volumeReward: "卷末打开新的区域层级、秘密入口或冒险目标。",
|
|
1498
|
+
mandatorySignals: ["未知感", "发现感", "地图扩展"],
|
|
1499
|
+
antiSignals: ["探索空转", "新区域没有存在的必要"],
|
|
1500
|
+
resolutionStyle: "靠观察、应对、适应与局部突破打开更深探索。",
|
|
1501
|
+
},
|
|
1502
|
+
{
|
|
1503
|
+
key: "story_mode_dungeon_challenge",
|
|
1504
|
+
name: "副本闯关",
|
|
1505
|
+
template: "副本不是重复打怪,要写清目标、机制、风险和通关奖励。",
|
|
1506
|
+
driver: "通过阶段性关卡挑战和规则破解形成连续的推进快感。",
|
|
1507
|
+
readerExpectation: "读者不断获得过关、破局和奖励兑现的满足。",
|
|
1508
|
+
payoffs: ["进入副本", "识别机制", "破解难点", "通关结算"],
|
|
1509
|
+
risks: ["关卡同质化", "只有数值叠加,没有机制可言"],
|
|
1510
|
+
primary: false,
|
|
1511
|
+
progressionUnits: ["进入副本", "识别机制", "破解难点", "通关结算"],
|
|
1512
|
+
allowedConflictForms: ["关卡机制", "时间压力", "队伍配合", "资源限制"],
|
|
1513
|
+
forbiddenConflictForms: ["副本机制全靠硬抗", "通关后拿不到奖励反馈", "关卡反复刷到失去新意"],
|
|
1514
|
+
conflictCeiling: "high",
|
|
1515
|
+
chapterUnit: "单章推进一个关卡节点、一个机制破解或一次通关反馈。",
|
|
1516
|
+
volumeReward: "卷末完成一段完整副本征程,获得显著奖励或更高阶入口。",
|
|
1517
|
+
mandatorySignals: ["机制感", "闯关反馈", "奖励兑现"],
|
|
1518
|
+
antiSignals: ["关卡同质化", "只有数值叠加,没有机制可言"],
|
|
1519
|
+
resolutionStyle: "靠识别规则、团队配合与关键执行完成通关。",
|
|
1520
|
+
},
|
|
1521
|
+
]
|
|
1522
|
+
|
|
1523
|
+
// ------------------------------------------------------ built-in plot beats
|
|
1524
|
+
|
|
1525
|
+
/** 剧情桥段库:可复用情节套路(作者阅读经验沉淀,非某本书的剧情线)。 */
|
|
1526
|
+
export const BUILTIN_PLOT_BEATS: PlotBeatTemplate[] = [
|
|
1527
|
+
{ key: 'play-weak', name: '扮猪吃虎', category: '装逼打脸', summary: '主角示弱/隐藏实力,关键时刻亮出獠牙,反差打脸。', position: '前期/中期', preconditions: ['主角有远超表面的实力', '有旁观者低估他'], payoffSource: ['身份反差', '实力揭晓时众人错愕', '质疑者被打脸'], combos: ['打脸', '身份揭露'], taboos: ['示弱太久读者憋屈', '反转无铺垫'], applicableGenres: ['都市', '玄幻', '仙侠'] },
|
|
1528
|
+
{ key: 'face-slap', name: '打脸', category: '装逼打脸', summary: '挑衅者趾高气扬,主角一击让其灰头土脸,情绪宣泄。', position: '任何', preconditions: ['挑衅者有明确的优越感', '主角有强出一截的底牌'], payoffSource: ['当众羞辱反杀', '围观者态度反转'], combos: ['扮猪吃虎', '大比'], taboos: ['连续无新意打脸', '羞辱过头读者不适'], applicableGenres: ['都市', '玄幻', '仙侠'] },
|
|
1529
|
+
{ key: 'broken-engagement', name: '退婚/反悔', category: '身份逆袭', summary: '被退婚/被轻视→用实力打回,顺势立目标。', position: '开局/前期', preconditions: ['主角处于弱势', '退婚方势利'], payoffSource: ['被轻贱→反杀', '立下目标'], combos: ['打脸', '金手指亮相'], taboos: ['拖大几十章才洗', '女主误会太久'], applicableGenres: ['玄幻', '都市', '豪门'] },
|
|
1530
|
+
{ key: 'auction-bargain', name: '拍卖会捡漏', category: '机缘', summary: '主角在拍卖会上用独到眼光/信息差捞到被低估的宝物。', position: '中期', preconditions: ['主角有识货能力/金手指', '现场有争夺者'], payoffSource: ['捡漏爽', '争夺者懊悔'], combos: ['渔翁得利', '宝物升级'], taboos: ['全程顺风顺水无波折', '宝物无后续用处'], applicableGenres: ['玄幻', '仙侠', '都市'] },
|
|
1531
|
+
{ key: 'secret-realm', name: '秘境/夺宝', category: '机缘', summary: '秘境开启,主角入内夺宝/悟道,或遇强敌/阴谋。', position: '中期/后期', preconditions: ['秘境有明确利益', '竞争者众多'], payoffSource: ['机缘得宝', '危机中成长'], combos: ['夺宝', '绝境翻盘'], taboos: ['宝物白给', '危机虎头蛇尾'], applicableGenres: ['仙侠', '玄幻', '悬疑'] },
|
|
1532
|
+
{ key: 'misunderstanding', name: '误会/解释不清', category: '情感拉扯', summary: '一方误解另一方的行为,情绪拉满后解开。', position: '任何', preconditions: ['信息不对称', '两方都在意关系'], payoffSource: ['误会造痛', '和解破冰'], combos: ['关系拉扯', '身份揭露'], taboos: ['误会拖太久', '为虐而虐'], applicableGenres: ['都市', '情感', '古言'] },
|
|
1533
|
+
{ key: 'last-stand', name: '绝境翻盘', category: '战斗', summary: '主角被逼到绝境,借助底牌/意志完成反杀。', position: '高潮', preconditions: ['主角实力明显劣势', '有破局底牌'], payoffSource: ['绝处逢生', '反派嚣张后被打脸'], combos: ['金手指爆发', '打脸'], taboos: ['开挂太突兀', '翻盘无代价'], applicableGenres: ['玄幻', '武侠', '无限流'] },
|
|
1534
|
+
{ key: 'tournament', name: '大比/比试', category: '升级打脸', summary: '宗门/势力大比,主角一路过关,暴露实力、收获名声。', position: '中期/后期', preconditions: ['有正式舞台', '有看客与对手'], payoffSource: ['连胜升级', '众目睽睽下打脸'], combos: ['打脸', '身份揭露'], taboos: ['比赛水太多', '对手全送脸'], applicableGenres: ['仙侠', '玄幻', '体育竞技'] },
|
|
1535
|
+
{ key: 'identity-reveal', name: '身份揭露', category: '反转', summary: '主角/配角的隐藏身份在关键时点揭开,颠覆认知。', position: '中期/后期', preconditions: ['身份有可埋伏的线索', '揭开时机能引爆情绪'], payoffSource: ['认知颠覆', '立场反转'], combos: ['打脸', '误会解开'], taboos: ['毫无伏笔硬揭', '身份设定无意义'], applicableGenres: ['悬疑', '古言', '玄幻'] },
|
|
1536
|
+
]
|
|
1537
|
+
|
|
1538
|
+
// ------------------------------------------------------------- persistence
|
|
1539
|
+
|
|
1540
|
+
/** 默认(空)项目写作资产。 */
|
|
1541
|
+
export function emptyProjectAssets(): ProjectAssets {
|
|
1542
|
+
return {
|
|
1543
|
+
auxiliaryProgressions: [],
|
|
1544
|
+
antiAiRules: [],
|
|
1545
|
+
styleAssets: [],
|
|
1546
|
+
}
|
|
1547
|
+
}
|
|
1548
|
+
|
|
1549
|
+
/** 合并项目资产与内置库:返回「生效的反 AI 规则」(内置全局 + 项目自定义)。 */
|
|
1550
|
+
export function effectiveAntiAiRules(assets: ProjectAssets | undefined): AntiAiRule[] {
|
|
1551
|
+
const custom = assets?.antiAiRules ?? []
|
|
1552
|
+
const keyOf = (r: AntiAiRule): string => r.key ?? r.name
|
|
1553
|
+
const customKeys = new Set(custom.filter(r => keyOf(r) !== '').map(keyOf))
|
|
1554
|
+
return [...BUILTIN_ANTI_AI_RULES.filter(r => !customKeys.has(keyOf(r))), ...custom]
|
|
1555
|
+
}
|
|
1556
|
+
|
|
1557
|
+
/** 安定 key:内置规则全局基线(globalBaselineEnabled)在新书/旧书一律生效。 */
|
|
1558
|
+
export function ensureGlobalBaseline(assets: ProjectAssets | undefined): ProjectAssets {
|
|
1559
|
+
return ensureBuiltinAssets(assets, 'missing_only')
|
|
1560
|
+
}
|
|
1561
|
+
|
|
1562
|
+
/** 内置库种子化 upsert(对齐上游 SystemResourceBootstrapService 精神)。
|
|
1563
|
+
* missing_only 仅补齐缺失的全局基线规则;sync_existing 还会按 key 刷新已内置规则的结构化字段。 */
|
|
1564
|
+
export function ensureBuiltinAssets(assets: ProjectAssets | undefined, mode: 'missing_only' | 'sync_existing' = 'missing_only'): ProjectAssets {
|
|
1565
|
+
const base = assets ?? emptyProjectAssets()
|
|
1566
|
+
const keyOf = (r: AntiAiRule): string => r.key ?? r.name
|
|
1567
|
+
const existing = base.antiAiRules ?? []
|
|
1568
|
+
const byKey = new Map(existing.map(r => [keyOf(r), r]))
|
|
1569
|
+
const out: AntiAiRule[] = []
|
|
1570
|
+
let changed = false
|
|
1571
|
+
for (const r of existing) {
|
|
1572
|
+
const builtin = BUILTIN_ANTI_AI_RULES.find(b => (b.key ?? b.name) === keyOf(r))
|
|
1573
|
+
if (mode === 'sync_existing' && builtin !== undefined) {
|
|
1574
|
+
const refreshed: AntiAiRule = {
|
|
1575
|
+
...builtin,
|
|
1576
|
+
name: r.name,
|
|
1577
|
+
avoid: r.avoid,
|
|
1578
|
+
fix: r.fix,
|
|
1579
|
+
detectPatterns: r.detectPatterns ?? builtin.detectPatterns,
|
|
1580
|
+
enabled: r.enabled ?? builtin.enabled,
|
|
1581
|
+
scope: r.scope,
|
|
1582
|
+
}
|
|
1583
|
+
out.push(refreshed)
|
|
1584
|
+
if (JSON.stringify(refreshed) !== JSON.stringify(r)) changed = true
|
|
1585
|
+
byKey.set(keyOf(r), refreshed)
|
|
1586
|
+
} else {
|
|
1587
|
+
out.push(r)
|
|
1588
|
+
}
|
|
1589
|
+
}
|
|
1590
|
+
for (const b of BUILTIN_ANTI_AI_RULES) {
|
|
1591
|
+
if (b.globalBaselineEnabled === true && !byKey.has(b.key ?? b.name)) {
|
|
1592
|
+
out.push(b)
|
|
1593
|
+
byKey.set(b.key ?? b.name, b)
|
|
1594
|
+
changed = true
|
|
1595
|
+
}
|
|
1596
|
+
}
|
|
1597
|
+
if (!changed) return base
|
|
1598
|
+
return { ...base, antiAiRules: out }
|
|
1599
|
+
}
|
|
1600
|
+
|
|
1601
|
+
/** 把生效规则渲染成提示词块(禁止/风险/鼓励三档分列,压缩省 token)。 */
|
|
1602
|
+
export function renderAntiAiRules(assets: ProjectAssets | undefined): string {
|
|
1603
|
+
const rules = effectiveAntiAiRules(assets).filter(r => r.enabled !== false)
|
|
1604
|
+
if (rules.length === 0) return ''
|
|
1605
|
+
const clip = (value: string, max: number): string => value.length > max ? value.slice(0, max) + '…' : value
|
|
1606
|
+
const category = (r: AntiAiRule): 'forbidden' | 'risk' | 'encourage' => {
|
|
1607
|
+
if (r.severity === 'encourage' || r.name.startsWith('鼓励') || r.avoid.startsWith('(鼓励类)')) return 'encourage'
|
|
1608
|
+
if (r.severity === 'risk') return 'risk'
|
|
1609
|
+
return 'forbidden'
|
|
1610
|
+
}
|
|
1611
|
+
const instruction = (r: AntiAiRule): string =>
|
|
1612
|
+
(r.promptInstruction !== undefined && r.promptInstruction !== '') ? r.promptInstruction : r.avoid
|
|
1613
|
+
const forbidden = rules.filter(r => category(r) === 'forbidden')
|
|
1614
|
+
const risk = rules.filter(r => category(r) === 'risk')
|
|
1615
|
+
const encourage = rules.filter(r => category(r) === 'encourage')
|
|
1616
|
+
const editLine = (r: AntiAiRule): string => r.fix !== '' ? `;修正——${clip(r.fix, 50)}` : ''
|
|
1617
|
+
const lines: string[] = []
|
|
1618
|
+
lines.push('==================== 反 AI 规则(写作时必须遵守的表达边界) ====================')
|
|
1619
|
+
if (forbidden.length > 0) {
|
|
1620
|
+
lines.push('禁止类(命中即问题,审稿时列为 high/medium):')
|
|
1621
|
+
for (const r of forbidden) {
|
|
1622
|
+
lines.push(`- ${r.name}:${clip(instruction(r), 90)}${editLine(r)}${r.riskLevel !== undefined && r.riskLevel !== 'high' ? `(严重度 ${r.riskLevel})` : ''}`)
|
|
1623
|
+
}
|
|
1624
|
+
}
|
|
1625
|
+
if (risk.length > 0) {
|
|
1626
|
+
lines.push('风险类(可能扣分,审稿按风险等级提示,不硬性阻塞):')
|
|
1627
|
+
for (const r of risk) {
|
|
1628
|
+
lines.push(`- ${r.name}:${clip(instruction(r), 90)}(${r.riskLevel ?? 'medium'}${r.autoRewrite === false ? ' · 不自动改写' : ''})${editLine(r)}`)
|
|
1629
|
+
}
|
|
1630
|
+
}
|
|
1631
|
+
if (encourage.length > 0) {
|
|
1632
|
+
lines.push('鼓励类(希望出现,不命中不算错,审稿时只作低优先级建议、不阻塞通过):')
|
|
1633
|
+
for (const r of encourage) {
|
|
1634
|
+
lines.push(`- ${r.name}:${clip(r.fix !== '' ? r.fix : r.avoid, 90)}`)
|
|
1635
|
+
}
|
|
1636
|
+
}
|
|
1637
|
+
return lines.join('\n')
|
|
1638
|
+
}
|
|
1639
|
+
|
|
1640
|
+
/** 渲染题材与推进模式提示词块。 */
|
|
1641
|
+
export function renderGenreAndProgression(assets: ProjectAssets | undefined): string {
|
|
1642
|
+
const sections: string[] = []
|
|
1643
|
+
if (assets?.genre !== undefined) {
|
|
1644
|
+
sections.push('==================== 题材基底(本书的题材定位与读者期待) ====================')
|
|
1645
|
+
sections.push(`题材:${assets.genre.name}`)
|
|
1646
|
+
if (assets.genre.description !== '') sections.push(`读者期待:${assets.genre.description}`)
|
|
1647
|
+
if (assets.genre.template !== undefined && assets.genre.template !== '') sections.push(`写法指引:${assets.genre.template}`)
|
|
1648
|
+
const walk = (node: GenreNode, depth: number): void => {
|
|
1649
|
+
for (const child of node.children) {
|
|
1650
|
+
sections.push(`${' '.repeat(depth)}- ${child.name}:${child.description}`)
|
|
1651
|
+
if (child.template !== undefined && child.template !== '') sections.push(`${' '.repeat(depth + 1)}写法指引:${child.template}`)
|
|
1652
|
+
walk(child, depth + 1)
|
|
1653
|
+
}
|
|
1654
|
+
}
|
|
1655
|
+
walk(assets.genre, 1)
|
|
1656
|
+
}
|
|
1657
|
+
const modes = [
|
|
1658
|
+
...(assets?.primaryProgression !== undefined ? [assets.primaryProgression] : []),
|
|
1659
|
+
...(assets?.auxiliaryProgressions ?? []),
|
|
1660
|
+
]
|
|
1661
|
+
if (modes.length > 0) {
|
|
1662
|
+
sections.push('==================== 推进模式(读者为什么继续看) ====================')
|
|
1663
|
+
for (const mode of modes) {
|
|
1664
|
+
const tag = mode.primary ? '(主推进)' : '(辅助)'
|
|
1665
|
+
const progressionUnits = mode.progressionUnits ?? []
|
|
1666
|
+
const allowedConflictForms = mode.allowedConflictForms ?? []
|
|
1667
|
+
const forbiddenConflictForms = mode.forbiddenConflictForms ?? []
|
|
1668
|
+
const mandatorySignals = mode.mandatorySignals ?? []
|
|
1669
|
+
const antiSignals = mode.antiSignals ?? []
|
|
1670
|
+
sections.push(`- 模式「${mode.name}」${tag}:驱动力——${mode.driver}`)
|
|
1671
|
+
sections.push(` 读者期待:${mode.readerExpectation}`)
|
|
1672
|
+
if (mode.template !== undefined && mode.template !== '') sections.push(` 写法指引:${mode.template}`)
|
|
1673
|
+
if (progressionUnits.length > 0) sections.push(` 推进单位:${progressionUnits.join(' → ')}`)
|
|
1674
|
+
if (mode.conflictCeiling !== undefined) sections.push(` 冲突上限:${mode.conflictCeiling}`)
|
|
1675
|
+
if (allowedConflictForms.length > 0) sections.push(` 允许冲突:${allowedConflictForms.join('、')}`)
|
|
1676
|
+
if (forbiddenConflictForms.length > 0) sections.push(` 避免冲突:${forbiddenConflictForms.join('、')}`)
|
|
1677
|
+
if (mode.chapterUnit !== undefined && mode.chapterUnit !== '') sections.push(` 单章单位:${mode.chapterUnit}`)
|
|
1678
|
+
if (mode.volumeReward !== undefined && mode.volumeReward !== '') sections.push(` 卷末回报:${mode.volumeReward}`)
|
|
1679
|
+
if (mandatorySignals.length > 0) sections.push(` 必达信号:${mandatorySignals.join('、')}`)
|
|
1680
|
+
if (antiSignals.length > 0) sections.push(` 跑偏信号:${antiSignals.join('、')}`)
|
|
1681
|
+
if (mode.payoffs.length > 0) sections.push(` 常见兑现:${mode.payoffs.join('、')}`)
|
|
1682
|
+
if (mode.risks.length > 0) sections.push(` 节奏风险(避免):${mode.risks.join('、')}`)
|
|
1683
|
+
}
|
|
1684
|
+
}
|
|
1685
|
+
return sections.join('\n')
|
|
1686
|
+
}
|
|
1687
|
+
|
|
1688
|
+
/** 渲染写法资产提示词块(规则去重,省 token)。 */
|
|
1689
|
+
export function renderStyleAssets(assets: ProjectAssets | undefined): string {
|
|
1690
|
+
const styles = assets?.styleAssets ?? []
|
|
1691
|
+
if (styles.length === 0) return ''
|
|
1692
|
+
const sections: string[] = ['==================== 写法资产(本书的叙事风格约束) ====================']
|
|
1693
|
+
for (const style of styles) {
|
|
1694
|
+
sections.push(`【${style.name}】`)
|
|
1695
|
+
const unique = (rules: string[]): string[] => [...new Set(rules)]
|
|
1696
|
+
if (style.proseRules.length > 0) sections.push('叙述与节奏:\n' + unique(style.proseRules).map(r => `- ${r}`).join('\n'))
|
|
1697
|
+
if (style.dialogueRules.length > 0) sections.push('台词风格:\n' + unique(style.dialogueRules).map(r => `- ${r}`).join('\n'))
|
|
1698
|
+
if (style.descriptionRules.length > 0) sections.push('描写与情绪:\n' + unique(style.descriptionRules).map(r => `- ${r}`).join('\n'))
|
|
1699
|
+
if (style.boundaries.length > 0) sections.push('表达边界:\n' + unique(style.boundaries).map(r => `- ${r}`).join('\n'))
|
|
1700
|
+
}
|
|
1701
|
+
return sections.join('\n')
|
|
1702
|
+
}
|
|
1703
|
+
|
|
1704
|
+
/** 渲染全部写作资产提示词(供生成/规划/审稿注入)。 */
|
|
1705
|
+
export function renderAllAssets(assets: ProjectAssets | undefined): string {
|
|
1706
|
+
const parts = [
|
|
1707
|
+
renderGenreAndProgression(assets),
|
|
1708
|
+
renderStyleAssets(assets),
|
|
1709
|
+
renderAntiAiRules(assets),
|
|
1710
|
+
].filter(part => part !== '')
|
|
1711
|
+
return parts.join('\n\n')
|
|
1712
|
+
}
|
|
1713
|
+
|
|
1714
|
+
/** 预置写法模板 → 可直接绑定的 StyleAsset。 */
|
|
1715
|
+
export function styleTemplateToAsset(template: StyleTemplate): StyleAsset {
|
|
1716
|
+
const proseRules = [...template.proseRules, ...template.rhythmRules.map(r => `节奏:${r}`)]
|
|
1717
|
+
const dialogueRules = [...template.dialogueRules]
|
|
1718
|
+
const descriptionRules = [...template.languageRules]
|
|
1719
|
+
const boundaries = [`模板「${template.name}」适用题材:${template.applicableGenres.join('、')}`, '不要违背模板的叙事单元结构与节奏约束']
|
|
1720
|
+
// 结构化子规则 → 扁平可执行规则(上游 StyleTemplate 的结构化字段在此落地)
|
|
1721
|
+
if (template.narrative?.progressionMode !== undefined) proseRules.push(`推进模式:${template.narrative.progressionMode}`)
|
|
1722
|
+
if ((template.narrative?.sceneUnitPattern?.length ?? 0) > 0) proseRules.push(`场景单元:${template.narrative!.sceneUnitPattern!.join(' → ')}`)
|
|
1723
|
+
if (template.narrative?.multiPov === false) proseRules.push('视角:单一视角')
|
|
1724
|
+
if (template.narrative?.endingStyle !== undefined) proseRules.push(`结尾风格:${template.narrative.endingStyle}`)
|
|
1725
|
+
if (template.narrative?.summary !== undefined) proseRules.push(`叙述要点:${template.narrative.summary}`)
|
|
1726
|
+
if (template.character?.dialogueStyle !== undefined) dialogueRules.push(`台词风格:${template.character.dialogueStyle}`)
|
|
1727
|
+
if ((template.character?.defenseMechanisms?.length ?? 0) > 0) dialogueRules.push(`嘴硬/防御方式:${template.character!.defenseMechanisms!.join('、')}`)
|
|
1728
|
+
if (template.character?.emotionExpression !== undefined) dialogueRules.push(`情绪表达:${template.character.emotionExpression}`)
|
|
1729
|
+
if (template.language?.register !== undefined) descriptionRules.push(`语言:${template.language.register}`)
|
|
1730
|
+
if (template.language?.roughness !== undefined) descriptionRules.push(`通俗度:${template.language.roughness}`)
|
|
1731
|
+
if (template.language?.sentenceVariation !== undefined) descriptionRules.push(`句式变化:${template.language.sentenceVariation}`)
|
|
1732
|
+
if (template.rhythm?.pace !== undefined) boundaries.push(`节奏:${template.rhythm.pace}`)
|
|
1733
|
+
if (template.rhythm?.pace === 'fast' || template.rhythm?.pace === 'medium_fast') boundaries.push('节奏偏快,动作先于解释')
|
|
1734
|
+
if (template.analysisMarkdown !== undefined && template.analysisMarkdown !== '') proseRules.push(`模板定位:${template.analysisMarkdown}`)
|
|
1735
|
+
return {
|
|
1736
|
+
name: template.name,
|
|
1737
|
+
proseRules,
|
|
1738
|
+
dialogueRules,
|
|
1739
|
+
descriptionRules,
|
|
1740
|
+
boundaries,
|
|
1741
|
+
createdAt: new Date().toISOString(),
|
|
1742
|
+
}
|
|
1743
|
+
}
|
|
1744
|
+
|
|
1745
|
+
// ---------------------------------------------------------- starter profiles
|
|
1746
|
+
|
|
1747
|
+
/** 起始风格画像库:无样本文本也能快速绑定一套写法(4 档起步写法)。 */
|
|
1748
|
+
export const BUILTIN_STARTER_STYLE_PROFILES: StarterStyleProfile[] = [
|
|
1749
|
+
{ key: 'starter-power-up', templateKey: 'power-up-escalation', name: '开书快跑·目标推进型', description: '第一次开书想先把推进感与爽点兑现跑顺,可以直接拿它起手,之后在这个底子上改。' },
|
|
1750
|
+
{ key: 'starter-suspense', templateKey: 'suspense-pressure', name: '开书快跑·信息遮蔽型', description: '写给异常、规则、调查、危险逼近这类故事:先把压迫感与信息差立起来。' },
|
|
1751
|
+
{ key: 'starter-emotional', templateKey: 'emotional-tension', name: '开书快跑·关系拉扯型', description: '写给关系推进、误读拉扯类故事:先拿一套能直接开写的关系表达底子。' },
|
|
1752
|
+
{ key: 'starter-daily', templateKey: 'immersive-daily', name: '开书快跑·日常浸没型', description: '写给治愈、陪伴、生活经营、轻缓成长类故事:优先保证生活感与沉浸感。' },
|
|
1753
|
+
]
|
|
1754
|
+
|
|
1755
|
+
/** 起始风格画像 → 可直接绑定的 StyleAsset(绑定对应模板,名称用画像名)。 */
|
|
1756
|
+
export function starterProfileToAsset(profile: StarterStyleProfile): StyleAsset | null {
|
|
1757
|
+
const template = BUILTIN_STYLE_TEMPLATES.find(t => t.key === profile.templateKey)
|
|
1758
|
+
if (template === undefined) return null
|
|
1759
|
+
return { ...styleTemplateToAsset(template), name: profile.name }
|
|
1760
|
+
}
|
|
1761
|
+
|
|
1762
|
+
/** 根据指纹风险推荐仿写预设:low→imitate / medium→balanced / high→transfer。 */
|
|
1763
|
+
export function recommendStylePreset(fingerprintRisk?: 'low' | 'medium' | 'high'): 'imitate' | 'balanced' | 'transfer' {
|
|
1764
|
+
if (fingerprintRisk === 'low') return 'imitate'
|
|
1765
|
+
if (fingerprintRisk === 'high') return 'transfer'
|
|
1766
|
+
return 'balanced'
|
|
1767
|
+
}
|
|
1768
|
+
|
|
1769
|
+
// ------------------------------------------------------- style extraction
|
|
1770
|
+
|
|
1771
|
+
/** 写法引擎:从样本文本提取风格资产的系统提示词(含 preset / 指纹 / 净化管线)。 */
|
|
1772
|
+
export function styleEngineSystemPrompt(): string {
|
|
1773
|
+
return [
|
|
1774
|
+
'你是一位资深网文文风分析师。你会收到一段样本文本,请提炼出可复用的叙事风格规则,供后续章节保持同一种味道,同时给出「仿写预设」与「净化」建议。',
|
|
1775
|
+
'要求:',
|
|
1776
|
+
'1. 从样本中归纳,不要泛泛而谈;每条规则都要能落到具体写法(句式、用词、视角、节奏、对话方式、描写密度)。',
|
|
1777
|
+
'2. 台词风格要说明角色说话的语气特征与常用表达方式。',
|
|
1778
|
+
'3. 表达边界要写明这段风格「不会怎么做」(如:不用华丽辞藻、不写长段心理独白、不用成语堆砌)。',
|
|
1779
|
+
'4. 给出 writingGuidance:净化后的写作指引,即把规则改写成可安全用于生成的具体指导(去掉会暴露来源的具体人名/地名/独特句式)。',
|
|
1780
|
+
'5. 给出 forbiddenEntities:样本文本里不可照搬的原作特有实体与标志性表达(人名、地名、核心设定句、独特口头禅等)。',
|
|
1781
|
+
'6. 判断预设 preset:imitate=高保真仿写(保留全部特征),balanced=平衡(保留可迁移特征、降指纹),transfer=迁移(只取骨架、彻底去指纹)。',
|
|
1782
|
+
'7. 判断 fingerprintRisk:low/medium/high,表示照搬本样本会被识别为抄原作的风险。',
|
|
1783
|
+
'8. 输出必须是合法 JSON 对象,不要输出任何其他文字。',
|
|
1784
|
+
'输出结构:',
|
|
1785
|
+
'{"proseRules": ["叙述视角与句式节奏规则"], "dialogueRules": ["台词风格规则"], "descriptionRules": ["描写密度与情绪表达规则"], "boundaries": ["表达边界"], "preset": "imitate|balanced|transfer", "fingerprintRisk": "low|medium|high", "writingGuidance": ["净化后的写作指引"], "forbiddenEntities": ["不可照搬的原作特有实体"]}',
|
|
1786
|
+
].join('\n')
|
|
1787
|
+
}
|
|
1788
|
+
|
|
1789
|
+
/** 写作公式提取系统提示词(分层:basic 骨架 / standard 完整 / deep 逐句细化)。 */
|
|
1790
|
+
export function styleFormulaSystemPrompt(depth: 'basic' | 'standard' | 'deep'): string {
|
|
1791
|
+
const depthLine = depth === 'basic'
|
|
1792
|
+
? '只提取最核心的叙事骨架与推进公式(1 段即可)。'
|
|
1793
|
+
: depth === 'deep'
|
|
1794
|
+
? '逐句/逐段细化:开场如何起、对话如何写、节奏如何控、爽点如何递进(分小节列出)。'
|
|
1795
|
+
: '提取完整可复用的写法公式(含结构、句式、节奏、对话、爽点密度)。'
|
|
1796
|
+
return [
|
|
1797
|
+
'你是一位网文写作公式提炼师。你会收到一段样本文本,请把它浓缩成"这套文怎么写"的写作公式。',
|
|
1798
|
+
depthLine,
|
|
1799
|
+
'要求:',
|
|
1800
|
+
'1. 聚焦 focusAreas 指定的重点(如 开场/对话/节奏/爽点密度/段落结构)。',
|
|
1801
|
+
'2. formula 用 Markdown 分小节;applyGuidance 说明生成/改写时如何套用(1-3 句)。',
|
|
1802
|
+
'3. 只输出合法 JSON 对象,不要任何其他文字。',
|
|
1803
|
+
'输出结构:',
|
|
1804
|
+
'{"name": "公式名", "focusAreas": ["重点域"], "formula": "Markdown 公式正文", "applyGuidance": "套用指引"}',
|
|
1805
|
+
].join('\n')
|
|
1806
|
+
}
|