jianzhihuixiang/alacarte-novel-website/chapters/chapter-128.html

1000 lines
43 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0">
<title>番外·与艾泽拉的守护誓言 - 阿拉德:剑之回响</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Noto+Serif+SC:wght@400;600;700&family=Noto+Sans+SC:wght@300;400;500;700&display=swap" rel="stylesheet">
<style>
:root {
--bg-primary: linear-gradient(135deg, #0f0c29 0%, #302b63 50%, #24243e 100%);
--text-primary: #e0e0e0;
--text-secondary: #888;
--accent-gradient: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
--border-color: rgba(255,255,255,0.1);
--btn-bg: rgba(255,255,255,0.1);
--btn-hover: rgba(255,255,255,0.2);
}
[data-theme="light"] {
--bg-primary: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
--text-primary: #333;
--text-secondary: #666;
--border-color: rgba(0,0,0,0.1);
--btn-bg: rgba(0,0,0,0.05);
--btn-hover: rgba(0,0,0,0.1);
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: 'Noto Serif SC', serif;
background: var(--bg-primary);
color: var(--text-primary);
line-height: 1.8;
min-height: 100vh;
transition: all 0.3s ease;
}
.container {
max-width: 800px;
margin: 0 auto;
padding: 20px;
padding-bottom: 120px;
}
/* 顶部导航 */
.top-nav {
position: fixed;
top: 0;
left: 0;
right: 0;
background: rgba(0,0,0,0.3);
backdrop-filter: blur(10px);
border-bottom: 1px solid var(--border-color);
z-index: 1000;
padding: 10px 20px;
}
.top-nav-content {
max-width: 800px;
margin: 0 auto;
display: flex;
justify-content: space-between;
align-items: center;
}
.nav-link {
color: var(--text-primary);
text-decoration: none;
font-family: 'Noto Sans SC', sans-serif;
font-size: 14px;
padding: 8px 16px;
background: var(--btn-bg);
border: 1px solid var(--border-color);
border-radius: 8px;
transition: all 0.3s ease;
}
.nav-link:hover {
background: var(--btn-hover);
}
.chapter-header {
text-align: center;
padding: 80px 0 40px;
border-bottom: 1px solid var(--border-color);
margin-bottom: 40px;
}
.chapter-number {
font-size: 14px;
color: var(--text-secondary);
letter-spacing: 4px;
text-transform: uppercase;
margin-bottom: 10px;
}
.chapter-title {
font-size: 32px;
font-weight: 700;
background: var(--accent-gradient);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
margin-bottom: 20px;
}
.chapter-meta {
font-size: 14px;
color: var(--text-secondary);
}
.chapter-content {
font-size: 18px;
line-height: 2;
text-align: justify;
}
.chapter-content p {
margin-bottom: 1.5em;
text-indent: 2em;
}
.chapter-content p:first-of-type::first-letter {
font-size: 3em;
float: left;
line-height: 1;
margin-right: 8px;
margin-top: -5px;
background: var(--accent-gradient);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
font-weight: 700;
}
/* 固定底部导航 */
.fixed-nav {
position: fixed;
bottom: 0;
left: 0;
right: 0;
background: rgba(0,0,0,0.3);
backdrop-filter: blur(10px);
border-top: 1px solid var(--border-color);
z-index: 1000;
padding: 15px 20px;
}
.fixed-nav-content {
max-width: 800px;
margin: 0 auto;
display: flex;
justify-content: space-between;
align-items: center;
}
.nav-btn {
padding: 12px 24px;
background: var(--btn-bg);
border: 1px solid var(--border-color);
border-radius: 8px;
color: var(--text-primary);
text-decoration: none;
transition: all 0.3s ease;
font-family: 'Noto Sans SC', sans-serif;
font-size: 14px;
cursor: pointer;
}
.nav-btn:hover {
background: var(--btn-hover);
transform: translateY(-2px);
}
.nav-btn.disabled {
opacity: 0.3;
cursor: not-allowed;
pointer-events: none;
}
.nav-btn.active {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
border-color: #667eea;
}
/* 右侧滚动按钮 */
.scroll-buttons {
position: fixed;
right: 20px;
bottom: 90px;
display: flex;
flex-direction: column;
gap: 10px;
z-index: 1001;
}
.scroll-btn {
width: 40px;
height: 40px;
border-radius: 8px;
background: var(--btn-bg);
border: 1px solid var(--border-color);
color: var(--text-primary);
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
font-size: 16px;
transition: all 0.3s ease;
font-family: 'Noto Sans SC', sans-serif;
}
.scroll-btn:hover {
background: var(--btn-hover);
}
/* TTS弹出面板 */
.tts-overlay {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(0,0,0,0.5);
z-index: 2000;
display: none;
align-items: center;
justify-content: center;
}
.tts-overlay.show {
display: flex;
}
.tts-panel {
background: rgba(30,30,50,0.95);
backdrop-filter: blur(10px);
border-radius: 16px;
border: 1px solid var(--border-color);
padding: 24px;
width: 90%;
max-width: 400px;
box-shadow: 0 10px 40px rgba(0,0,0,0.3);
}
[data-theme="light"] .tts-panel {
background: rgba(255,255,255,0.95);
}
.tts-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 20px;
padding-bottom: 15px;
border-bottom: 1px solid var(--border-color);
}
.tts-title {
font-size: 18px;
font-weight: 600;
color: var(--text-primary);
font-family: 'Noto Sans SC', sans-serif;
}
.tts-close {
width: 32px;
height: 32px;
border-radius: 50%;
background: var(--btn-bg);
border: 1px solid var(--border-color);
color: var(--text-primary);
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
font-size: 18px;
transition: all 0.3s ease;
}
.tts-close:hover {
background: var(--btn-hover);
}
.tts-controls {
display: flex;
justify-content: center;
gap: 16px;
margin-bottom: 20px;
}
.tts-btn {
width: 56px;
height: 56px;
border-radius: 50%;
background: var(--btn-bg);
border: 2px solid var(--border-color);
color: var(--text-primary);
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
font-size: 20px;
transition: all 0.3s ease;
font-family: 'Noto Sans SC', sans-serif;
}
.tts-btn:hover {
background: var(--btn-hover);
transform: scale(1.1);
}
.tts-btn.active {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
border-color: #667eea;
transform: scale(1.1);
}
.tts-progress {
margin-bottom: 20px;
}
.tts-progress-bar {
height: 6px;
background: var(--btn-bg);
border-radius: 3px;
overflow: hidden;
margin-bottom: 8px;
}
.tts-progress-fill {
height: 100%;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
width: 0%;
transition: width 0.1s ease;
}
.tts-time {
font-size: 13px;
color: var(--text-secondary);
font-family: 'Noto Sans SC', sans-serif;
text-align: center;
}
.tts-speed {
display: flex;
align-items: center;
justify-content: center;
gap: 12px;
}
.tts-speed-label {
font-size: 14px;
color: var(--text-secondary);
font-family: 'Noto Sans SC', sans-serif;
}
.tts-speed-select {
padding: 8px 16px;
background: var(--btn-bg);
border: 1px solid var(--border-color);
border-radius: 8px;
color: var(--text-primary);
font-size: 14px;
cursor: pointer;
font-family: 'Noto Sans SC', sans-serif;
}
/* 侧边栏 - 标题固定,内容滚动 */
.sidebar {
position: fixed;
right: 20px;
top: 50%;
transform: translateY(-50%);
background: rgba(0,0,0,0.5);
backdrop-filter: blur(10px);
border-radius: 12px;
border: 1px solid var(--border-color);
width: 200px;
max-height: 70vh;
z-index: 999;
display: flex;
flex-direction: column;
}
.sidebar-title {
font-size: 14px;
color: var(--text-secondary);
text-transform: uppercase;
letter-spacing: 2px;
padding: 15px 20px;
border-bottom: 1px solid var(--border-color);
flex-shrink: 0;
}
.sidebar-content {
overflow-y: auto;
padding: 10px 20px 20px;
flex: 1;
scrollbar-width: thin;
scrollbar-color: transparent transparent;
transition: scrollbar-color 0.3s ease;
}
.sidebar-content:hover {
scrollbar-color: rgba(255,255,255,0.3) transparent;
}
.sidebar-content::-webkit-scrollbar {
width: 6px;
}
.sidebar-content::-webkit-scrollbar-track {
background: transparent;
}
.sidebar-content::-webkit-scrollbar-thumb {
background: transparent;
border-radius: 3px;
transition: background 0.3s ease;
}
.sidebar-content:hover::-webkit-scrollbar-thumb {
background: rgba(255,255,255,0.3);
}
.sidebar-content:hover::-webkit-scrollbar-thumb:hover {
background: rgba(255,255,255,0.5);
}
[data-theme="light"] .sidebar-content:hover {
scrollbar-color: rgba(0,0,0,0.3) transparent;
}
[data-theme="light"] .sidebar-content:hover::-webkit-scrollbar-thumb {
background: rgba(0,0,0,0.3);
}
[data-theme="light"] .sidebar-content:hover::-webkit-scrollbar-thumb:hover {
background: rgba(0,0,0,0.5);
}
.sidebar-chapter {
display: block;
padding: 8px 0;
color: #aaa;
text-decoration: none;
font-size: 13px;
border-bottom: 1px solid rgba(255,255,255,0.05);
transition: all 0.3s ease;
line-height: 1.5;
}
.sidebar-chapter:hover {
color: #667eea;
}
.sidebar-chapter.current {
color: #667eea;
font-weight: 600;
}
@media (max-width: 1200px) {
.sidebar {
display: none;
}
}
@media (max-width: 600px) {
.chapter-title {
font-size: 24px;
}
.chapter-content {
font-size: 16px;
}
.fixed-nav-content {
gap: 8px;
}
.nav-btn {
padding: 10px 12px;
font-size: 12px;
}
.scroll-buttons {
display: none;
}
.tts-panel {
padding: 20px;
width: 95%;
}
.tts-btn {
width: 48px;
height: 48px;
font-size: 18px;
}
.tts-title {
font-size: 16px;
}
}
/* 滚动条样式 */
.sidebar::-webkit-scrollbar {
width: 4px;
}
.sidebar::-webkit-scrollbar-track {
background: transparent;
}
.sidebar::-webkit-scrollbar-thumb {
background: rgba(255,255,255,0.2);
border-radius: 2px;
}
</style>
</head>
<body>
<!-- 顶部导航 -->
<nav class="top-nav">
<div class="top-nav-content">
<a href="../index.html" class="nav-link">返回首页</a>
<button class="nav-link" id="themeToggle">切换主题</button>
</div>
</nav>
<div class="container">
<header class="chapter-header">
<div class="chapter-number">Chapter 128</div>
<h1 class="chapter-title">{{CHAPTER_TITLE}}</h1>
</header>
<article class="chapter-content">
<p>寂静城,艾泽拉的居所。</p>
<p>这里与贝奇的房间不同,更加安静、更加深沉。房间里的灯光柔和而温暖,墙上挂着各种图纸和设计,桌上堆满了研究资料。作为卢克的助手,艾泽拉的工作繁重而复杂。</p>
<p>林克敲响艾泽拉的房门。</p>
<p>"请进。"门内传来艾泽拉的声音,温和而有礼。</p>
<p>林克推开门,看到艾泽拉正坐在桌前,翻阅着一份图纸。她有着紫色的短发、紫色的眼眸、精致的五官。她的身材纤细而匀称,穿着研究者的服饰,散发着一种知性的美感。</p>
<p>她看到林克,紫色的眼睛里闪过惊喜:"林克?"</p>
<p>她放下图纸,站起身来,走近他:"你来看我了。"</p>
<p>林克点头:"我来看看你。最近还好吗?"</p>
<p>艾泽拉微微一笑:"还好。研究进展顺利,卢克爷爷的状态也稳定。"</p>
<p>她的笑容温和而优雅,给人一种安心感。但林克注意到,她的眉间有一丝疲惫。</p>
<p>"你看起来很累。"林克说。</p>
<p>艾泽拉愣了一下,然后苦笑:"我确实有点累。最近研究任务很繁重,每天都在处理各种数据和图纸。"</p>
<p>她的声音变得轻柔:"但这是我的职责。作为卢克爷爷的助手,我要帮助他完成研究。"</p>
<p>林克走近她,伸手握住她的手:"你可以休息一下。"</p>
<p>艾泽拉看着他,眼中闪过温柔:"有你在,我觉得可以放松。"</p>
<p>她的手指微微颤抖,但很快稳定下来。她不太习惯被人关心,尤其是被林克关心。</p>
<p style="text-align: center; color: var(--text-secondary); text-indent: 0;">···</p>
<p>下午,林克带着艾泽拉在寂静城里漫步。</p>
<p>两人走过钢铁的走廊,看着精密的机械运转。艾泽拉为林克介绍着寂静城的各种设施,她的讲解详细而专业。</p>
<p>"这是卢克爷爷的主实验室。"她指着一间大型房间,"他在这里进行主要的创造和研究。"</p>
<p>"这是能源控制中心。"她指着另一间房间,"寂静城的能源由这里分配和管理。"</p>
<p>"这是..."她停顿了一下,指着一间特殊的房间,"这是我的私人实验室。我在这里进行自己的研究。"</p>
<p>林克看向那间房间,看到里面有很多图纸和设备。房间里还有一个小窗户,可以看到外面的天空海。</p>
<p>"你有自己的研究方向?"林克问。</p>
<p>艾泽拉点头:"我在研究人造人的情感系统。卢克爷爷创造了贝奇和其他人造人,但他们的情感系统还不够完善。我在尝试改进这个系统,让他们能够更好地感受人类的情感。"</p>
<p>她的声音变得认真:"贝奇是我的研究对象之一。她的情感系统是最先进的,但还是有很多不完善的地方。我在研究如何让她的系统更加接近人类。"</p>
<p>林克看着她:"你很关心贝奇。"</p>
<p>艾泽拉点头:"贝奇是卢克爷爷创造的最完美的人造人。她有着强大的战斗能力和学习能力,但她的情感系统还不够完善。我希望我的研究能帮助她。"</p>
<p>她的眼神变得温柔:"她是一个很可爱的孩子,我希望她能真正感受到人类的情感。"</p>
<p>林克伸手握住她的手:"你是一个很善良的人,艾泽拉。"</p>
<p>艾泽拉微微一笑,有些不好意思:"我只是做了应该做的事。"</p>
<p style="text-align: center; color: var(--text-secondary); text-indent: 0;">···</p>
<p>两人继续漫步,来到了寂静城的最高点。</p>
<p>这里是观察台,可以看到整个寂静城的全景。钢铁的建筑、精密的机械、闪烁的灯光...这一切构成了这座机械之城的独特风景。</p>
<p>更远的地方,可以看到天空海。蓝色的天空与机械的钢铁形成对比,给人一种奇特的美感。</p>
<p>"真美。"林克感慨道。</p>
<p>艾泽拉点头:"这是我最喜欢的地方。每次累了,我都会来这里看风景。"</p>
<p>她的声音变得轻柔:"看着天空海,看着寂静城的灯光,我会觉得平静。"</p>
<p>林克看着她,眼中闪过心疼:"你经常累吗?"</p>
<p>艾泽拉点头:"研究任务很繁重,我每天都工作到很晚。有时候,我会觉得很疲惫。"</p>
<p>她的声音变得深沉:"但我不能放弃。卢克爷爷需要我的帮助,贝奇需要我的研究。我有很多责任。"</p>
<p>林克走近她,伸手握住她的手:"艾泽拉,你也可以休息。"</p>
<p>艾泽拉看着他,眼中闪过感动:"谢谢你,林克。谢谢你关心我。"</p>
<p>她低下头,声音变得轻柔:"有时候,我会觉得孤独。在寂静城里,我只有卢克爷爷和贝奇。他们是我的家人,但他们都有自己的任务。我没有可以依靠的人。"</p>
<p>林克握紧她的手:"你可以依靠我。"</p>
<p>艾泽拉抬起头,看着他:"真的吗?"</p>
<p>"真的。"林克认真地说,"我会一直在你身边。"</p>
<p>艾泽拉的眼眶湿润了:"谢谢你,林克..."</p>
<p style="text-align: center; color: var(--text-secondary); text-indent: 0;">···</p>
<p>傍晚,两人坐在观察台上,看着夕阳。</p>
<p>夕阳的余晖洒在寂静城上,为钢铁的建筑镀上了一层金色的光芒。天空海也变得橙红,美得如同一幅画。</p>
<p>艾泽拉靠在林克肩上,身体放松,脸上带着温和的笑容。</p>
<p>"林克。"她轻声说。</p>
<p>"嗯?"</p>
<p>"谢谢你陪我。"她的声音带着感激,"这是我第一次...觉得不那么孤独。"</p>
<p>林克搂住她:"以后都不会孤独了。我会陪着你。"</p>
<p>艾泽拉点头,享受着这份宁静。</p>
<p>过了一会儿,她的声音变得认真:"林克,我有话想对你说。"</p>
<p>林克看着她:"什么话?"</p>
<p>艾泽拉深吸一口气,鼓起勇气说:"我...我喜欢你。"</p>
<p>她的声音很轻,但每一个字都很清晰:"从你救卢克爷爷的那天开始,我就把你放在心里了。你是我遇到的第一个真正帮助我们的人,第一个让我看到希望的人,第一个...让我想要依靠的人。"</p>
<p>她低下头:"我知道,我是研究者,有很多任务和责任。我可能不像其他人那么有趣,也不那么活泼...但是...我还是想告诉你我的心意。"</p>
<p>她的声音变得轻柔:"至少,让你知道,有人在寂静城等你。有人愿意放下研究,只和你在一起。"</p>
<p>林克没有说话,只是静静地看着她。</p>
<p>艾泽拉紧张地等待着他的回应,心脏跳得很快。她不知道自己为什么会这么紧张,明明已经做好了被拒绝的准备。毕竟她是研究者,性格内向,不像贝奇那么活泼可爱,林克可能不喜欢这样的她。</p>
<p>然后,她感觉到一只手轻轻抬起她的下巴。</p>
<p>她抬起头,看到林克正温柔地看着她。</p>
<p>"艾泽拉。"他说,"我也喜欢你。"</p>
<p>艾泽拉愣住了:"真...真的?你不介意我的性格吗?"</p>
<p>"不介意。"林克摇头,"你善良、温柔、知性。你为了帮助卢克和贝奇而努力研究,这份责任心我很欣赏。我喜欢你的性格,也喜欢你这个人。"</p>
<p>艾泽拉的眼眶湿润了,眼泪不自觉地滑落。她等这句话等了太久太久。</p>
<p>"林克..."她轻声说,声音带着哽咽。</p>
<p>林克伸手擦去她的眼泪:"不要再哭了。"</p>
<p>艾泽拉破涕为笑:"我忍不住嘛..."</p>
<p>然后,她主动凑过去,吻住了他的唇。</p>
<p style="text-align: center; color: var(--text-secondary); text-indent: 0;">···</p>
<p>这是一个温柔的吻,带着艾泽拉特有的知性和深情。</p>
<p>夕阳的余晖洒在两人身上,为这个吻镀上了一层金色的光芒。艾泽拉的双臂环住林克的脖子,身体紧紧贴着他。她的身体纤细而柔软,散发着淡淡的芳香。</p>
<p>林克的手轻轻搂住她的腰,将她拥入怀中。</p>
<p>吻了很久,两人才分开。艾泽拉的脸红得像晚霞,紫色的眼睛亮晶晶的。</p>
<p>"林克..."她轻声说,声音带着羞涩,"今晚...我们可以在这里吗?"</p>
<p>林克看着她,读懂了她眼中的期待。他伸手抚摸着她的紫色短发,感受着她柔软的温度。</p>
<p>"你想在这里?"他问。</p>
<p>艾泽拉点头,眼神中带着一丝期待和紧张:"我想和你在一起...在这个观察台上...这是我最喜欢的空间。"</p>
<p>她的声音变得轻柔:"这是我第一次...想要放下研究,只和你在一起。"</p>
<p>林克看着她,眼中闪过温柔:"艾泽拉,你确定吗?"</p>
<p>艾泽拉认真地点头:"我确定。"她的声音很轻,但很坚定,"我想要和你...更亲密。"</p>
<p>林克没有说话,只是再次吻住了她。这一次的吻更加热烈,更加深入。艾泽拉发出一声轻哼,紧紧抱住了他。</p>
<p>夕阳慢慢沉入地平线,夜幕开始降临。观察台的灯光亮起,为两人增添了几分浪漫的氛围。</p>
<p style="text-align: center; color: var(--text-secondary); text-indent: 0;">···</p>
<p>夜幕降临,星星出现在天空中。</p>
<p>观察台的角落里,两人依偎在一起。艾泽拉的头靠在林克胸口,手指在他的胸口画着圈。她的身体纤细而柔软,散发着淡淡的温暖。</p>
<p>"林克。"她轻声说。</p>
<p>"嗯?"</p>
<p>"我好幸福。"她的声音带着满足,"这是我第一次觉得,原来研究者也可以有属于自己的幸福。"</p>
<p>林克搂紧了她:"以后会更幸福的,艾泽拉。我会一直在你身边。"</p>
<p>艾泽拉抬起头,看着他:"真的吗?你不会离开我吗?"</p>
<p>"不会。"林克认真地说,"我会一直陪伴你。"</p>
<p>艾泽拉开心地笑了,再次吻了他。然后,她把头埋进他的胸口,享受着这份宁静和甜蜜。</p>
<p>"林克。"她轻声说,声音带着思考。</p>
<p>"嗯?"</p>
<p>"我会继续研究。"她的眼神带着认真,"我要帮助卢克爷爷,帮助贝奇,还有...帮助我们的未来。"</p>
<p>林克看了她一眼,笑了:"好,你继续研究。我会支持你。"</p>
<p>艾泽拉开心地笑了,把头靠在他的肩上。</p>
<p>月光洒在两人身上,见证着这份新的爱情。</p>
<p style="text-align: center; color: var(--text-secondary); text-indent: 0;">···</p>
<p>深夜,两人依偎在一起。</p>
<p>艾泽拉的头靠在林克胸口,听着他的心跳声。她的身体有些疲惫,但心情无比满足。</p>
<p>"林克。"她轻声说。</p>
<p>"嗯?"</p>
<p>"谢谢你...给我这份回忆。"她的声音很轻,但很真诚,"这是我第一次,真正放下研究,享受自己的时间。"</p>
<p>林克搂紧了她:"这只是开始,艾泽拉。以后我们会有更多的回忆。"</p>
<p>艾泽拉开心地笑了,紧紧抱住他。</p>
<p>曾经,她以为自己的命运只是研究者的身份,没有属于自己的幸福。但现在,她知道,研究者也可以追求爱情,责任和幸福可以共存。</p>
<p>观察台的灯光依旧明亮,见证着这对恋人的甜蜜时光。</p>
<p style="text-align: center; color: var(--text-secondary); text-indent: 0;">···</p>
<p>第二天清晨,两人并肩离开观察台。</p>
<p>艾泽拉整理好衣服,恢复了研究者的姿态。但她的脸上带着幸福的笑容,紫色的眼眸中也多了几分温柔。</p>
<p>"林克。"她说。</p>
<p>"嗯?"</p>
<p>"我会继续努力的。"她的眼神坚定,"我要研究,要帮助卢克爷爷,要帮助贝奇...还有,要陪伴你。"</p>
<p>林克握住她的手:"好,我们一起努力。"</p>
<p>艾泽拉开心地笑了,紧紧握着他的手。</p>
<p>曾经,她以为自己只是孤独的研究者。但现在,她知道,她有了依靠,有了爱情,有了最重要的那个人。</p>
<p>她的守护誓言,不只是对卢克和贝奇,也是对林克,对他们的未来。</p>
<p style="text-align: center; color: var(--text-secondary); text-indent: 0;">···</p>
<p style="text-align: center; color: var(--text-secondary); text-indent: 0; margin-top: 2em;">(第一百二十八章完)</p>
<p style="text-align: center; color: var(--text-secondary); text-indent: 0; margin-top: 2em;">(番外·艾泽拉篇 完)</p>
</article>
</div>
<!-- 固定底部导航 -->
<nav class="fixed-nav">
<div class="fixed-nav-content">
<a href="chapter-127.html" class="nav-btn ">上一章</a>
<a href="../chapters.html" class="nav-btn">目录</a>
<button class="nav-btn" id="ttsToggleBtn">朗读</button>
<a href="chapter-129.html" class="nav-btn ">下一章</a>
</div>
</nav>
<!-- 右侧滚动按钮 -->
<div class="scroll-buttons">
<button class="scroll-btn" id="scrollTop" title="回到顶部"></button>
<button class="scroll-btn" id="scrollBottom" title="回到底部"></button>
</div>
<!-- TTS弹出面板 -->
<div class="tts-overlay" id="ttsOverlay">
<div class="tts-panel">
<div class="tts-header">
<div class="tts-title">🔊 语音朗读</div>
<button class="tts-close" id="ttsClose">×</button>
</div>
<div class="tts-controls">
<button class="tts-btn" id="ttsPlay" title="播放"></button>
<button class="tts-btn" id="ttsPause" title="暂停"></button>
<button class="tts-btn" id="ttsStop" title="停止"></button>
</div>
<div class="tts-progress">
<div class="tts-progress-bar">
<div class="tts-progress-fill" id="ttsProgressFill"></div>
</div>
<div class="tts-time" id="ttsTime">0 / 0 句</div>
</div>
<div class="tts-speed">
<span class="tts-speed-label">朗读速度:</span>
<select class="tts-speed-select" id="ttsSpeed">
<option value="0.5">慢速 (0.5x)</option>
<option value="0.75">较慢 (0.75x)</option>
<option value="1" selected>正常 (1x)</option>
<option value="1.25">较快 (1.25x)</option>
<option value="1.5">快速 (1.5x)</option>
<option value="2">极速 (2x)</option>
</select>
</div>
</div>
</div>
<!-- 侧边栏章节导航 -->
<aside class="sidebar">
<div class="sidebar-title">章节导航</div>
<div class="sidebar-content" id="sidebarContent">
<a href="chapter-98.html" class="sidebar-chapter ">第98章钢铁之臂</a>
<a href="chapter-99.html" class="sidebar-chapter ">第99章能源熔炉</a>
<a href="chapter-100.html" class="sidebar-chapter ">第100章王之书库</a>
<a href="chapter-101.html" class="sidebar-chapter ">第101章不灭回廊</a>
<a href="chapter-102.html" class="sidebar-chapter ">第102章机械王座</a>
<a href="chapter-103.html" class="sidebar-chapter ">第103章番外·寂静城的早晨</a>
<a href="chapter-104.html" class="sidebar-chapter ">第104章番外·贝奇与艾泽拉</a>
<a href="chapter-105.html" class="sidebar-chapter ">第105章番外·卢克的嘱托</a>
<a href="chapter-106.html" class="sidebar-chapter ">第106章时空之门的召唤</a>
<a href="chapter-107.html" class="sidebar-chapter ">第107章格兰之火</a>
<a href="chapter-108.html" class="sidebar-chapter ">第108章瘟疫之源</a>
<a href="chapter-109.html" class="sidebar-chapter ">第109章卡勒特之初</a>
<a href="chapter-110.html" class="sidebar-chapter ">第110章无法地带</a>
<a href="chapter-111.html" class="sidebar-chapter ">第111章暗黑圣战</a>
<a href="chapter-112.html" class="sidebar-chapter ">第112章昔日悲鸣</a>
<a href="chapter-113.html" class="sidebar-chapter ">第113章凛冬</a>
<a href="chapter-114.html" class="sidebar-chapter ">第114章迷之觉悟</a>
<a href="chapter-115.html" class="sidebar-chapter ">第115章番外·艾丽丝的抉择</a>
<a href="chapter-116.html" class="sidebar-chapter ">第116章番外·后宫的日常</a>
<a href="chapter-117.html" class="sidebar-chapter ">第117章番外·与赛丽亚的约会</a>
<a href="chapter-118.html" class="sidebar-chapter ">第118章番外·与奥菲利亚的重逢</a>
<a href="chapter-119.html" class="sidebar-chapter ">第119章番外·与敏泰的雪山之行</a>
<a href="chapter-120.html" class="sidebar-chapter ">第120章番外·与莎兰的魔法时光</a>
<a href="chapter-121.html" class="sidebar-chapter ">第121章番外·与帕丽丝的格斗训练</a>
<a href="chapter-122.html" class="sidebar-chapter ">第122章番外·与莫纳亨的念动力</a>
<a href="chapter-123.html" class="sidebar-chapter ">第123章番外·与泽丁的天界巡逻</a>
<a href="chapter-124.html" class="sidebar-chapter ">第124章番外·与马琳的骑士之道</a>
<a href="chapter-125.html" class="sidebar-chapter ">第125章番外·与皇女的皇家约会</a>
<a href="chapter-126.html" class="sidebar-chapter ">第126章番外·与米娅的工坊时光</a>
<a href="chapter-127.html" class="sidebar-chapter ">第127章番外·与贝奇的人造之心</a>
<a href="chapter-128.html" class="sidebar-chapter current">第128章番外·与艾泽拉的守护誓言</a>
<a href="chapter-129.html" class="sidebar-chapter ">第129章魔界的召唤</a>
<a href="chapter-130.html" class="sidebar-chapter ">第130章魔界营地</a>
<a href="chapter-131.html" class="sidebar-chapter ">第131章凯蒂的指引</a>
<a href="chapter-132.html" class="sidebar-chapter ">第132章营地危机</a>
<a href="chapter-133.html" class="sidebar-chapter ">第133章尼梅尔的心意</a>
<a href="chapter-134.html" class="sidebar-chapter ">第134章中央公园</a>
<a href="chapter-135.html" class="sidebar-chapter ">第135章剑圣的试炼</a>
<a href="chapter-136.html" class="sidebar-chapter ">第136章地轨中心</a>
<a href="chapter-137.html" class="sidebar-chapter ">第137章魔剑士阿斯兰</a>
<a href="chapter-138.html" class="sidebar-chapter ">第138章泪目之眼</a>
<a href="chapter-139.html" class="sidebar-chapter ">第139章使徒会晤</a>
<a href="chapter-140.html" class="sidebar-chapter ">第140章复仇之剑</a>
<a href="chapter-141.html" class="sidebar-chapter ">第141章寂静城再访</a>
<a href="chapter-142.html" class="sidebar-chapter ">第142章时间之钥</a>
<a href="chapter-143.html" class="sidebar-chapter ">第143章翡翠梦魇</a>
<a href="chapter-144.html" class="sidebar-chapter ">第144章诅咒的守护者</a>
<a href="chapter-145.html" class="sidebar-chapter ">第145章精灵的誓言</a>
<a href="chapter-146.html" class="sidebar-chapter ">第146章深渊之眼</a>
<a href="chapter-147.html" class="sidebar-chapter ">第147章赫尔德的仪式</a>
<a href="chapter-148.html" class="sidebar-chapter ">第148章战后余晖</a>
<a href="chapter-149.html" class="sidebar-chapter ">第149章泰波尔斯的召唤</a>
<a href="chapter-150.html" class="sidebar-chapter ">第150章天空之城</a>
<a href="chapter-151.html" class="sidebar-chapter ">第151章风暴试炼</a>
<a href="chapter-152.html" class="sidebar-chapter ">第152章光芒与暗影</a>
<a href="chapter-153.html" class="sidebar-chapter ">第153章天空之战</a>
<a href="chapter-154.html" class="sidebar-chapter ">第154章天空之战</a>
<a href="chapter-155.html" class="sidebar-chapter ">第155章天空之战</a>
<a href="chapter-156.html" class="sidebar-chapter ">第156章格兰之森异象</a>
<a href="chapter-157.html" class="sidebar-chapter ">第157章魔界深处</a>
<a href="chapter-158.html" class="sidebar-chapter ">第158章幻象迷宫</a>
</div>
</aside>
<script>
// 记录阅读进度
let readChapters = JSON.parse(localStorage.getItem('readChapters') || '[]');
if (!readChapters.includes(128)) {
readChapters.push({{CHAPTER_ID}});
localStorage.setItem('readChapters', JSON.stringify(readChapters));
}
// 主题切换
const themeToggle = document.getElementById('themeToggle');
const savedTheme = localStorage.getItem('theme') || 'dark';
document.documentElement.setAttribute('data-theme', savedTheme);
themeToggle.textContent = savedTheme === 'dark' ? '浅色' : '深色';
themeToggle.addEventListener('click', () => {
const currentTheme = document.documentElement.getAttribute('data-theme');
const newTheme = currentTheme === 'dark' ? 'light' : 'dark';
document.documentElement.setAttribute('data-theme', newTheme);
localStorage.setItem('theme', newTheme);
themeToggle.textContent = newTheme === 'dark' ? '浅色' : '深色';
});
// 滚动到顶部
document.getElementById('scrollTop').addEventListener('click', () => {
window.scrollTo({ top: 0, behavior: 'smooth' });
});
// 滚动到底部
document.getElementById('scrollBottom').addEventListener('click', () => {
window.scrollTo({ top: document.body.scrollHeight, behavior: 'smooth' });
});
// 页面加载时,侧边栏自动滚动到当前章节
window.addEventListener('load', () => {
const sidebarContent = document.getElementById('sidebarContent');
const currentChapter = sidebarContent.querySelector('.current');
if (currentChapter) {
currentChapter.scrollIntoView({ behavior: 'smooth', block: 'center' });
}
});
// ========== TTS弹出面板 ==========
const ttsOverlay = document.getElementById('ttsOverlay');
const ttsToggleBtn = document.getElementById('ttsToggleBtn');
const ttsClose = document.getElementById('ttsClose');
// 打开TTS面板
ttsToggleBtn.addEventListener('click', () => {
ttsOverlay.classList.add('show');
initTTS();
});
// 关闭TTS面板
ttsClose.addEventListener('click', () => {
ttsOverlay.classList.remove('show');
});
// 点击遮罩关闭
ttsOverlay.addEventListener('click', (e) => {
if (e.target === ttsOverlay) {
ttsOverlay.classList.remove('show');
}
});
// ========== TTS语音朗读功能 ==========
let ttsSynth = window.speechSynthesis;
let ttsUtterance = null;
let ttsText = '';
let ttsSentences = [];
let ttsCurrentIndex = 0;
let ttsIsPlaying = false;
let ttsIsPaused = false;
let ttsSpeed = 1;
// 初始化:提取章节内容
function initTTS() {
const contentEl = document.querySelector('.chapter-content');
if (!contentEl) return;
// 获取所有段落文本清理HTML标签
ttsText = contentEl.innerText || contentEl.textContent;
// 分割成句子(中文按句号、问号、感叹号分割)
ttsSentences = ttsText.match(/[^。!?\n]+[。!?\n]+|[^。!?\n]+$/g) || [ttsText];
ttsSentences = ttsSentences.filter(s => s.trim().length > 0);
updateTTSProgress();
}
// 更新进度显示
function updateTTSProgress() {
const total = ttsSentences.length;
const current = ttsCurrentIndex;
document.getElementById('ttsTime').textContent = `${current} / ${total}`;
const percent = total > 0 ? (current / total * 100) : 0;
document.getElementById('ttsProgressFill').style.width = `${percent}%`;
}
// 播放当前句子
function playCurrentSentence() {
if (ttsCurrentIndex >= ttsSentences.length) {
stopTTS();
return;
}
const text = ttsSentences[ttsCurrentIndex].trim();
ttsUtterance = new SpeechSynthesisUtterance(text);
ttsUtterance.lang = 'zh-CN';
ttsUtterance.rate = ttsSpeed;
// 尝试选择中文语音
const voices = ttsSynth.getVoices();
const zhVoice = voices.find(v => v.lang.includes('zh') || v.lang.includes('CN'));
if (zhVoice) {
ttsUtterance.voice = zhVoice;
}
ttsUtterance.onend = () => {
if (ttsIsPlaying && !ttsIsPaused) {
ttsCurrentIndex++;
updateTTSProgress();
playCurrentSentence();
}
};
ttsUtterance.onerror = (e) => {
console.error('TTS error:', e);
if (ttsIsPlaying) {
ttsCurrentIndex++;
updateTTSProgress();
playCurrentSentence();
}
};
ttsSynth.speak(ttsUtterance);
}
// 播放
function playTTS() {
if (ttsSentences.length === 0) {
initTTS();
}
if (ttsIsPaused) {
ttsSynth.resume();
ttsIsPaused = false;
} else {
ttsIsPlaying = true;
playCurrentSentence();
}
document.getElementById('ttsPlay').classList.add('active');
document.getElementById('ttsPause').classList.remove('active');
ttsToggleBtn.classList.add('active');
}
// 暂停
function pauseTTS() {
if (ttsIsPlaying) {
ttsSynth.pause();
ttsIsPaused = true;
document.getElementById('ttsPlay').classList.remove('active');
document.getElementById('ttsPause').classList.add('active');
ttsToggleBtn.classList.remove('active');
}
}
// 停止
function stopTTS() {
ttsSynth.cancel();
ttsIsPlaying = false;
ttsIsPaused = false;
ttsCurrentIndex = 0;
updateTTSProgress();
document.getElementById('ttsPlay').classList.remove('active');
document.getElementById('ttsPause').classList.remove('active');
ttsToggleBtn.classList.remove('active');
}
// 设置速度
function setTTSSpeed(speed) {
ttsSpeed = parseFloat(speed);
// 如果正在播放,需要重新开始当前句子
if (ttsIsPlaying && !ttsIsPaused) {
ttsSynth.cancel();
playCurrentSentence();
}
}
// 绑定事件
document.getElementById('ttsPlay').addEventListener('click', playTTS);
document.getElementById('ttsPause').addEventListener('click', pauseTTS);
document.getElementById('ttsStop').addEventListener('click', stopTTS);
document.getElementById('ttsSpeed').addEventListener('change', (e) => setTTSSpeed(e.target.value));
// 加载语音列表(某些浏览器需要异步加载)
if (speechSynthesis.onvoiceschanged !== undefined) {
speechSynthesis.onvoiceschanged = initTTS;
}
// 页面离开时停止播放
window.addEventListener('beforeunload', stopTTS);
</script>
</body>
</html>