| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196 |
- import { Book, BookEntry, BookEntryKind, BookSection } from "@/types/book";
- function makeEntries(sectionId: string, kind: BookEntryKind, titles: string[][]): BookEntry[] {
- return titles.map(([title, ...content], index) => ({
- id: `${sectionId}-${index + 1}`,
- title,
- kind,
- order: index + 1,
- content
- }));
- }
- function makeSection(
- id: string,
- title: string,
- kind: BookEntryKind,
- order: number,
- titles: string[][]
- ): BookSection {
- return {
- id,
- title,
- kind,
- order,
- entries: makeEntries(id, kind, titles)
- };
- }
- export const demoBooks: Book[] = [
- {
- id: "memory-catcher",
- title: "记忆捕手",
- author: "墨尘",
- category: "悬疑",
- description:
- "一间只在深夜营业的记忆事务所,一群替人打捞记忆碎片的人,以及越来越像真实案件的委托记录。",
- wordCount: "约 6 万字(演示)",
- coverStyle: "linear-gradient(135deg, #7089a8, #2e405a)",
- sections: [
- makeSection("mc-lore-world", "世界观设定", "lore", 1, [
- [
- "资料一 事务所规则",
- "记忆事务所只在每天凌晨零点到五点营业,所有委托都需要经过双重验证,且不得跨越自然死亡边界回收记忆。",
- "每次进入记忆深层前,执行者必须留下现实锚点,否则在高损耗片段中极易失去自我定位。"
- ],
- [
- "资料二 回收协议",
- "记忆回收分为取样、修复、归还三个阶段,资料类委托和正文类案件都必须标记来源与完整度。",
- "当完整度低于百分之三十时,系统会自动建议多人协同解析。"
- ]
- ]),
- makeSection("mc-lore-roles", "人物档案", "lore", 2, [
- [
- "资料三 林夜",
- "林夜是事务所的主检索员,擅长在受损记忆中建立临时路径。",
- "他最大的弱点是不擅长拒绝任何一份“看起来还能救回来”的委托。"
- ],
- [
- "资料四 深洲事务所",
- "事务所位于深洲旧城区地下一层,常年由蓝色工作灯照明,主工作台正对一面由十五块屏幕拼成的监控墙。",
- "多数外来委托都会先被收录为资料条目,再决定是否转入正式案件。"
- ]
- ]),
- makeSection("mc-novel-volume-1", "正文 第一卷", "novel", 100, [
- [
- "第一章 数据废墟",
- "深洲事务所的地下工作室被蓝色光芒覆盖,十五块屏幕全部亮起,数据流在每一个像素中涌动。",
- "林夜坐在工作台中央,接口头环已经戴好,眼前是一份来自匿名客户的委托:在七十二小时内找回一段被人为删除的童年记忆。",
- "这类工作本该只是技术活,可委托附件里多出了一段视频。视频结尾,有一只沾着雨水的手按住镜头,像是隔着时间朝他们打招呼。"
- ],
- [
- "第二章 深网潜入",
- "林夜坐在工作台中央,接口头环已经戴好,双手悬停在键盘上方,等待深网桥接程序完成最后一次校验。",
- "任务目标是一段被藏进深层节点的私人记忆。它没有文件名,也没有索引,像一枚被扔进黑潮里的钉子,只能靠微弱的访问残响定位。",
- "副屏上,系统给出了三条不太乐观的提示:来源匿名、时间戳错乱、回收通道不稳定。"
- ],
- [
- "第三章 雨巷回声",
- "连接建立后,第一段回收到的不是画面,而是一阵潮湿的雨声。",
- "雨点顺着一条老旧的石板巷子落下,远处有人撑着黑伞停在路灯下,像在等谁,又像已经等了很久。",
- "系统记录显示,这段记忆在过去七年里被人为删除过四次,但每次都会在不同的深夜重新出现。"
- ],
- [
- "第四章 失真坐标",
- "他们终于在失真层里找到了坐标,却发现坐标指向的是一座早已拆除的旧车站。",
- "记忆里的广播还在播报过期的列车时刻,玻璃穹顶上方积着雨,候车厅里坐满了看不清脸的人。"
- ],
- [
- "第五章 双重委托",
- "清晨六点,他们刚从深层断开,门铃便响了。",
- "来的人戴着深灰色帽子,把同样一份委托重新放在桌上,连措辞都和昨晚的一字不差,只在签名处多了一个新的名字。"
- ],
- [
- "第六章 无名乘客",
- "第二次进入时,他们看见候车厅角落多了一个孩子。",
- "孩子穿着被雨打湿的校服,手里攥着半张车票,车票背面写着一行几乎被水泡开的字:不要相信站台上的广播。"
- ],
- [
- "第七章 镜像证词",
- "为了验证委托来源,他们调出了另一位委托人的证词记录。",
- "两份证词在前半段完全一致,只在最后三分钟出现了分叉。"
- ],
- [
- "第八章 灯箱之后",
- "林夜在站台广告灯箱后找到了一扇隐藏维护门。",
- "门后不是管道井,而是一间布满旧磁带和纸质档案的小房间。"
- ],
- [
- "第九章 回收协议",
- "事务所服务器在当晚收到一份未签名的回收协议。",
- "协议条款极短,只要求他们在二十四小时内交出目标记忆的完整副本。"
- ],
- [
- "第十章 七号出口",
- "他们决定在现实中去找那座被封闭的七号出口。",
- "清晨的围挡后满是积水和灰尘,可在围挡缝隙后,林夜看见了一盏仍旧亮着的引导灯。"
- ]
- ])
- ]
- },
- {
- id: "lan-archive",
- title: "局域网夜航",
- author: "程未远",
- category: "近未来",
- description: "一座封闭园区、几台常亮的旧电脑,以及深夜里不断跳出的陌生消息。",
- wordCount: "12.8 万字",
- coverStyle: "linear-gradient(135deg, #b86143, #5c2d23)",
- sections: [
- makeSection("lan-lore", "设定资料", "lore", 1, [
- ["资料一 园区网络", "园区网络与公网完全隔离,所有访问记录由本地交换系统统一收敛。"],
- ["资料二 旧机房", "二层最靠里的旧机房仍保留着上一代局域网控制台与部分废弃机柜。"]
- ]),
- makeSection("lan-novel", "正文", "novel", 100, [
- ["第一章 机房尽头的灯", "凌晨两点十三分,园区办公楼里只剩下二层最靠里的机房还亮着灯。"],
- ["第二章 没有登记的设备", "他先检查 DHCP 记录,又翻了交换机最近一小时的地址分配表,结果一片空白。"],
- ["第三章 反向截图", "对方没有回答,只发来一张刚刚拍下的机房照片。"]
- ])
- ]
- },
- {
- id: "tea-house",
- title: "旧书铺茶事",
- author: "沈南絮",
- category: "日常",
- description: "一间开在老街口的旧书铺,白天卖书,傍晚煮茶。",
- wordCount: "8.4 万字",
- coverStyle: "linear-gradient(135deg, #8f6a3d, #314438)",
- sections: [
- makeSection("tea-lore", "店铺札记", "lore", 1, [
- ["资料一 书铺门铃", "门铃是一枚老铜铃,雨天响起来比晴天更轻一些。"]
- ]),
- makeSection("tea-novel", "正文", "novel", 100, [
- ["第一章 雨落在旧街口", "傍晚五点,雨刚刚落下来,青石板路被洗得发亮。"]
- ])
- ]
- },
- {
- id: "star-mail",
- title: "星港来信",
- author: "林观海",
- category: "科幻",
- description: "远航舰队返程之前,地球收到一封延迟了十九年的星际邮件。",
- wordCount: "15.1 万字",
- coverStyle: "linear-gradient(135deg, #355c7d, #121c2e)",
- sections: [
- makeSection("star-lore", "星港档案", "lore", 1, [
- ["资料一 深空信道", "民用深空信道十九年未曾亮起,因此被默认彻底沉寂。"]
- ]),
- makeSection("star-novel", "正文", "novel", 100, [
- ["第一章 邮件抵达前夜", "海港城的夜总是比内陆亮一些。"]
- ])
- ]
- },
- {
- id: "north-city",
- title: "北城旧事簿",
- author: "顾行舟",
- category: "都市",
- description: "一座旧城的黄昏、几条重复经过的街道,以及那些看似平常却慢慢累积出重量的日子。",
- wordCount: "10.2 万字",
- coverStyle: "linear-gradient(135deg, #7c5a43, #28384f)",
- sections: [
- makeSection("north-lore", "旧城资料", "lore", 1, [
- ["资料一 北城地标", "天桥、报刊亭和旧商场灯牌,是北城许多故事共同的入口。"]
- ]),
- makeSection("north-novel", "正文", "novel", 100, [
- ["第一章 天桥下的晚风", "晚高峰刚过,天桥下的人群还没散完。"]
- ])
- ]
- }
- ];
- export function getBookById(bookId: string) {
- return demoBooks.find((book) => book.id === bookId);
- }
|