重构架构: 提取章节为JSON, 使用通用阅读器

This commit is contained in:
openclaw 2026-03-25 09:46:40 +08:00
parent 32b72247ec
commit 4c57d2e806
38 changed files with 650 additions and 131 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,5 @@
{
"id": 4,
"title": "幽暗密林深处",
"content": "<p>三天后,林克的伤基本痊愈。</p>\n<p>这三天里,他一直在阿甘左的指导下进行基础训练。挥剑、闪避、步法,一遍又一遍,直到每个动作都成为本能。</p>\n<p>\"你的基础很扎实。\"阿甘左说,\"但基础只是地基,真正决定胜负的是临场应变。\"</p>\n<p>\"所以?\"</p>\n<p>\"所以今天你要去幽暗密林深处。\"阿甘左看着他,\"那里有你需要面对的东西。\"</p>\n<p>林克愣了一下,想起三天前听到的神秘咆哮。</p>\n<p>\"那是……什么?\"</p>\n<p>\"你会知道的。\"阿甘左没有正面回答,\"准备好了就出发。\"</p>\n<p>---</p>\n<p>林克再次进入幽暗密林深处,遭遇猫妖王。那是一只体型比普通猫妖大三倍以上的怪物,浑身覆盖着暗紫色的皮毛,脖颈处有着和林克一样的卡赞诅咒印记。</p>\n<p>战斗异常惨烈。猫妖王的速度和力量都远超林克的想象,他很快就陷入了绝境。</p>\n<p>就在生死关头,林克体内的卡赞诅咒再次觉醒。这一次,他没有抗拒,而是任由那股狂暴的力量在体内奔涌。</p>\n<p>他的眼睛变成了血红色,世界在他眼中变得缓慢而清晰。太刀带着血色的刀芒,精准地刺入猫妖王脖颈处的诅咒印记核心。</p>\n<p>\"噗嗤——!\"</p>\n<p>猫妖王发出凄厉的惨叫,庞大的身躯轰然倒地。</p>\n<p>当红色的光芒从林克眼中褪去,他跪在地上,大口喘着粗气。刚才那一击,几乎耗尽了他全部的体力。</p>\n<p>\"你觉醒了。\"阿甘左的声音从身后传来。</p>\n<p>林克艰难地转过头,看到阿甘左不知什么时候出现在了空地边缘。</p>\n<p>\"那是卡赞诅咒的力量?\"</p>\n<p>\"一部分。\"阿甘左蹲下来,和他平视,\"卡赞诅咒是一把双刃剑。它能给你力量,也能吞噬你的心智。你刚才的状态很危险,如果你再不收手,可能会失控。\"</p>\n<p>林克沉默。</p>\n<p>\"猫妖王脖颈上的印记……和你的一样。\"阿甘左说,\"它是被卡赞诅咒侵蚀的生物,已经失去了理智。你如果继续依赖诅咒的力量,迟早也会变成那样。\"</p>\n<p>\"那怎么办?\"林克问,\"我怎么才能控制它?\"</p>\n<p>阿甘左沉默片刻,然后说:\"这是一个漫长的过程。你需要学会驾驭诅咒,而不是被诅咒驾驭。这需要时间,也需要机缘。\"</p>\n<p>\"机缘?\"</p>\n<p>\"有些事,现在还不能告诉你。\"阿甘左站起身,\"等你变强了,自然会知道。\"</p>\n<p>---</p>\n<p>回到艾尔文防线时,赛丽亚看到林克满身是血的样子,眼眶一下子红了。</p>\n<p>\"你怎么……怎么每次都这样……\"</p>\n<p>\"我没事。\"林克勉强笑了笑,\"这次赢得很漂亮。\"</p>\n<p>处理完伤口后,林克躺在床上,脑海中不断回放着今天发生的事。</p>\n<p>猫妖王脖颈上的印记、阿甘左说的话、诅咒的力量……</p>\n<p>\"卡赞诅咒到底是什么……\"</p>\n<p>他抬起手,看着皮肤下隐约浮现的红色纹路。</p>\n<p>那天晚上,他做了一个梦。梦中,他看到一片燃烧的战场,一个高大的身影站在战场中央,手中握着一把燃烧着黑色火焰的巨剑。</p>\n<p>那个身影转过头,看向梦中的林克。</p>\n<p>\"你会来的。\"</p>\n<p>\"你会来找我,林克。\"</p>\n<p>---</p>\n<p>(第四章完)</p>"
}

View File

