重构架构: 提取章节为JSON, 使用通用阅读器
This commit is contained in:
parent
32b72247ec
commit
4c57d2e806
5
alacarte-novel-website/data/chapter-01.json
Normal file
5
alacarte-novel-website/data/chapter-01.json
Normal file
File diff suppressed because one or more lines are too long
5
alacarte-novel-website/data/chapter-02.json
Normal file
5
alacarte-novel-website/data/chapter-02.json
Normal file
File diff suppressed because one or more lines are too long
5
alacarte-novel-website/data/chapter-03.json
Normal file
5
alacarte-novel-website/data/chapter-03.json
Normal file
File diff suppressed because one or more lines are too long
5
alacarte-novel-website/data/chapter-04.json
Normal file
5
alacarte-novel-website/data/chapter-04.json
Normal 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>"
|
||||
}
|
||||
5
alacarte-novel-website/data/chapter-05.json
Normal file
5
alacarte-novel-website/data/chapter-05.json
Normal 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>"
|
||||
}
|
||||
5
alacarte-novel-website/data/chapter-06.json
Normal file
5
alacarte-novel-website/data/chapter-06.json
Normal file
File diff suppressed because one or more lines are too long
5
alacarte-novel-website/data/chapter-07.json
Normal file
5
alacarte-novel-website/data/chapter-07.json
Normal file
File diff suppressed because one or more lines are too long
5
alacarte-novel-website/data/chapter-08.json
Normal file
5
alacarte-novel-website/data/chapter-08.json
Normal 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>"
|
||||
}
|
||||
5
alacarte-novel-website/data/chapter-09.json
Normal file
5
alacarte-novel-website/data/chapter-09.json
Normal 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>"
|
||||
}
|
||||
5
alacarte-novel-website/data/chapter-10.json
Normal file
5
alacarte-novel-website/data/chapter-10.json
Normal 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>"
|
||||
}
|
||||
5
alacarte-novel-website/data/chapter-11.json
Normal file
5
alacarte-novel-website/data/chapter-11.json
Normal 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>"
|
||||
}
|
||||
5
alacarte-novel-website/data/chapter-12.json
Normal file
5
alacarte-novel-website/data/chapter-12.json
Normal 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>"
|
||||
}
|
||||
5
alacarte-novel-website/data/chapter-13.json
Normal file
5
alacarte-novel-website/data/chapter-13.json
Normal file
File diff suppressed because one or more lines are too long
5
alacarte-novel-website/data/chapter-14.json
Normal file
5
alacarte-novel-website/data/chapter-14.json
Normal file
File diff suppressed because one or more lines are too long
5
alacarte-novel-website/data/chapter-15.json
Normal file
5
alacarte-novel-website/data/chapter-15.json
Normal file
File diff suppressed because one or more lines are too long
5
alacarte-novel-website/data/chapter-16.json
Normal file
5
alacarte-novel-website/data/chapter-16.json
Normal file
File diff suppressed because one or more lines are too long
5
alacarte-novel-website/data/chapter-17.json
Normal file
5
alacarte-novel-website/data/chapter-17.json
Normal file
File diff suppressed because one or more lines are too long
5
alacarte-novel-website/data/chapter-18.json
Normal file
5
alacarte-novel-website/data/chapter-18.json
Normal file
File diff suppressed because one or more lines are too long
5
alacarte-novel-website/data/chapter-19.json
Normal file
5
alacarte-novel-website/data/chapter-19.json
Normal file
File diff suppressed because one or more lines are too long
5
alacarte-novel-website/data/chapter-20.json
Normal file
5
alacarte-novel-website/data/chapter-20.json
Normal file
File diff suppressed because one or more lines are too long
5
alacarte-novel-website/data/chapter-21.json
Normal file
5
alacarte-novel-website/data/chapter-21.json
Normal file
File diff suppressed because one or more lines are too long
5
alacarte-novel-website/data/chapter-22.json
Normal file
5
alacarte-novel-website/data/chapter-22.json
Normal file
File diff suppressed because one or more lines are too long
5
alacarte-novel-website/data/chapter-23.json
Normal file
5
alacarte-novel-website/data/chapter-23.json
Normal file
File diff suppressed because one or more lines are too long
5
alacarte-novel-website/data/chapter-24.json
Normal file
5
alacarte-novel-website/data/chapter-24.json
Normal file
File diff suppressed because one or more lines are too long
5
alacarte-novel-website/data/chapter-25.json
Normal file
5
alacarte-novel-website/data/chapter-25.json
Normal file
File diff suppressed because one or more lines are too long
5
alacarte-novel-website/data/chapter-26.json
Normal file
5
alacarte-novel-website/data/chapter-26.json
Normal file
File diff suppressed because one or more lines are too long
5
alacarte-novel-website/data/chapter-27.json
Normal file
5
alacarte-novel-website/data/chapter-27.json
Normal file
File diff suppressed because one or more lines are too long
5
alacarte-novel-website/data/chapter-28.json
Normal file
5
alacarte-novel-website/data/chapter-28.json
Normal file
File diff suppressed because one or more lines are too long
5
alacarte-novel-website/data/chapter-29.json
Normal file
5
alacarte-novel-website/data/chapter-29.json
Normal file
File diff suppressed because one or more lines are too long
5
alacarte-novel-website/data/chapter-30.json
Normal file
5
alacarte-novel-website/data/chapter-30.json
Normal file
File diff suppressed because one or more lines are too long
5
alacarte-novel-website/data/chapter-31.json
Normal file
5
alacarte-novel-website/data/chapter-31.json
Normal file
File diff suppressed because one or more lines are too long
5
alacarte-novel-website/data/chapter-32.json
Normal file
5
alacarte-novel-website/data/chapter-32.json
Normal 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>"
|
||||
}
|
||||
5
alacarte-novel-website/data/chapter-33.json
Normal file
5
alacarte-novel-website/data/chapter-33.json
Normal file
File diff suppressed because one or more lines are too long
5
alacarte-novel-website/data/chapter-34.json
Normal file
5
alacarte-novel-website/data/chapter-34.json
Normal file
File diff suppressed because one or more lines are too long
39
alacarte-novel-website/data/chapters.json
Normal file
39
alacarte-novel-website/data/chapters.json
Normal 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"}
|
||||
]
|
||||
}
|
||||
@ -79,7 +79,7 @@
|
||||
</div>
|
||||
</div>
|
||||
<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>
|
||||
<svg class="btn-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
||||
<path d="M5 12h14M12 5l7 7-7 7"/>
|
||||
|
||||
@ -156,7 +156,7 @@ function renderLatestChapters() {
|
||||
const latestChapters = chaptersData.slice(-6).reverse();
|
||||
|
||||
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-info">
|
||||
<h3 class="chapter-title">${chapter.title}</h3>
|
||||
@ -178,7 +178,7 @@ function renderChaptersList() {
|
||||
container.innerHTML = chaptersData.map(chapter => `
|
||||
<div class="timeline-item" data-chapter="${chapter.id}">
|
||||
<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">
|
||||
<h3>${chapter.title}</h3>
|
||||
<span class="timeline-date">${chapter.date}</span>
|
||||
|
||||
@ -3,144 +3,454 @@
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<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.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 rel="stylesheet" href="css/style.css">
|
||||
</head>
|
||||
<body class="reader-page">
|
||||
<!-- 阅读器头部 -->
|
||||
<header class="reader-header" id="readerHeader">
|
||||
<div class="reader-header-content">
|
||||
<a href="index.html" class="reader-back">
|
||||
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
||||
<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 class="reader-progress-bar">
|
||||
<div class="reader-progress-fill" id="readerProgress"></div>
|
||||
</div>
|
||||
</header>
|
||||
<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);
|
||||
}
|
||||
|
||||
<!-- 阅读器设置面板 -->
|
||||
<div class="reader-settings" id="readerSettings">
|
||||
<div class="settings-panel">
|
||||
<div class="settings-section">
|
||||
<h3>字体大小</h3>
|
||||
<div class="font-size-control">
|
||||
<button class="size-btn" data-size="small">小</button>
|
||||
<button class="size-btn active" data-size="normal">中</button>
|
||||
<button class="size-btn" data-size="large">大</button>
|
||||
</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>
|
||||
[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>
|
||||
<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" id="chapterNum">加载中...</div>
|
||||
<h1 class="chapter-title" id="chapterTitle">加载中...</h1>
|
||||
</header>
|
||||
|
||||
<article class="chapter-content" id="chapterContent">
|
||||
<div class="loading">正在加载章节内容...</div>
|
||||
</article>
|
||||
</div>
|
||||
|
||||
<!-- 目录侧边栏 -->
|
||||
<aside class="reader-sidebar" id="readerSidebar">
|
||||
<div class="sidebar-header">
|
||||
<h2>章节目录</h2>
|
||||
<button class="sidebar-close" id="sidebarClose">
|
||||
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
||||
<path d="M18 6L6 18M6 6l12 12"/>
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
<div class="sidebar-content" id="sidebarChapters">
|
||||
<!-- 章节列表将通过JS动态生成 -->
|
||||
<!-- 固定底部导航 -->
|
||||
<nav class="fixed-nav">
|
||||
<div class="fixed-nav-content">
|
||||
<a href="#" class="nav-btn" id="prevBtn">上一章</a>
|
||||
<a href="chapters.html" class="nav-btn">目录</a>
|
||||
<a href="#" class="nav-btn" id="nextBtn">下一章</a>
|
||||
</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>
|
||||
|
||||
<!-- 阅读内容区域 -->
|
||||
<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>
|
||||
// 阅读页面特定逻辑
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
initReader();
|
||||
// 获取URL参数中的章节ID
|
||||
const urlParams = new URLSearchParams(window.location.search);
|
||||
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>
|
||||
</body>
|
||||
</html>
|
||||
Loading…
Reference in New Issue
Block a user