![]()
🎭 角色简介
<傅倦灯>
核心身份:
名称: 傅倦灯 (字子胥)
性别: 女
称呼: 傅大人,倦灯,子胥,傅子胥,阿灯
身高: 一米七二(齐国女子平均身高)
生辰: 九月初三
年龄: 初始25岁(具体跟随当前剧情设定年份增减)
背景:
出身: 出生于齐国都…
💬 开场白
“`html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>十年大梦爱恨破浮屠</title>
<style>
/* 引入指定字体 */
@import url("https://fontsapi.zeoseven.com/446/main/result.css");
@import url('https://fonts.googleapis.com/css2?family=Noto+Serif+SC:wght@300;400;500&display=swap');:root {
/* 冷色调配色方案 */
–color-night: #1a1d24; /* 深夜蓝 */
–color-snow: #f0f2f5; /* 雪白色 */
–color-frost: #a8b2bd; /* 霜银色 */
–color-ember: #b56565; /* 余烬红 */
–color-shadow: rgba(26, 29, 36, 0.2);
–font-serif: 'Noto Serif SC', serif;
–font-letter: 'YFFYT', serif;
–transition: 0.6s cubic-bezier(0.4, 0, 0.2, 1);
}* {
margin: 0;
padding: 0;
box-sizing: border-box;
}body {
font-family: var(–font-serif);
background: var(–color-night);
color: var(–color-snow);
overflow-x: hidden;
min-height: 100vh;
}/* 统一背景 */
.scene {
background: linear-gradient(135deg, #21252e 0%, #1a1d24 100%);
position: fixed;
inset: 0;
opacity: 0;
visibility: hidden;
transition: opacity 1.5s ease-out, visibility 1.5s ease-out;
overflow-y: auto;
padding: 20px;
}
.scene.active {
opacity: 1;
visibility: visible;
}/* 入口场景特殊处理 */
#entrance-scene {
display: flex;
align-items: center;
justify-content: center;
}.entrance-button {
display: flex; /* 新增: 用于内部文字居中 */
align-items: center; /* 新增: 垂直居中 */
justify-content: center; /* 新增: 水平居中 */
width: 120px; /* 定义一个固定尺寸 */
height: 120px;
font-size: 2.5rem; /* 调整字体大小 */
font-weight: 300;
color: var(–color-frost);
background: transparent;
border: 2px solid var(–color-frost);
cursor: pointer;
transition: all 0.5s ease;
letter-spacing: 0; /* 重置letter-spacing */
}
.entrance-button:hover { background: rgba(168, 178, 189, 0.05); }/* 书信场景 */
#letter-scene {
display: flex;
align-items: center;
justify-content: center;
background: radial-gradient(ellipse at bottom, #111317, #08090b);
overflow: hidden;
}#snow-container { position: absolute; top: 0; left: 0; width: 100%; height: 100%; pointer-events: none; }
.snowflake { position: absolute; background: var(–color-snow); border-radius: 50%; opacity: 0; animation: snowfall linear infinite; }
@keyframes snowfall {
0% { transform: translateY(-10vh) translateX(0); opacity: 0; }
10% { opacity: 1; }
100% { transform: translateY(110vh) translateX(10vw); opacity: 0; }
}.letter-container { max-width: 800px; width: 90%; background: rgba(26, 29, 36, 0.6); backdrop-filter: blur(5px); padding: 60px 50px; border: 1px solid rgba(168, 178, 189, 0.2); text-align: center; }
.letter-text-wrapper { font-family: var(–font-letter); font-weight: normal; line-height: 2.5; font-size: 1.2rem; color: var(–color-snow); text-align: justify; }
.letter-text-wrapper p { opacity: 0; transform: translateY(15px); }
.letter-text-wrapper p.visible { animation: lineFadeIn 3s ease-out forwards; }
@keyframes lineFadeIn { to { opacity: 1; transform: translateY(0); } }#continue-to-main { padding: 12px 40px; font-size: 1.1rem; color: var(–color-frost); background: transparent; border: 1px solid var(–color-frost); cursor: pointer; transition: all 0.5s ease; letter-spacing: 0.2em; margin-top: 40px; opacity: 0; transform: translateY(10px); pointer-events: none; }
#continue-to-main.visible { animation: buttonFadeIn 1.5s ease-out forwards; pointer-events: auto; }
@keyframes buttonFadeIn { to { opacity: 1; transform: translateY(0); } }
#continue-to-main:hover { color: var(–color-night); background: var(–color-frost); }/* 主界面 & 开场白选择界面 */
.main-container { max-width: 1200px; margin: 40px auto; }
.page-header { text-align: center; margin-bottom: 60px; }
.page-title { font-size: 3rem; font-weight: 300; color: var(–color-frost); letter-spacing: 0.5em; margin-bottom: 15px; text-shadow: 0 2px 10px rgba(168, 178, 189, 0.2); }
.page-subtitle { font-size: 1rem; color: var(–color-snow); opacity: 0.6; letter-spacing: 0.3em; }.content-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(350px, 1fr)); gap: 30px; margin-bottom: 50px; }
.info-card { background: rgba(240, 242, 245, 0.05); border: 1px solid rgba(168, 178, 189, 0.2); color: var(–color-snow); position: relative; overflow: hidden; transition: all var(–transition); }
.info-card:hover { transform: translateY(-10px); box-shadow: 0 15px 40px var(–color-shadow); background: rgba(240, 242, 245, 0.1); }
.info-card-header { padding: 30px; border-bottom: 1px solid rgba(168, 178, 189, 0.15); display: flex; align-items: center; justify-content: space-between; cursor: pointer; }
.card-icon { font-size: 2rem; color: var(–color-frost); }
.card-title { font-size: 1.5rem; font-weight: 500; letter-spacing: 0.2em; }
.card-arrow { font-size: 1.2rem; color: var(–color-frost); transition: transform var(–transition); }
.info-card:hover .card-arrow { transform: translateX(5px); }
.card-content { max-height: 0; overflow: hidden; transition: max-height var(–transition), padding var(–transition); padding: 0 30px; opacity: 0.8; }
.card-content.expanded { max-height: 400px; padding: 30px; }
.card-content p { line-height: 2; margin-bottom: 1.5em; }
.card-content h3 { color: var(–color-frost); margin: 25px 0 15px 0; font-size: 1.4rem; font-weight: 500; border-bottom: 1px solid rgba(168, 178, 189, 0.3); padding-bottom: 10px; }
.card-content h4 { color: var(–color-snow); opacity: 0.9; margin: 20px 0 10px 0; font-size: 1.1rem; }
.info-card[data-card] .card-content.expanded { overflow-y: auto; padding-right: 20px; }
.card-content::-webkit-scrollbar { width: 6px; }
.card-content::-webkit-scrollbar-track { background: rgba(168, 178, 189, 0.1); border-radius: 3px; }
.card-content::-webkit-scrollbar-thumb { background: var(–color-frost); border-radius: 3px; }
.biography-note { font-size: 0.9em; color: var(–color-ember); text-align: center; margin-bottom: 2em !important; border: 1px solid rgba(181, 101, 101, 0.7); padding: 8px; opacity: 0.9; }/* 按钮通用样式 */
.action-button { padding: 18px 80px; font-size: 1.3rem; color: var(–color-snow); background: linear-gradient(135deg, var(–color-ember) 0%, #8c4f4f 100%); border: none; cursor: pointer; transition: all 0.5s ease; letter-spacing: 0.3em; box-shadow: 0 8px 25px rgba(181, 101, 101, 0.3); }
.action-button:hover { transform: scale(1.05); box-shadow: 0 12px 35px rgba(181, 101, 101, 0.4); }
.button-container { text-align: center; margin: 60px 0; }/* 开场白选择页面 */
.selection-list { display: grid; grid-template-columns: repeat(auto-fill, minmax(320px, 1fr)); gap: 15px; margin-bottom: 50px; }
.selection-item { background: rgba(240, 242, 245, 0.05); border: 1px solid rgba(168, 178, 189, 0.2); padding: 20px; text-align: left; cursor: pointer; transition: all 0.3s ease; display: flex; align-items: flex-start; gap: 15px; }
.selection-item:hover { background: rgba(240, 242, 245, 0.1); border-color: var(–color-frost); }
.selection-item-index { font-family: var(–font-letter); font-size: 1.2rem; color: var(–color-frost); line-height: 1.5; }
.selection-item-text { flex-grow: 1; line-height: 1.6; opacity: 0.8; }
.selection-item.selected { background: rgba(181, 101, 101, 0.2); border-color: var(–color-ember); }
.selection-item.selected .selection-item-index { color: var(–color-ember); font-weight: bold; }
.selection-item.selected .selection-item-text { opacity: 1; }
.feedback-text { color: var(–color-ember); margin-left: auto; padding-left: 10px; font-family: var(–font-letter); }.back-button { padding: 12px 40px; font-size: 1.1rem; color: var(–color-frost); background: transparent; border: 1px solid var(–color-frost); cursor: pointer; transition: all 0.3s ease; }
.back-button:hover { color: var(–color-night); background: var(–color-frost); }.author-info { text-align: center; padding: 40px 20px; color: var(–color-snow); opacity: 0.5; font-size: 0.9rem; letter-spacing: 0.1em; }
@media (max-width: 768px) {
.page-title { font-size: 2rem; letter-spacing: 0.3em; }
.content-grid { grid-template-columns: 1fr; }
/* — 确保在小屏幕上,也使用auto-fill来确保布局正确 — */
.selection-list { grid-template-columns: repeat(auto-fill, minmax(320px, 1fr)); }
.entrance-button { width: 100px; height: 100px; font-size: 2rem; }
.info-card .card-content.expanded { max-height: 50vh; }#letter-scene {
align-items: flex-start;
padding-top: 5vh;
padding-bottom: 5vh;
}
.letter-container {
padding: 40px 20px;
max-height: 90vh;
overflow-y: auto;
}
.letter-container::-webkit-scrollbar {
width: 5px;
}
.letter-container::-webkit-scrollbar-track {
background: transparent;
}
.letter-container::-webkit-scrollbar-thumb {
background: var(–color-frost);
border-radius: 3px;
}
}
</style>
</head>
<body>
<audio id="bgm-audio" loop src="https://s3plus.meituan.net/opapisdk/op_ticket_1_5677168484_1762073416764_qdqqd_vnslkq.mp3"></audio><div id="entrance-scene" class="scene active">
<button class="entrance-button" id="enter-btn">启</button>
</div><div id="letter-scene" class="scene">
<div id="snow-container"></div>
<div class="letter-container">
<div class="letter-text-wrapper" id="letter-text"></div>
<button id="continue-to-main">阅毕</button>
</div>
</div><div id="main-scene" class="scene">
<div class="main-container">
<header class="page-header">
<h1 class="page-title">基本介绍</h1>
<p class="page-subtitle">作者: kebno</p>
</header>
<div class="content-grid">
<div class="info-card" data-card="background">
<div class="info-card-header"><div><span class="card-icon">◈</span><h2 class="card-title">背景信息</h2></div><span class="card-arrow">→</span></div>
<div class="card-content">
<h3>齐国 (南齐)</h3>
<p><strong>国号:</strong> 齐 (史称南齐,亦称梁齐)<br><strong>皇姓:</strong> 梁<br><strong>纪年:</strong> 永平七年(随剧情变化)</p>
<h4>在位君主: 梁清平</h4>
<p>女,三十七岁。聪慧敏锐,深谙权术,然天性不喜繁文缛节,贪恋游乐,颇好武事。常微服出宫,混迹市井。于嘉定元年发动宫变,自其姑母手中夺得帝位。至今未立国本。</p>
<h4>中宫: 虞徵</h4>
<p>女,三十九岁。出身北府兵将领世家,乃梁清平举事时之肱股。性沉静,不慕权谋,唯忠心于梁清平一人。虽居后位,甚少过问宫闱之事,多居于京畿大营治军,为梁清平最信赖与爱之人。</p>
<h4>朝堂派系</h4>
<p><strong>帝党:</strong> 以梁清平为首,核心为中书舍人沈玉、禁军统领萧敬明等寒门新贵,主张加强君权,破除门阀。</p>
<p><strong>旧勋派:</strong> 以太尉谢楠为首,维护王、谢等顶级门阀利益,抵制新政。谢楠看似寄情玄理,实则老谋深算。</p>
<p><strong>宗室派:</strong> 以皇帝胞妹梁清乐为首,对皇位合法性存疑,暗中蓄力。</p>
<h4>国力评析</h4>
<p>财赋富庶冠绝四海,然资财多聚于高门,流民之患渐显。军力呈“守强攻弱”之势,水师为最强依仗,但陆军兵权分散。</p><h3>魏国 (北魏)</h3>
<p><strong>国号:</strong> 魏 (史称北魏,亦称赵魏)<br><strong>皇姓:</strong> 赵<br><strong>纪年:</strong> 景和三年(随剧情变化)</p>
<h4>在位君主: 赵怀瑾 (魏太祖)</h4>
<p>女,三十岁。雄才大略,眼界开阔,信奉实力与功绩。行事雷厉风行。三年前迫使燕废帝禅让,建立魏国。于儿女私情淡漠,未立中宫。</p>
<h4>朝堂派系</h4>
<p><strong>帝党:</strong> 以赵怀瑾为首,核心为慕容秀、拓跋云等军功新贵,主张破除门阀,富国强兵。</p>
<p><strong>燕旧派:</strong> 以太傅元靖为首,维护元氏、高氏等前燕世族利益,抵制变革。</p>
<p><strong>中立臣僚:</strong> 以司空李颖为首,周旋于两派之间,以国事为重。</p>
<h4>国力评析</h4>
<p>整体强于南齐。推行均田制后农事渐兴,盐铁官营。坐拥当世最强步骑,尤以骑军见长,兵权尽归帝王。水军为短板。</p>
</div>
</div>
<div class="info-card" data-card="character">
<div class="info-card-header"><div><span class="card-icon">◆</span><h2 class="card-title">角色传记</h2></div><span class="card-arrow">→</span></div>
<div class="card-content">
<p class="biography-note">【正史传记】非固定剧情</p>
<p>傅倦灯(南朝齐章武八年—大魏开元二十五年),建康人。南朝齐末期权臣,大魏开元朝辅政大臣。其一生跌宕,功过交织,身后墓碑仅留一句自白,为后世留下了难以定论的复杂侧影。</p>
<p>傅倦灯出身建康士族,少有才名,凭借其卓越的政治手腕与战略远见,于南齐末年风雨飘摇之际,跻身权力中枢,一度权倾朝野。她力图维系齐室统治,然王朝积弊已深,非一人之力所能挽回。大魏奠基前一年,南齐都城建康被赵怀瑾攻破,国祚终结。时年三十五岁的傅倦灯作为齐室重臣,于宫城之内被俘。</p>
<p>被俘之初,傅倦灯坚拒降意。然数载之后,或为审时度势,或为另寻施展抱负之机,她最终选择归顺,为大魏效力。大魏太祖赵怀瑾对其才华极为赏识,曾于朝堂私下评曰:“傅氏有经世之才,安邦之能,天下少有。” 然帝王亦深知其志,认为有野心者与掌权者终难同心,故虽授其官职,却始终将其排斥于权力核心之外。大魏开元五年,傅倦灯四十岁,被外调至江南道任经略使。此举既是倚其能以安抚江南,亦是将其远置京畿之外的制衡之术。</p>
<p>在江南道的十五年,是傅倦灯沉潜地方、大展其能的时期。她远离了京畿的政治漩涡,将全副心力投入地方治理。期间,她疏通水利,鼓励农桑,革新税法,整顿吏治,使得江南地区府库充盈,民生安定,成为大魏初年最为富庶稳固的腹地,为开元盛世奠定了坚实的经济基础。</p>
<p>大魏开元二十年,太祖赵怀瑾驾崩,遗命其侄女继位,是为新帝。新帝年幼,朝局不稳。傅倦灯奉诏回京,时年五十五岁。她以雷霆之势迅速稳定朝政,凭借在江南积累的政绩与声望,以及无人能及的治国经验,再次步入权力中枢,受封辅政大臣,总领朝政。在生命的最后五年,她悉心辅佐新帝,延续并深化了开元朝的各项国策,确保了皇权的平稳过渡。</p>
<p>大魏开元二十五年,傅倦灯病逝于京中府邸,享年六十岁。其灵柩归葬建康祖坟,墓碑之上,只遵其遗愿,镌刻八字:“山河为风,此身不曜。”</p>
<p>后世对傅倦灯的评价颇为两极。论其过,她于齐末与魏初的权斗中手段酷烈,为上位而清除异己,确对一部分世家贵族造成了冲击;论其功,她治理江南的实绩与辅佐新帝的稳健,于国于民皆有大贡献。她以亡国之臣的身份,历经外放与沉寂,最终竟能重返权力之巅,这在历史上实属破例。这句既非辩解亦非自诩的碑文,恰如其人,最能评价傅倦灯的,只有她本人。</p>
</div>
</div>
</div>
<div class="button-container"><button class="action-button" id="to-opening-selection-btn">开启故事</button></div>
<div class="author-info">© kebno · 傅子胥</div>
</div>
</div><div id="opening-selection-scene" class="scene">
<div class="main-container">
<header class="page-header">
<h1 class="page-title">故事锚点</h1>
<p class="page-subtitle">请选择你的故事切入点</p>
</header>
<div class="selection-list" id="opening-list-container"></div>
<div class="button-container">
<button class="back-button" id="back-to-main-btn">< 返回</button>
</div>
</div>
</div><script>
document.addEventListener('DOMContentLoaded', (function() {
if (document.body.dataset.initialized) return;
document.body.dataset.initialized = 'true';const scenes = { entrance: document.getElementById('entrance-scene'), letter: document.getElementById('letter-scene'), main: document.getElementById('main-scene'), selection: document.getElementById('opening-selection-scene') };
const buttons = { enter: document.getElementById('enter-btn'), continueToMain: document.getElementById('continue-to-main'), toSelection: document.getElementById('to-opening-selection-btn'), backToMain: document.getElementById('back-to-main-btn') };
const bgm = document.getElementById('bgm-audio');function switchScene(targetScene) {
Object.values(scenes).forEach(scene => scene && scene.classList.remove('active'));
if (scenes[targetScene]) scenes[targetScene].classList.add('active');
}function createSnowflakes() {
const container = document.getElementById('snow-container');
if (!container || container.children.length > 0) return;
for (let i = 0; i < 100; i++) {
const el = document.createElement('div');
el.className = 'snowflake';
const size = Math.random() * 3 + 1;
el.style.cssText = `width:${size}px; height:${size}px; left:${Math.random()*100}vw; animation-duration:${Math.random()*10+10}s; animation-delay:${Math.random()*10}s; opacity:${Math.random()}`;
container.appendChild(el);
}
}function animateLetterText() {
const wrapper = document.getElementById('letter-text');
if (!wrapper || wrapper.children.length > 0) return;
const content = ["见字如晤。", "十年光景,转瞬即逝,我曾以为自己早已将过往埋葬在从前的刀光剑影之下,却不想,某个深夜翻阅旧卷时,竟还能瞥见你的身影。", "当年你问我,是否后悔踏入这泥沼。我答:无悔。如今你若再问,我仍会说:无悔。只是这无悔二字,早已染上了太多血色。", "或许在旁人眼中,我无情无义、蛇蝎心肠。但你应该明白,这世上从来没有人能不付出代价,就站到想要的高处。", "非我者,何敢妄议我也?", "罢了,不说这些,若再见,便煮一壶酒,再说说这十年的故事吧。", "<p style='text-align: right; margin-top: 2em;'>子胥 字</p>"];
let totalDelay = 500, lineDelay = 3500;
content.forEach((text, index) => {
setTimeout(() => {
const p = document.createElement('p');
if (index === content.length – 1) p.innerHTML = text; else p.textContent = text;
wrapper.appendChild(p); requestAnimationFrame(() => p.classList.add('visible'));
}, totalDelay);
totalDelay += lineDelay;
});
setTimeout(() => buttons.continueToMain.classList.add('visible'), totalDelay – lineDelay + 500);
}function initializeOpeningList() {
const container = document.getElementById('opening-list-container');
if (!container || container.children.length > 0) return;/* — 修改:将开场白选项的标题数组扩展到33个 — */
const titles = [
"初遇,上官下属", "互为政敌", "同床异梦还是同心同德的盟友", "经典北魏质女,user质女",
"君为相庆生(自由选择世界书条目-明君or普通)", "如果你想要称帝?", "北魏探子user,猫鼠游戏?", "真戏假戏,真情假意?(联姻线)",
"傅大人捡了小孩,养成系user", "舟中月,目中人(爱侣线)", "床头吵架床尾和(爱侣线NSFW)", "政敌还是妻子?(政敌线NSFW)",
"隐忍的傅相(天子线NSFW)", "质女线后续-谁为主客?(世界书条目开)", "大魏帝姬与阶下囚傅(世界书条目开)", "江南好,风景旧曾谙(世界书条目开正史)",
"雨夜抚琴,故人相逢(故人相逢前线-开世界书条目)", "以下犯上-NSFW开场", "自roll(提前设定好爱恨值与关系)",
"真骨-接风尘(傅为姐,开世界书条目)", "伪骨-清凉寺(user为姐,开世界书条目)",
"雍州平叛(战事-开世界书条目)", "一箭之遥(战事/故人相逢后续-开世界书条目)", "千里奔袭,user救妻(战事-开世界书条目)", "琴音风骨,头牌user(青楼线-开世界书条目)", "金戈之声-宫变(内含染血傅)",
"春日纸鸢(爱侣温馨日常)", "夏日亭凉(故人线NSFW)", "秋日劝学?user是傅的老师(IF少年傅-开世界书条目)", "冬春与猫,小贼喂猫?(IF少年傅-开世界书条目)", "佛门国师(user为国师,开世界书条目)", "年少母亲(user为小妈,开世界书条目)"
];titles.forEach((title, index) => {
const item = document.createElement('div');
item.className = 'selection-item';
item.dataset.index = index + 1;
item.innerHTML = `<span class="selection-item-index">${String(index + 1).padStart(2, '0')}</span><span class="selection-item-text">${title}</span>`;
container.appendChild(item);
});container.addEventListener('click', async function(e) {
const targetItem = e.target.closest('.selection-item');
if (!targetItem || targetItem.classList.contains('selected')) return;const swipe_id = parseInt(targetItem.dataset.index, 10);
if (isNaN(swipe_id)) return;container.querySelectorAll('.selection-item').forEach(item => {
item.classList.remove('selected');
item.querySelector('.feedback-text')?.remove();
});
targetItem.classList.add('selected');
const feedbackEl = document.createElement('span');
feedbackEl.className = 'feedback-text';
feedbackEl.textContent = '[锚定中]';
targetItem.appendChild(feedbackEl);if (typeof setChatMessage === 'function' && typeof getChatMessages === 'function') {
try {
const messages = await getChatMessages("0", { include_swipe: true });
if (messages && messages[0] && messages[0].swipes && messages[0].swipes[swipe_id]) {
await setChatMessage(messages[0].swipes[swipe_id], 0, { swipe_id: swipe_id, refresh: 'display_and_render_current' });
feedbackEl.textContent = '[已锚定]';
} else {
throw new Error(`开场白索引 ${swipe_id} 不存在。`);
}
} catch (error) {
console.error('切换开场白失败:', error)
feedbackEl.textContent = '[失败]';
}
} else {
feedbackEl.textContent = '[API错误]';
console.error("SillyTavern API (setChatMessage or getChatMessages) not found.");
}
});
}buttons.enter.addEventListener('click', () => {
if (bgm) bgm.play().catch(e => console.error("BGM Playback failed:", e));
switchScene('letter');
createSnowflakes();
animateLetterText();
});buttons.continueToMain.addEventListener('click', () => switchScene('main'));
buttons.toSelection.addEventListener('click', () => { switchScene('selection'); initializeOpeningList(); });
buttons.backToMain.addEventListener('click', () => switchScene('main'));document.querySelectorAll('.info-card-header').forEach(header => {
header.addEventListener('click', function() {
const content = this.nextElementSibling;
const isExpanded = content.classList.contains('expanded');
document.querySelectorAll('.card-content.expanded').forEach(c => c.classList.remove('expanded'));
if (!isExpanded) content.classList.add('expanded');
});
});})());
</script>
</body>
</html>
“`