demo-books.ts 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. import { Book, BookEntry, BookEntryKind, BookSection } from "@/types/book";
  2. function makeEntries(sectionId: string, kind: BookEntryKind, titles: string[][]): BookEntry[] {
  3. return titles.map(([title, ...content], index) => ({
  4. id: `${sectionId}-${index + 1}`,
  5. title,
  6. kind,
  7. order: index + 1,
  8. content
  9. }));
  10. }
  11. function makeSection(
  12. id: string,
  13. title: string,
  14. kind: BookEntryKind,
  15. order: number,
  16. titles: string[][]
  17. ): BookSection {
  18. return {
  19. id,
  20. title,
  21. kind,
  22. order,
  23. entries: makeEntries(id, kind, titles)
  24. };
  25. }
  26. export const demoBooks: Book[] = [
  27. {
  28. id: "memory-catcher",
  29. title: "记忆捕手",
  30. author: "墨尘",
  31. category: "悬疑",
  32. description:
  33. "一间只在深夜营业的记忆事务所,一群替人打捞记忆碎片的人,以及越来越像真实案件的委托记录。",
  34. wordCount: "约 6 万字(演示)",
  35. coverStyle: "linear-gradient(135deg, #7089a8, #2e405a)",
  36. sections: [
  37. makeSection("mc-lore-world", "世界观设定", "lore", 1, [
  38. [
  39. "资料一 事务所规则",
  40. "记忆事务所只在每天凌晨零点到五点营业,所有委托都需要经过双重验证,且不得跨越自然死亡边界回收记忆。",
  41. "每次进入记忆深层前,执行者必须留下现实锚点,否则在高损耗片段中极易失去自我定位。"
  42. ],
  43. [
  44. "资料二 回收协议",
  45. "记忆回收分为取样、修复、归还三个阶段,资料类委托和正文类案件都必须标记来源与完整度。",
  46. "当完整度低于百分之三十时,系统会自动建议多人协同解析。"
  47. ]
  48. ]),
  49. makeSection("mc-lore-roles", "人物档案", "lore", 2, [
  50. [
  51. "资料三 林夜",
  52. "林夜是事务所的主检索员,擅长在受损记忆中建立临时路径。",
  53. "他最大的弱点是不擅长拒绝任何一份“看起来还能救回来”的委托。"
  54. ],
  55. [
  56. "资料四 深洲事务所",
  57. "事务所位于深洲旧城区地下一层,常年由蓝色工作灯照明,主工作台正对一面由十五块屏幕拼成的监控墙。",
  58. "多数外来委托都会先被收录为资料条目,再决定是否转入正式案件。"
  59. ]
  60. ]),
  61. makeSection("mc-novel-volume-1", "正文 第一卷", "novel", 100, [
  62. [
  63. "第一章 数据废墟",
  64. "深洲事务所的地下工作室被蓝色光芒覆盖,十五块屏幕全部亮起,数据流在每一个像素中涌动。",
  65. "林夜坐在工作台中央,接口头环已经戴好,眼前是一份来自匿名客户的委托:在七十二小时内找回一段被人为删除的童年记忆。",
  66. "这类工作本该只是技术活,可委托附件里多出了一段视频。视频结尾,有一只沾着雨水的手按住镜头,像是隔着时间朝他们打招呼。"
  67. ],
  68. [
  69. "第二章 深网潜入",
  70. "林夜坐在工作台中央,接口头环已经戴好,双手悬停在键盘上方,等待深网桥接程序完成最后一次校验。",
  71. "任务目标是一段被藏进深层节点的私人记忆。它没有文件名,也没有索引,像一枚被扔进黑潮里的钉子,只能靠微弱的访问残响定位。",
  72. "副屏上,系统给出了三条不太乐观的提示:来源匿名、时间戳错乱、回收通道不稳定。"
  73. ],
  74. [
  75. "第三章 雨巷回声",
  76. "连接建立后,第一段回收到的不是画面,而是一阵潮湿的雨声。",
  77. "雨点顺着一条老旧的石板巷子落下,远处有人撑着黑伞停在路灯下,像在等谁,又像已经等了很久。",
  78. "系统记录显示,这段记忆在过去七年里被人为删除过四次,但每次都会在不同的深夜重新出现。"
  79. ],
  80. [
  81. "第四章 失真坐标",
  82. "他们终于在失真层里找到了坐标,却发现坐标指向的是一座早已拆除的旧车站。",
  83. "记忆里的广播还在播报过期的列车时刻,玻璃穹顶上方积着雨,候车厅里坐满了看不清脸的人。"
  84. ],
  85. [
  86. "第五章 双重委托",
  87. "清晨六点,他们刚从深层断开,门铃便响了。",
  88. "来的人戴着深灰色帽子,把同样一份委托重新放在桌上,连措辞都和昨晚的一字不差,只在签名处多了一个新的名字。"
  89. ],
  90. [
  91. "第六章 无名乘客",
  92. "第二次进入时,他们看见候车厅角落多了一个孩子。",
  93. "孩子穿着被雨打湿的校服,手里攥着半张车票,车票背面写着一行几乎被水泡开的字:不要相信站台上的广播。"
  94. ],
  95. [
  96. "第七章 镜像证词",
  97. "为了验证委托来源,他们调出了另一位委托人的证词记录。",
  98. "两份证词在前半段完全一致,只在最后三分钟出现了分叉。"
  99. ],
  100. [
  101. "第八章 灯箱之后",
  102. "林夜在站台广告灯箱后找到了一扇隐藏维护门。",
  103. "门后不是管道井,而是一间布满旧磁带和纸质档案的小房间。"
  104. ],
  105. [
  106. "第九章 回收协议",
  107. "事务所服务器在当晚收到一份未签名的回收协议。",
  108. "协议条款极短,只要求他们在二十四小时内交出目标记忆的完整副本。"
  109. ],
  110. [
  111. "第十章 七号出口",
  112. "他们决定在现实中去找那座被封闭的七号出口。",
  113. "清晨的围挡后满是积水和灰尘,可在围挡缝隙后,林夜看见了一盏仍旧亮着的引导灯。"
  114. ]
  115. ])
  116. ]
  117. },
  118. {
  119. id: "lan-archive",
  120. title: "局域网夜航",
  121. author: "程未远",
  122. category: "近未来",
  123. description: "一座封闭园区、几台常亮的旧电脑,以及深夜里不断跳出的陌生消息。",
  124. wordCount: "12.8 万字",
  125. coverStyle: "linear-gradient(135deg, #b86143, #5c2d23)",
  126. sections: [
  127. makeSection("lan-lore", "设定资料", "lore", 1, [
  128. ["资料一 园区网络", "园区网络与公网完全隔离,所有访问记录由本地交换系统统一收敛。"],
  129. ["资料二 旧机房", "二层最靠里的旧机房仍保留着上一代局域网控制台与部分废弃机柜。"]
  130. ]),
  131. makeSection("lan-novel", "正文", "novel", 100, [
  132. ["第一章 机房尽头的灯", "凌晨两点十三分,园区办公楼里只剩下二层最靠里的机房还亮着灯。"],
  133. ["第二章 没有登记的设备", "他先检查 DHCP 记录,又翻了交换机最近一小时的地址分配表,结果一片空白。"],
  134. ["第三章 反向截图", "对方没有回答,只发来一张刚刚拍下的机房照片。"]
  135. ])
  136. ]
  137. },
  138. {
  139. id: "tea-house",
  140. title: "旧书铺茶事",
  141. author: "沈南絮",
  142. category: "日常",
  143. description: "一间开在老街口的旧书铺,白天卖书,傍晚煮茶。",
  144. wordCount: "8.4 万字",
  145. coverStyle: "linear-gradient(135deg, #8f6a3d, #314438)",
  146. sections: [
  147. makeSection("tea-lore", "店铺札记", "lore", 1, [
  148. ["资料一 书铺门铃", "门铃是一枚老铜铃,雨天响起来比晴天更轻一些。"]
  149. ]),
  150. makeSection("tea-novel", "正文", "novel", 100, [
  151. ["第一章 雨落在旧街口", "傍晚五点,雨刚刚落下来,青石板路被洗得发亮。"]
  152. ])
  153. ]
  154. },
  155. {
  156. id: "star-mail",
  157. title: "星港来信",
  158. author: "林观海",
  159. category: "科幻",
  160. description: "远航舰队返程之前,地球收到一封延迟了十九年的星际邮件。",
  161. wordCount: "15.1 万字",
  162. coverStyle: "linear-gradient(135deg, #355c7d, #121c2e)",
  163. sections: [
  164. makeSection("star-lore", "星港档案", "lore", 1, [
  165. ["资料一 深空信道", "民用深空信道十九年未曾亮起,因此被默认彻底沉寂。"]
  166. ]),
  167. makeSection("star-novel", "正文", "novel", 100, [
  168. ["第一章 邮件抵达前夜", "海港城的夜总是比内陆亮一些。"]
  169. ])
  170. ]
  171. },
  172. {
  173. id: "north-city",
  174. title: "北城旧事簿",
  175. author: "顾行舟",
  176. category: "都市",
  177. description: "一座旧城的黄昏、几条重复经过的街道,以及那些看似平常却慢慢累积出重量的日子。",
  178. wordCount: "10.2 万字",
  179. coverStyle: "linear-gradient(135deg, #7c5a43, #28384f)",
  180. sections: [
  181. makeSection("north-lore", "旧城资料", "lore", 1, [
  182. ["资料一 北城地标", "天桥、报刊亭和旧商场灯牌,是北城许多故事共同的入口。"]
  183. ]),
  184. makeSection("north-novel", "正文", "novel", 100, [
  185. ["第一章 天桥下的晚风", "晚高峰刚过,天桥下的人群还没散完。"]
  186. ])
  187. ]
  188. }
  189. ];
  190. export function getBookById(bookId: string) {
  191. return demoBooks.find((book) => book.id === bookId);
  192. }