@ -0,0 +1,5 @@
{
"id": 5,
"title": "雷鸣废墟",
"content": "<p>一个月后。林克站在艾尔文防线的边缘,看着远处被雷电笼罩的区域。</p>\n<p>\"那里就是雷鸣废墟。\"阿甘左站在他身后,\"闪电哥布林的领地。\"</p>\n<p>\"我能感觉到。\"林克眯起眼睛,\"空气中有电流的气息。\"</p>\n<p>这一个月里,他每天都在进行高强度的训练。挥剑、闪避、体能,然后再挥剑、再闪避、再体能。循环往复,永无止境。</p>\n<p>但他从不抱怨。</p>\n<p>因为每一次训练,他都能感觉到自己在变强。体内的诅咒力量也不再像之前那样狂暴,而是逐渐变得温顺,像是一头被驯服的野兽。</p>\n<p>当然,这只是假象。</p>\n<p>---</p>\n<p>雷鸣废墟比他想象中还要诡异。</p>\n<p>天空永远笼罩着乌云,闪电在云层中不断闪烁。空气中弥漫着一股臭氧的味道,刺激着他的鼻腔。地面是焦黑色的,仿佛被雷电常年轰炸过,到处都是深浅不一的坑洞。</p>\n<p>\"噼啪——\"</p>\n<p>一道闪电从天而降,落在林克前方不到十米的地方。</p>\n<p>\"这就是闪电哥布林的领地……\"</p>\n<p>林克警惕地看着四周,缓慢前行。</p>\n<p>这里的能见度很低,闪电的光芒每隔几秒就会照亮整个废墟。在那短暂的光亮中,林克能看到废墟中游荡的身影。</p>\n<p>哥布林。到处都是哥布林。</p>\n<p>它们和外面的普通哥布林不同,身体呈灰蓝色,皮肤像是被雷电劈焦了一样。手中的木棒顶端镶嵌着蓝色的水晶球,不断闪烁着电光。</p>\n<p>\"闪电哥布林……\"</p>\n<p>林克数了一下,至少有二十只。</p>\n<p>这还是他能看到的。在这片废墟里,不知道还有多少隐藏在暗处。</p>\n<p>---</p>\n<p>战斗瞬间打响。</p>\n<p>\"嘎——!\"</p>\n<p>一只闪电哥布林发现了林克,发出了刺耳的尖叫。</p>\n<p>几乎是同时,二十多只闪电哥布林同时转向他,眼中闪烁着嗜血的光芒。</p>\n<p>\"噼里啪啦——!\"</p>\n<p>蓝色的电光从它们手中的水晶球中迸发而出,汇聚成一道道闪电链,像是群蛇乱舞般向林克劈来。</p>\n<p>\"太快了!\"</p>\n<p>林克咬牙,身体一侧,险之又险地躲过第一道闪电。但第二道、第三道闪电紧随其后,让他避无可避。</p>\n<p>\"轰——!\"</p>\n<p>闪电击中了他的肩膀。</p>\n<p>剧烈的疼痛从肩膀蔓延开来,林克感觉整条手臂都失去了知觉。他的身体被电流击中,不由自主地颤抖起来。</p>\n<p>---</p>\n<p>就在林克陷入绝境时,一只体型格外庞大的闪电哥布林出现了。</p>\n<p>那是一只哥布林王。</p>\n<p>身高超过三米,浑身的皮肤呈深蓝色,像是蕴含着无穷的雷电能量。它的眼睛是银白色的,瞳孔中不断有电光闪烁。最引人注目的是它头顶的角——两根螺旋形的蓝色水晶角,不断向外散发着噼里啪啦的电火花。</p>\n<p>\"闪电哥布林王……\"</p>\n<p>林克握紧太刀,体内诅咒力量开始运转。</p>\n<p>这是他面对过的最强敌人。</p>\n<p>---</p>\n<p>在闪电哥布林王的压迫下,林克体内的卡赞血脉突然发生了变化。</p>\n<p>原本狂暴的红色血气开始凝聚,在他身后形成一个模糊的人形虚影。</p>\n<p>那是一个战士的轮廓,手持巨剑,身披战甲,散发着毁天灭地的气息。</p>\n<p>卡赞的虚影。</p>\n<p>那个虚影举起手中的巨剑,对着笼罩而来的雷电海洋,狠狠地劈下。</p>\n<p>\"轰——!!!\"</p>\n<p>血色的剑芒撕裂了雷电,撕裂了天空,也撕裂了闪电哥布林王的身体。</p>\n<p>战斗结束。</p>\n<p>---</p>\n<p>红色的血气从林克身上缓缓散去,那个模糊的人形虚影也逐渐消失。</p>\n<p>林克跪在地上,大口大口地喘着粗气。</p>\n<p>\"刚才那个虚影……是什么?\"</p>\n<p>\"卡赞的虚影。\"阿甘左不知何时出现在他身边,\"那是卡赞血脉觉醒的征兆。\"</p>\n<p>\"卡赞血脉?\"</p>\n<p>\"你是卡赞血脉的继承者。\"阿甘左说,\"而且,是最纯净的血脉之一。\"</p>\n<p>\"最纯净?\"</p>\n<p>\"普通的鬼剑士,体内只有一丝卡赞的血脉。但你不同。你体内的卡赞血脉,纯净到可以召唤出卡赞的虚影。\"</p>\n<p>\"那刚才那个影子……\"</p>\n<p>\"是卡赞残留在世间的意志。\"阿甘左说,\"当你体内的血脉觉醒到一定程度时,就可以借用那股意志的力量。\"</p>\n<p>林克沉默了。</p>\n<p>原来如此。</p>\n<p>原来他体内流淌的,是卡赞的血脉。</p>\n<p>---</p>\n<p>(第五章完)</p>"
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,5 @@
{
"id": 8,
"title": "冰霜幽暗密林",
"content": "<p>从烈焰格拉卡回来后,林克的身体逐渐恢复。</p>\n<p>但有一个问题始终萦绕在他心头——赛丽亚到底是什么人?</p>\n<p>\"精灵的钥匙\"……彼诺修说的这句话是什么意思?</p>\n<p>---</p>\n<p>这天傍晚,阿甘左找到了林克。</p>\n<p>\"冰霜幽暗密林的地图。\"阿甘左说,\"那里住着一位冰之魔法师——冰女克拉赫。\"</p>\n<p>\"她和彼诺修曾经是同门。\"阿甘左说,\"如果彼诺修想要隐瞒什么,克拉赫一定会反其道而行之。\"</p>\n<p>---</p>\n<p>第二天一早,两人出发前往冰霜幽暗密林。</p>\n<p>与烈焰格拉卡的灼热截然不同,这里是一片银装素裹的世界。参天大树被厚厚的冰雪覆盖,地面上结着厚厚的冰层。</p>\n<p>\"好冷……\"赛丽亚缩了缩脖子。</p>\n<p>\"喝下药。\"林克递给她一瓶抗寒药剂。</p>\n<p>---</p>\n<p>当他们来到冰霜幽暗密林的核心区域时,眼前的景象让两人都惊呆了。</p>\n<p>那是一座完全由冰晶构成的宫殿,宫殿的墙壁透明如镜,在阳光的照射下折射出七彩的光芒。</p>\n<p>\"那就是……冰女克拉赫的居所?\"赛丽亚惊叹道。</p>\n<p>---</p>\n<p>他们走进宫殿,只见大厅中央坐着一个身穿蓝色长裙的女子。她有着一头银白色的长发,皮肤白皙得近乎透明。</p>\n<p>\"你们来了。\"克拉赫睁开眼睛,那是一双如同蓝宝石般清澈的眼眸。</p>\n<p>\"彼诺修说得没错……你确实来了。\"</p>\n<p>---</p>\n<p>克拉赫开始讲述精灵族的历史。</p>\n<p>\"在很久很久以前,阿拉德大陆上存在着一个强大的种族——精灵族。\"</p>\n<p>\"他们拥有强大的魔法力量,能够与大自然沟通。\"</p>\n<p>\"但在那场灾难中,精灵族几乎灭绝了……\"</p>\n<p>她转过身,看着赛丽亚:\"而你,就是精灵族最后的血脉。\"</p>\n<p>赛丽亚的身体摇晃了一下。</p>\n<p>\"我……我是精灵?\"</p>\n<p>\"准确地说,你是'精灵之心'的容器。\"克拉赫说,\"精灵族在灭亡前,将全族的力量凝聚成一颗宝石——'精灵之心'。而你,就是那颗宝石的化身。\"</p>\n<p>\"所以……所以才叫'钥匙'\"</p>\n<p>\"因为'精灵之心'是开启'世界树'的钥匙。而世界树,连接着阿拉德大陆与神界的通道。\"</p>\n<p>---</p>\n<p>就在这时,宫殿外突然传来一阵剧烈的震动!</p>\n<p>\"轰——!!!\"</p>\n<p>冰湖的湖面突然裂开,一个巨大的身影从湖底冲了出来!</p>\n<p>那是一只由冰块构成的巨龙,身长超过十米,浑身散发着刺骨的寒气。</p>\n<p>\"冰霜巨龙!\"克拉赫脸色大变。</p>\n<p>\"吼——!!!\"</p>\n<p>冰霜巨龙发出震耳欲聋的咆哮,张开大口,一道冰冷的龙息向宫殿喷来!</p>\n<p>\"我来对付它!\"林克冲了出去。</p>\n<p>---</p>\n<p>林克掏出最后两张火焰符文卷轴,同时展开!</p>\n<p>\"轰——!!!\"</p>\n<p>炽热的火焰从卷轴中喷涌而出,形成两条火龙,向冰霜巨龙扑去!</p>\n<p>但冰霜巨龙并没有倒下,而是更加愤怒地向林克扑来!</p>\n<p>就在这千钧一发之际——</p>\n<p>\"精灵之箭!\"</p>\n<p>一道绿色的光芒从赛丽亚手中射出,正中冰霜巨龙的眉心!</p>\n<p>\"吼——!!!\"</p>\n<p>冰霜巨龙发出最后一声哀鸣,庞大的身躯轰然倒地,化为一堆碎冰。</p>\n<p>---</p>\n<p>\"看来,传承成功了。\"克拉赫走到两人面前,脸上露出欣慰的笑容。</p>\n<p>\"从今以后,你不再是那个只能使用基础治愈术的小女孩了。你是精灵族最后的继承者,是'精灵之心'的守护者。\"</p>\n<p>赛丽亚沉默了片刻,然后抬起头,眼中闪过坚定的光芒。</p>\n<p>\"我明白了。\"</p>\n<p>她看向林克,轻轻握住他的手:\"不管我是谁……我都会和你一起走下去。\"</p>\n<p>---</p>\n<p>离开冰霜幽暗密林时,克拉赫送给了他们两样东西。</p>\n<p>第一样是一枚蓝色的水晶吊坠,可以增强赛丽亚的魔力。</p>\n<p>第二样是一张古老的地图,上面标注着\"暗黑雷鸣废墟\"的位置。</p>\n<p>\"那里是通往死亡之地的大门。\"克拉赫说,\"也是你们接下来要去的地方。\"</p>\n<p>\"去赫顿玛尔找GSD。\"克拉赫说,\"他是鬼剑士的导师,会指引你走向正确的道路。\"</p>\n<p>---</p>\n<p>(第八章完)</p>"
}

View File

@ -0,0 +1,5 @@
{
"id": 9,
"title": "转职之路",
"content": "<p>冰霜幽暗密林的事件结束后,林克和赛丽亚回到了艾尔文防线休整。</p>\n<p>\"转职……\"林克看着自己的鬼手,若有所思。</p>\n<p>一路上,他见识了狂战士的狂暴、鬼泣的神秘、阿修罗的威严。但那些力量,似乎都与他想要守护的初心有所不同。</p>\n<p>\"赛丽亚,你觉得我该选择哪条路?\"林克问道。</p>\n<p>赛丽亚轻轻握住他的手:\"林克,你还记得我们第一次相遇时说的话吗?你说你想用剑守护重要的人。无论选择什么,不要违背你的本心就好。\"</p>\n<p>林克点点头。</p>\n<p>---</p>\n<p>赫顿玛尔,贝尔玛尔公国的首都。</p>\n<p>相比艾尔文防线的简朴,这里繁华得多。街道两旁是林立的商铺,冒险者们来来往往。</p>\n<p>林克按照守护者的指引在城西的一条小巷中找到了GSD的居所。</p>\n<p>那是一间不起眼的屋子,门口挂着一块木牌,上面写着\"剑道馆\"三个字。</p>\n<p>---</p>\n<p>\"来了?\"苍老的声音从屋内传来。</p>\n<p>林克走进内室看到了那位传说中的剑术大师——GSD。他蒙着双眼手中拄着一根拐杖但浑身上下散发着令人心悸的气息。</p>\n<p>\"GSD大师我是来寻求转职指引的。\"</p>\n<p>\"我知道。\"GSD微微一笑\"林克,鬼手持有者,阿甘左的弟子。你的事迹,我已经听说了。\"</p>\n<p>---</p>\n<p>\"鬼剑士有四条转职之路,你可知道?\"</p>\n<p>GSD开始详细讲解</p>\n<p>\"第一条路,狂战士。他们彻底解放鬼手的力量,以鲜血为代价换取狂暴的战斗力。但这条路也最为凶险——狂战士需要不断战斗,压抑不住内心的狂暴时,甚至会攻击同伴。\"</p>\n<p>\"第二条路,鬼泣。他们与鬼神签订契约,借用鬼神之力战斗。但借来的力量总有代价,稍有不慎就会被反噬。\"</p>\n<p>\"第三条路,阿修罗。他们放弃了双眼,以心眼感知世界。但放弃视觉,意味着你永远活在黑暗之中,再也看不见……重要之人的笑容。\"</p>\n<p>\"第四条路,剑魂。剑魂追求极致的剑术,以剑为魂,剑在人在。他们精通各种武器,尤其擅长光剑。剑魂相信,真正强大的不是诅咒,不是鬼神,而是自己手中的剑。\"</p>\n<p>---</p>\n<p>说完四条道路GSD静静地等待着。</p>\n<p>\"你心中可有倾向?\"</p>\n<p>林克沉思良久。</p>\n<p>狂战士的狂暴,不是他想要的。</p>\n<p>鬼泣的鬼神之力,虽然强大,但借来的力量总有隐患。</p>\n<p>阿修罗的波动之力,他倒是颇为向往。但放弃双眼……他想起赛丽亚温柔的笑容,摇了摇头。</p>\n<p>\"我想成为剑魂。\"林克抬起头,目光坚定。</p>\n<p>\"哦?\"GSD似乎并不意外\"为何?\"</p>\n<p>\"因为我想靠自己的力量守护重要的人。\"林克说,\"师父教导我,剑是守护之器。我想像他一样,用剑守护世界,而不是依靠诅咒或鬼神。\"</p>\n<p>GSD沉默了片刻然后笑了。</p>\n<p>\"很好。\"他点点头,\"剑魂之道,需要的正是这份觉悟。\"</p>\n<p>---</p>\n<p>\"但是——\"GSD话锋一转\"选择了道路,还需要通过试炼,才能真正转职。\"</p>\n<p>\"试炼?\"</p>\n<p>\"暗黑雷鸣废墟。\"GSD说道\"那里是格兰之森最阴森的角落,死亡的气息终年不散。你体内的鬼手之力会在那里受到压制,只有凭借纯粹的剑术和意志,才能战胜那里的僵尸王。\"</p>\n<p>\"如果你能通过试炼,证明你确实具备剑魂的资质,我便正式为你主持转职仪式。\"</p>\n<p>林克握紧霜刃:\"我明白了。\"</p>\n<p>---</p>\n<p>离开剑道馆林克将GSD的话告诉了赛丽亚。</p>\n<p>\"剑魂吗……\"赛丽亚微微一笑,\"很适合你呢,林克。\"</p>\n<p>\"谢谢你一直陪在我身边。\"林克看着她的眼睛,\"等这次试炼结束,我们就去天空之城。\"</p>\n<p>\"嗯!\"赛丽亚点点头,眼中闪烁着期待的光芒。</p>\n<p>---</p>\n<p>(第九章完)</p>"
}

View File

@ -0,0 +1,5 @@
{
"id": 10,
"title": "暗黑雷鸣废墟",
"content": "<p>暗黑雷鸣废墟,位于格兰之森最阴森的角落。</p>\n<p>这里曾是古代战场,无数战士在此殒命。死亡的气息终年不散,久而久之,死者化作僵尸,在废墟中游荡。</p>\n<p>\"这里就是……暗黑雷鸣废墟?\"赛丽亚紧紧抓住林克的衣角,声音有些发颤。</p>\n<p>林克点点头,目光凝重地看着前方。</p>\n<p>与之前的地图不同,这里没有阳光,天空永远笼罩着一层灰蒙蒙的雾气。</p>\n<p>---</p>\n<p>\"林克……\"赛丽亚突然停下脚步,\"你有没有感觉到?\"</p>\n<p>\"什么?\"</p>\n<p>\"你的鬼手……它好像……被压制了?\"</p>\n<p>林克低头看去,果然发现左手臂上的绷带不再发烫。平日里那股躁动的诅咒之力,此刻竟然安静得像是沉睡了一样。</p>\n<p>\"是这里的死亡气息……\"林克若有所思,\"GSD说过这里的死亡气息会压制鬼手的力量。\"</p>\n<p>这就是试炼的含义——在没有鬼神之力的情况下,仅凭剑术战胜敌人。</p>\n<p>---</p>\n<p>当他们来到废墟的核心区域时,眼前的景象让他们倒吸一口凉气。</p>\n<p>那是一座巨大的祭坛,祭坛上刻满了古老的符文,中央摆放着一个巨大的石棺。</p>\n<p>而在祭坛的最高处,站着一个身穿黑色铠甲的身影。</p>\n<p>那是一个身高超过两米的怪物,全身被黑色的铠甲覆盖,头盔下露出一张腐烂的面孔。它的眼睛是血红色的,手中握着一把巨大的双手剑。</p>\n<p>\"僵尸王……\"林克低声说。</p>\n<p>\"新鲜的……血肉……\"僵尸王缓缓转过头,血红色的眼睛看向两人。</p>\n<p>---</p>\n<p>战斗瞬间爆发。</p>\n<p>僵尸王的速度远比普通僵尸快得多。它挥舞着双手剑,带起一阵黑色的旋风,向林克斩来!</p>\n<p>\"好快!\"</p>\n<p>林克举刀格挡,但巨大的力量震得他手臂发麻。僵尸王的力量,甚至比牛头王萨乌塔还要恐怖!</p>\n<p>林克不断闪避,但僵尸的数量太多,他很快就被包围了。</p>\n<p>\"这样下去不行……\"林克咬紧牙关。</p>\n<p>他下意识地想要调动鬼手的力量,但体内空空如也。</p>\n<p>\"没有鬼神之力……我难道就赢不了吗?\"</p>\n<p>---</p>\n<p>就在这时林克想起了GSD说过的话。</p>\n<p>\"剑魂追求的,是极致的剑术。不是鬼神之力,不是诅咒,而是剑本身。\"</p>\n<p>\"你要相信手中的剑,相信你自己的剑术。\"</p>\n<p>林克闭上眼睛,深吸一口气。</p>\n<p>他举起霜刃,剑身上亮起耀眼的白光。</p>\n<p>\"斩——!\"</p>\n<p>林克挥剑斩出,一道白色的剑气撕裂了空间,直奔僵尸王!</p>\n<p>\"不——!!!\"</p>\n<p>僵尸王举起双手剑格挡,但剑气直接穿透了它的防御,将它斩成两半!</p>\n<p>---</p>\n<p>战斗结束了。</p>\n<p>就在这时,祭坛上的石棺突然发出一阵光芒。</p>\n<p>石棺缓缓打开,里面放着一把散发着柔和光芒的长剑。</p>\n<p>那是一把光剑。</p>\n<p>剑身由纯粹的光能量构成,没有实体,但却散发着令人心悸的锋芒。</p>\n<p>\"试炼的奖励。\"GSD的声音突然响起。</p>\n<p>\"GSD\"</p>\n<p>\"既然你通过了试炼,它就归你了。\"</p>\n<p>林克站起身,走到石棺前,郑重地拿起了那把光剑。</p>\n<p>当他的手握住剑柄时,光剑发出一阵欢快的嗡鸣,仿佛在迎接新的主人。</p>\n<p>\"从今以后,你就叫'晨曦'吧。\"林克轻声说。</p>\n<p>---</p>\n<p>(第十章完)</p>"
}

View File

@ -0,0 +1,5 @@
{
"id": 11,
"title": "剑魂转职仪式",
"content": "<p>暗黑雷鸣废墟的试炼结束后林克和赛丽亚跟随GSD回到了赫顿玛尔。</p>\n<p>剑道馆内GSD站在大厅中央表情庄严。林克单膝跪在他面前手中捧着那把刚刚获得的光剑\"晨曦\"。</p>\n<p>\"林克,你已通过暗黑雷鸣废墟的试炼,证明了你的意志和剑术。\"GSD的声音低沉而有力\"今日,我正式授予你剑魂之名。\"</p>\n<p>他伸出手,轻轻点在林克的额头。</p>\n<p>\"剑魂,以剑为魂,追求极致剑术之道。\"</p>\n<p>---</p>\n<p>GSD转身从身后的架子上取下五把不同的武器一一摆在林克面前。</p>\n<p>\"太刀、巨剑、短剑、钝器、光剑——在剑魂手中,万物皆可为剑。\"</p>\n<p>---</p>\n<p>GSD开始详细讲解每种武器的特性</p>\n<p>\"太刀,灵活迅捷,适合单挑和快速连击。\"</p>\n<p>\"巨剑,力量型武器,破甲能力极强。对付硬甲敌人时,巨剑是最佳选择。\"</p>\n<p>\"短剑,带有魔法属性攻击。对付魔法防御低的敌人,短剑能发挥出意想不到的效果。\"</p>\n<p>\"钝器,能够产生震荡伤害,有概率眩晕目标。\"</p>\n<p>\"光剑,剑魂专属武器,极速连击,附加光属性伤害。它是剑魂的象征,也是你最强大的伙伴。\"</p>\n<p>林克认真记下每一种武器的特性。</p>\n<p>\"真正的剑魂,不会在战斗中局限于一把武器。\"GSD强调\"根据敌人的特点,灵活切换最适合的武器,这才是剑魂的精髓。\"</p>\n<p>\"你的鬼手给了你强大的力量,但剑魂之道,不在于力量的大小,而在于剑术的境界。\"</p>\n<p>\"你要学会驾驭剑,而不是被剑驾驭。\"</p>\n<p>---</p>\n<p>仪式进行到高潮GSD将手放在林克的光剑\"晨曦\"上。</p>\n<p>\"这把剑,从此刻起,正式成为你的伙伴。\"</p>\n<p>\"但记住,晨曦的力量远不止于此。\"GSD说\"它与天空之城的光之核心有着神秘的联系。如果你想发挥它的真正力量,就必须去天空之城,找到答案。\"</p>\n<p>林克握紧晨曦,感受着剑身上传来的温暖力量。</p>\n<p>\"弟子明白。\"</p>\n<p>\"好。\"GSD收回手\"从今天起,你就是正式的剑魂了。\"</p>\n<p>---</p>\n<p>仪式结束后GSD将一套装备交给了林克。</p>\n<p>\"这是剑魂的标准装备——五把武器,涵盖所有类型。\"</p>\n<p>林克接过装备,发现除了原本的霜刃和晨曦,还有三把新武器:</p>\n<p>• <strong>巨剑\"破军\"</strong>:沉重但威力巨大,剑身上刻满了战斗的痕迹</p>\n<p>• <strong>短剑\"影牙\"</strong>:漆黑如墨,剑刃上缠绕着暗影之力</p>\n<p>• <strong>钝器\"碎骨\"</strong>:巨大的铁锤,一锤下去连钢铁都能砸碎</p>\n<p>\"这五把武器,将是你在天空之城的依仗。\"GSD说\"好好使用它们。\"</p>\n<p>\"谢谢师父!\"</p>\n<p>---</p>\n<p>转职仪式结束后的两天,林克在剑道馆内刻苦修炼。</p>\n<p>GSD亲自指导他如何在战斗中快速切换武器如何根据敌人的特点选择最优解。</p>\n<p>\"差不多了。\"GSD点点头\"接下来,你该去天空之城了。\"</p>\n<p>\"但在那之前,先去一趟西海岸。\"</p>\n<p>\"西海岸?\"</p>\n<p>\"那里有位魔道学者,名叫莎兰。\"GSD说\"她对天空之城了解很深,会告诉你一些我不知道的事情。\"</p>\n<p>\"而且……\"GSD顿了顿\"她可能会告诉你关于晨曦的秘密。\"</p>\n<p>---</p>\n<p>(第十一章完)</p>"
}

View File

@ -0,0 +1,5 @@
{
"id": 12,
"title": "西海岸",
"content": "<p>转职仪式结束,林克和赛丽亚在赫顿玛尔休整了两天后,准备前往天空之城。</p>\n<p>按照GSD的指引他们先来到了西海岸。</p>\n<p>西海岸位于赫顿玛尔的西边,是一座港口城市。与赫顿玛尔的繁华不同,这里充满了海洋的气息。空气中弥漫着咸咸的海风,街道上到处都是渔民和商人。</p>\n<p>\"这里就是西海岸……\"赛丽亚好奇地看着四周。</p>\n<p>\"据说这里的海鲜很有名。\"林克笑着说,\"等从天空之城回来,我请你吃。\"</p>\n<p>---</p>\n<p>莎兰住在城西的一座高塔里。</p>\n<p>那是一座魔法塔,外墙由蓝色的水晶构成,在阳光下闪烁着柔和的光芒。</p>\n<p>林克走到塔门前,轻轻敲了敲门。</p>\n<p>\"进来吧,我已经等你们很久了。\"</p>\n<p>门内传来一个优雅的女声。林克推开门,和赛丽亚一起走了进去。</p>\n<p>---</p>\n<p>塔内的装饰充满了魔法的气息。</p>\n<p>一个身穿紫色长袍的女子站在窗边。她有着一头银白色的长发,眼睛是深紫色的,像是蕴含着无尽的星空。</p>\n<p>\"你就是林克GSD的新弟子\"女子转过身来。</p>\n<p>\"是的,莎兰小姐。\"林克恭敬地行礼。</p>\n<p>\"我知道你想去天空之城。\"莎兰微微一笑,\"坐吧,我们慢慢聊。\"</p>\n<p>---</p>\n<p>莎兰开始讲述天空之城的事情。</p>\n<p>\"天空之城,是数千年前天界与阿拉德大陆连接的通道。后来发生了'龙之战争',天界的暴君巴卡尔被封印,天空之城也因此封闭。\"</p>\n<p>\"那里的怪物比格兰之森强大得多——龙人、石巨人、人偶……各种各样的危险。\"</p>\n<p>林克认真地听着。</p>\n<p>\"对了,莎兰小姐。\"林克想起什么,\"GSD师父说您可能会告诉我一些关于光剑的事情\"</p>\n<p>莎兰看向林克手中的晨曦。</p>\n<p>\"这把剑……能让我看看吗?\"</p>\n<p>林克拔出晨曦,递给莎兰。</p>\n<p>莎兰仔细端详着。</p>\n<p>\"果然……\"莎兰轻声说,\"这把剑,和天空之城有关。\"</p>\n<p>\"什么意思?\"</p>\n<p>\"光剑的能量来源,是天空之城的'光之核心'。\"莎兰说,\"数千年前,一位剑魂从天空之城带出了一块光之核心的碎片,铸造了这把剑。\"</p>\n<p>\"如果你想发挥这把剑的真正力量,就必须去天空之城,找到光之核心。\"</p>\n<p>---</p>\n<p>离开莎兰的魔法塔后,林克陷入了沉思。</p>\n<p>原来晨曦还有这样的来历……</p>\n<p>\"林克?\"赛丽亚担心地看着他。</p>\n<p>\"我在想……我的剑道。\"林克看着手中的晨曦,\"GSD师父教我剑魂要精通所有武器。但晨曦对我来说似乎有着特殊的意义。\"</p>\n<p>\"走吧,去天空之城。\"林克抬起头,眼中闪烁着坚定的光芒,\"我要找到答案。\"</p>\n<p>---</p>\n<p>两人来到西海岸的传送阵前。</p>\n<p>那是一个巨大的魔法阵,散发着淡淡的蓝色光芒。传送阵的中央,有一道直通天际的光柱——那就是通往天空之城的通道。</p>\n<p>\"准备好了吗?\"林克问赛丽亚。</p>\n<p>\"准备好了!\"</p>\n<p>就在这时,一个熟悉的声音从身后传来。</p>\n<p>\"等等。\"</p>\n<p>林克转身惊讶地看到GSD正拄着拐杖走来。</p>\n<p>\"师父?您怎么来了?\"</p>\n<p>\"天空之城不是你们现在的实力能单独闯荡的。\"GSD说\"我陪你们走一趟。\"</p>\n<p>\"真的吗?\"赛丽亚惊喜地问。</p>\n<p>\"嗯。\"GSD点点头\"正好……我也很久没去过那里了。\"</p>\n<p>林克心中涌起一股暖流。有师父在,他就安心多了。</p>\n<p>\"走吧。\"GSD走到传送阵前\"跟紧我。\"</p>\n<p>三人一起踏入传送阵,光芒闪烁中,他们的身影消失在西海岸。</p>\n<p>新的冒险,即将开始。</p>\n<p>---</p>\n<p>(第十二章完)</p>"
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,5 @@
{
"id": 32,
"title": "克伦特的委托",
"content": "<p>从蜘蛛洞穴返回阿法利亚营地后,林克三人受到了克伦特的热情接待。</p>\n<p>\"干得漂亮!\"克伦特拍了拍林克的肩膀,\"艾克洛索一直是我们的心腹大患,你们解决了它,通往暗精灵墓地的道路就畅通了。\"</p>\n<p>赛丽亚将收集到的毒囊交给克伦特:\"这些是给炼金术师的素材。\"</p>\n<p>\"很好,我会转交给他们的。\"克伦特收起毒囊,脸色变得严肃起来,\"不过,还有更重要的事情需要你们帮忙。\"</p>\n<p>他走到营帐中央,展开一张古老的地图。</p>\n<p>\"这是暗精灵墓地的布局图。数百年前,我们的祖先将邪龙斯皮兹的头颅封印在那里。为了防止邪龙复活,封印需要定期加固,而加固封印需要四把钥匙。\"</p>\n<p>\"四把钥匙?\"林克皱眉。</p>\n<p>\"没错。这四把钥匙分别由四个骷髅将军看守,他们是邪龙斯皮兹的四肢守卫——左翼、右翼、前爪、尾刺。\"克伦特指着地图上的四个标记,\"但最近,这四个骷髅将军叛变了。\"</p>\n<p>\"叛变?\"奥菲利亚惊讶地问。</p>\n<p>\"是的。他们杀害了墓地的守卫,夺走了钥匙,似乎在策划什么阴谋。\"克伦特叹了口气,\"如果你们能进入暗精灵墓地,击败这四个骷髅将军,夺回钥匙,就能重新加固邪龙的封印。\"</p>\n<p>林克沉思了一会儿:\"这听起来很危险。\"</p>\n<p>\"确实危险。\"克伦特点头,\"所以我不会强求。但这是目前最紧急的任务,如果邪龙斯皮兹复活,整个阿法利亚都会陷入灾难。\"</p>\n<p>赛丽亚握住林克的手:\"林克,我们……\"</p>\n<p>\"我们去。\"林克坚定地说,\"既然已经走到这一步,就不能半途而废。\"</p>\n<p>奥菲利亚也点头:\"我也是。我要为GBL教的兄弟们报仇也要保护这片大陆。\"</p>\n<p>克伦特露出了欣慰的笑容:\"我就知道可以信任你们。\"</p>\n<p>他从怀中取出一张卷轴:\"这是进入暗精灵墓地所需的通行证。墓地内部结构复杂,而且充满了亡灵生物,你们一定要小心。\"</p>\n<p>林克接过卷轴:\"我们会注意的。\"</p>\n<p>\"还有,\"克伦特叫住准备离开的三人,\"暗精灵墓地中除了四个骷髅将军,还有其他危险。据说邪龙斯皮兹的邪恶气息会侵蚀人心,你们一定要保持清醒的意志。\"</p>\n<p>\"明白了。\"</p>\n<p>三人离开营帐,开始为明天的探险做准备。</p>\n<p>夜幕降临,阿法利亚营地的篝火在黑暗中跳动。</p>\n<p>林克坐在篝火旁,晨曦横放在膝上,剑身在火光中泛着柔和的光芒。赛丽亚和奥菲利亚一左一右坐在他身边,三人都沉默不语。</p>\n<p>\"紧张吗?\"林克打破了沉默。</p>\n<p>\"有一点。\"赛丽亚坦诚地说,\"暗精灵墓地……听起来就很可怕。\"</p>\n<p>\"我也是。\"奥菲利亚低声说,\"但只要有你在,我就不怕。\"</p>\n<p>林克笑了笑,将两个少女搂入怀中:\"放心,我会保护你们的。无论遇到什么,我们都一起面对。\"</p>\n<p>赛丽亚靠在林克肩上,轻声说:\"林克,答应我,一定要平安回来。\"</p>\n<p>\"我答应你们。\"林克郑重地说,\"我们三个,一个都不能少。\"</p>\n<p>月光洒在三人身上,篝火的光芒渐渐微弱。明天,他们将踏入暗精灵墓地,面对前所未有的挑战。</p>\n<p>但此刻,在这温暖的篝火旁,有彼此相伴,就足够了。</p>\n<p>(第三十二章完)</p>"
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,39 @@
{
"total": 34,
"chapters": [
{"id": 1, "title": "洛兰的风", "subtitle": "初入艾尔文防线", "desc": "林克初到艾尔文防线,在洛兰森林遭遇哥布林,被阿甘左救下。", "date": "2026-03-20"},
{"id": 2, "title": "洛兰深处", "subtitle": "哥布林头目", "desc": "林克在阿甘左指导下修炼剑术,深入洛兰深处击败哥布林头目。", "date": "2026-03-20"},
{"id": 3, "title": "幽暗密林", "subtitle": "猫妖的伏击", "desc": "林克进入格兰之森深处的幽暗密林,遭遇猫妖伏击,历经苦战突破重围。", "date": "2026-03-23"},
{"id": 4, "title": "幽暗密林深处", "subtitle": "猫妖王", "desc": "林克再次进入幽暗密林深处,遭遇猫妖王,揭开卡赞诅咒的部分真相。", "date": "2026-03-23"},
{"id": 5, "title": "雷鸣废墟", "subtitle": "闪电哥布林", "desc": "林克挑战雷鸣废墟,遭遇闪电哥布林,经历雷电危机。", "date": "2026-03-23"},
{"id": 6, "title": "格拉卡", "subtitle": "牛头王萨乌塔", "desc": "林克进入格拉卡,面对强大的牛头王萨乌塔,激战突破自身极限。", "date": "2026-03-23"},
{"id": 7, "title": "烈焰格拉卡", "subtitle": "火女彼诺修", "desc": "林克挑战火女彼诺修,她的血之诅咒让战斗更加凶险。", "date": "2026-03-23"},
{"id": 8, "title": "冰霜幽暗密林", "subtitle": "冰女克拉赫", "desc": "为寻找赛丽亚身世线索,林克前往冰霜幽暗密林挑战冰女克拉赫。", "date": "2026-03-23"},
{"id": 9, "title": "转职之路", "subtitle": "选择剑魂", "desc": "林克前往赫顿玛尔寻找GSD了解四大转职方向坚定选择剑魂之道。", "date": "2026-03-24"},
{"id": 10, "title": "暗黑雷鸣废墟", "subtitle": "转职试炼", "desc": "林克在暗黑雷鸣废墟完成转职试炼,在死亡气息中验证自己的剑道。", "date": "2026-03-24"},
{"id": 11, "title": "剑魂转职仪式", "subtitle": "武器大师", "desc": "GSD为林克举行正式转职仪式详细讲解剑魂武器大师特性。", "date": "2026-03-24"},
{"id": 12, "title": "西海岸", "subtitle": "天空之城入口", "desc": "林克前往西海岸了解天空之城背景GSD决定同行。", "date": "2026-03-24"},
{"id": 13, "title": "龙人之塔", "subtitle": "GSD带队", "desc": "GSD亲自带队刷龙人之塔展现'开挂瞎子'的恐怖实力。", "date": "2026-03-24"},
{"id": 14, "title": "人偶玄关", "subtitle": "觉醒技能", "desc": "GSD带队刷人偶玄关展现阿修罗觉醒技能'暗天波动眼'。", "date": "2026-03-24"},
{"id": 15, "title": "石巨人塔", "subtitle": "独立挑战", "desc": "林克和赛丽亚独立挑战石巨人塔,面对黄金巨人普拉塔尼。", "date": "2026-03-24"},
{"id": 16, "title": "黑暗玄廊", "subtitle": "光明与黑暗", "desc": "回赫顿玛尔交任务,探索黑暗玄廊,击败天之驱逐者。", "date": "2026-03-24"},
{"id": 17, "title": "城主宫殿", "subtitle": "光之城主", "desc": "面对光之城主赛格哈特,净化光之核心,揭晓晨曦的来历。", "date": "2026-03-24"},
{"id": 18, "title": "番外·悬空城", "subtitle": "光之骑士", "desc": "探索天空之城最深处,恢复晨曦的光芒,获得光之骑士称号。", "date": "2026-03-24"},
{"id": 19, "title": "天帷巨兽·神殿外围", "subtitle": "使徒的呼唤", "desc": "前往天帷巨兽调查GBL教异变遭遇第二使徒罗特斯的精神控制。", "date": "2026-03-24"},
{"id": 20, "title": "树精丛林", "subtitle": "禁忌实验", "desc": "探索GBL教的秘密实验室发现使徒融合实验击败树精王。", "date": "2026-03-24"},
{"id": 21, "title": "炼狱", "subtitle": "火焰试炼", "desc": "穿越夜叉栖息的炼狱,击败夜叉王,晨曦恢复七成。", "date": "2026-03-24"},
{"id": 22, "title": "西海岸的闲暇", "subtitle": "支线与成长", "desc": "返回西海岸休整,完成支线任务,与卡坤互动,学会拔刀斩。", "date": "2026-03-24"},
{"id": 23, "title": "极昼", "subtitle": "天空之巅", "desc": "赛丽亚因精神污染离队林克独自挑战极昼击败EX多尼尔。", "date": "2026-03-24"},
{"id": 24, "title": "第一脊椎", "subtitle": "圣光降临", "desc": "圣骑士艾伦加入队伍,联手击败巨型黑章鱼,晨曦恢复九成。", "date": "2026-03-24"},
{"id": 25, "title": "赫顿玛尔的准备", "subtitle": "天界科技", "desc": "凯丽制造抗精神干扰手环,为最终决战做准备。", "date": "2026-03-24"},
{"id": 26, "title": "第二脊椎", "subtitle": "使徒决战", "desc": "最终BOSS罗特斯晨曦完全觉醒天帷巨兽篇完结。", "date": "2026-03-24"},
{"id": 27, "title": "重逢的温柔", "subtitle": "赛丽亚线", "desc": "林克与赛丽亚久别重逢,两人感情突破,正式确立关系。", "date": "2026-03-24"},
{"id": 28, "title": "暗精灵的委托", "subtitle": "后宫建立", "desc": "莎兰暧昧互动,奥菲利亚表白加入后宫,前往暗黑城新任务。", "date": "2026-03-24"},
{"id": 29, "title": "阿法利亚营地", "subtitle": "暗黑城篇开启", "desc": "抵达阿法利亚营地,接受克伦特委托,后宫修罗场帐篷同眠。", "date": "2026-03-24"},
{"id": 30, "title": "浅栖之地", "subtitle": "寻找摩根", "desc": "探索浅栖之地,击败怨恨之摩根,发现夏普伦长老的阴谋。", "date": "2026-03-24"},
{"id": 31, "title": "蜘蛛洞穴", "subtitle": "猛龙断空斩", "desc": "首次实战使用猛龙断空斩击败BOSS艾克洛索突破Lv.50。", "date": "2026-03-24"},
{"id": 32, "title": "克伦特的委托", "subtitle": "四把钥匙", "desc": "返回营地汇报,接受克伦特委托,准备前往暗精灵墓地收集四把钥匙。", "date": "2026-03-24"},
{"id": 33, "title": "暗精灵墓地·左翼守卫", "subtitle": "奥菲利亚线", "desc": "击败火焰骷髅将军获得第一把钥匙,奥菲利亚献身,后宫正式确立。", "date": "2026-03-24"},
{"id": 34, "title": "暗精灵墓地·剩余三将军", "subtitle": "三战连捷", "desc": "连续击败冰冻、速度、剧毒三位骷髅将军,集齐四把钥匙。", "date": "2026-03-25"}
]
}

View File

@ -79,7 +79,7 @@
</div> </div>
</div> </div>
<div class="hero-actions"> <div class="hero-actions">
<a href="chapters/chapter-1.html" class="btn btn-primary"> <a href="reader.html?id=1" class="btn btn-primary">
<span>开始阅读</span> <span>开始阅读</span>
<svg class="btn-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"> <svg class="btn-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
<path d="M5 12h14M12 5l7 7-7 7"/> <path d="M5 12h14M12 5l7 7-7 7"/>

View File

@ -156,7 +156,7 @@ function renderLatestChapters() {
const latestChapters = chaptersData.slice(-6).reverse(); const latestChapters = chaptersData.slice(-6).reverse();
container.innerHTML = latestChapters.map(chapter => ` container.innerHTML = latestChapters.map(chapter => `
<a href="chapters/chapter-${chapter.id}.html" class="chapter-card"> <a href="reader.html?id=${chapter.id}" class="chapter-card">
<div class="chapter-number">${chapter.id}</div> <div class="chapter-number">${chapter.id}</div>
<div class="chapter-info"> <div class="chapter-info">
<h3 class="chapter-title">${chapter.title}</h3> <h3 class="chapter-title">${chapter.title}</h3>
@ -178,7 +178,7 @@ function renderChaptersList() {
container.innerHTML = chaptersData.map(chapter => ` container.innerHTML = chaptersData.map(chapter => `
<div class="timeline-item" data-chapter="${chapter.id}"> <div class="timeline-item" data-chapter="${chapter.id}">
<div class="timeline-marker"></div> <div class="timeline-marker"></div>
<a href="chapters/chapter-${chapter.id}.html" class="timeline-content"> <a href="reader.html?id=${chapter.id}" class="timeline-content">
<div class="timeline-header"> <div class="timeline-header">
<h3>${chapter.title}</h3> <h3>${chapter.title}</h3>
<span class="timeline-date">${chapter.date}</span> <span class="timeline-date">${chapter.date}</span>

View File

@ -3,144 +3,454 @@
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>正在阅读 - 阿拉德:剑之回响</title> <title>阿拉德:剑之回响</title>
<link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <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=Inter:wght@300;400;500;600;700&display=swap" rel="stylesheet"> <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">
<link rel="stylesheet" href="css/style.css"> <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-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; }
/* 右侧滚动按钮 */
.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); }
/* 侧边栏 */
.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; }
.loading { text-align: center; padding: 100px 0; color: var(--text-secondary); }
.error { text-align: center; padding: 100px 0; color: #ff6b6b; }
@media (max-width: 1200px) { .sidebar { display: none; } }
@media (max-width: 600px) {
.chapter-title { font-size: 24px; }
.chapter-content { font-size: 16px; }
.nav-btn { padding: 10px 15px; font-size: 12px; }
}
</style>
</head> </head>
<body class="reader-page"> <body>
<!-- 阅读器头部 --> <!-- 顶部导航 -->
<header class="reader-header" id="readerHeader"> <nav class="top-nav">
<div class="reader-header-content"> <div class="top-nav-content">
<a href="index.html" class="reader-back"> <a href="index.html" class="nav-link">返回首页</a>
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"> <button class="nav-link" id="themeToggle">切换主题</button>
<path d="M19 12H5M12 19l-7-7 7-7"/>
</svg>
</a>
<div class="reader-info">
<h1 class="reader-title" id="chapterTitle">第一章</h1>
<span class="reader-book">阿拉德:剑之回响</span>
</div>
<button class="reader-menu-toggle" id="readerMenuToggle">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
<circle cx="12" cy="12" r="1"/>
<circle cx="19" cy="12" r="1"/>
<circle cx="5" cy="12" r="1"/>
</svg>
</button>
</div> </div>
<div class="reader-progress-bar"> </nav>
<div class="reader-progress-fill" id="readerProgress"></div>
</div>
</header>
<!-- 阅读器设置面板 --> <div class="container">
<div class="reader-settings" id="readerSettings"> <header class="chapter-header">
<div class="settings-panel"> <div class="chapter-number" id="chapterNum">加载中...</div>
<div class="settings-section"> <h1 class="chapter-title" id="chapterTitle">加载中...</h1>
<h3>字体大小</h3> </header>
<div class="font-size-control">
<button class="size-btn" data-size="small"></button> <article class="chapter-content" id="chapterContent">
<button class="size-btn active" data-size="normal"></button> <div class="loading">正在加载章节内容...</div>
<button class="size-btn" data-size="large"></button> </article>
</div>
</div>
<div class="settings-section">
<h3>主题</h3>
<div class="theme-options">
<button class="theme-option active" data-theme="dark">
<span class="theme-preview dark"></span>
<span>深色</span>
</button>
<button class="theme-option" data-theme="light">
<span class="theme-preview light"></span>
<span>浅色</span>
</button>
<button class="theme-option" data-theme="sepia">
<span class="theme-preview sepia"></span>
<span>护眼</span>
</button>
</div>
</div>
<div class="settings-section">
<h3>行间距</h3>
<div class="line-height-control">
<button class="lh-btn" data-lh="compact">紧凑</button>
<button class="lh-btn active" data-lh="normal">标准</button>
<button class="lh-btn" data-lh="loose">宽松</button>
</div>
</div>
</div>
</div> </div>
<!-- 目录侧边栏 --> <!-- 固定底部导航 -->
<aside class="reader-sidebar" id="readerSidebar"> <nav class="fixed-nav">
<div class="sidebar-header"> <div class="fixed-nav-content">
<h2>章节目录</h2> <a href="#" class="nav-btn" id="prevBtn">上一章</a>
<button class="sidebar-close" id="sidebarClose"> <a href="chapters.html" class="nav-btn">目录</a>
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"> <a href="#" class="nav-btn" id="nextBtn">下一章</a>
<path d="M18 6L6 18M6 6l12 12"/>
</svg>
</button>
</div>
<div class="sidebar-content" id="sidebarChapters">
<!-- 章节列表将通过JS动态生成 -->
</div> </div>
</nav>
<!-- 右侧滚动按钮 -->
<div class="scroll-buttons">
<button class="scroll-btn" id="scrollTop"></button>
<button class="scroll-btn" id="scrollBottom"></button>
</div>
<!-- 侧边栏章节导航 -->
<aside class="sidebar">
<div class="sidebar-title">章节导航</div>
<div class="sidebar-content" id="sidebarContent"></div>
</aside> </aside>
<!-- 阅读内容区域 -->
<main class="reader-content" id="readerContent">
<article class="chapter-content" id="chapterContent">
<!-- 章节内容将通过JS动态加载 -->
<div class="chapter-loading">
<div class="loading-spinner"></div>
<p>正在加载章节内容...</p>
</div>
</article>
</main>
<!-- 阅读器底部导航 -->
<footer class="reader-footer" id="readerFooter">
<div class="reader-nav">
<button class="nav-btn" id="prevChapter" disabled>
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
<path d="M15 18l-6-6 6-6"/>
</svg>
<span>上一章</span>
</button>
<button class="nav-btn nav-center" id="openSidebar">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
<path d="M4 6h16M4 12h16M4 18h16"/>
</svg>
<span>目录</span>
</button>
<button class="nav-btn" id="nextChapter">
<span>下一章</span>
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
<path d="M9 18l6-6-6-6"/>
</svg>
</button>
</div>
</footer>
<!-- 阅读设置浮动按钮 -->
<button class="reader-settings-toggle" id="settingsToggle" title="阅读设置">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
<circle cx="12" cy="12" r="3"/>
<path d="M19.4 15a1.65 1.65 0 00.33 1.82l.06.06a2 2 0 010 2.83 2 2 0 01-2.83 0l-.06-.06a1.65 1.65 0 00-1.82-.33 1.65 1.65 0 00-1 1.51V21a2 2 0 01-2 2 2 2 0 01-2-2v-.09A1.65 1.65 0 009 19.4a1.65 1.65 0 00-1.82.33l-.06.06a2 2 0 01-2.83 0 2 2 0 010-2.83l.06-.06a1.65 1.65 0 00.33-1.82 1.65 1.65 0 00-1.51-1H3a2 2 0 01-2-2 2 2 0 012-2h.09A1.65 1.65 0 004.6 9a1.65 1.65 0 00-.33-1.82l-.06-.06a2 2 0 010-2.83 2 2 0 012.83 0l.06.06a1.65 1.65 0 001.82.33H9a1.65 1.65 0 001-1.51V3a2 2 0 012-2 2 2 0 012 2v.09a1.65 1.65 0 001 1.51 1.65 1.65 0 001.82-.33l.06-.06a2 2 0 012.83 0 2 2 0 010 2.83l-.06.06a1.65 1.65 0 00-.33 1.82V9a1.65 1.65 0 001.51 1H21a2 2 0 012 2 2 2 0 01-2 2h-.09a1.65 1.65 0 00-1.51 1z"/>
</svg>
</button>
<!-- 遮罩层 -->
<div class="overlay" id="overlay"></div>
<script src="js/app.js"></script>
<script> <script>
// 阅读页面特定逻辑 // 获取URL参数中的章节ID
document.addEventListener('DOMContentLoaded', function() { const urlParams = new URLSearchParams(window.location.search);
initReader(); let currentChapter = parseInt(urlParams.get('id')) || 1;
let chaptersData = [];
// 加载章节列表
async function loadChaptersIndex() {
try {
const response = await fetch('data/chapters.json');
const data = await response.json();
chaptersData = data.chapters;
renderSidebar();
loadChapter(currentChapter);
} catch (error) {
console.error('Failed to load chapters index:', error);
document.getElementById('chapterContent').innerHTML =
'<div class="error">加载失败,请刷新页面重试</div>';
}
}
// 加载具体章节内容
async function loadChapter(id) {
if (id < 1 || id > chaptersData.length) {
document.getElementById('chapterContent').innerHTML =
'<div class="error">章节不存在</div>';
return;
}
currentChapter = id;
try {
const response = await fetch(`data/chapter-${String(id).padStart(2, '0')}.json`);
const chapter = await response.json();
// 更新页面内容
document.getElementById('chapterNum').textContent = `Chapter ${id}`;
document.getElementById('chapterTitle').textContent = chapter.title;
document.getElementById('chapterContent').innerHTML = chapter.content;
document.title = `${chapter.title} - 阿拉德:剑之回响`;
// 更新导航按钮
updateNavButtons();
// 更新侧边栏高亮
updateSidebarHighlight();
// 记录阅读进度
let readChapters = JSON.parse(localStorage.getItem('readChapters') || '[]');
if (!readChapters.includes(id)) {
readChapters.push(id);
localStorage.setItem('readChapters', JSON.stringify(readChapters));
}
// 滚动到顶部
window.scrollTo({ top: 0, behavior: 'smooth' });
} catch (error) {
console.error('Failed to load chapter:', error);
document.getElementById('chapterContent').innerHTML =
'<div class="error">章节加载失败</div>';
}
}
// 渲染侧边栏
function renderSidebar() {
const sidebarContent = document.getElementById('sidebarContent');
let html = '';
chaptersData.forEach(ch => {
html += `<a href="?id=${ch.id}" class="sidebar-chapter" data-id="${ch.id}">第${ch.id}章:${ch.title}</a>`;
});
sidebarContent.innerHTML = html;
updateSidebarHighlight();
// 自动滚动到当前章节
setTimeout(() => {
const current = sidebarContent.querySelector('.current');
if (current) {
current.scrollIntoView({ behavior: 'smooth', block: 'center' });
}
}, 100);
}
// 更新侧边栏高亮
function updateSidebarHighlight() {
document.querySelectorAll('.sidebar-chapter').forEach(link => {
link.classList.remove('current');
if (parseInt(link.dataset.id) === currentChapter) {
link.classList.add('current');
}
});
}
// 更新导航按钮状态
function updateNavButtons() {
const prevBtn = document.getElementById('prevBtn');
const nextBtn = document.getElementById('nextBtn');
if (currentChapter <= 1) {
prevBtn.classList.add('disabled');
prevBtn.href = '#';
} else {
prevBtn.classList.remove('disabled');
prevBtn.href = `?id=${currentChapter - 1}`;
}
if (currentChapter >= chaptersData.length) {
nextBtn.classList.add('disabled');
nextBtn.href = '#';
} else {
nextBtn.classList.remove('disabled');
nextBtn.href = `?id=${currentChapter + 1}`;
}
}
// 主题切换
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' });
});
// 初始化
loadChaptersIndex();
</script> </script>
</body> </body>
</html> </html>