@wji.ai/cli 0.4.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +48 -2
- package/dist/commands/backreel.js +260 -0
- package/dist/commands/canvas.js +588 -88
- package/dist/commands/class.js +395 -0
- package/dist/commands/npc.js +413 -0
- package/dist/commands/workspace.js +109 -24
- package/dist/core/members.js +54 -0
- package/dist/core/npc.js +108 -0
- package/dist/core/output.js +4 -2
- package/dist/index.js +8 -0
- package/package.json +1 -1
- package/skill/short-drama/SKILL.md +86 -8
- package/skill/short-drama/reference/action-bullet-time.md +47 -0
- package/skill/short-drama/reference/action-car-chase.md +51 -0
- package/skill/short-drama/reference/action-gun-fu.md +52 -0
- package/skill/short-drama/reference/action-historical-realist.md +50 -0
- package/skill/short-drama/reference/action-hk-kungfu.md +54 -0
- package/skill/short-drama/reference/action-street-brawl.md +49 -0
- package/skill/short-drama/reference/action-superhero.md +50 -0
- package/skill/short-drama/reference/action-wuxia-fantasy.md +51 -0
- package/skill/short-drama/reference/action.md +94 -0
- package/skill/short-drama/reference/cinematography-costume-dark.md +117 -0
- package/skill/short-drama/reference/cinematography-costume-idol.md +126 -0
- package/skill/short-drama/reference/cinematography-low-key.md +115 -0
- package/skill/short-drama/reference/cinematography-period-nostalgia.md +106 -0
- package/skill/short-drama/reference/cinematography-scifi-hard.md +63 -0
- package/skill/short-drama/reference/cinematography-scifi-soft.md +66 -0
- package/skill/short-drama/reference/cinematography-sweet-romance.md +175 -0
- package/skill/short-drama/reference/cinematography.md +83 -0
- package/skill/short-drama/reference/composition-art-first.md +74 -0
- package/skill/short-drama/reference/craft-shots.md +3 -1
- package/skill/short-drama/reference/craft-story.md +4 -1
- package/skill/short-drama/reference/format.md +94 -0
- package/skill/short-drama/reference/grammar-comedy.md +105 -0
- package/skill/short-drama/reference/grammar-faceslap.md +67 -0
- package/skill/short-drama/reference/grammar.md +103 -0
- package/skill/short-drama/reference/operations-cli.md +1 -1
- package/skill/short-drama/reference/schema.md +34 -3
- package/skill/short-drama/reference/stage-art.md +1 -1
- package/skill/short-drama/reference/stage-outline.md +21 -0
- package/skill/short-drama/reference/stage-script.md +10 -0
- package/skill/short-drama/reference/stage-storyboard.md +15 -0
- package/skill/short-drama/reference/story-angst.md +117 -0
- package/skill/short-drama/reference/story-comedy.md +136 -0
- package/skill/short-drama/reference/story-cultivation.md +109 -0
- package/skill/short-drama/reference/story-family.md +119 -0
- package/skill/short-drama/reference/story-horror.md +124 -0
- package/skill/short-drama/reference/story-mystery.md +127 -0
- package/skill/short-drama/reference/story-palace.md +103 -0
- package/skill/short-drama/reference/story-revenge.md +124 -0
- package/skill/short-drama/reference/story-scifi.md +112 -0
- package/skill/short-drama/reference/story-sweet.md +128 -0
- package/skill/short-drama/reference/story.md +127 -0
- package/skill/short-drama/scripts/selftest.mjs +809 -1
- package/skill/short-drama/scripts/short-drama.mjs +1608 -16
- package/skill/wji/SKILL.md +66 -2
- package/skill/wji/reference/commands.md +76 -15
- package/skill/wji-classroom/SKILL.md +161 -0
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
# Format — short drama, medium drama, movie (`params.format`)
|
|
2
|
+
|
|
3
|
+
The skill makes three kinds of work with **the same pipeline and the same story structure**: an
|
|
4
|
+
outline of units, a script per unit, a storyboard per unit, the sheets, the clips. What changes is
|
|
5
|
+
how long a unit is and the pulse it is held to.
|
|
6
|
+
|
|
7
|
+
| | `short` 短剧 | `medium` 中剧 | `movie` 电影 |
|
|
8
|
+
| --- | --- | --- | --- |
|
|
9
|
+
| unit | 集 (episode) | 集 (episode) | 段 (part) of one film |
|
|
10
|
+
| length | 1–3 min | 4–15 min | 3–8 min (≈ 5) |
|
|
11
|
+
| count | 30–100 | 10–40 | ≈ 18 for a 90-minute film |
|
|
12
|
+
| default ratio | 9:16 | 16:9 | 16:9 (21:9 for scope) |
|
|
13
|
+
| hook | a cold open every episode, on screen by 15 s | every episode, by 30 s | **the first part only**, by 60 s |
|
|
14
|
+
| turns | every 30 s | every 60 s | every 90 s |
|
|
15
|
+
| lines in a row | ≤ 3 | ≤ 4 | ≤ 5 |
|
|
16
|
+
| action beside dialogue | ≥ 35 % | ≥ 30 % | ≥ 25 % |
|
|
17
|
+
| cliff | every episode | every episode | at the act breaks (the end of golden and escalation); a part ends on a turn or a question |
|
|
18
|
+
| paywall logic | 卡点 at E8–12, ~E30 | the first cliffs of the season | none — the audience has paid for the whole film |
|
|
19
|
+
|
|
20
|
+
`init` reads the format from the genre (电影 / 微电影 / movie → `movie`, 中剧 / 横屏剧 → `medium`) or from
|
|
21
|
+
the length (over 3 minutes → `medium`); `--format` overrides it. The rhythm values above are
|
|
22
|
+
defaults: a project may still set `hookSeconds`, `turnSeconds`, `maxConsecutiveLines` or
|
|
23
|
+
`minActionRatio` itself. `validate` flags a unit length outside the format's range.
|
|
24
|
+
|
|
25
|
+
## What stays the same
|
|
26
|
+
|
|
27
|
+
- **The outline**: the brief (the six judgements), the three phases, the 创作指引, beats, and one
|
|
28
|
+
outline unit per episode or part, each with its function, task, change, 爽点 and hook. In a movie,
|
|
29
|
+
**golden / escalation / climax are acts one, two and three**, and each part's "hook" is the question
|
|
30
|
+
or turn it hands to the next part.
|
|
31
|
+
- **The bibles, the script beats, 谈话+行动, filmability**, the storyboard, the canvases (one per unit),
|
|
32
|
+
the references and the gates.
|
|
33
|
+
- **The looks, the action styles, the grammars, the composition and the story genres** — all of them.
|
|
34
|
+
|
|
35
|
+
## How the genre rules scale
|
|
36
|
+
|
|
37
|
+
The story-genre rules are mostly **shares of the run** (the turn at 25–45 %, the arch-nemesis at
|
|
38
|
+
80 %, the black moment at 70–90 %), which mean the same thing in every format. The few written as
|
|
39
|
+
counts ("a payback by E3", "no more than 3 episodes without sugar", "a breakthrough every 12") were
|
|
40
|
+
researched on 1–2-minute episodes, so they convert:
|
|
41
|
+
|
|
42
|
+
- **medium — by runtime.** Three 1.5-minute episodes are one 5-minute episode: "by E3" becomes "by
|
|
43
|
+
E1", "every 12 episodes" becomes "every 4".
|
|
44
|
+
- **movie — by share of the film**, because a film is not paced like a paywalled series: "the first
|
|
45
|
+
payback by E3" becomes "by 20 % of the film" (part 4 of 18), "at most 3 without sugar" becomes
|
|
46
|
+
"at most ~20 %".
|
|
47
|
+
- **"long enough"** conditions (a rule that only applies to runs of 20+ episodes) compare runtime,
|
|
48
|
+
so a 90-minute film or a 24 × 5-minute season qualifies.
|
|
49
|
+
|
|
50
|
+
Messages then speak of *units* rather than episodes. The comedy density converts by the minute
|
|
51
|
+
outside `short`: at least `0.8 × minutes` punchlines a unit for `slapstick` / `deadpan`,
|
|
52
|
+
`0.5 × minutes` otherwise (4 and 3 in a 5-minute unit).
|
|
53
|
+
|
|
54
|
+
## Medium drama (中剧)
|
|
55
|
+
|
|
56
|
+
The 4–15-minute episode (横屏微短剧 and the short series of the long-video platforms) keeps the 短剧
|
|
57
|
+
engine — a hook, turns, a 爽点, a cliff in every episode — with room to breathe:
|
|
58
|
+
|
|
59
|
+
- **Each episode has an A story and, from 8 minutes up, a B story**; two or three turns; the 爽点 in
|
|
60
|
+
the back half; the cliff at the end.
|
|
61
|
+
- **Scenes can run longer** (a 90-second confrontation plays), but keep the turn every minute.
|
|
62
|
+
- **The season still front-loads**: the first three episodes build retention (the `episode-design`
|
|
63
|
+
gate still checks E1 grabs, E2 proves the 爽点, E3 widens the line).
|
|
64
|
+
- **16:9** opens the frame: two-shots and wides carry more; the `composition` and `cinematography`
|
|
65
|
+
guides apply as written.
|
|
66
|
+
|
|
67
|
+
## Movie in parts (电影)
|
|
68
|
+
|
|
69
|
+
A feature written as ~5-minute parts is still one story. Think of the parts as **sequences** — each
|
|
70
|
+
with a local goal, an obstacle and a turn — grouped into three acts:
|
|
71
|
+
|
|
72
|
+
| act | phase | share | what happens |
|
|
73
|
+
| --- | --- | --- | --- |
|
|
74
|
+
| 1 | golden | ~25–30 % | the opening image and the hook in part 1; the world and the want; the catalyst at ~10 %; the break into act two |
|
|
75
|
+
| 2 | escalation | ~45–50 % | fun and games — the genre's promise delivered; **the midpoint** at 50 % (a false win or a false loss, the stakes raised); the bad guys close in |
|
|
76
|
+
| 3 | climax | ~20–25 % | all is lost at ~75 %; the dark night; the finale that pays every plant; the closing image |
|
|
77
|
+
|
|
78
|
+
- **A part ends on a button, not a cliffhanger** — a turn, a decision, a question — except at the two
|
|
79
|
+
act breaks, where the film does cliff. The part's `hookType` names what it hands on.
|
|
80
|
+
- **Plant and pay off across the whole film**: the mystery clue ledger, the revenge ladder, the
|
|
81
|
+
romance milestones and the running gags all work on the film's parts exactly as on episodes.
|
|
82
|
+
- **The 爽点 per part** becomes the part's payoff — a small win, a reveal, a laugh, a scare — so a film
|
|
83
|
+
written this way keeps the 短剧's density of payoffs without its cliff at every cut.
|
|
84
|
+
- **Production**: each part is still a unit of work — its own script file, its own storyboard (about
|
|
85
|
+
twenty 15-second generations for 5 minutes), its own canvas. Continuity across parts is the same
|
|
86
|
+
continuity across segments (`craft-shots.md`), carried by the sheets.
|
|
87
|
+
- **The frame**: 16:9 by default, 21:9 for a scope film; the `art-first` composition suits cinema.
|
|
88
|
+
|
|
89
|
+
## Choosing
|
|
90
|
+
|
|
91
|
+
Ask at the parameters question. A vertical, paywalled, many-episode series is `short`; a
|
|
92
|
+
horizontal series of longer episodes is `medium`; a single story meant to be watched in one go is a
|
|
93
|
+
`movie`, whatever its length. When in doubt, ask where it will be released and how it will be
|
|
94
|
+
watched.
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# Grammar `comedy` — 喜剧
|
|
2
|
+
|
|
3
|
+
Comedy is **timing and faces**. A joke is a setup, a punchline and the room to laugh; the camera's
|
|
4
|
+
job is to let the audience see the face and give the laugh its beat. Three styles
|
|
5
|
+
(`params.comedy`) share that grammar and differ in rhythm and camera. Combinations and exceptions:
|
|
6
|
+
`grammar.md`.
|
|
7
|
+
|
|
8
|
+
Use it on a segment with `"grammar": "comedy"`, or make it the default (`params.grammar:
|
|
9
|
+
comedy`) in a comedy, where a straight scene sets `grammar: drama` on itself.
|
|
10
|
+
|
|
11
|
+
## 1. The shared grammar
|
|
12
|
+
|
|
13
|
+
| field | on | meaning |
|
|
14
|
+
| --- | --- | --- |
|
|
15
|
+
| `gag: "setup"` | the cut that plants the joke | the expectation, the rule, the lie, the thing that will go wrong |
|
|
16
|
+
| `gag: "build"` | optional, cuts that raise it | the rule of three: the same thing twice, then the twist |
|
|
17
|
+
| `gag: "punchline"` | the cut the joke lands on | the reversal, the reveal, the pratfall, the line |
|
|
18
|
+
| `purpose.kind: "reaction"` | the cut after the punchline | the laugh room: the face that takes the joke |
|
|
19
|
+
|
|
20
|
+
**Gated:**
|
|
21
|
+
- **Setup first** (`setup-first`): a punchline needs a `setup` earlier in the same scene.
|
|
22
|
+
- **Laugh room** (`punchline-reaction`): a punchline is followed by a `reaction` cut of at least
|
|
23
|
+
the style's `hold` seconds, **or** the punchline itself is a `Static Shot` held `hold + 1`
|
|
24
|
+
seconds (the awkward hold).
|
|
25
|
+
|
|
26
|
+
**Advisory** (`grammar-advice`): a comedy segment with no punchline; the average cut length of the
|
|
27
|
+
style; its signature shot; a punchline keyed from the side or behind in a `low-key` /
|
|
28
|
+
`costume-dark` drama (a laugh needs the face).
|
|
29
|
+
|
|
30
|
+
**Craft that holds for all three:**
|
|
31
|
+
- **Faces must read.** Comedy is the one grammar that asks the light to reach the face on the
|
|
32
|
+
punchline, even in a dark look.
|
|
33
|
+
- **The reaction is funnier than the action.** Cut to the person who sees it, not the thing
|
|
34
|
+
itself, and hold.
|
|
35
|
+
- **The rule of three**: set it up, repeat it, break it. Mark the first two `setup` / `build`.
|
|
36
|
+
- **Callbacks**: a setup in episode 1 can pay off in episode 5; put the setup on the cut
|
|
37
|
+
(`gag: setup`) so the payoff can point at it.
|
|
38
|
+
- **Silence is a sound**: a `silence` music cue or a pause in the ambience before the punchline.
|
|
39
|
+
- **Model limits**: a pratfall, a spit take, a double-take, a jaw drop, a freeze are common
|
|
40
|
+
actions and render well; a precise timed collision (a pie hitting a moving face) does not —
|
|
41
|
+
show the before and the after.
|
|
42
|
+
|
|
43
|
+
## 2. `slapstick` — 无厘头喜剧
|
|
44
|
+
|
|
45
|
+
Big, fast, physical, exaggerated. Faces stretched, bodies flung, logic abandoned.
|
|
46
|
+
|
|
47
|
+
- **Rhythm**: short cuts (2–3 s); laugh room `hold` = 2 s.
|
|
48
|
+
- **Camera**: the **crash zoom** (`Zoom In`) onto a stunned face is the signature; whip pans
|
|
49
|
+
(`Pan Left` / `Pan Right`) between two people; a freeze-frame on the peak of the gag;
|
|
50
|
+
`Shake Slightly` on a crash.
|
|
51
|
+
- **Sound**: cartoon sfx on every beat (boing, whoosh, record scratch), a comic sting after the
|
|
52
|
+
punchline, sudden silence.
|
|
53
|
+
- **Set pieces**: the double-take; the pratfall on the prop planted in the setup; the
|
|
54
|
+
over-the-top 反应 (fainting, spitting tea); the absurd escalation of a small lie.
|
|
55
|
+
- **Example `motion.action`**: `he spits the tea across the table`; `she freezes with the
|
|
56
|
+
chopsticks halfway to her mouth`.
|
|
57
|
+
|
|
58
|
+
## 3. `deadpan` — 冷面处境喜剧
|
|
59
|
+
|
|
60
|
+
Dry, still, awkward. The frame does the joke: symmetrical static shots held a beat too long,
|
|
61
|
+
characters with straight faces in an absurd situation.
|
|
62
|
+
|
|
63
|
+
- **Rhythm**: long cuts (3–5 s); laugh room `hold` = 3 s — the silence after is the joke.
|
|
64
|
+
- **Camera**: locked-off (`Static Shot`) wides and mediums, centred and symmetrical; people
|
|
65
|
+
arranged in a row facing the camera; no zooms, no shake.
|
|
66
|
+
- **Sound**: no comic sfx, often no music; the ambience (a clock, a fly, a fridge hum) fills the
|
|
67
|
+
awkward pause.
|
|
68
|
+
- **Set pieces**: the awkward silence after the wrong thing is said; the straight-faced
|
|
69
|
+
explanation of something absurd; the slow turn of every head in the row; the cut to the one
|
|
70
|
+
person who has not moved.
|
|
71
|
+
- **Example `motion.action`**: `all four turn their heads toward him at the same time`; `he sets
|
|
72
|
+
the cup down very slowly`.
|
|
73
|
+
|
|
74
|
+
## 4. `romcom` — 甜宠喜剧
|
|
75
|
+
|
|
76
|
+
Cute, flustered, embarrassed. The joke is on the lovers: the misunderstanding, the accidental
|
|
77
|
+
closeness, the blush.
|
|
78
|
+
|
|
79
|
+
- **Rhythm**: 2–4 s; laugh room `hold` = 2 s.
|
|
80
|
+
- **Camera**: close-up reactions (the blush, the double-take, the eyes going wide) are the
|
|
81
|
+
signature; a `Push In` on the embarrassed face; the two-shot of the misunderstanding with both
|
|
82
|
+
faces readable. Pairs with the `sweet-romance` look.
|
|
83
|
+
- **Sound**: playful pops and plinks, a heartbeat, a cute sting; the OST can enter on the blush.
|
|
84
|
+
- **Set pieces**: the overheard sentence taken the wrong way; the accidental fall into each
|
|
85
|
+
other's arms (then the scramble apart); the text sent to the wrong person; the jealous
|
|
86
|
+
friend's exaggerated reaction; the third wheel.
|
|
87
|
+
- **Example `motion.action`**: `her face goes red and she hides behind the menu`; `he does a
|
|
88
|
+
double-take between the phone and her` (one action).
|
|
89
|
+
|
|
90
|
+
## 5. With the other axes
|
|
91
|
+
|
|
92
|
+
| combination | how it plays |
|
|
93
|
+
| --- | --- |
|
|
94
|
+
| `costume-idol` / `costume-dark` (古装喜剧) | court etiquette as the straight line the joke breaks; `deadpan` suits a court, `slapstick` a tavern |
|
|
95
|
+
| `period-nostalgia` (年代喜剧) | `deadpan` with the era's objects as props; the static tableau is already an old photograph |
|
|
96
|
+
| `sweet-romance` | `romcom` |
|
|
97
|
+
| with `action` (`hk-kungfu`) | the comic fight: the setup is the prop, the punchline the hit that goes wrong, the reaction the shaken hand |
|
|
98
|
+
| with `faceslap` | the villain's comeuppance played to farce |
|
|
99
|
+
|
|
100
|
+
## 6. Review questions
|
|
101
|
+
|
|
102
|
+
- Where is the setup, and does the audience see it?
|
|
103
|
+
- Whose face takes the joke, and for how long?
|
|
104
|
+
- Is the face lit on the punchline?
|
|
105
|
+
- Is the camera doing the style — crash zoom, locked-off symmetry, or the close-up blush?
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# Grammar `faceslap` — 爽剧打脸
|
|
2
|
+
|
|
3
|
+
The payoff 短剧 audiences come for: the hero who was mocked, doubted or trampled **turns the
|
|
4
|
+
tables in public**. The whole beat is built for one feeling (扬眉吐气): the arrogance before, the
|
|
5
|
+
calm of the hero, the proof, then face after face changing its tune. Cut it as a sequence, not as
|
|
6
|
+
one shot. Combinations and exceptions: `grammar.md`.
|
|
7
|
+
|
|
8
|
+
Use it on a segment with `"grammar": "faceslap"` — always on the 爽点 of an episode whose
|
|
9
|
+
`satisfaction.type` is 打脸, 身份揭露, 智商碾压 or 复仇, and anywhere else the tables turn.
|
|
10
|
+
|
|
11
|
+
## 1. The sequence
|
|
12
|
+
|
|
13
|
+
| # | beat | cut | purpose | notes |
|
|
14
|
+
| --- | --- | --- | --- | --- |
|
|
15
|
+
| 1 | **the pressure** (压) | the villain's arrogance: the sneer, the insult, the crowd laughing along | `pressure` | the harder the setup, the harder the payoff; can sit in the segment before |
|
|
16
|
+
| 2 | **the calm** (静) | the hero unmoved: a small smile, a slow look up, the untouched tea | `performance` | stillness against their noise |
|
|
17
|
+
| 3 | **the entrance / the move** (起) | the hero stands, walks in, or someone important enters on their side; **low angle**, often slow motion | `reveal` / `decision` | the music enters here |
|
|
18
|
+
| 4 | **the proof** (证) | an insert on what turns the tables: the contract, the black card, the badge, the ring, the phone screen, the transfer receipt, the photograph | `evidence` / `reveal` | gated: every 打脸 shows its proof |
|
|
19
|
+
| 5 | **the cascade** (反应链) | face after face: the villain pales, the crowd whispers, the one who doubted drops their cup, the villain's ally steps away | `reaction` × 2 or more | gated: ≥ 2 reaction cuts (this segment and the next in the scene), on different people |
|
|
20
|
+
| 6 | **the landing** (落) | the villain's consequence (kneels, is escorted out, loses the deal) or the hero's quiet last line | `consequence` | the hook for the next beat can hide here |
|
|
21
|
+
|
|
22
|
+
Beats 1–2 may belong to the segment before. The gate checks 4 and 5; the advisory
|
|
23
|
+
`grammar-advice` notes a missing pressure cut, a missing low angle and a missing music hit.
|
|
24
|
+
|
|
25
|
+
## 2. Camera and framing
|
|
26
|
+
|
|
27
|
+
- **The hero from below** (`height: low`), centred, unhurried; the villain at eye level or from
|
|
28
|
+
above as they shrink. Swap the power geometry of the earlier scenes.
|
|
29
|
+
- **The proof in close-up or extreme close-up**, held long enough to read (2–3 s). Readable text
|
|
30
|
+
follows the prop's `textPolicy` (stage-art). A slap on the table is the classic entrance for it.
|
|
31
|
+
- **The cascade in close-ups**, each a different face, 2 s each, cut on the beat of the music.
|
|
32
|
+
A `Push In` on the villain's face as it drains is the signature shot.
|
|
33
|
+
- **Slow motion** on the entrance or the proof (`in slow motion` in `motion`), once.
|
|
34
|
+
- **The crowd** is the chorus: one wide of the room changing its tune (heads turning, phones
|
|
35
|
+
lowering) sells the scale. Staging per `maxOnScreen`.
|
|
36
|
+
|
|
37
|
+
## 3. Sound
|
|
38
|
+
|
|
39
|
+
`sound.music`: `silence` or `drop` under the insult (the room holds its breath), `enter` or
|
|
40
|
+
`swell` on the entrance or the proof, full through the cascade. `sound.sfx`: the slap of the
|
|
41
|
+
document on the table, the gasp, the cup falling, the murmur rising. A single line from the hero,
|
|
42
|
+
quiet, often lands harder than a speech.
|
|
43
|
+
|
|
44
|
+
## 4. With the other axes
|
|
45
|
+
|
|
46
|
+
| combination | how it plays |
|
|
47
|
+
| --- | --- |
|
|
48
|
+
| `low-key` look | the hero steps out of the shadow into the practical light for the reveal |
|
|
49
|
+
| `sweet-romance` look (霸总) | the male lead arrives to back her; the halo behind him on the entrance |
|
|
50
|
+
| `costume-dark` (宫斗) | the edict, the jade token, the imperial seal as the proof; kneeling as the landing |
|
|
51
|
+
| with `action` | the underdog's single decisive blow, then the cascade of the watching crowd |
|
|
52
|
+
| with `comedy` | the villain's reaction pushed to farce (the jaw drop, the spit take), still ≥ 2 reactions |
|
|
53
|
+
|
|
54
|
+
## 5. Example cut lines
|
|
55
|
+
|
|
56
|
+
- pressure: `the young heir laughs and tosses the contract onto the floor at her feet`
|
|
57
|
+
- entrance: `she rises from the chair in slow motion and looks up at him`
|
|
58
|
+
- proof: `she lays the black card on the table`
|
|
59
|
+
- reaction: `his smile drains away and he takes half a step back`
|
|
60
|
+
- reaction: `the manager's pen stops above the page`
|
|
61
|
+
|
|
62
|
+
## 6. Review questions
|
|
63
|
+
|
|
64
|
+
- Was the hero pushed down hard enough before?
|
|
65
|
+
- Can the audience read the proof?
|
|
66
|
+
- How many different faces change — at least two?
|
|
67
|
+
- Is the hero shot from below, and does the music come in?
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
# Genre = axes + grammars — how a drama's look and cutting are composed
|
|
2
|
+
|
|
3
|
+
A genre like 古装喜剧 or 未来动作 is not one setting. It is a **combination**: what the world looks
|
|
4
|
+
like, how people talk, and how each scene is cut. The skill keeps those apart so any combination
|
|
5
|
+
works, and never needs a preset per genre.
|
|
6
|
+
|
|
7
|
+
## 1. The drama's axes (one value each, in `params`)
|
|
8
|
+
|
|
9
|
+
| axis | param | what it decides | values | guide |
|
|
10
|
+
| --- | --- | --- | --- | --- |
|
|
11
|
+
| render | `style` | how the picture is drawn | `photoreal` · `realistic` · `ghibli` · `soft3d` · `disney3d` | stage-characters |
|
|
12
|
+
| look | `cinematography` | light, colour, the world | `low-key` · `sweet-romance` · `period-nostalgia` · `costume-idol` · `costume-dark` · `scifi-hard` · `scifi-soft` · `none` | `cinematography.md` |
|
|
13
|
+
| framing | `composition` | what the frame is built for, in any genre (a segment may override it) | `standard` · `art-first` (艺术优先: negative space, symmetry, monumental scale) | `composition-art-first.md` |
|
|
14
|
+
| lines | `register` | how dialogue is written and spoken | `粤语` · `大陆普通话` · `台湾国语` · `港式普通话` · `古装` · `年代` · `英文美式` · `英文英式` | dialogue-craft |
|
|
15
|
+
| fights | `action` | how a fight is cut | `gun-fu` · `hk-kungfu` · `wuxia-fantasy` · `historical-realist` · `bullet-time` · `superhero` · `street-brawl` · `car-chase` · `none` | `action.md` |
|
|
16
|
+
| laughs | `comedy` | how a gag is cut | `slapstick` · `deadpan` · `romcom` · `none` | `grammar-comedy.md` |
|
|
17
|
+
| default cutting | `grammar` | the grammar of a segment that does not name its own | `drama` · `action` · `faceslap` · `comedy` | this file |
|
|
18
|
+
|
|
19
|
+
## 2. The segment's grammar (per storyboard segment)
|
|
20
|
+
|
|
21
|
+
Each segment is cut in one or more grammars: `segment.grammar` (a string or an array), else
|
|
22
|
+
`params.grammar`.
|
|
23
|
+
|
|
24
|
+
| grammar | for | adds | guide |
|
|
25
|
+
| --- | --- | --- | --- |
|
|
26
|
+
| `drama` | ordinary scenes | nothing beyond the base storyboard rules | — |
|
|
27
|
+
| `action` | fights, chases, power battles | open wide, one move per cut, a reaction after every impact, in `params.action`'s style | `action.md` |
|
|
28
|
+
| `faceslap` | the 打脸 payoff: 身份揭露, 智商碾压, 复仇 reversals | the proof on screen, a cascade of ≥ 2 reactions | `grammar-faceslap.md` |
|
|
29
|
+
| `comedy` | gags | a setup before every punchline, laugh room after it, in `params.comedy`'s style | `grammar-comedy.md` |
|
|
30
|
+
|
|
31
|
+
**Grammars combine.** `"grammar": ["action", "comedy"]` is a comic fight (a 港式功夫喜剧 brawl):
|
|
32
|
+
every hard rule of both applies, and the prompt carries both lines. `["faceslap", "comedy"]` is a
|
|
33
|
+
comic 打脸 (the villain's jaw literally drops). `["action", "faceslap"]` is the fight in which the
|
|
34
|
+
underdog wins and the room turns.
|
|
35
|
+
|
|
36
|
+
**The prompt says how it is cut.** `prompt segment` writes one labelled line per grammar,
|
|
37
|
+
gated verbatim: `Action: …`, `Payoff: …`, `Comedy: …` (for `wan`: `动作:`, `爽点:`, `喜剧:`).
|
|
38
|
+
|
|
39
|
+
## 3. Recipes — common 短剧 genres as combinations
|
|
40
|
+
|
|
41
|
+
`init` reads every axis from `--genre` on its own (the look, the action style, the default
|
|
42
|
+
grammar and the comedy style), so `--genre 古装喜剧` already composes the first row. Confirm the
|
|
43
|
+
result with the user and override any axis with its flag; a value in *italics* below is one
|
|
44
|
+
`init` does not pick from the genre alone, so pass it.
|
|
45
|
+
|
|
46
|
+
| genre | look | register | default grammar | action | comedy | 打脸 |
|
|
47
|
+
| --- | --- | --- | --- | --- | --- | --- |
|
|
48
|
+
| 古装喜剧 | `costume-idol` (or `costume-dark` for a dry court comedy) | 古装 | `comedy` | — | `slapstick` / `deadpan` | on the 爽点 |
|
|
49
|
+
| 未来动作 / 科幻动作 | `scifi-soft` (or *`scifi-hard`*) | any | `drama` | `bullet-time` (or *`superhero`*) | — | — |
|
|
50
|
+
| 硬科幻 | `scifi-hard` | any | `drama` | — | — | — |
|
|
51
|
+
| 赛博朋克 | `scifi-soft` | any | `drama` | *`gun-fu` / `street-brawl`* | — | — |
|
|
52
|
+
| 艺术古装 / 文艺科幻 / any 艺术 genre | the genre's look | any | the genre's | — | — | — · plus `composition: art-first` |
|
|
53
|
+
| 霸总甜宠 | `sweet-romance` | 大陆普通话 | `drama` | — | `romcom` for the gags | on the 爽点 |
|
|
54
|
+
| 战神 / 赘婿 / 逆袭 | `low-key` or `none` | any | `drama` | *`street-brawl` / `gun-fu`* | — | **every 爽点** |
|
|
55
|
+
| 港式功夫喜剧 | *`none`* | 粤语 | `comedy` | `hk-kungfu` | `slapstick` | — |
|
|
56
|
+
| 仙侠 | `costume-idol` | 古装 | `drama` | `wuxia-fantasy` | — | — |
|
|
57
|
+
| 宫斗 / 权谋 | `costume-dark` | 古装 | `drama` | `historical-realist` if it fights | — | **every 爽点** |
|
|
58
|
+
| 年代喜剧 | `period-nostalgia` | 年代 | `comedy` | — | *`deadpan`* | — |
|
|
59
|
+
| 甜宠喜剧 | `sweet-romance` | any | `comedy` | — | `romcom` | — |
|
|
60
|
+
| 都市悬疑 | `low-key` | any | `drama` | — | — | — |
|
|
61
|
+
|
|
62
|
+
`init` also reads `composition: art-first` when the genre says 艺术 / 文艺 / arthouse; for any other
|
|
63
|
+
genre, pass `--composition art-first` when the user asks for art-first framing.
|
|
64
|
+
|
|
65
|
+
How to read a mixed genre:
|
|
66
|
+
- **The look is the world**, and there is one. A comedy set in a palace is `costume-*`, not a
|
|
67
|
+
"comedy look".
|
|
68
|
+
- **The default grammar is what most scenes are.** In a comedy, most segments are comedy, and the
|
|
69
|
+
straight scene sets `grammar: drama` on itself. In a drama with a few jokes, the default is
|
|
70
|
+
`drama` and the gag segments set `comedy`.
|
|
71
|
+
- **Fights, 打脸 and gags are segments.** Mark them where they happen, not on the whole drama.
|
|
72
|
+
- **The 爽点 of a 打脸-type episode is a `faceslap` segment.** When the outline's
|
|
73
|
+
`satisfaction.type` is 打脸 / 身份揭露 / 智商碾压 / 复仇, the advisory `grammar-advice` names the
|
|
74
|
+
segment carrying the `satisfactionBeat` if it is not cut as one.
|
|
75
|
+
|
|
76
|
+
## 4. Exceptions
|
|
77
|
+
|
|
78
|
+
Every hard grammar rule can be waived for one segment when **the user asks for it**:
|
|
79
|
+
`"exceptions": [{ "rule": "<rule>", "reason": "user: <what they asked>" }]`. The rules:
|
|
80
|
+
`open-wide` · `one-move` · `impact-reaction` · `no-graphic` (action), `reveal-insert` ·
|
|
81
|
+
`reaction-chain` (faceslap), `punchline-reaction` · `setup-first` (comedy), `composition-device` ·
|
|
82
|
+
`signature-share` · `art-wide` (art-first). Never add an exception
|
|
83
|
+
yourself to turn a gate green. The old `actionExceptions` key and `action: true` still work.
|
|
84
|
+
|
|
85
|
+
## 5. Gates
|
|
86
|
+
|
|
87
|
+
| gate | checks |
|
|
88
|
+
| --- | --- |
|
|
89
|
+
| `grammar` | grammars are known; `params.action` / `params.comedy` are chosen when a segment uses them; exceptions name a rule and carry a reason; `gag` values; each grammar's line in the prompt |
|
|
90
|
+
| `action` | the fight rules (`action.md`) |
|
|
91
|
+
| `faceslap` | the proof on screen; ≥ 2 reactions after it (this segment and the next one in the scene) |
|
|
92
|
+
| `comedy` | a setup before every punchline (in the scene); laugh room after it |
|
|
93
|
+
| `action-advice` · `grammar-advice` | rhythm, signature shots, 打脸 craft, comedy craft, the 爽点 link (advisory) |
|
|
94
|
+
| `composition` | art-first: every cut's devices named and in the frame, ≥ 50 % negative space / symmetry / monumental scale, a wide per segment |
|
|
95
|
+
| `no-ip-names` | no film, franchise or performer names anywhere |
|
|
96
|
+
|
|
97
|
+
## 6. Adding a grammar or a style
|
|
98
|
+
|
|
99
|
+
A new **style of an existing grammar** (a fourth comedy style, a ninth action style) is an entry
|
|
100
|
+
in `COMEDY_STYLES` / `ACTION_STYLES` with its phrases, rhythm and signature shots, plus a section
|
|
101
|
+
in its guide. A new **grammar** (suspense, horror, melodrama…) is a name in `GRAMMARS`, its hard
|
|
102
|
+
rules in a gate, its advisory craft in `grammar-advice`, a line in `grammarLines`, and a guide
|
|
103
|
+
`grammar-<name>.md` in the same shape as the two here.
|
|
@@ -15,7 +15,7 @@ node {baseDir}/scripts/short-drama.mjs <cmd> {project} …
|
|
|
15
15
|
|
|
16
16
|
| Operation | Command |
|
|
17
17
|
| --- | --- |
|
|
18
|
-
| `init` | `short-drama.mjs init {project} --title "<t>" --episodes N --minutes M --genre "<g>" --register 台湾国语 [--adapt 抽核] [--ratio 9:16] [--video h3\|seedance\|seedance2\|seedance2fast\|wan] [--resolution 480P…] [--accent "<accent>"] [--style photoreal\|realistic\|ghibli] [--references sheets\|keyframes] [--duration auto\|fixed] [--look "<lens>"] [--lang zh]` |
|
|
18
|
+
| `init` | `short-drama.mjs init {project} --title "<t>" --episodes N --minutes M --genre "<g>" --register 台湾国语 [--adapt 抽核] [--ratio 9:16] [--video h3\|seedance\|seedance2\|seedance2fast\|wan] [--resolution 480P…] [--accent "<accent>"] [--style photoreal\|realistic\|ghibli] [--references sheets\|keyframes] [--duration auto\|fixed] [--look "<lens>"] [--cinematography low-key\|sweet-romance\|period-nostalgia\|costume-idol\|costume-dark\|scifi-hard\|scifi-soft\|none] [--action <style>\|none] [--violence blood\|implied] [--grammar drama\|action\|faceslap\|comedy] [--comedy slapstick\|deadpan\|romcom\|none] [--composition standard\|art-first] [--story revenge,sweet,…] [--market mainland\|overseas] [--format short\|medium\|movie] [--lang zh]` |
|
|
19
19
|
| `validate` | `short-drama.mjs validate {project} [--stage <stage>] [--ep N]` — exits 1 on a hard failure, 0 on advisories alone |
|
|
20
20
|
| `checkup` | `short-drama.mjs checkup {project}` — same, but prints the passing and skipped rows too |
|
|
21
21
|
| `seed` | `short-drama.mjs seed {project} script --ep N [--force]` · `… seed {project} storyboard --ep N [--force]` |
|
|
@@ -67,6 +67,15 @@ All commands accept either the directory or the `project.json` path.
|
|
|
67
67
|
| `audioTrack` | `bed` | the Seed Audio node per segment: `bed` (ambience + sfx + timed music, no voices), `full` (the bed plus every line in the connected `@Audio1..3` voices — at most three speakers), `none` |
|
|
68
68
|
| `subtitles` | false | `true` drops the subtitles-off sentence requirement from the prompts |
|
|
69
69
|
| `maxFrameChars` | 900 | frames longer than this are flagged as padding (advisory) |
|
|
70
|
+
| `composition` | picked by `init` from the genre (`standard` unless it says 艺术 / 文艺) | what the frame is built for, `COMPOSITION_STYLES`: `standard` or `art-first` (艺术优先: every cut names its devices, ≥ 50 % negative space / symmetry / monumental scale, a wide per segment, a `Composition:` line); a segment may override it with its own `composition`; see `composition-art-first.md` |
|
|
71
|
+
| `grammar` | picked by `init` from the genre (`comedy` for a comedy, else `drama`) | the grammar a segment without its own `grammar` is cut in: `drama` · `action` · `faceslap` · `comedy`; see `grammar.md` |
|
|
72
|
+
| `comedy` | picked by `init` from the genre (`none` unless a comedy) | the comedy style, `COMEDY_STYLES`: `slapstick` · `deadpan` · `romcom` · `none`; see `grammar-comedy.md` |
|
|
73
|
+
| `format` | `short` (`init` reads it from the genre or the length) | `short` 短剧 (1–3 min), `medium` 中剧 (4–15 min), `movie` 电影 in ~5-minute parts; sets the default `hookSeconds` / `turnSeconds` / `maxConsecutiveLines` / `minActionRatio` and how the genre counts scale (`span`); see `format.md` |
|
|
74
|
+
| `market` | `mainland` | `mainland` or `overseas` — on the mainland a horror threat is explained rationally and the superstition notes apply |
|
|
75
|
+
| `story` | read by `init` from the genre (empty unless it names one) | the story genres, a list: `revenge` · `sweet` · `mystery` · `comedy` · `angst` · `family` · `palace` · `cultivation` · `scifi` · `horror`; each adds an outline ledger and rules (gates `story-*`); see `story.md` |
|
|
76
|
+
| `action` | `none` (`init` reads it from the genre only when named) | how fight segments are cut, `ACTION_STYLES`: `gun-fu`, `hk-kungfu`, `wuxia-fantasy`, `historical-realist`, `bullet-time`, `superhero`, `street-brawl`, `car-chase` or `none`; see `action.md` |
|
|
77
|
+
| `violence` | `blood` | `blood` lets frames and prompts show blood and wounds (never dismemberment, decapitation or organs); `implied` shows impact only through reaction and sound |
|
|
78
|
+
| `cinematography` | picked by `init` from the genre (`none` when the key is missing) | the lighting and composition preset, `CINEMATOGRAPHY_PRESETS`: `low-key` (practical sources, people in shadow, side / back / rim light, negative space), `sweet-romance` (soft bright faces, backlit halo, pastel, the couple's distance as the story), `period-nostalgia` (film look, window sun and bare bulbs, ≤ T4), `scifi-hard` (engineered light, one harsh sun, no magic or holograms), `scifi-soft` (holograms, neon, dual-tone colour), `costume-idol` (luminous, gauze, backlit silk), `costume-dark` (firelight and lattice windows, faces in shadow); both costume presets need a wide with negative space in every segment or `none`. Every preset: a named `light.source`, a foreground, ≤ T2.8 unless it says otherwise (`sweet-romance` / `costume-idol`: ≤ T2, a T1.3 package from `init`, half the frames naming their bokeh); the period and costume ones refuse sources from the wrong era. Gated in `scene-design`, `photography` and `video-prompt`; see `cinematography.md` |
|
|
70
79
|
| `lookPhrase` | empty | a lens / look phrase (e.g. `wide-aperture lens, shallow depth of field, creamy background bokeh and soft out-of-focus foreground elements`) that every segment prompt must carry verbatim |
|
|
71
80
|
| `style` | `realistic` | `photoreal` (live action), `realistic` (semi-realistic painterly) or `ghibli`; one style for the whole drama (see stage-characters) |
|
|
72
81
|
| `register` | required | the 语体 the lines are written in: `粤语` / `大陆普通话` / `台湾国语` / `港式普通话` / `古装` / `年代` / `英文美式` / `英文英式` (traditional spellings accepted). When `speechAccent` is empty it is derived from this in the prompt's language (`standard Mandarin` / `标准普通话`). A character may override it in `bible.speech.register`. The `dialogue-register` gate is **advisory** — it notes lines that break the register and never fails `validate` |
|
|
@@ -114,6 +123,17 @@ written exactly like 2.5 — they differ only in the ceiling (15 s, not 30) and
|
|
|
114
123
|
| `guideline` | yes | the 创作指引 — `{tone, emotionalIntensity, dialogueStyle, visualStyle, productionLimits, forbidden[] (≥3), priorities[] (3–5)}`; `render guideline` publishes it as its own dataset and it is re-read before every stage |
|
|
115
124
|
| `beats[]` | ≥1 | `{id:"B01", type, weight:"major"|"minor", episode, setup, payoff}`; `episode` is the only place a beat's position lives |
|
|
116
125
|
| `episodes[]` | exactly `params.episodes` | `{ep, function[], task: {goal, obstacle, stake}, change, satisfaction: {type, action}, hookType, synopsis, hook, suspense, sceneIds[], characterIds[], propIds[], crowdPlan?, warnings[]}` — narrative prose, **no dialogue quotes** (`「」『』“”`). `function` ⊆ `开局钩子 / 冲突升级 / 身份揭露 / 情感推进 / 大反转 / 清算收束`; `satisfaction.type` ∈ the six 爽点 types and `action` is the visible action that does it; `hookType` ∈ `身份 / 危机 / 结果 / 情感 / 反转 / 道具`. Episode 1 includes 开局钩子; with ≥ 3 episodes, episode 2's 爽点 type is the brief's engine and episode 3 includes 冲突升级 / 身份揭露 / 大反转; the finale includes 清算收束 or 大反转 |
|
|
126
|
+
| `paybacks[]` | `revenge` | `{ ep, target (an antagonist), scale: small / big / final, by (who lands it), how }` — every antagonist finished once, in tier order (gate `story-revenge`) |
|
|
127
|
+
| `romance[]` | `sweet` | `{ ep, milestone, until?, note }` — `milestone` ∈ `meet bind spark touch jealousy protect kiss confession misunderstanding reconcile public black-moment commit`; a misunderstanding has `until` (gate `story-sweet`) |
|
|
128
|
+
| `mysteryMode` · `questions[]` · `clues[]` | `mystery` | `whodunit` / `inverted` / `thriller`; `{ id, layer 1–3, question, openEp, answerEp, clues[] }`; `{ id, kind: true / red-herring, what, plantEp, prop?, echoEps[], dismissedEp? }` (gate `story-mystery`) |
|
|
129
|
+
| `brief.comicPremise` · `runningGags[]` | `comedy` | the gap between the normal and the comic world; `{ id, premise, eps[] }` (gate `story-comedy`) |
|
|
130
|
+
| `angst` · `brief.redLines` | `angst` | `{ ending: HE / HE-second / BE / OE, turnEp, exitEp, reconcileEp, misbelief: { belief, engineeredBy, evidence, audienceRevealEp, heroRevealEp }, beats: [{ ep, kind: 虐 / 悔 / 追 / 糖, inflictor?, what?, cost?, severity?, releaseEp?, public? }] }`; what the male lead never does (gate `story-angst`) |
|
|
131
|
+
| `secrets[]` · `vindications[]` · `reconciliations[]` | `family` | `{ id, content, audienceKnowsEp, plantEp, hintEps[], revealEp }`; `{ char, ep, venue, witnesses[] }`; `{ pair, woundEp, triggerEp, turnEp, endState }` (gate `story-family`) |
|
|
132
|
+
| `rankLadder` · `rankEvents[]` · `schemes[]` · `factions[]` · `allegiance[]` | `palace` | `{ track, levels[] }`; `{ char, ep, to }`; `{ id, schemer, target, stakes, setupEp, revealEp, outcome, counteredBy: { type, ref, plantEp }, flaw, justice? }`; `{ id, leader, members[] }`; `{ char, ep, from, to, motive, foreshadowEp }` (gate `story-palace`) |
|
|
133
|
+
| `powerSystem` · `goldenFinger` · `startPower` · `upgrades[]` · `fights[]` | `cultivation` | `{ realms: [{ id, name, visual }] }`; `{ type, name, activationEp, rules[], costs[] }` (or two); `废柴 / 隐藏大佬 / 满级`; `{ ep, char, to, cause, cost }`; `{ ep, foe, heroRealm, foeRealm, foeRevealedEp, edge? }` (gate `story-cultivation`) |
|
|
134
|
+
| `brief.novum` · `worldRules[]` · `countdown` · `loops[]` · `foreknowledge[]` · `secondaryNovums[]` | `scifi` | `{ statement, category, mode, firstEp }`; `{ id, rule, kind: power / limit / cost / trigger / exception, shownEp, decidesEps[], brokenEp?, revealSetupEp? }`; `{ label, zeroEp, log: [{ ep, value }] }`; `{ n, ep, newInfo, changed }`; `{ event, plantedEp, payoffEp, deviated }`; `{ id, derivesFrom }` (gate `story-scifi`) |
|
|
135
|
+
| `horror` · `horrorRules[]` · `episodes[].scares` | `horror` | `{ subgenre, threat: { nature, firstSignEp, glimpseEps[], revealEp, explanation: { type, revealEp, clueEps[] } } }`; `{ id, text, isTrue, shownEp, brokenEp?, consequence }`; `[氛围 / 假警报 / 惊吓 / 揭示 / 规则惩罚]` (gate `story-horror`) |
|
|
136
|
+
| `storyExceptions[]` | no | `{ rule, reason }` — waives a story rule for the whole drama when the user asks (`story.md`) |
|
|
117
137
|
|
|
118
138
|
`warnings` values: `雨戏`, `肢体接触`, `人群`, `手部特写` (generation hazards).
|
|
119
139
|
|
|
@@ -151,6 +171,13 @@ Outline stage fills the first block; the characters stage fills the rest.
|
|
|
151
171
|
}
|
|
152
172
|
```
|
|
153
173
|
|
|
174
|
+
Story-genre character fields (outline stage, only for the genres in `params.story`):
|
|
175
|
+
`antagonist: { tier: 1–3, firstPressEp, motive }` (`revenge`), `mysteryRole` (`investigator`
|
|
176
|
+
`culprit` `accomplice` `suspect` `unreliable-ally` `victim` `witness`) and `firstEp` (`mystery`),
|
|
177
|
+
`comic: { flaw, humanity, role: 逗 / 捧 / both }` (`comedy`), `family: { generation, role, minor?,
|
|
178
|
+
endState }` (`family`). Script beats may carry `clue` (a clue
|
|
179
|
+
id or list) and `gag` (`setup` / `build` / `punchline`) with `runningGag`.
|
|
180
|
+
|
|
154
181
|
| Field | Language | Rules |
|
|
155
182
|
| --- | --- | --- |
|
|
156
183
|
| `tier` | — | `lead` (1–5, `arc` required) / `support` (≤10, `arc` required) / `functional` (≤10, `name` is a role label such as 急诊医生, `arc` optional) |
|
|
@@ -237,7 +264,7 @@ prompt bans hands**). At most `thresholds.maxProps` (8).
|
|
|
237
264
|
"cuts": [
|
|
238
265
|
{ "beats": [1, 1], "seconds": 3, "size": "medium", "camera": "Tracking Shot",
|
|
239
266
|
"focal": "40mm",
|
|
240
|
-
"light": { "direction": "back-left", "note": "the store light rims her shoulder; the street stays unlit" },
|
|
267
|
+
"light": { "direction": "back-left", "source": "the store's fluorescent window", "note": "the store light rims her shoulder; the street stays unlit" },
|
|
241
268
|
"foreground": "the dripping edge of the striped awning",
|
|
242
269
|
"characters": ["C01"], "props": ["P01"], "frame": "medium shot of …, cinematic film still", "note": "" }
|
|
243
270
|
],
|
|
@@ -278,17 +305,21 @@ Duration: `Σ lines (chars ÷ charsPerSecond) + Σ actions × actionSeconds`.
|
|
|
278
305
|
| `camera` | one of the H3 vocabulary: `Static Shot` `Push In` `Pull Out` `Zoom In` `Zoom Out` `Pan Left` `Pan Right` `Truck Left` `Truck Right` `Tilt Up` `Tilt Down` `Pedestal Up` `Pedestal Down` `Arc Shot` `Tracking Shot` `Shake Slightly` `Shake Strongly` `POV` `Roll Clockwise` `Roll Counterclockwise` |
|
|
279
306
|
| `characters` / `props` | ⊆ the scene's; `characters.length > maxOnScreen` needs `note` |
|
|
280
307
|
| `focal` / `aperture` | optional per-cut overrides of the lens; left out, `FOCAL_BY_SIZE` picks the focal from the shot size (extreme-wide 18mm, wide 25mm, medium 40mm, close 75mm, extreme-close 100mm macro) and `params.camera.aperture` the stop |
|
|
281
|
-
| `light` | `{ direction, note }`. `direction` ∈ `frontal` `front-left` `front-right` `side-left` `side-right` `back-left` `back-right` `backlight` `top` `underlight` `ambient` — **relative to the camera, not the room**; `note` says what the key picks out, what fills the shadow side and how it changes over the cut. Both required |
|
|
308
|
+
| `light` | `{ direction, source, note }`. `direction` ∈ `frontal` `front-left` `front-right` `side-left` `side-right` `back-left` `back-right` `backlight` `top` `underlight` `ambient` — **relative to the camera, not the room**; `note` says what the key picks out, what fills the shadow side and how it changes over the cut. Both required. `source` (required under a `cinematography` preset) is the lamp, window, sun or string lights the key comes from, named verbatim in `frame`; the preset bans some directions on a person and wants ≥ ½ the cuts with people per segment from its preferred ones (`cinematography.md`) |
|
|
282
309
|
| `foreground` | what sits between the lens and the subject, to be thrown out of focus. `""` is a deliberately clean frame; at least half the cuts of a segment must have one |
|
|
283
310
|
| `background` | optional — the third depth layer behind the subject; expected (or a `note`) on a 9:16 wide |
|
|
311
|
+
| `composition` | art-first segments only: the devices of the frame, one or more of `negative-space` `symmetry` `grand-scale` `frame-in-frame` `leading-lines` `silhouette` `layered-depth` `color-block` `top-down` `thirds`; each device's phrase is in `frame` (gate `composition`) |
|
|
312
|
+
| `gag` | comedy segments only: `setup` · `build` · `punchline` — a punchline needs a setup earlier in the scene and a reaction after it (gate `comedy`) |
|
|
313
|
+
| `move` | fight segments only: `{ kind, impact }` — `kind` ∈ `strike kick shot slash stab block dodge throw grapple fall leap draw reload power stance chase swerve crash none`; `impact: true` when it lands, and then the next cut is a `reaction` / `consequence` (or this cut is a `consequence`) — gate `action` |
|
|
284
314
|
| `purpose` | `{ kind, change }` — `kind` ∈ `establish / reveal / evidence / reaction / pressure / decision / consequence / performance / transition`; `change` says what the audience knows or who holds power when the cut ends (gate `shot-purpose`) |
|
|
285
315
|
| `angle` / `height` / `axisSide` | `front / three-quarter / profile / rear-three-quarter / back` · `ground / low / eye / high / top` · `working / cross / neutral` (`cross` needs `note`) — gate `framing-axis` |
|
|
286
316
|
| `start` / `end` | boundaries `{ positions: {C01: …}, facing: {C01: screen-left\|screen-right\|camera\|away}, gaze, hands, heldProps: {C01: [P01]}, state: [] }` for every person on screen; `start` only on a segment's first cut (later cuts inherit the previous `end`); a prop changes hands only on an action beat; `state` items that exist only in `end` may not appear in `frame` — gate `continuity` |
|
|
287
317
|
| `motion` | `{ trigger, action, result }` — cue, one visible state chain, landing (or `hold`); English unless the prompt language is Chinese; no names, no inferred states, ≤ 3 hand verbs — gate `motion` |
|
|
288
318
|
| `cameraNote` | `{ motivation, trigger, path, endFraming }` on any move (`motivation` ∈ `reveal / pressure / alignment / relationship / transition / stillness`), `{ hold }` on a `Static Shot` — gate `motion` |
|
|
289
|
-
| `frame` | English prompt for the moment: composition, this moment's positions and poses, the size phrase, the style's `framePhrase` (`photorealistic cinematic film still` / `cinematic film still` / `hand-painted anime film still`), **and verbatim** the camera phrase (`shot on an ARRI ALEXA Mini LF with a Zeiss Supreme Prime 75mm at T1.5`), the light-direction phrase and the foreground
|
|
319
|
+
| `frame` | English prompt for the moment: composition, this moment's positions and poses, the size phrase, the style's `framePhrase` (`photorealistic cinematic film still` / `cinematic film still` / `hand-painted anime film still`), **and verbatim** the camera phrase (`shot on an ARRI ALEXA Mini LF with a Zeiss Supreme Prime 75mm at T1.5`), the light-direction phrase and the foreground, and under a `cinematography` preset also its `framePhrase` and the `light.source`; **no names** — identity comes from the sheet references |
|
|
290
320
|
| `prompt` | the video prompt, shape by `params.video` (below); gate `prompt-hygiene` (no `…`, no ids / paths / notes, subtitles off unless `params.subtitles`, H3 lips-closed clause, sheets-mode `@imageK` per shot) |
|
|
291
321
|
| `segments[].axis` | `{ between: [C01, C02], workingSide, screenLeft, screenRight }`, required when two or more people appear in the segment |
|
|
322
|
+
| `segments[].grammar` / `exceptions` | `grammar` (a string or an array) says how the segment is cut — `drama` · `action` · `faceslap` · `comedy`; missing, it is `params.grammar`; the old `action: true` means `action`. Each grammar's rules apply (gates `grammar`, `action`, `faceslap`, `comedy`; advisory `action-advice`, `grammar-advice`) and the prompt carries each grammar's line. `exceptions: [{ rule, reason }]` waives one rule for this segment when the user asks — rules `open-wide` `one-move` `impact-reaction` `no-graphic` `reveal-insert` `reaction-chain` `punchline-reaction` `setup-first` (the old `actionExceptions` still works) |
|
|
292
323
|
| `segments[].sound` | `{ ambience, sfx: [{ cut, event }], music }` — ambience identical across a scene's segments; `music` is `N/A`, an intent string, or `{ intent, cues: [{ at: <cut number \| "10.5s">, do: enter \| swell \| duck \| drop \| silence \| out, note }] }` — gate `sound`. `prompt audio E01-01` derives the segment's Seed Audio soundtrack prompt from it (timecoded `[start s:end s]` ambience / sfx / music, plus the lines with `--full`) — gate `audio-track` |
|
|
293
324
|
| `storyboard.visualPlans[]` | `{ sceneIndex, turn, alignment, pressure, progression, rhythm, landing, sound }` for the 爽点 scene and the cliff scene (seeded) — gate `visual-plan` |
|
|
294
325
|
| `props[].textPolicy` | optional `{ mode: readable \| symbolic \| blank, text }` — gate `text-policy` |
|
|
@@ -9,7 +9,7 @@ stage's output is a **consistency plan** per asset, not a mood board.
|
|
|
9
9
|
| --- | --- |
|
|
10
10
|
| `summary` | design intent — what story this space tells, not a floor plan |
|
|
11
11
|
| `anchors` (3–5) | features that must appear in every generation: paintable, recognisable, checkable ("flickering oden light box", "red drawer with worn corners"; not "old atmosphere") |
|
|
12
|
-
| `lighting` (≥1) | one English prompt per lighting state the episodes actually use — derive them from the episodes the scene appears in, don't write a day/dusk/night set nobody uses |
|
|
12
|
+
| `lighting` (≥1) | one English prompt per lighting state the episodes actually use — derive them from the episodes the scene appears in, don't write a day/dusk/night set nobody uses. With a `params.cinematography` preset each prompt contains the preset's `framePhrase` (`low-key practical lighting` / `soft romantic lighting`) and names the sources that light the space (what, where, what colour) — see the preset's guide, `cinematography-<preset>.md` §1 |
|
|
13
13
|
| `image.prompt` | the master view, **empty scene, no people** (say so); `negativePrompt` must ban people |
|
|
14
14
|
| `image.sheet` | environment sheet: main panel (≈72 % × 70 %, master view + first lighting state) + an L of detail panels showing the anchors; `THE SPACE MUST BE IDENTICAL ACROSS ALL PANELS`, `nothing invented that is not present in the master view`; the style render phrase |
|
|
15
15
|
| `variantOf` + `changes` | a scene that is the parent with a different time / weather / foreground — cheaper and more consistent than a new environment; outline scenes with a `reusePlan` become variants |
|
|
@@ -51,6 +51,27 @@ gate should pass before you show the skeleton.
|
|
|
51
51
|
Show the user, in plain language: the lines cut, the people merged, the episode of each major beat.
|
|
52
52
|
Wait for a yes. Change the skeleton on their feedback and validate again.
|
|
53
53
|
|
|
54
|
+
## Genre ledgers (`params.story`)
|
|
55
|
+
|
|
56
|
+
Each story genre adds what the outline must track, written with the skeleton and shown at
|
|
57
|
+
sign-off (`story.md`, and the genre's own guide for the rules and the craft):
|
|
58
|
+
|
|
59
|
+
| genre | ledger | gate |
|
|
60
|
+
| --- | --- | --- |
|
|
61
|
+
| `revenge` | `characters[].antagonist { tier, firstPressEp, motive }`, `outline.paybacks[] { ep, target, scale, by, how }` | `story-revenge` |
|
|
62
|
+
| `sweet` | `outline.romance[] { ep, milestone, until?, note }` | `story-sweet` |
|
|
63
|
+
| `mystery` | `outline.mysteryMode`, `outline.questions[]`, `outline.clues[]`, `characters[].mysteryRole` / `firstEp` | `story-mystery` |
|
|
64
|
+
| `comedy` | `outline.brief.comicPremise`, `characters[].comic { flaw, humanity, role }`, `outline.runningGags[]` | `story-comedy` |
|
|
65
|
+
| `angst` | `outline.angst { ending, turnEp, exitEp, reconcileEp, misbelief, beats[] }`, `outline.brief.redLines` | `story-angst` |
|
|
66
|
+
| `family` | `characters[].family`, `outline.secrets[]`, `outline.vindications[]`, `outline.reconciliations[]` | `story-family` |
|
|
67
|
+
| `palace` | `outline.rankLadder`, `outline.rankEvents[]`, `outline.schemes[]`, `outline.factions[]`, `outline.allegiance[]` | `story-palace` |
|
|
68
|
+
| `cultivation` | `outline.powerSystem`, `outline.goldenFinger`, `outline.startPower`, `outline.upgrades[]`, `outline.fights[]` | `story-cultivation` |
|
|
69
|
+
| `scifi` | `outline.brief.novum`, `outline.worldRules[]`, `outline.countdown`, `outline.loops[]`, `outline.foreknowledge[]` | `story-scifi` |
|
|
70
|
+
| `horror` | `outline.horror { subgenre, threat }`, `outline.horrorRules[]`, `outline.episodes[].scares` | `story-horror` |
|
|
71
|
+
|
|
72
|
+
The episodes are then designed against the ledger: a payback episode's `satisfaction.type` is a
|
|
73
|
+
payback type, a sugar episode's is 强宠 / 情感释放, and so on — the gates count both.
|
|
74
|
+
|
|
54
75
|
## Episodes (batches of ≤10)
|
|
55
76
|
|
|
56
77
|
Design first, prose second. Per episode the 分集目录 fields: `function` (开局钩子 / 冲突升级 /
|
|
@@ -67,6 +67,16 @@ this episode.
|
|
|
67
67
|
only way to get it back.
|
|
68
68
|
- **A picture change is a sound change** downstream — remember it when the storyboard exists.
|
|
69
69
|
|
|
70
|
+
## Genre markers (gate `story-script`)
|
|
71
|
+
|
|
72
|
+
- **Mystery**: the beat that plants a clue carries `clue: "K1"` (or a list) in the clue's plant
|
|
73
|
+
episode — a clue is something the camera shows, never narration. Plant it inside a beat doing
|
|
74
|
+
something else (`story-mystery.md` §5).
|
|
75
|
+
- **Comedy**: `gag: setup` where a joke is planted, `gag: build` for the repeats of a rule of three,
|
|
76
|
+
`gag: punchline` where it lands (at least 2–3 an episode), `runningGag: "G1"` on a callback. Every
|
|
77
|
+
punchline has a setup before it (or calls back a running gag); a punchline line is ≤ 20 字 and
|
|
78
|
+
ends on the funny word (`story-comedy.md`).
|
|
79
|
+
|
|
70
80
|
## Feel (not gated, decides whether it plays)
|
|
71
81
|
|
|
72
82
|
Short lines, dense action: an action or reaction every two or three lines, never four lines in a
|
|
@@ -146,6 +146,21 @@ picks out, what fills the shadow side, and **how it changes over the cut** — a
|
|
|
146
146
|
the fill away, a pan that carries the face out of one source into another, a turn that trades a
|
|
147
147
|
front key for a rim. A cut where the light does nothing is a cut where the light was not directed.
|
|
148
148
|
|
|
149
|
+
Under a `params.cinematography` preset the light also has a `source`: the lamp, window, sun or
|
|
150
|
+
string lights, candle or lattice window it comes from, named verbatim in the frame. A person is never keyed from the
|
|
151
|
+
preset's banned directions (e.g. `low-key` / `costume-dark`: `frontal` / `ambient`;
|
|
152
|
+
`sweet-romance` / `costume-idol`: `underlight` / `top`), at least half the cuts with people in a
|
|
153
|
+
segment use its preferred ones, the stop stays within the preset's limit, and a period or costume
|
|
154
|
+
preset refuses a source its era did not have. Stage the person against the source first, then pick the camera side; the
|
|
155
|
+
tables are in `cinematography.md` and the preset's guide.
|
|
156
|
+
|
|
157
|
+
**Each segment is cut in its grammar** (`segment.grammar`, else `params.grammar`; see
|
|
158
|
+
`grammar.md`): `action` segments open on a wide, take one move per cut and answer every impact
|
|
159
|
+
(`action.md`); `faceslap` segments show the proof and a cascade of reactions
|
|
160
|
+
(`grammar-faceslap.md`); `comedy` segments set up every punchline and give it laugh room
|
|
161
|
+
(`grammar-comedy.md`). Each grammar adds its line to the prompt (`Action:` / `Payoff:` /
|
|
162
|
+
`Comedy:`).
|
|
163
|
+
|
|
149
164
|
### Foreground
|
|
150
165
|
|
|
151
166
|
Depth needs something to be shallow *against*. `foreground` names what sits between the lens and
|