59 lines
31 KiB
JavaScript
59 lines
31 KiB
JavaScript
import fs from 'node:fs'
|
||
import path from 'node:path'
|
||
import { fileURLToPath } from 'node:url'
|
||
|
||
const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..')
|
||
const outRoot = path.join(root, '战役素材', '西汉')
|
||
const BASE = `Premium live-action Chinese historical film still, archaeology-inspired Western Han realism, cinematic 16:9 landscape, subtle film grain, physically plausible human and terrain scale, tactile rammed earth, aged timber, hemp, low-sheen silk, leather, lacquered lamellar armor, wood carts, bronze and iron tools. Leave calm negative space for webpage copy. No baked-in text, readable banners, subtitles, logo or watermark; no clone-face armies, fantasy armor, Tang/Song/Ming/Qing gear or architecture, imperial yellow dragon robes, Forbidden City, modern maps, UI arrows, firearms, cannons, explosions, samurai armor, European plate, magic, anime, gore or body piles.`
|
||
const img = (file, alt, request, inference) => ({ original:`images/${file}.png`, delivery:`images/${file}.webp`, alt, prompt:`Use case: historical-scene. Digital Me Western Han story frame. ${request} ${BASE}`, visualInference:inference, refinementPrompt:'' })
|
||
|
||
const packs = [
|
||
{
|
||
dir:'七国之乱(周亚夫断吴楚粮道)',
|
||
event:{ canonicalName:'七国之乱(周亚夫断吴楚粮道)', aliases:['七国之乱','吴楚七国之乱','吴楚之乱'], era:'汉景帝三年', date:'公元前154年正月至三月', place:'关东诸侯国、梁国与昌邑一线', summary:'吴楚等七国以诛晁错为名起兵;景帝虽杀晁错仍未止兵,周亚夫坚壁断吴楚粮道,朝廷三月平乱。' },
|
||
narration:{ language:'zh-CN', estimatedSeconds:84, fullText:'公元前一五四年,吴王刘濞联合楚王刘戊等六王起兵,号称要诛晁错、清君侧。叛军向西猛攻梁国,诸侯割据的旧矛盾终于变成全国战争。汉景帝听从袁盎建议,在长安处死主张削藩的晁错,希望以此换取七国退兵;但吴楚军没有停下。朝廷任命周亚夫为太尉,窦婴为大将军。周亚夫没有直赴梁国救急,而从武关绕行,到昌邑深沟高垒,拒绝同吴楚军正面决战。他派轻骑截断淮泗口,切断叛军粮道。梁国承受正面攻势,吴楚军屡次挑战周亚夫营垒都无法得战,粮食渐尽,只能退却。汉军随后追击,吴楚主力崩溃,其余诸王相继败亡。战争从正月持续到三月便告平定。杀晁错没有换来和平,真正结束叛乱的是中央军的调度、梁国的牵制与被切断的补给。' },
|
||
scenes:[
|
||
{id:'01',title:'七王举兵',timePlace:'公元前154年正月,吴楚与梁国方向',purpose:'交代叛乱规模与吴楚军首先压向梁国。',narration:'吴王刘濞联合楚王等六王起兵,以诛晁错为名向西推进,梁国首当其冲。',overlay:{heading:'七王举兵',line:'“清君侧”是旗号,诸侯与中央的冲突才是战火。'},people:[{name:'刘濞',office:'吴王、叛军盟主',action:'联合六王起兵并率吴楚军西进'},{name:'刘武',office:'梁王',action:'守梁国,承受吴楚主力进攻'}],image:img('01-seven-kings-rise','吴楚军跨过淮泗水网向梁国推进,吴王刘濞在船车混合队列前观察西方,沿途诸侯兵装束不一。','Western Han rebel host moves west through the Huai-Si river plain. Wu King Liu Bi, an older East Asian prince in practical dark robe over armor, surveys a mixed column of infantry, riders, river boats and supply carts; contingents have varied equipment, showing an alliance rather than one uniform army. Distant fortified Liang settlement braces for attack. No readable rebel slogans.','具体行军道路、舟车比例和刘濞外貌为视觉重构;七王皆反、吴楚攻梁有史载。'),sources:['《汉书·景帝纪》卷五','《史记·吴王濞列传》卷一百六']},
|
||
{id:'02',title:'斩错不止兵',timePlace:'长安与关东战报抵达之际',purpose:'呈现晁错被牺牲后叛军仍不退,避免将处决画成血腥奇观。',narration:'景帝斩晁错“以谢七国”。消息传出,吴楚军并未解散,战争仍须由军队解决。',overlay:{heading:'斩错不止兵',line:'一个人的死,没有让七支军队回头。'},people:[{name:'汉景帝',office:'皇帝',action:'下令处死晁错,试图缓和叛乱'},{name:'晁错',office:'御史大夫',action:'因削藩政策被杀;不表现行刑过程'}],image:img('02-chao-cuo-sacrificed','长安宫门外,晁错留下的冠帽与封闭车驾从画面边缘远去,景帝在殿门内接到关东军报,朝臣沉默,不直接呈现腰斩。','Restrained political aftermath at a Western Han palace gate in Chang’an. A closed official carriage and an abandoned dark court cap recede at the far edge, implying Chao Cuo’s execution without showing it. Emperor Jing, a mature East Asian ruler in austere court robes, stands inside the doorway receiving fresh sealed wooden military reports from the east; ministers remain silent. Somber, no execution, no blood, no ornate later palace.','以冠帽、封闭车驾与新军报并置为视觉重构;斩晁错以谢七国及叛军不止见史载。'),sources:['《汉书·景帝纪》卷五','《史记·袁盎晁错列传》卷一百一']},
|
||
{id:'03',title:'昌邑坚壁',timePlace:'昌邑,周亚夫军营',purpose:'表现周亚夫避开吴楚锋芒、拒绝急救梁国并等待断粮见效。',narration:'周亚夫从武关出兵,在昌邑深沟高垒。梁国告急,他仍按兵不出,不给吴楚决战机会。',overlay:{heading:'昌邑坚壁',line:'最难的命令不是出击,而是看着盟友苦战仍不出击。'},people:[{name:'周亚夫',office:'太尉、平叛主帅',action:'屯昌邑坚壁不战,控制主战节奏'},{name:'梁国使者',office:'求援人员',action:'多次请求汉军直接救梁'}],image:img('03-zhou-yafu-holds-at-changyi','昌邑汉军营垒内,周亚夫站在深沟木栅后审视军情,梁国使者急切呈报,士卒守位不出,远处吴楚军列阵挑战。','Inside the fortified Han camp at Changyi. Zhou Yafu, a stern middle-aged East Asian commander in restrained Western Han lamellar armor, studies the enemy from behind a deep ditch and timber palisade. An exhausted Liang messenger presents sealed reports and gestures urgently, while Han troops remain at assigned posts instead of charging. Far across open ground Wu-Chu formations challenge the camp. Emphasize disciplined refusal and tension, no cowardice caricature.','沟垒形态、使者姿态与远处挑战为视觉重构;周亚夫坚壁、梁告急而不往有史载。'),sources:['《史记·绛侯周勃世家》卷五十七']},
|
||
{id:'04',title:'断粮三月平',timePlace:'淮泗口与吴楚军退路',purpose:'以截粮和撤退收束战争,避免把七国之乱压成一场正面会战。',narration:'汉轻骑截断淮泗口粮道。吴楚军久攻不得战,粮尽退却,汉军追击,三月平定七国。',overlay:{heading:'断粮三月平',line:'营垒没有动,粮道先断,叛军自己失去了时间。'},people:[{name:'周亚夫',office:'太尉',action:'部署轻骑截断吴楚粮道并在其退却后追击'},{name:'吴楚军',office:'叛军主力',action:'因粮绝与攻势受阻而退败'}],image:img('04-supply-line-cut-retreat','淮泗口附近的粮道上,汉轻骑截住叛军粮车并控制渡口,远处吴楚军开始撤退,周亚夫不在一线英雄摆拍。','Wide Huai-Si crossing after Han light cavalry has cut the rebel supply line. Han riders secure a ford and halt wooden grain carts; sacks and draft animals are intact rather than burning. In the distance Wu-Chu columns turn east in weary retreat while a courier carries the result toward Zhou Yafu’s main camp, keeping the victory about logistics rather than a heroic duel. Early spring haze, controlled motion.','渡口、粮车位置、轻骑规模与撤军同框为视觉推演;截淮泗口、吴楚粮绝退败与三月平乱有史载。'),sources:['《史记·绛侯周勃世家》卷五十七','《汉书·景帝纪》卷五']}
|
||
],
|
||
bgm:{catalogId:'zhanzhen:jingxing#0',title:'井陉之战',version:'仅复用无主唱冷静谋略器乐 stem',status:'pending-export',pathOrUrl:'',usage:'删去韩信主题与歌词,只保留冷钢琴、低弦和一次低鼓;第三幕持续绷紧,第四幕不做凯旋高潮。',reason:'项目无七国之乱专属曲;井陉器乐层的克制谋略感适合周亚夫坚壁断粮,仓库暂无成品音频。',cues:[{from:'00:00',to:'00:21',scene:'01',direction:'低频建立全国性压力。'},{from:'00:21',to:'00:42',scene:'02',direction:'几乎撤空打击乐。'},{from:'00:42',to:'01:03',scene:'03',direction:'冷弦持续,不响应远处挑战。'},{from:'01:03',to:'01:24',scene:'04',direction:'粮道截断处短促落点,随后平静收束。'}]},
|
||
sources:[{claim:'七王起兵、斩晁错、遣周亚夫窦婴与三月平乱',citation:'《汉书·景帝纪》卷五',url:'https://zh.wikisource.org/zh-hans/汉书/卷005'},{claim:'周亚夫由武关、屯昌邑、坚壁与绝吴楚粮道',citation:'《史记·绛侯周勃世家》卷五十七',url:'https://zh.wikisource.org/zh-hans/史记/卷057'},{claim:'吴王刘濞举兵与吴楚败亡',citation:'《史记·吴王濞列传》卷一百六',url:'https://zh.wikisource.org/zh-hans/史记/卷106'}],
|
||
blacklist:['把七国之乱画成七位诸侯王同场会盟或七军统一指挥','把晁错之死写成叛乱因此停止;史实相反','把周亚夫不救梁写成怯战,忽略其坚壁断粮部署','虚构精确总兵力、单一决战、周亚夫与刘濞单挑','现代文字地图、水印、后世服饰建筑、火器爆炸、血腥行刑']
|
||
},
|
||
{
|
||
dir:'马邑之谋(伏击未发)',
|
||
event:{canonicalName:'马邑之谋(伏击未发)',aliases:['马邑之谋','马邑伏击','聂壹诱单于'],era:'汉武帝元光年间',date:'公元前133年(《史记》与《汉书》系年相差一岁)',place:'马邑、武州塞及马邑旁谷(今山西朔州一带)',summary:'汉以聂壹诈降诱军臣单于入塞,数十万伏兵藏于马邑旁谷;单于发现牲畜无人牧的破绽并从被俘尉史处得知伏兵,全军退还。'},
|
||
narration:{language:'zh-CN',estimatedSeconds:85,fullText:'公元前一三三年,汉武帝决定把延续多年的和亲改成一次大规模伏击。马邑豪商聂壹向匈奴诈降,声称能杀死县令丞、献出城池。为取信单于,汉方把死罪囚的首级悬在城上。军臣单于率十余万骑穿过武州塞,向马邑深入;汉军车骑、材官数十万人则藏在城旁山谷,等单于入城后合围。《史记》一处记伏兵二十余万,另一处与《汉书》记三十余万,数字应并存。距马邑还有百余里时,单于看见牲畜遍布野外,却没有牧人,立刻起疑。他攻下一座边亭,俘获尉史。尉史供出汉军伏兵位置,单于惊呼险些被汉人出卖,随即北撤。汉军追到边塞,判断追不上,只得停止。负责截击匈奴辎重的王恢也没有出兵,战后以逗留畏缩论罪,自杀而死。马邑一箭未发,却终结了和亲框架,汉匈从此转入长期战争。'},
|
||
scenes:[
|
||
{id:'01',title:'聂壹诈降',timePlace:'马邑城与匈奴使者往来期间',purpose:'交代诱敌骗局,克制处理悬首取信。',narration:'聂壹诈称能献马邑。汉方以被覆布遮挡的刑具和城门易手假象向单于使者取信。',overlay:{heading:'聂壹诈降',line:'一座城被摆成诱饵,真假只差单于肯不肯再走百里。'},people:[{name:'聂壹',office:'马邑豪商',action:'作为间者向匈奴诈降诱敌'},{name:'匈奴使者',office:'军臣单于使者',action:'查验马邑诈降可信度'}],image:img('01-nie-yi-feigns-surrender','马邑城门内,聂壹向匈奴使者展示已被控制的城防与覆布木架,城门守军刻意稀少,不出现人头特写。','At the gate of frontier Mayi, merchant Nie Yi, a shrewd middle-aged East Asian man in practical wool-hemp travel clothing, receives Xiongnu envoys and gestures toward apparently surrendered defenses. A covered wooden frame high on the wall only implies the historical display of executed prisoners, with no heads or gore visible. Han guards deliberately stay sparse and subdued; tension lies in the staged evidence. Western Han frontier architecture, no readable documents.','覆布处理、使者人数和城门布置为克制视觉重构;聂壹诈降、悬死囚首取信有史载。'),sources:['《史记·韩长孺列传》卷一百八']},
|
||
{id:'02',title:'旁谷伏兵',timePlace:'马邑旁谷',purpose:'表现庞大伏兵对隐蔽和单一触发条件的依赖。',narration:'汉军车骑、材官数十万人匿于马邑旁谷,只等单于进入预定范围。',overlay:{heading:'旁谷伏兵',line:'网已经张开,但猎物必须自己走进最窄的位置。'},people:[{name:'韩安国',office:'护军将军',action:'节度马邑主伏兵区诸将'},{name:'李广、公孙贺、李息',office:'骁骑、轻车、材官将军',action:'分领车骑与材官伏兵'}],image:img('02-army-hidden-in-valleys','马邑周边层叠山谷中,汉军步卒、弩手、骑兵和车辆分区隐蔽,韩安国在前景低声部署,谷外道路保持空旷。','Layered dry valleys beside Mayi conceal a large Western Han ambush. Crossbow infantry crouch below ridgelines, cavalry wait behind folds of terrain, and wooden vehicles remain screened under dull cloth and brush. Han Anguo, a mature East Asian commander in practical armor, quietly coordinates officers in the foreground. The road outside the valley remains deliberately empty. Show scale through depth and multiple concealed pockets, not an impossible single mass or camouflage net technology.','具体谷形、各部隐蔽位置与指挥动作是视觉推演;车骑材官数十万匿马邑旁谷有史载。'),sources:['《史记·韩长孺列传》卷一百八','《史记·匈奴列传》卷一百十']},
|
||
{id:'03',title:'畜在而人空',timePlace:'距马邑百余里,边亭附近',purpose:'呈现让单于起疑的关键破绽与尉史泄谋。',narration:'单于见牲畜遍野却无人放牧,转而攻亭,俘得尉史。伏兵位置由此泄露。',overlay:{heading:'畜在而人空',line:'不是伏兵露了甲,是一片草场少了牧人。'},people:[{name:'军臣单于',office:'匈奴单于',action:'率十余万骑入塞,发现异常后停止深入'},{name:'雁门尉史',office:'汉边吏',action:'被俘后供出马邑伏兵'}],image:img('03-empty-pasture-raises-suspicion','开阔草场上牛羊散布却看不到牧人,军臣单于勒马观察,匈奴骑队停在后方;远处边亭被包围,尉史被带出但未受刑。','Open pasture about a hundred li from Mayi: cattle and sheep are scattered everywhere, but there is not a single herder. Junchen Chanyu, an experienced Xiongnu leader in restrained steppe lamellar and layered wool, reins in his horse and studies the unnatural emptiness; his large mounted column halts behind him. Farther away, riders surround a small Han frontier watch post and escort a captured clerk out alive, no torture. Suspicion and observation, not combat spectacle.','牲畜分布、单于勒马、亭障距离与尉史被带出为视觉重构;畜布野无人牧、攻亭得尉史有史载。'),sources:['《史记·匈奴列传》卷一百十','《史记·韩长孺列传》卷一百八']},
|
||
{id:'04',title:'伏击未发',timePlace:'武州塞与汉军伏击区',purpose:'交代单于退军、汉军无功和王恢结局,不伪造交战。',narration:'单于得知伏兵,立即引军北还。汉军没有追上,王恢也未截辎重,整场伏击无功。',overlay:{heading:'伏击未发',line:'几十万人等来的是撤军号令,也等来了更长的战争。'},people:[{name:'军臣单于',office:'匈奴单于',action:'识破伏击后全师退还'},{name:'王恢',office:'大行、屯将军',action:'未出击匈奴辎重,战后下狱并自杀'},{name:'汉军伏兵',office:'车骑材官',action:'因目标退出伏击圈而无功撤军'}],image:img('04-ambush-stands-down','山谷伏兵远望匈奴骑队越过塞口北撤,汉军将领传达停止追击,士卒收起弩机,双方没有交战画面。','Wide view from the concealed Han valley toward Wuzhou Pass. The Xiongnu mounted column withdraws north in an orderly long line beyond the planned kill zone. In the foreground Han crossbowmen lower and unstring weapons while an officer passes the stand-down order; Wang Hui watches a separate baggage-route approach from a distant ridge, visibly choosing not to attack. No arrows in flight, no battle, the failure is silence and distance.','王恢远望、撤令传递和两军距离为视觉推演;单于引还、汉追不及、王恢罢兵无功有史载。'),sources:['《史记·韩长孺列传》卷一百八']}
|
||
],
|
||
bgm:{catalogId:'zhanzhen:mayizhimou#0',title:'马邑之谋',version:'电影级配乐·建议使用无主唱器乐 stem',status:'pending-export',pathOrUrl:'',usage:'第一幕保持交易式克制,第二幕堆叠低频而不爆,第三幕突然抽空,第四幕以远去马蹄与低弦收束;删除歌词与品牌尾签。',reason:'项目内马邑专属自生成音乐;军臣单于视角的冷静撤离正适合“未战即败”的结构,仓库暂无音频。',cues:[{from:'00:00',to:'00:21',scene:'01',direction:'少量木质敲击与低音。'},{from:'00:21',to:'00:42',scene:'02',direction:'逐层堆叠伏兵压力。'},{from:'00:42',to:'01:03',scene:'03',direction:'在发现空牧场时骤然收空。'},{from:'01:03',to:'01:24',scene:'04',direction:'马蹄远去,不给战斗高潮。'}]},
|
||
sources:[{claim:'聂壹诈降、伏兵异文、尉史泄谋、王恢罢兵与自杀',citation:'《史记·韩长孺列传》卷一百八',url:'https://zh.wikisource.org/zh-hans/史记/卷108'},{claim:'单于入塞、畜布野无人牧与和亲断绝',citation:'《史记·匈奴列传》卷一百十',url:'https://zh.wikisource.org/zh-hans/史记/卷110'}],
|
||
blacklist:['把马邑之谋画成已经发生的大规模会战;史实是伏击未发、双方无功','把伏兵数固定成唯一准确数字;史记二十余万与三十余万异文应并存','展示悬首、刑讯或王恢自杀的血腥近景','把单于识破全归功于尉史,忽略先见畜布野无人牧而起疑','现代文字地图、水印、后世服饰建筑、火器爆炸或动漫画风']
|
||
},
|
||
{
|
||
dir:'陈汤灭郅支(虽远必诛)',
|
||
event:{canonicalName:'陈汤灭郅支(虽远必诛)',aliases:['陈汤灭郅支','郅支城之战','郅支单于之战'],era:'汉元帝建昭三年',date:'公元前36年',place:'康居东界都赖水畔郅支城(约今哈萨克斯坦塔拉斯河流域,城址为后世推定)',summary:'西域副校尉陈汤矫制发兵,迫使都护甘延寿共同率汉胡联军四万余远征郅支城;联军破木城、围土城,杀郅支单于。'},
|
||
narration:{language:'zh-CN',estimatedSeconds:89,fullText:'公元前三十六年,郅支单于远据康居东部,曾杀汉使谷吉,又多次困辱汉使。西域副校尉陈汤判断,郅支虽远,却没有汉地坚城强弩,若各国兵同时出发,一朝可以攻取。西域都护甘延寿主张先上奏朝廷,陈汤担心不会获准,趁甘延寿久病,矫造诏令,调发西域城郭诸国兵与屯田吏士。甘延寿惊起阻止,陈汤按剑斥责,最终迫使他共同出兵。汉兵与诸国兵合计四万余,分六校穿越西域,抵达都赖水畔的郅支城。联军四面围城,挖壕堵门,以盾牌在前、戟弩在后压制城楼。外层木城被薪火烧穿,郅支退入土城。天明,四面火起,联军乘势入城。郅支负伤而死,军候假丞杜勋斩其首。甘延寿、陈汤上疏自劾,也写下“明犯强汉者,虽远必诛”。朝廷既嘉其功,又忌其擅权,最终封赏远低于这场万里远征的声势。' },
|
||
scenes:[
|
||
{id:'01',title:'矫制发兵',timePlace:'西域都护府,甘延寿病中',purpose:'呈现陈汤擅发诸国兵的风险与甘延寿被迫同意。',narration:'甘延寿想先奏请,陈汤却趁其久病矫制发兵。甘延寿欲止,陈汤按剑迫其同行。',overlay:{heading:'矫制发兵',line:'远征从一道未经朝廷批准的命令开始。'},people:[{name:'陈汤',office:'西域副校尉',action:'矫制调发诸国兵与屯田吏士'},{name:'甘延寿',office:'西域都护、骑都尉',action:'原欲奏请,最终在陈汤压力下共同出兵'}],image:img('01-forged-order-at-protectorate','西域都护府内,病中的甘延寿从榻上惊起,陈汤按着入鞘佩剑站在封闭木牍旁,几名军吏等待命令,不出现可读诏书。','Inside a modest Western Han Protectorate office in the Western Regions. Gan Yanshou, a seasoned East Asian commander weakened by illness, rises from a low couch in alarm. Chen Tang, a sharp-eyed East Asian officer in his thirties wearing travel-worn Han armor and robe, stands over sealed blank wooden-slip bundles with one hand resting on a sheathed sword, forcing the decision without drawing it. Several clerks and allied envoys wait tensely. Political coercion, no assault, no readable edict.','病榻、木牍、军吏和按剑姿态为视觉重构;久病、矫制发兵、甘惊欲止与陈汤按剑叱有史载。'),sources:['《汉书·傅常郑甘陈段传》卷七十']},
|
||
{id:'02',title:'六校万里西征',timePlace:'西域诸国至康居东界',purpose:'表现汉胡联军四万余的多国组成与远征尺度。',narration:'汉兵与西域诸国兵合四万余,编为六校,穿过城郭、荒漠与草原,直指康居东界。',overlay:{heading:'六校西征',line:'这不是长安大军出塞,而是西域兵力被临时汇成一路。'},people:[{name:'甘延寿',office:'西域都护、法定主帅',action:'部勒联军行阵'},{name:'陈汤',office:'西域副校尉、谋主',action:'推动并组织远征'},{name:'城郭诸国兵与屯田吏士',office:'汉胡联军',action:'组成四万余人的六校远征军'}],image:img('02-six-columns-march-west','中亚荒漠草原与绿洲交界处,甘延寿、陈汤率多种服饰但装备协调的六路队伍西进,汉军弩手、屯田兵和城郭诸国骑兵分层行军。','Vast Central Asian steppe and oasis frontier. Gan Yanshou and Chen Tang lead a multi-ethnic allied army west in six separated columns visible across the landscape: Han crossbow infantry and tuntian troops mixed with cavalry from Western Region city-states, varied faces and clothing but coordinated movement. Camels, horses and modest supply carts show distance and logistics. No modern ethnic stereotypes, no Silk Road caravan fantasy, no readable flags.','六校在同一远景中的位置、兵种与绿洲地貌为视觉推演;汉胡兵合四万余、分六校进军有史载。'),sources:['《汉书·傅常郑甘陈段传》卷七十']},
|
||
{id:'03',title:'四面薄城',timePlace:'都赖水畔郅支城',purpose:'呈现土城外重木城、壕沟堵门与盾戟弩协同攻坚。',narration:'联军闻鼓四面薄城,挖壕堵门。盾牌在前、戟弩在后,压住城楼射手。',overlay:{heading:'四面薄城',line:'远征的最后三里,变成一层木城和一层土城。'},people:[{name:'甘延寿',office:'联军主帅',action:'部勒行阵并令各军闻鼓薄城'},{name:'陈汤',office:'副校尉',action:'参与四面围城与攻坚指挥'},{name:'郅支单于',office:'匈奴单于',action:'披甲登楼督战'}],image:img('03-surround-zhizhi-city','都赖水旁,联军四面包围外木栅内土城,前排持大盾、后排戟弩仰射,士卒开挖壕沟封堵城门,郅支只在楼上远景督战。','Zhizhi’s fortified city beside the Talas-like Dulai River: an outer heavy timber palisade surrounds an inner rammed-earth fortress. Allied troops close from multiple sides, large shields forward and crossbows with long weapons behind, while work parties dig trenches and block gates. Gan Yanshou and Chen Tang coordinate from a protected middle position. Zhizhi Chanyu appears only as a distant armored figure on the tower. Clear defensive layers, no medieval stone castle, no siege cannon or fantasy machinery.','城防外观、四面军队同框、盾戟弩队形与壕沟位置为视觉重构;木城土城、穿堑塞门、卤楯戟弩有史载。'),sources:['《汉书·傅常郑甘陈段传》卷七十']},
|
||
{id:'04',title:'火穿木城',timePlace:'郅支城,夜至平明',purpose:'表现火攻外层木城与进入土城,不渲染后宫参战和斩首。',narration:'联军发薪烧穿木城。平明四面火起,鼓声动地,攻军乘火进入土城。',overlay:{heading:'火穿木城',line:'外层木栅先失守,孤城的纵深只剩最后一层。'},people:[{name:'陈汤、甘延寿',office:'联军统帅',action:'指挥火攻木城并推进土城'},{name:'郅支单于',office:'守城主帅',action:'负伤后退入内室,最终死于城破'}],image:img('04-fire-breaches-wooden-wall','黎明前木城多点燃烧但无爆炸,联军盾阵从破口推进,内侧土城仍在抵抗;郅支受伤撤离只以远处被搀扶身影表现。','Before dawn, controlled fires burn through several sections of the outer timber wall without explosions. Western Han and allied shield teams advance through smoking breaches while crossbowmen cover them; the inner rammed-earth fortress still resists. A distant armored Zhizhi Chanyu is helped down from the tower after being wounded, never shown in close-up and no death or severed head. Firelight, smoke and drum-driven pressure, not a fantasy inferno.','火点、破口、盾阵和郅支远景撤下为视觉重构;发薪烧木城、平明四面火起与郅支负创有史载。'),sources:['《汉书·傅常郑甘陈段传》卷七十']},
|
||
{id:'05',title:'功成自劾',timePlace:'战后郅支城与上疏回长安',purpose:'以战后清点、封缄首级和自劾奏疏收束功劳与擅权并存。',narration:'郅支被杀,杜勋取得其首。甘延寿、陈汤封缄战果,上疏自劾,也写下“虽远必诛”。',overlay:{heading:'功成自劾',line:'同一封奏疏里,一边是万里奇功,一边是矫诏之罪。'},people:[{name:'甘延寿',office:'西域都护',action:'与陈汤共同上疏自劾并报告战果'},{name:'陈汤',office:'西域副校尉',action:'提出远征并写下“明犯强汉者,虽远必诛”'},{name:'杜勋',office:'军候假丞',action:'斩郅支首;本幕只呈封闭木匣,不展示首级'}],image:img('05-victory-and-self-accusation','战后营帐内,甘延寿与陈汤面对封缄木匣和无字奏牍,杜勋站在一旁,城郭诸国将领在远处清点俘虏,画面不展示头颅或可读名句。','Restrained aftermath inside the allied camp. Gan Yanshou and Chen Tang sit across a low table holding sealed blank memorial slips and a closed wooden evidence box; their faces show relief mixed with awareness of unauthorized command. Du Xun stands nearby after reporting the result. Outside, officers from the Western Region city-states calmly register prisoners and distribute supplies, no humiliation. The famous sentence is represented only in metadata, never visible as calligraphy. No severed head.','奏牍内容、木匣封缄、人物神态与清点场景为视觉重构;杜勋斩首、两将上疏自劾及名句有史载。'),sources:['《汉书·傅常郑甘陈段传》卷七十']}
|
||
],
|
||
bgm:{catalogId:'zhanzhen:chentangmiezhizhi#0',title:'陈汤灭郅支',version:'电影级配乐·建议使用无主唱器乐 stem',status:'pending-export',pathOrUrl:'',usage:'第一幕以按住不发的低弦起,第二幕拓宽空间,第三幕建立攻坚节拍,第四幕为唯一高潮,第五幕撤鼓转为克制政治余韵;删除歌词与品牌尾签。',reason:'项目内郅支之战专属自生成音乐,适配矫制—远征—攻城—自劾结构;仓库暂无音频。',cues:[{from:'00:00',to:'00:18',scene:'01',direction:'窄声场和低弦。'},{from:'00:18',to:'00:36',scene:'02',direction:'增加长线行军空间。'},{from:'00:36',to:'00:54',scene:'03',direction:'盾弩推进对应稳重节拍。'},{from:'00:54',to:'01:12',scene:'04',direction:'木城破口形成唯一高潮。'},{from:'01:12',to:'01:30',scene:'05',direction:'撤去鼓点,以一声低音收束功罪。'}]},
|
||
sources:[{claim:'矫制发兵、六校远征、四万余联军、围城攻坚、斩郅支与上疏封赏',citation:'《汉书·傅常郑甘陈段传》卷七十',url:'https://zh.wikisource.org/zh-hans/汉书/卷070'},{claim:'郅支单于身份、入康居与呼韩邪后续',citation:'《汉书·匈奴传》卷九十四',url:'https://zh.wikisource.org/zh-hans/汉书/卷094'}],
|
||
blacklist:['把陈汤矫制写成得到汉元帝预先批准;它正是战后争议核心','把甘延寿抹去;他是法定主帅且参与实际攻城指挥','把郅支城画成欧洲中世纪石堡,或断言城址就是现代塔拉兹唯一确定地点','展示郅支首级、斩首、火烧人群和后宫死亡近景','把“虽远必诛”生成在画面旗帜、城墙或奏牍上','现代文字地图、水印、后世服饰、火器爆炸、奇幻或动漫画风']
|
||
}
|
||
]
|
||
|
||
function md(p){const a=[`# ${p.event.canonicalName}|素材说明`,'','## 事件边界','',`- 规范事件名:${p.event.canonicalName}`,`- 常用称呼:${p.event.aliases.join('、')}`,`- 时代:${p.event.era}`,`- 日期:${p.event.date}`,`- 地点:${p.event.place}`,`- 一句话结论:${p.event.summary}`,'','## 60–90 秒主旁白','',p.narration.fullText,'','## 分幕素材',''];for(const s of p.scenes)a.push(`### ${s.id}|${s.title}`,'',`- 时间地点:${s.timePlace}`,`- 本幕作用:${s.purpose}`,`- 分幕旁白:${s.narration}`,`- 页面标题:${s.overlay.heading}`,`- 页面短句:${s.overlay.line}`,`- PNG:\`${s.image.original}\``,`- WebP:\`${s.image.delivery}\``,`- 替代文本:${s.image.alt}`,`- 视觉推演边界:${s.image.visualInference}`,`- 人物:${s.people.map(x=>`${x.name}(${x.office};${x.action})`).join(';')}`,`- 史料:${s.sources.join(';')}`,'','生成提示词:','','```text',s.image.prompt,'```','');a.push('## BGM 选曲','',`- 项目曲目:\`${p.bgm.catalogId}\`|${p.bgm.title}|${p.bgm.version}`,`- 状态:${p.bgm.status}`,`- 用法:${p.bgm.usage}`,`- 选择理由:${p.bgm.reason}`,'- 音频路径或 URL:仓库暂缺,待导出','','| 时间 | 分幕 | 编排 |','|---|---|---|',...p.bgm.cues.map(x=>`| ${x.from}–${x.to} | ${x.scene} | ${x.direction} |`),'','## 史料来源','',...p.sources.map(x=>`- ${x.claim}:[${x.citation}](${x.url})`),'','## 禁区与误读防护','',...p.blacklist.map(x=>`- ${x}`),'','## 交付检查','','- [ ] 每幕 PNG 原图存在且为 16:9','- [ ] 每幕 WebP 交付图存在且为 16:9','- [x] 旁白、页面文案、人物标签、提示词、视觉推演和史料齐全','- [ ] BGM 已导出并填写可用路径','- [ ] `manifest.json` 与本说明中的文件名全部校验通过','');return a.join('\n')+'\n'}
|
||
for(const p of packs){const d=path.join(outRoot,p.dir);if(fs.existsSync(d))throw new Error(`Refusing to overwrite ${d}`);fs.mkdirSync(path.join(d,'images'),{recursive:true});fs.writeFileSync(path.join(d,'manifest.json'),JSON.stringify({event:p.event,narration:p.narration,scenes:p.scenes,bgm:p.bgm,sources:p.sources,blacklist:p.blacklist},null,2)+'\n');fs.writeFileSync(path.join(d,'素材说明.md'),md(p))}
|
||
console.log(`Generated ${packs.length} Western Han empire packages`)
|