├── .gitignore ├── LICENSE ├── README.md ├── apps ├── import.js ├── other.js ├── search.js ├── settings.js └── statistics.js ├── guoba.support.js ├── index.js ├── models ├── Page.js └── Settings.js ├── resources ├── achievements │ └── wonders_of_the_world.json ├── images │ └── icon.png └── template │ ├── font │ └── tttgbnumber.ttf │ ├── img │ ├── background_bottom.png │ ├── background_middle.png │ ├── background_top.png │ ├── done_time.png │ ├── icon0.png │ ├── icon1.png │ ├── icon3.png │ ├── psd.psd │ ├── reward.png │ ├── thumb-1920-1271.jpg │ ├── top_background.png │ └── wonders_of_the_world.png │ ├── import_image.html │ ├── import_video.html │ ├── statistics.html │ └── style │ ├── common.css │ ├── common.less │ ├── statistics.css │ └── statistics.less ├── utils ├── Data.js ├── adapter.js ├── common.js └── waitInput.js └── version ├── 2x.js ├── 3x.js ├── common.js └── getVersion.js /.gitignore: -------------------------------------------------------------------------------- 1 | # Windows thumbnail cache files 2 | Thumbs.db 3 | Thumbs.db:encryptable 4 | ehthumbs.db 5 | ehthumbs_vista.db 6 | 7 | # Dump file 8 | *.stackdump 9 | 10 | # Folder config file 11 | [Dd]esktop.ini 12 | 13 | # Recycle Bin used on file shares 14 | $RECYCLE.BIN/ 15 | 16 | # Windows Installer files 17 | *.cab 18 | *.msi 19 | *.msix 20 | *.msm 21 | *.msp 22 | 23 | # Windows shortcuts 24 | *.lnk 25 | 26 | .idea 27 | 28 | /resources/settings.json 29 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 zolay 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 成就查漏功能说明 2 | 3 | `achievements-plugin`是`Yunzai-Bot`的扩展插件,提供成就查漏功能。 4 | 5 | 具体功能可在安装插件后,通过发送`#成就帮助`来进行查看。 6 | 7 | ## 已实现的功能 8 | 9 | 1. 成就录入 10 | - [x] 图片集成就扫描 11 | - [x] 录屏成就扫描 12 | - 功能已实现,但默认不支持,需要安装完整chrome才能使用。 13 | - [x] 从椰羊导入JSON 14 | - [x] 手动输入成就ID 15 | 2. 成就查漏 16 | - 仅支持天地万象,根据已录入的成就,对比数据库给出未完成的成就列表) 17 | 3. 成就查询 18 | - [x] 根据成就ID精准查询成就信息 19 | - [x] 根据成就名称、简介模糊查询成就信息 20 | 4. 成就重置 21 | - 如发现成就数据损坏,可以重置成就数据 22 | 5. 成就配置 23 | - master可以配置成就的录入方法等 24 | 25 | ## 安装与更新 26 | 27 | 直接将`achievements-plugin`放置在`Yunzai-Bot`的`plugins`目录下,重启`Yunzai-Bot`后即可使用。 28 | 29 | 推荐使用git进行安装,以方便后续升级。在BOT根目录下打开终端,运行 30 | 31 | ``` 32 | git clone https://gitee.com/zolay-poi/achievements-plugin.git ./plugins/achievements-plugin/ 33 | ``` 34 | 35 | 进行安装。如需更新,在BOT根目录下打开终端,运行 36 | 37 | ``` 38 | git -C ./plugins/achievements-plugin/ pull 39 | ``` 40 | 41 | # 免责声明 42 | 43 | 1. 功能仅限内部交流与小范围使用,严禁将Yunzai-Bot及Achievements-Plugin用于任何商业用途或盈利 44 | 2. 图片与其他素材均来自于网络,仅供交流学习使用,如有侵权请联系,会立即删除 45 | 46 | # 其他 47 | 48 | * Yunzai-Bot 49 | - [gitee](https://gitee.com/Le-niao/Yunzai-Bot) 50 | - [github](https://github.com/Le-niao/Yunzai-Bot) 51 | * Miao-Plugin 52 | - [gitee](https://github.com/yoimiya-kokomi/miao-plugin) 53 | - [github](https://github.com/yoimiya-kokomi/miao-plugin) 54 | 55 | ## 功能依赖 56 | 57 | 该插件的运行离不开以下开源软件 58 | 59 | 1. 椰羊(cocogoat) 60 | - 用于实现成就扫描功能 61 | - 项目地址: 62 | 2. GenshinData 63 | - 全成就列表的数据来源 64 | - [wonders_of_the_world.json](https://github.com/dvaJi/genshin-data/blob/master/src/data/chinese-simplified/achievements/wonders_of_the_world.json) 65 | - 项目地址: 66 | -------------------------------------------------------------------------------- /apps/import.js: -------------------------------------------------------------------------------- 1 | import fs from 'fs'; 2 | import path from 'path'; 3 | import moment from 'moment'; 4 | import Data from '../utils/Data.js'; 5 | import { _paths, settings, achievementsMap, _method, browserInit } from '../utils/common.js'; 6 | import { readUserJson, getMysApi, downloadFiles } from '../utils/common.js'; 7 | import { waitInputAt } from '../utils/waitInput.js'; 8 | import { matchFilename } from "../utils/adapter.js"; 9 | 10 | export function install(app) { 11 | // #成就录入 12 | app.register(/^#成就(录入|识别|扫描|记录)/, achImport); 13 | } 14 | 15 | function joinTexts(texts) { 16 | if (texts.length > 1) { 17 | return `“${texts.splice(0, texts.length - 1).join('”、“')}”或“${texts.pop()}”` 18 | } else { 19 | return `“${texts[0]}”` 20 | } 21 | } 22 | 23 | export async function achImport(e) { 24 | let enabled = settings.importMethod.enabled 25 | if (enabled.length === 0) { 26 | e.replyAt('成就录入功能已被完全禁用……'); 27 | return true; 28 | } 29 | let MysApi = await getMysApi(e); 30 | if (!MysApi) return true; 31 | let uid = MysApi.targetUid; 32 | if (!uid) { 33 | e.replyAt('请先绑定uid'); 34 | return true; 35 | } 36 | // 消息中携带图片 37 | if (e.img && e.img.length > 0) { 38 | return downloadAndScanner(e, e.img, _method.IMAGE, MysApi); 39 | } 40 | // 消息中携带成就ID 41 | let ids = getAchIds(e); 42 | if (ids.length > 0) { 43 | return importOfIds(e, ids, uid); 44 | } 45 | let texts = enabled.map(e => e.humanText) 46 | // 什么都不携带,发送指南 47 | waitInputAt(e, { 48 | key: `ach-import-${e.user_id}`, 49 | message: `请发送${joinTexts(texts)}`, 50 | timeout: 60000, 51 | checkFn: achImportCheck, 52 | timeoutCb: () => e.replyAt('成就录入已取消'), 53 | }) 54 | return true; 55 | } 56 | 57 | /** 递归 push 系列成就 */ 58 | function pushSeries({ id, preStage }, doneList) { 59 | if (preStage != null) { 60 | doneList.push({ 61 | id: preStage, 62 | nextStage: id, 63 | isPush: true, 64 | }); 65 | let achItem = achievementsMap.get(preStage); 66 | pushSeries(achItem, doneList); 67 | } 68 | } 69 | 70 | export async function achImportCheck(e) { 71 | // 【V3兼容】发送纯图片或文件时msg为空,导致无法获取uid 72 | if (!e.msg) e.msg = '-' 73 | // 处理wechat可能出现的此异常消息 74 | if (e.msg === '消息超过字数限制,无法发送。') { 75 | return false; 76 | } 77 | let MysApi = await getMysApi(e); 78 | if (!MysApi) return true; 79 | let uid = MysApi.targetUid; 80 | if (!uid) { 81 | e.replyAt('请先绑定uid'); 82 | return true; 83 | } 84 | // 消息中携带成就ID 85 | let ids = getAchIds(e); 86 | if (ids.length > 0) { 87 | return importOfIds(e, ids, uid); 88 | } 89 | let file, video; 90 | for (let msg of e.message) { 91 | if (msg.type === 'video') { 92 | video = msg; 93 | break; 94 | } 95 | if (msg.type === 'file') { 96 | file = msg; 97 | let url = file.url; 98 | if (!url) { 99 | const fid = file.fid || file.file_id; 100 | if (e.isGroup) { 101 | url = await e.group.getFileUrl?.(fid); 102 | } else { 103 | url = await e.friend.getFileUrl?.(fid); 104 | } 105 | if (!url) { 106 | e.replyAt('获取文件URL失败,可能是该文件类型尚未支持,请附带控制台完整截图在Git上提交ISSUE等待解决。'); 107 | console.warn('[成就查漏] 不支持的文件类型:', file); 108 | return true; 109 | } 110 | } 111 | file.url = url; 112 | // 兼容其他平台的文件格式 113 | if (!file.name) { 114 | file.name = matchFilename(file.url) 115 | } 116 | break; 117 | } 118 | // 兼容 discord 的 application 消息 119 | if (msg.type === 'application') { 120 | file = { 121 | ...msg, 122 | type: 'file', 123 | name: msg.filename, 124 | fid: msg.id, 125 | }; 126 | break; 127 | } 128 | } 129 | if (!e.img && !file && !video && !ids.length) { 130 | let texts = settings.importMethod.enabled.map(e => e.humanText) 131 | let need = `请发送${joinTexts(texts)}`; 132 | e.replyAt(`成就录入已取消:发送的内容不合法!\n${need}\n也可发送“#成就帮助”来查看功能帮助。`); 133 | return true; 134 | } 135 | if (file) { 136 | let isImage = /\.(jpg|png|jpeg)$/.test(file.name); 137 | let isVideo = /\.(mp4)$/.test(file.name); 138 | let isJson = /\.(json)$/.test(file.name); 139 | if (!isImage && !isVideo && !isJson) { 140 | e.replyAt('发送的文件不是静态图片或mp4格式的视频或椰羊JSON,成就录入已取消'); 141 | return true; 142 | } 143 | let url = file.url; 144 | // 从JSON导入成就 145 | if (isJson) { 146 | return importOfJson(e, url, MysApi); 147 | } 148 | let type = isImage ? _method.IMAGE : _method.VIDEO; 149 | return downloadAndScanner(e, [url], type, MysApi); 150 | } else if (video) { 151 | if (!/\.(mp4)$/.test(video.name)) { 152 | e.replyAt('发送的不是mp4格式的视频,成就录入已取消'); 153 | return true; 154 | } 155 | let url; 156 | const fid = video.fid || video.file_id; 157 | if (e.isGroup) { 158 | url = await e.group.getVideoUrl(fid, video.md5); 159 | } else { 160 | url = await e.friend.getVideoUrl(fid, video.md5); 161 | } 162 | return downloadAndScanner(e, [url], _method.VIDEO, MysApi); 163 | } else { 164 | return downloadAndScanner(e, e.img, _method.IMAGE, MysApi); 165 | } 166 | } 167 | 168 | /** 获取消息中的成就ID */ 169 | function getAchIds(e) { 170 | let match = (e.msg || '').match(/(\d{5}([,,、 ]\d{5})*)/); 171 | if (match && match.length >= 1) { 172 | let ids = match[1]; 173 | if (ids) { 174 | return ids.split(/[,,、 ]/).map(id => parseInt(id)); 175 | } 176 | } 177 | return []; 178 | } 179 | 180 | /** 下载文件并识别 */ 181 | async function downloadAndScanner(e, urls, type, MysApi) { 182 | let uid = MysApi.targetUid; 183 | if (type === _method.VIDEO) { 184 | if (!settings.importMethod.check(_method.VIDEO)) { 185 | e.replyAt('录屏成就录入已被禁用'); 186 | return true; 187 | } 188 | e.replyAt('正在处理中,请稍等…\n录屏识别为未经完全验证的测试功能,识别错误率可能较高,请仔细核对确认或等待完善。'); 189 | } else { 190 | if (!settings.importMethod.check(_method.IMAGE)) { 191 | e.replyAt('截图成就录入已被禁用'); 192 | return true; 193 | } 194 | if (urls.length > 12) { 195 | e.replyAt('一次性最多发送12张图片…'); 196 | return true; 197 | } 198 | e.replyAt('正在处理中,请稍等…'); 199 | } 200 | let suffix = type === _method.IMAGE ? '.jpg' : '.mp4'; 201 | // 保存所有文件 202 | const { filePaths, errorCount } = await downloadFiles(e, urls, suffix); 203 | if (filePaths.length === 0) { 204 | e.replyAt(`${type === _method.IMAGE ? '图片' : '视频'}下载失败…`); 205 | return true; 206 | } 207 | // 调用椰羊进行成就扫描 208 | let result; 209 | try { 210 | // {result, dup} 211 | let results = await cocoGoatScanner(filePaths, type, e); 212 | result = results.result; 213 | } catch (err) { 214 | console.error(err) 215 | e.replyAt(`${err.message || err}`); 216 | return true; 217 | } finally { 218 | // 删除临时文件 219 | filePaths.forEach((file) => fs.unlink(file, () => 0)); 220 | } 221 | let successCount = 0, unfinishedCount = 0, failCount = 0, doneList = []; 222 | for (const item of result) { 223 | if (item.success) { 224 | successCount++; 225 | // 是否完成 226 | if (item.done) { 227 | let achItem = { 228 | id: item.achievement.id, 229 | date: item.date, 230 | status: item.status, 231 | }; 232 | // 是否是系列成就 233 | if (item.achievement.preStage) { 234 | achItem.preStage = item.achievement.preStage; 235 | pushSeries(achItem, doneList); 236 | } 237 | doneList.push(achItem); 238 | } else { 239 | unfinishedCount++; 240 | } 241 | } else { 242 | // console.log('fail', {item}); 243 | failCount++; 244 | } 245 | } 246 | if (successCount === 0) { 247 | e.replyAt('没有识别到成就…'); 248 | return true; 249 | } 250 | let userJsonName = `${uid}.json`; 251 | let { saveData, writeUserJson } = readUserJson(userJsonName); 252 | // 目前仅支持【天地万象】 253 | let saveDoneList = saveData.wonders_of_the_world; 254 | // 新增个数,重复个数 255 | let saveCount = 0, dupCount = 0; 256 | // 去除重复的 257 | for (const achItem of doneList) { 258 | if (saveDoneList.findIndex(i => i.id === achItem.id) !== -1) { 259 | dupCount++; 260 | } else { 261 | saveCount++; 262 | saveDoneList.push(achItem); 263 | } 264 | } 265 | writeUserJson(); 266 | let unfinishedStr = unfinishedCount > 0 ? `,包含${unfinishedCount}个识别为未完成的成就` : ''; 267 | let dupStr = dupCount > 0 ? `,包含${dupCount}个已记录的成就` : ''; 268 | e.replyAt(`本次成功识别了${successCount}个成就${unfinishedStr}${dupStr},新增记录了${saveCount}个成就。\n你可发送“#成就查漏”来查看你尚未完成的成就。`); 269 | return true; 270 | } 271 | 272 | /** 手动录入成就ids */ 273 | async function importOfIds(e, ids, uid) { 274 | if (!settings.importMethod.check(_method.INPUT)) { 275 | e.replyAt('手动录入成就已被禁用'); 276 | return true; 277 | } 278 | let userJsonName = `${uid}.json`; 279 | let { saveData, writeUserJson } = readUserJson(userJsonName); 280 | let saveDoneList = saveData.wonders_of_the_world; 281 | 282 | // achievementsMap 283 | let inputAchList = ids.map(id => achievementsMap.get(id)).filter(i => i != null); 284 | if (inputAchList.length === 0) { 285 | e.replyAt('录入失败:输入的成就id不存在…\n你可发送“#成就帮助”来查看功能说明。'); 286 | return true; 287 | } 288 | // 新增个数,重复个数 289 | let saveCount = [], dupCount = 0; 290 | let date = moment().format('YYYY/MM/DD'); 291 | for (const achItem of inputAchList) { 292 | if (saveDoneList.findIndex(i => i.id === achItem.id) !== -1) { 293 | dupCount++; 294 | } else { 295 | saveCount.push(achItem); 296 | saveDoneList.push({ 297 | id: achItem.id, 298 | date: date, 299 | status: 3, 300 | }); 301 | } 302 | } 303 | writeUserJson(); 304 | let message = [`成功识别了${inputAchList.length}个成就,新增记录了${saveCount.length}个成就。`]; 305 | for (let i = 0; i < saveCount.length; i++) { 306 | const achItem = saveCount[i]; 307 | message.push(`· ${achItem.name}(${achItem.id})`); 308 | } 309 | message.push(`你可发送“#成就查漏”来查看你尚未完成的成就。`); 310 | e.replyAt(message.join('\n')); 311 | return true; 312 | } 313 | 314 | /** 从JSON导入成就 */ 315 | async function importOfJson(e, url, MysApi) { 316 | let uid = MysApi.targetUid; 317 | // 下载JSON文件 318 | const { filePaths } = await downloadFiles(e, [url], '.json'); 319 | if (filePaths.length === 0) { 320 | e.replyAt(`文件下载失败…`); 321 | return true; 322 | } 323 | let json = '' 324 | try { 325 | json = Data.readJSON(path.dirname(filePaths[0]), path.basename(filePaths[0])); 326 | } catch (e) { 327 | console.error(e); 328 | } 329 | // 判断JSON类型 330 | if (!json) { 331 | e.replyAt(`发送的JSON文件为空…`); 332 | return true; 333 | } 334 | // 椰羊(旧) 335 | let isCocoGoat = json.source === '椰羊成就'; 336 | // UIAF 337 | let isUIAF = json.info && json.list; 338 | if (isCocoGoat) { 339 | return await importOfCocoGoatJson(e, json, uid); 340 | } else if (isUIAF) { 341 | return await importOfUIAFJson(e, json, uid); 342 | } else { 343 | e.replyAt(`无法识别发送的JSON文件…`); 344 | return true; 345 | } 346 | } 347 | 348 | /** 导入UIAF格式的成就文件 */ 349 | async function importOfUIAFJson(e, json, uid) { 350 | if (!settings.importMethod.check(_method.COCO_GOAT)) { 351 | e.replyAt('从JSON导入成就已被禁用'); 352 | return true; 353 | } 354 | const { info, list } = json 355 | if (info.uiaf_version !== 'v1.1') { 356 | e.replyAt(`仅支持v1.1的UIAF文件…`); 357 | return 358 | } 359 | let userJsonName = `${uid}.json`; 360 | let { saveData, writeUserJson } = readUserJson(userJsonName); 361 | let saveDoneList = saveData.wonders_of_the_world; 362 | // 新增个数,重复个数 363 | let saveCount = 0, dupCount = 0; 364 | // 去除重复的 365 | let doneList = list || []; 366 | for (const achItem of doneList) { 367 | // ACHIEVEMENT_INVALID = 0; 368 | // ACHIEVEMENT_UNFINISHED = 1; 369 | // ACHIEVEMENT_FINISHED = 2; 370 | // ACHIEVEMENT_POINT_TAKEN = 3; 371 | if (![2, 3].includes(achItem.status)) continue; 372 | // 非天地万象的成就不处理 373 | if (!achievementsMap.has(achItem.id)) continue; 374 | if (saveDoneList.findIndex(i => i.id === achItem.id) !== -1) { 375 | dupCount++; 376 | } else { 377 | saveCount++; 378 | saveDoneList.push({ 379 | id: achItem.id, 380 | date: moment.unix(achItem.timestamp).format('YYYY/MM/DD'), 381 | status: achItem.status, 382 | }); 383 | } 384 | } 385 | writeUserJson(); 386 | e.replyAt(`成功识别到${doneList.length}个成就。\n「天地万象」中新增记录了${saveCount}个成就。\n你可发送“#成就查漏”来查看你尚未完成的成就。`); 387 | return true; 388 | } 389 | 390 | /** 从椰羊JSON导入 */ 391 | async function importOfCocoGoatJson(e, json, uid) { 392 | if (!settings.importMethod.check(_method.COCO_GOAT)) { 393 | e.replyAt('从椰羊导入成就已被禁用'); 394 | return true; 395 | } 396 | let userJsonName = `${uid}.json`; 397 | let { saveData, writeUserJson } = readUserJson(userJsonName); 398 | let saveDoneList = saveData.wonders_of_the_world; 399 | // 新增个数,重复个数 400 | let saveCount = 0, dupCount = 0; 401 | // 去除重复的 402 | let doneList = (json.value || {}).achievements || []; 403 | for (const achItem of doneList) { 404 | // 0 = 天地万象 405 | if (achItem.categoryId !== 0) continue; 406 | // status为空也视为未完成的成就 407 | if (!achItem.status) continue; 408 | if (saveDoneList.findIndex(i => i.id === achItem.id) !== -1) { 409 | dupCount++; 410 | } else { 411 | saveCount++; 412 | saveDoneList.push({ 413 | id: achItem.id, 414 | date: achItem.date, 415 | status: achItem.status, 416 | }); 417 | } 418 | } 419 | writeUserJson(); 420 | e.replyAt(`成功从椰羊识别到${doneList.length}个成就。\n「天地万象」中新增记录了${saveCount}个成就。\n你可发送“#成就查漏”来查看你尚未完成的成就。`); 421 | return true; 422 | } 423 | 424 | /** 对接椰羊的成就扫描 */ 425 | async function cocoGoatScanner(fileList, type, e) { 426 | return new Promise(async (resolve, reject) => { 427 | let browser = await browserInit(); 428 | if (!browser) { 429 | reject('puppeteer启动失败……'); 430 | return; 431 | } 432 | let page = await browser.newPage(); 433 | await page.goto('file:///' + path.join(_paths.templatePath, `import_${type}.html`)); 434 | // 监听椰羊发送的消息 435 | await page.evaluate(() => { 436 | window.addEventListener('message', (ev) => { 437 | if (ev && ev.data && ev.data.app === 'cocogoat.scanner.achievement') { 438 | console.log('YUNZAI_CONSOLE_EXCHANGE', ev.data); 439 | } 440 | }); 441 | }); 442 | let progressTimer 443 | let timeout = setTimeout(() => { 444 | reject('椰羊启动超时,请稍后重试……'); 445 | page.close(); 446 | }, 15000); 447 | // 监听页面的console,实现与页面的通讯 448 | page.on('console', async message => { 449 | // 约定的协议: 450 | // 1、console传的参数必须为2个 451 | // 2、第一个参数为标识,目前固定为 YUNZAI_CONSOLE_EXCHANGE 452 | // 3、第二个参数为携带的数据 453 | if (message && message.args().length === 2) { 454 | let [key, payload] = message.args(); 455 | key = await key.jsonValue(); 456 | if (key === 'YUNZAI_CONSOLE_EXCHANGE') { 457 | let json = await payload.jsonValue(); 458 | if (json) { 459 | let { event, data } = json; 460 | if (event === 'load') { 461 | // 椰羊加载完成,开始上传文件 462 | if (data === true) { 463 | clearInterval(timeout); 464 | let frame = page.frames()[1]; 465 | 466 | // // --- debug --- 467 | // let body = await frame.$('body'); 468 | // await frame.waitForTimeout(3000); 469 | // base64 = await body.screenshot({type: 'jpeg', encoding: 'base64',}); 470 | // if (base64) { 471 | // e.reply(['001', segment.image(`base64://${base64}`)]); 472 | // } 473 | 474 | // 获取 fileInput 475 | const inputEl = await frame.waitForSelector('#toki div.top input'); 476 | // uploadFile 上传图片 477 | await inputEl.uploadFile(...fileList); 478 | await frame.waitForTimeout(1000); 479 | 480 | // // --- debug --- 481 | // await frame.waitForTimeout(3000); 482 | // base64 = await body.screenshot({type: 'jpeg', encoding: 'base64',}); 483 | // if (base64) { 484 | // e.reply(['002', segment.image(`base64://${base64}`)]); 485 | // } 486 | 487 | // 获取“识别”按钮并点击 488 | const btnEl = await frame.waitForSelector('#toki div.top button'); 489 | await btnEl.click(); 490 | 491 | // // --- debug --- 492 | // await frame.waitForTimeout(3000); 493 | // base64 = await body.screenshot({type: 'jpeg', encoding: 'base64',}); 494 | // if (base64) { 495 | // e.reply(['003', segment.image(`base64://${base64}`)]); 496 | // } 497 | 498 | // 进度超时 499 | progressTimer = setTimeout(() => { 500 | if (type === _method.VIDEO) { 501 | reject('扫描超时,你可能使用了不完整的chrome,导致录屏扫描功能不可用,请发送“#成就帮助”来获取帮助。'); 502 | } else { 503 | reject('扫描超时,请稍后重试……'); 504 | } 505 | page.close(); 506 | }, 12000); 507 | } else if (data === false) { 508 | clearInterval(timeout); 509 | page.close(); 510 | reject('椰羊加载失败,请稍后重试……'); 511 | } 512 | } else if (event === 'progress') { 513 | // 扫描进度 514 | clearTimeout(progressTimer); 515 | } else if (event === 'result') { 516 | page.close(); 517 | // 扫描结果 518 | resolve(data); 519 | } else { 520 | // console.group(`--- 椰羊 ---`); 521 | // console.log(json); 522 | // console.groupEnd(); 523 | } 524 | } 525 | } 526 | } 527 | }); 528 | 529 | }); 530 | } 531 | -------------------------------------------------------------------------------- /apps/other.js: -------------------------------------------------------------------------------- 1 | import { exec } from 'child_process'; 2 | import { _paths } from '../utils/common.js'; 3 | import { getMapKey, waitMap } from '../utils/waitInput.js'; 4 | 5 | const _path = process.cwd(); 6 | 7 | export function install(app) { 8 | // #成就帮助 9 | app.register(/^#成就(帮助|help)/, help); 10 | // #成就插件更新 11 | // #成就插件强制更新 12 | // 主人命令 13 | app.register(/^#成就插件更新$/, updateWithGit, { isMaster: true }); 14 | } 15 | 16 | // 成就帮助 17 | export async function help(e) { 18 | let msg = '成就查漏帮助:https://docs.qq.com/doc/DWmVRSnRwRldzcm13'; 19 | if (e.isMaster) { 20 | msg += '\n主人帮助:https://docs.qq.com/doc/DWktCdVJsWmFybUpi'; 21 | } 22 | e.reply(msg); 23 | return true; 24 | } 25 | 26 | let timer; 27 | 28 | // 更新 29 | // 代码借鉴:miao-plugin 30 | export async function updateWithGit(e) { 31 | let isForce = e.msg.includes('强制'); 32 | let command = 'git pull'; 33 | if (isForce) { 34 | command = 'git checkout . && git pull'; 35 | e.reply('正在执行强制更新操作,请稍等'); 36 | } else { 37 | e.reply('正在执行更新操作,请稍等'); 38 | } 39 | exec(command, { cwd: _paths.pluginsPath }, function (error, stdout, stderr) { 40 | //console.log(stdout); 41 | if (/Already up[ -]to[ -]date/.test(stdout)) { 42 | e.reply('目前已经是最新版了~'); 43 | return true; 44 | } 45 | if (error) { 46 | e.reply('更新失败!\nError code: ' + error.code + '\n' + error.stack + '\n 请稍后重试。'); 47 | return true; 48 | } 49 | e.reply('更新成功,尝试重新启动Yunzai以应用更新...'); 50 | timer && clearTimeout(timer); 51 | redis.set('zolay:restart-msg', JSON.stringify({ 52 | msg: '重启成功,新版成就查漏Plugin已经生效~', 53 | qq: e.user_id, 54 | }), { EX: 30 }); 55 | timer = setTimeout(function () { 56 | let command = 'npm run restart'; 57 | exec(command, function (error, stdout, stderr) { 58 | if (error) { 59 | if (/Yunzai not found/.test(error)) { 60 | e.reply('自动重启失败,请手动重启以应用插件。请使用 npm run start 命令启动Yunzai-Bot'); 61 | } else { 62 | e.reply('重启失败!\nError code: ' + error.code + '\n' + error.stack + '\n 请稍后重试。'); 63 | } 64 | return true; 65 | } 66 | }); 67 | }, 1000); 68 | 69 | }); 70 | return true; 71 | } 72 | 73 | export async function waitInputCheck(e, ...args) { 74 | for (let [mapKey, wait] of waitMap.entries()) { 75 | let originKey = wait.originKey; 76 | if (mapKey !== getMapKey(e, originKey)) { 77 | continue; 78 | } 79 | if (typeof wait.checkFn === 'function') { 80 | let flag = await wait.checkFn(e, ...args); 81 | if (flag) { 82 | clearWait(mapKey, wait); 83 | return true; 84 | } 85 | } else if (typeof wait.checkFn.test === 'function') { 86 | let flag = wait.checkFn.test(e.msg); 87 | if (flag) { 88 | clearWait(mapKey, wait); 89 | let res = await wait.successCb(e); 90 | if (res) { 91 | return true; 92 | } 93 | } 94 | } 95 | } 96 | } 97 | 98 | function clearWait(key, wait) { 99 | waitMap.delete(key); 100 | clearTimeout(wait.timer); 101 | } 102 | -------------------------------------------------------------------------------- /apps/search.js: -------------------------------------------------------------------------------- 1 | import { achievementsMap } from '../utils/common.js'; 2 | import { NO_INSTALLATION, renderStatistics } from './statistics.js'; 3 | 4 | export function install(app) { 5 | // #成就查询xxx 6 | // 可以模糊搜索成就 7 | app.register(/^#成就(查询|搜索|查找)(.*)$/, achSearch); 8 | } 9 | 10 | /** 模糊搜索成就 */ 11 | export async function achSearch(e, c, reg) { 12 | let match = e.msg.match(reg) 13 | let keyword = (match[2] || '').trim() 14 | keyword = keyword.match(/(\D*)\d{0,2}/)[1] 15 | if (!keyword) { 16 | e.replyAt(`请输入要查询的关键词,如:#成就查询食神`); 17 | return true; 18 | } 19 | let list = [] 20 | for (const achItem of achievementsMap.values()) { 21 | // 过滤未实装的成就 22 | if (NO_INSTALLATION.includes(achItem.id)) continue; 23 | if (achItem.id.toString() === keyword || achItem.name.includes(keyword) || achItem.desc.includes(keyword)) { 24 | list.push(achItem) 25 | } 26 | } 27 | if (list.length === 0) { 28 | e.replyAt(`没有找到“${keyword}”相关成就`); 29 | return true; 30 | } 31 | let img = await renderStatistics('-', e, c, list, { 32 | showTopInfo: false, 33 | }) 34 | if (img) { 35 | e.replyAt([`查询到了以下成就:\n`, img]); 36 | } else { 37 | e.replyAt(`查询到了以下成就:\n${list.map(i => `${i.id} ${i.name}`).join('\n')}`); 38 | } 39 | return true; 40 | } -------------------------------------------------------------------------------- /apps/settings.js: -------------------------------------------------------------------------------- 1 | import { waitInputAt } from '../utils/waitInput.js'; 2 | import { _version, settings } from "../utils/common.js"; 3 | 4 | export function install(app) { 5 | const con = { isMaster: true } 6 | 7 | app.register(/^#成就配置$/, getSettings, { ...con }); 8 | app.register(/^#成就配置录入(启用|禁用)(.+)$/, updateImportMethod, { ...con }); 9 | 10 | app.register(/^#成就配置(开启|启用)代理$/, bindUS('system.enableProxy', true), { ...con }); 11 | app.register(/^#成就配置(关闭|禁用)代理$/, bindUS('system.enableProxy', false), { ...con }); 12 | 13 | app.register(/^#成就配置(重置|重新配置)$/, resetSettings, { ...con }); 14 | } 15 | 16 | function getSettings(e) { 17 | let msg = []; 18 | msg.push(`欢迎使用成就查漏插件${_version}\n`); 19 | msg.push("当前配置如下:"); 20 | msg.push("- 成就录入方式:"); 21 | for (const [key, value] of Object.entries(settings.importMethod.value)) { 22 | let text = settings.getText(`importMethod.${key}`); 23 | msg.push(` - ${text}:${value ? "已启用" : "已禁用"}`); 24 | } 25 | msg.push(`\n你可以使用“#成就配置录入[启用|禁用][方式]”来开关成就录入方式。\n例:#成就配置录入启用录屏`); 26 | e.reply(msg.join("\n")); 27 | return true; 28 | } 29 | 30 | function updateImportMethod(e, c, reg) { 31 | let [, action, method] = e.msg.match(reg); 32 | let key = settings.getPathByText(method); 33 | if (!key) { 34 | e.reply(`未知的成就录入方式:${method}`); 35 | return true; 36 | } 37 | settings.setAndSave(key, action === "启用"); 38 | e.reply(`成就录入方式“${method}”已${action}`); 39 | return true; 40 | } 41 | 42 | /** 43 | * 绑定更新配置的方法 44 | * @param kp key path 45 | * @param nv new value 46 | */ 47 | function bindUS(kp, nv) { 48 | return function (e, c, reg) { 49 | try { 50 | settings.setAndSave(kp, nv); 51 | e.replyAt('操作成功'); 52 | return true 53 | } catch (e) { 54 | e.replyAt('操作失败:' + e?.message ?? (e ?? '未知错误')); 55 | console.error(e) 56 | return false 57 | } 58 | } 59 | } 60 | 61 | /** 重新配置成就插件 */ 62 | function resetSettings(e) { 63 | waitInputAt(e, { 64 | key: `ach-reset-settings-${e.user_id}`, 65 | message: `确定要重置成就插件的配置项吗?\n请发送“确定”继续,或者发送其他任意内容取消。`, 66 | timeout: 12000, 67 | checkFn: (e) => { 68 | if (/^(确定|是|[Yy](es)?)$/.test((e.msg || '').trim())) { 69 | settings.reset(); 70 | e.replyAt('重置成功,所有配置项已恢复为默认值。'); 71 | } else { 72 | e.replyAt('已取消重置'); 73 | } 74 | return true; 75 | }, 76 | timeoutCb: () => e.replyAt('输入超时,请重试。'), 77 | }) 78 | return true; 79 | } 80 | -------------------------------------------------------------------------------- /apps/statistics.js: -------------------------------------------------------------------------------- 1 | import fs from 'fs'; 2 | import path from 'path'; 3 | import Page from '../models/Page.js'; 4 | import { _paths, achievementsMap, getMysApi, readUserJson } from '../utils/common.js'; 5 | import { waitInputAt } from '../utils/waitInput.js'; 6 | import { dynamicImport, isV2 } from '../version/getVersion.js'; 7 | 8 | const { default: MysInfo } = await dynamicImport('', '../../genshin/model/mys/mysInfo.js'); 9 | 10 | export function install(app) { 11 | // #成就查漏 12 | // 可以根据已经识别的成就生成未完成的成就列表 13 | app.register(/^#成就(查漏|统计)/, actStatistics); 14 | // #成就重置 15 | // 强制重置自己的成就 16 | app.register(/^#成就(重置|重新配置|清空)$/, achReset); 17 | } 18 | 19 | // 成就查漏功能 20 | export async function actStatistics(e, c) { 21 | let MysApi = await getMysApi(e); 22 | if (!MysApi) return true; 23 | let uid = MysApi.targetUid; 24 | if (!uid) { 25 | e.replyAt('请先绑定uid'); 26 | return true; 27 | } 28 | let userJsonName = `${uid}.json`; 29 | let { saveData } = readUserJson(userJsonName); 30 | // 目前仅支持【天地万象】 31 | let doneList = saveData.wonders_of_the_world; 32 | if (doneList.length === 0) { 33 | e.replyAt('你尚未录入任何成就,无法使用成就查漏功能,请发送“#成就帮助”来查看录入方法'); 34 | return true; 35 | } 36 | // 遍历未完成的成就 37 | let list = []; 38 | for (const [id, achievement] of achievementsMap.entries()) { 39 | // 过滤未实装的成就 40 | if (NO_INSTALLATION.includes(id)) continue; 41 | if (achievement.preStage != null) continue; 42 | if (doneList.findIndex(i => i.id === achievement.id) === -1) { 43 | list.push(achievement); 44 | } 45 | } 46 | if (list.length === 0) { 47 | e.replyAt('恭喜你已经完成了「天地万象」中所有的成就了!'); 48 | return true; 49 | } 50 | let img = await renderStatistics(uid, e, c, list, { 51 | ...(await getAchievementInfo(e, MysApi)), 52 | }); 53 | if (img) { 54 | e.replyAt([`在「天地万象」中你还有 ${list.length} 个成就未完成,详情见下图`, img]); 55 | } else { 56 | e.replyAt('图片渲染失败……'); 57 | } 58 | return true; 59 | } 60 | 61 | export async function renderStatistics(uid, e, { render }, list, renderOptions) { 62 | let pageNum = 1; 63 | let page = new Page(list, pageNum, 30); 64 | let patten = /.+[^\d](\d+)$/; 65 | if (patten.test(e.msg)) { 66 | pageNum = Number.parseInt(e.msg.match(patten)[1]); 67 | if (pageNum < 1) { 68 | page.pageNum = 1; 69 | } else if (pageNum > page.maxNum) { 70 | page.pageNum = page.maxNum; 71 | } else { 72 | page.pageNum = pageNum; 73 | } 74 | } 75 | // 算出内容区域高度 76 | let topHeight = 202; 77 | let bottomHeight = 228; 78 | let middleHeight = (Math.round(116.8 * page.records.length) + 150) - (topHeight + bottomHeight); 79 | let img = await render('statistics', { 80 | save_id: uid, 81 | page, 82 | middleHeight: middleHeight < 0 ? 0 : middleHeight, 83 | uid, 84 | user_id: e.user_id, 85 | name: e.sender.card.replace(uid, '').trim(), 86 | pageInfo: `第 ${page.pageNum} / ${page.maxNum} 页`, 87 | // 是否显示顶部的成就数量 88 | showTopInfo: true, 89 | ...renderOptions, 90 | }); 91 | if (img) { 92 | return img; 93 | } else { 94 | e.replyAt('图片渲染失败……'); 95 | return null; 96 | } 97 | } 98 | 99 | /** 未实装的成就列表 */ 100 | export const NO_INSTALLATION = [ 101 | // 测试数据 102 | 84027, 103 | // 绀田祟神 104 | 81101, 105 | // 在提瓦特寻求昭和七四式是不是搞错了什么? 106 | 81102, 107 | // 狸猫的报恩 108 | 81103, 109 | // 丽影萍踪 110 | 81107, 111 | // 「第七个武士」 112 | 81110, 113 | // 谁打碎了我的陶罐 114 | 81126, 115 | // 戳穿绀田传助的谎言 116 | 81127, 117 | // 她的愿望 118 | 81128, 119 | // 为了未来的鸣神… 120 | 81129, 121 | // 「我有金钟罩♬」 122 | 82016, 123 | // 善事有善报 124 | 84517, 125 | // 未曾设想的味道 126 | 84521, 127 | ]; 128 | 129 | export async function achReset(e) { 130 | let MysApi = await getMysApi(e); 131 | if (!MysApi) return true; 132 | let uid = MysApi.targetUid; 133 | if (!uid) { 134 | e.replyAt('请先绑定uid'); 135 | return true; 136 | } 137 | waitInputAt(e, { 138 | key: `ach-reset-${e.user_id}`, 139 | message: `确定要清空你录入的所有成就吗?此操作不可逆,请谨慎操作!\n请发送“确定”继续,或者发送其他任意内容取消。`, 140 | timeout: 12000, 141 | checkFn: (e) => { 142 | if (/^(确定|是|[Yy](es)?)$/.test((e.msg || '').trim())) { 143 | let userJsonFile = path.join(_paths.userDataPath, `${uid}.json`); 144 | if (fs.existsSync(userJsonFile)) { 145 | fs.unlinkSync(userJsonFile); 146 | } 147 | e.replyAt('已成功清空所有录入的成就'); 148 | } else { 149 | e.replyAt('已取消重置'); 150 | } 151 | return true; 152 | }, 153 | timeoutCb: () => e.replyAt('输入超时,请重试。'), 154 | }); 155 | return true; 156 | } 157 | 158 | /* 获取用户的成就信息 */ 159 | async function getAchievementInfo(e, MysApi) { 160 | // 不输出错误 161 | const oldReply = e.reply 162 | e.reply = () => void 0 163 | // 【兼容写法】 164 | let res; 165 | if (isV2) { 166 | res = await MysApi.getIndex(); 167 | } else { 168 | res = await MysInfo.get(e, 'index'); 169 | if (res) res = res.data; 170 | } 171 | e.reply = oldReply 172 | 173 | if (!res?.stats) { 174 | return {} 175 | } 176 | return { 177 | achievement_number: res.stats.achievement_number 178 | }; 179 | } 180 | -------------------------------------------------------------------------------- /guoba.support.js: -------------------------------------------------------------------------------- 1 | import path from 'path' 2 | import {_paths, settings} from './utils/common.js' 3 | 4 | // 支持锅巴 5 | export function supportGuoba() { 6 | return { 7 | // 插件信息,将会显示在前端页面 8 | // 如果你的插件没有在插件库里,那么需要填上补充信息 9 | // 如果存在的话,那么填不填就无所谓了,填了就以你的信息为准 10 | pluginInfo: { 11 | name: 'achievements-plugin', 12 | title: '成就插件', 13 | author: '@zolay-poi', 14 | authorLink: 'https://github.com/zolay-poi', 15 | link: 'https://github.com/zolay-poi/achievements-plugin', 16 | isV2: true, isV3: true, 17 | description: '提供成就查漏、成就查询等功能', 18 | // 显示图标,此为个性化配置 19 | // 图标可在 https://icon-sets.iconify.design 这里进行搜索 20 | icon: 'ph:balloon-duotone', 21 | // 图标颜色,例:#FF0000 或 rgb(255, 0, 0) 22 | iconColor: '#1769aa', 23 | // 如果想要显示成图片,也可以填写图标路径(绝对路径) 24 | iconPath: path.join(_paths.resourcesPath, 'images/icon.png'), 25 | }, 26 | // 配置项信息 27 | configInfo: { 28 | // 配置项 schemas 29 | schemas: [ 30 | { 31 | field: 'importMethod.cocoGoat', 32 | label: '启用椰羊', 33 | bottomHelpMessage: '是否可以从椰羊导入成就数据(推荐开启)', 34 | // 组件类型,可参考 https://vvbin.cn/doc-next/components/introduction.html 35 | component: 'Switch', 36 | }, 37 | { 38 | field: 'importMethod.image', 39 | label: '启用截图', 40 | bottomHelpMessage: '是否可以通过识别截图导入成就数据(服务器性能不高不建议开)', 41 | component: 'Switch', 42 | }, 43 | { 44 | field: 'importMethod.video', 45 | label: '启用录屏', 46 | bottomHelpMessage: '是否可以通过识别录屏导入成就数据(服务器性能不高不建议开)', 47 | component: 'Switch', 48 | }, 49 | { 50 | field: 'importMethod.input', 51 | label: '启用手动录入', 52 | bottomHelpMessage: '是否可以通过手动录入成就ID的方法录入成就(推荐开启)', 53 | component: 'Switch', 54 | }, 55 | { 56 | field: 'system.enableProxy', 57 | label: '启用代理', 58 | helpMessage:'具体代理地址请去本体的 bot.yaml 中设置 proxyAddress', 59 | bottomHelpMessage: '当文件访问失败时,可开启代理', 60 | component: 'Switch', 61 | }, 62 | ], 63 | // 获取配置数据方法(用于前端填充显示数据) 64 | getConfigData() { 65 | return settings.$source 66 | }, 67 | // 设置配置的方法(前端点确定后调用的方法) 68 | setConfigData(data, {Result}) { 69 | for (let [keyPath, value] of Object.entries(data)) { 70 | settings.set(keyPath, value) 71 | } 72 | settings.save() 73 | return Result.ok({}, '保存成功~') 74 | }, 75 | }, 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | import { isV2 } from './version/getVersion.js'; 2 | 3 | if (!global.segment) { 4 | global.segment = (await import("oicq")).segment 5 | } 6 | 7 | const apps = {}; 8 | const rule = {}; 9 | 10 | let v2, v3; 11 | 12 | if (isV2) { 13 | // 2.x 版本 14 | v2 = await import(`./version/2x.js`); 15 | Object.assign(rule, v2.rule); 16 | } else { 17 | // 3.x 版本 18 | v3 = await import(`./version/3x.js`); 19 | Object.assign(apps, v3); 20 | } 21 | 22 | /** 23 | * v2 的方法,要显式定义并导出,所以这里写一个中转方法,v3中不处理,v2中中转 24 | * 也就是说如果你的插件导出的方法很多的话,每个都需要中转一下~ 25 | * @param fnName 方法名 26 | */ 27 | function bindV2Func(fnName) { 28 | if (!v2) return; 29 | let fn = v2[fnName]; 30 | if (typeof fn === 'function') { 31 | return function(...args) { 32 | return fn(...args); 33 | }; 34 | } 35 | } 36 | 37 | // 使用方式参考此处: 38 | export const achRouter = bindV2Func('achRouter'); 39 | export const waitInputCheck = bindV2Func('waitInputCheck'); 40 | 41 | export { apps, rule }; 42 | -------------------------------------------------------------------------------- /models/Page.js: -------------------------------------------------------------------------------- 1 | /** 分页类 */ 2 | export default class Page { 3 | 4 | constructor(list, pageNum, pageSize) { 5 | this.$list = list; 6 | this.$pageNum = pageNum; 7 | this.$pageSize = pageSize; 8 | } 9 | 10 | get pageNum() { 11 | return this.$pageNum; 12 | } 13 | 14 | set pageNum(pageNum) { 15 | this.$pageNum = pageNum; 16 | } 17 | 18 | get pageSize() { 19 | return this.$pageSize; 20 | } 21 | 22 | set pageSize(pageSize) { 23 | this.$pageSize = pageSize; 24 | } 25 | 26 | /** 根据当前分页条件,计算出的数据 */ 27 | get records() { 28 | return [...this.$list].splice(this.offset, this.$pageSize); 29 | } 30 | 31 | /** 计算当前分页偏移量 */ 32 | get offset() { 33 | let current = this.$pageNum; 34 | if (current <= 1) { 35 | return 0; 36 | } 37 | return Math.max((current - 1) * this.$pageSize, 0); 38 | } 39 | 40 | /** 最大页码 */ 41 | get maxNum() { 42 | return Math.ceil(this.total / this.$pageSize); 43 | } 44 | 45 | /** 总行数 */ 46 | get total() { 47 | return this.$list.length; 48 | } 49 | 50 | } 51 | -------------------------------------------------------------------------------- /models/Settings.js: -------------------------------------------------------------------------------- 1 | import fs from "fs"; 2 | import lodash from "lodash"; 3 | import { _paths } from "../utils/common.js"; 4 | 5 | /** 配置类 */ 6 | export default class Settings { 7 | 8 | constructor() { 9 | this.$source = this.read(); 10 | } 11 | 12 | get importMethod() { 13 | let value = this.get("importMethod"); 14 | let enabled = []; 15 | for (const [method, isEnable] of Object.entries(value)) { 16 | if (isEnable) { 17 | enabled.push({ 18 | method, 19 | text: this.getText(`importMethod.${method}`), 20 | humanText: this.getText(`importMethod.${method}`, true), 21 | }); 22 | } 23 | } 24 | return { 25 | value, 26 | enabled, 27 | check: (method) => enabled.findIndex(e => e.method === method) !== -1, 28 | } 29 | } 30 | 31 | get(path) { 32 | return lodash.get(this.$source, path); 33 | } 34 | 35 | set(path, value) { 36 | return lodash.set(this.$source, path, value); 37 | } 38 | 39 | setAndSave(path, value) { 40 | this.set(path, value); 41 | this.save(); 42 | } 43 | 44 | /** 45 | * 通过path获取text 46 | * @param path 配置路径 47 | * @param humanize 是否显示人性化文本 48 | */ 49 | getText(path, humanize = false) { 50 | let preset = SETTINGS_PRESET.find(item => item.path === path); 51 | if (preset) { 52 | return preset[humanize ? "humanText" : "text"]; 53 | } 54 | return path; 55 | } 56 | 57 | // 通过 text 获取 path 58 | getPathByText(text) { 59 | let preset = SETTINGS_PRESET.find(item => item.text === text); 60 | if (preset) { 61 | return preset.path; 62 | } 63 | return text; 64 | } 65 | 66 | /** 读取配置 */ 67 | read() { 68 | if (!fs.existsSync(_paths.settingsPath)) { 69 | initSettingsJson(); 70 | } 71 | let text = fs.readFileSync(_paths.settingsPath, "utf8"); 72 | let json = JSON.parse(text); 73 | return lodash.merge({}, DEFAULT_SETTINGS, json); 74 | } 75 | 76 | save() { 77 | saveSettings(this.$source); 78 | } 79 | 80 | // 初始化配置文件 81 | reset() { 82 | initSettingsJson(); 83 | this.$source = this.read() 84 | } 85 | 86 | } 87 | 88 | export const _method = { 89 | COCO_GOAT: 'cocoGoat', 90 | IMAGE: 'image', 91 | VIDEO: 'video', 92 | INPUT: 'input', 93 | }; 94 | 95 | /** 配置文件预设 */ 96 | const SETTINGS_PRESET = [ 97 | { path: `importMethod.${_method.COCO_GOAT}`, def: true, text: "椰羊", humanText: "椰羊JSON", desc: "椰羊JSON文件" }, 98 | { path: `importMethod.${_method.IMAGE}`, def: true, text: "截图", humanText: "成就截图", desc: "截图文件" }, 99 | { path: `importMethod.${_method.VIDEO}`, def: false, text: "录屏", humanText: "录屏文件", desc: "录屏文件" }, 100 | { path: `importMethod.${_method.INPUT}`, def: true, text: "手动", humanText: "手动输入成就ID", desc: "手动输入成就ID" }, 101 | 102 | { path: `system.enableProxy`, def: false, text: "启用代理", humanText: "启用代理", desc: "启用代理" }, 103 | ]; 104 | 105 | /** 默认配置 */ 106 | const DEFAULT_SETTINGS = (() => { 107 | let res = {}; 108 | for (const item of SETTINGS_PRESET) { 109 | lodash.set(res, item.path, item.def); 110 | } 111 | return res; 112 | })(); 113 | 114 | function initSettingsJson() { 115 | saveSettings(DEFAULT_SETTINGS); 116 | } 117 | 118 | function saveSettings(settings) { 119 | if (!fs.existsSync(_paths.userDataPath)) { 120 | fs.mkdirSync(_paths.userDataPath); 121 | } 122 | fs.writeFileSync(_paths.settingsPath, JSON.stringify(settings, null, 2)); 123 | } 124 | -------------------------------------------------------------------------------- /resources/achievements/wonders_of_the_world.json: -------------------------------------------------------------------------------- 1 | { 2 | "_id": 0, 3 | "id": "wonders_of_the_world", 4 | "name": "天地万象", 5 | "order": 1, 6 | "achievements": [ 7 | { 8 | "id": 80091, 9 | "name": "妖鬼狂言百物语", 10 | "desc": "集齐全套《鹮巷物语》。", 11 | "reward": 5, 12 | "hidden": true, 13 | "order": 92 14 | }, 15 | { 16 | "id": 80127, 17 | "name": "动物园大亨", 18 | "desc": "使用道具「四方八方之网」捕获1只野外生物。", 19 | "reward": 5, 20 | "hidden": false, 21 | "order": 127 22 | }, 23 | { 24 | "id": 80128, 25 | "name": "动物园大亨", 26 | "desc": "使用道具「四方八方之网」捕获30只野外生物。", 27 | "reward": 10, 28 | "hidden": false, 29 | "order": 128, 30 | "preStage": 80127 31 | }, 32 | { 33 | "id": 80129, 34 | "name": "动物园大亨", 35 | "desc": "使用道具「四方八方之网」捕获100只野外生物。", 36 | "reward": 20, 37 | "hidden": false, 38 | "order": 129, 39 | "preStage": 80128 40 | }, 41 | { 42 | "id": 80142, 43 | "name": "昨日重现", 44 | "desc": "通过「千籁至音」系列摆设在尘歌壶内激活10首旋律。", 45 | "reward": 5, 46 | "hidden": false, 47 | "order": 142 48 | }, 49 | { 50 | "id": 80143, 51 | "name": "昨日重现", 52 | "desc": "通过「千籁至音」系列摆设在尘歌壶内激活30首旋律。", 53 | "reward": 10, 54 | "hidden": false, 55 | "order": 143, 56 | "preStage": 80142 57 | }, 58 | { 59 | "id": 80144, 60 | "name": "昨日重现", 61 | "desc": "通过「千籁至音」系列摆设在尘歌壶内激活60首旋律。", 62 | "reward": 20, 63 | "hidden": false, 64 | "order": 144, 65 | "preStage": 80143 66 | }, 67 | { 68 | "id": 81000, 69 | "name": "俯瞰风景", 70 | "desc": "抵达庆云顶的制高点。", 71 | "reward": 5, 72 | "hidden": true, 73 | "order": 1000 74 | }, 75 | { 76 | "id": 81001, 77 | "name": "烈风的遗骨", 78 | "desc": "登上风龙废墟的高塔顶端。", 79 | "reward": 5, 80 | "hidden": true, 81 | "order": 1001 82 | }, 83 | { 84 | "id": 81002, 85 | "name": "「风带来了故事的种子…」", 86 | "desc": "到达蒙德东北方的无名小岛。", 87 | "reward": 5, 88 | "hidden": true, 89 | "order": 1002 90 | }, 91 | { 92 | "id": 81003, 93 | "name": "矢志不渝", 94 | "desc": "开启爱心形石阵中央的宝箱。", 95 | "reward": 5, 96 | "hidden": true, 97 | "order": 1003 98 | }, 99 | { 100 | "id": 81004, 101 | "name": "启动跃迁引擎!", 102 | "desc": "穿越誓言岬上空的时空隧道。", 103 | "reward": 5, 104 | "hidden": true, 105 | "order": 1004 106 | }, 107 | { 108 | "id": 81005, 109 | "name": "风神的宠儿", 110 | "desc": "在蒙德城内的神像手中坐下。", 111 | "reward": 5, 112 | "hidden": true, 113 | "order": 1005 114 | }, 115 | { 116 | "id": 81010, 117 | "name": "冢里最好的剑", 118 | "desc": "解开剑冢的三层封印。", 119 | "reward": 5, 120 | "hidden": true, 121 | "order": 1010 122 | }, 123 | { 124 | "id": 81014, 125 | "name": "华清归藏密宫", 126 | "desc": "循着长存者之迹,叩开了秘境之门。", 127 | "reward": 5, 128 | "hidden": true, 129 | "order": 1014 130 | }, 131 | { 132 | "id": 81015, 133 | "name": "塞西莉亚苗圃", 134 | "desc": "帮助仙灵归位,解锁奔狼领内的秘境入口。", 135 | "reward": 5, 136 | "hidden": true, 137 | "order": 1015 138 | }, 139 | { 140 | "id": 81016, 141 | "name": "无妄引咎密宫", 142 | "desc": "跟随仙灵点燃火光,解锁无妄坡内的秘境入口。", 143 | "reward": 5, 144 | "hidden": true, 145 | "order": 1016 146 | }, 147 | { 148 | "id": 81017, 149 | "name": "「只要用心…」", 150 | "desc": "烹饪1道口味奇怪的料理。", 151 | "reward": 5, 152 | "hidden": true, 153 | "order": 1017 154 | }, 155 | { 156 | "id": 81018, 157 | "name": "「…人人都是食神。」", 158 | "desc": "烹饪10道口味奇怪的料理。", 159 | "reward": 5, 160 | "hidden": true, 161 | "order": 1018 162 | }, 163 | { 164 | "id": 81019, 165 | "name": "十岁差点打倒野猪", 166 | "desc": "被野猪击败。", 167 | "reward": 5, 168 | "hidden": true, 169 | "order": 1019 170 | }, 171 | { 172 | "id": 81020, 173 | "name": "金牌飞行执照", 174 | "desc": "一次滑翔很远、很远的距离。", 175 | "reward": 10, 176 | "hidden": true, 177 | "order": 1020 178 | }, 179 | { 180 | "id": 81021, 181 | "name": "「在空中飞行程度的能力」", 182 | "desc": "持续滑翔超过80秒。", 183 | "reward": 10, 184 | "hidden": true, 185 | "order": 1021 186 | }, 187 | { 188 | "id": 81022, 189 | "name": "如光似电", 190 | "desc": "持续冲刺或使用替代冲刺的能力,移动15秒。", 191 | "reward": 10, 192 | "hidden": true, 193 | "order": 1022 194 | }, 195 | { 196 | "id": 81023, 197 | "name": "朋友遍天下", 198 | "desc": "在冒险中,与各种各样的人相识。", 199 | "reward": 10, 200 | "hidden": true, 201 | "order": 1023 202 | }, 203 | { 204 | "id": 81024, 205 | "name": "威遍风土", 206 | "desc": "蒙德的声望等级达到8级。", 207 | "reward": 20, 208 | "hidden": false, 209 | "order": 1024 210 | }, 211 | { 212 | "id": 81025, 213 | "name": "名震云来", 214 | "desc": "璃月的声望等级达到8级。", 215 | "reward": 20, 216 | "hidden": false, 217 | "order": 1025 218 | }, 219 | { 220 | "id": 80092, 221 | "name": "布武雷国", 222 | "desc": "稻妻的声望等级达到10级。", 223 | "reward": 20, 224 | "hidden": true, 225 | "order": 1026 226 | }, 227 | { 228 | "id": 81026, 229 | "name": "QUEST CLEAR", 230 | "desc": "完成10次「讨伐悬赏」。", 231 | "reward": 5, 232 | "hidden": false, 233 | "order": 1027 234 | }, 235 | { 236 | "id": 81027, 237 | "name": "QUEST CLEAR", 238 | "desc": "完成20次「讨伐悬赏」。", 239 | "reward": 10, 240 | "hidden": false, 241 | "order": 1028, 242 | "preStage": 81026 243 | }, 244 | { 245 | "id": 81028, 246 | "name": "QUEST CLEAR", 247 | "desc": "完成30次「讨伐悬赏」。", 248 | "reward": 20, 249 | "hidden": false, 250 | "order": 1029, 251 | "preStage": 81027 252 | }, 253 | { 254 | "id": 81029, 255 | "name": "见习勇者", 256 | "desc": "完成10次「居民请求」。", 257 | "reward": 5, 258 | "hidden": false, 259 | "order": 1030 260 | }, 261 | { 262 | "id": 81030, 263 | "name": "见习勇者", 264 | "desc": "完成20次「居民请求」。", 265 | "reward": 10, 266 | "hidden": false, 267 | "order": 1031, 268 | "preStage": 81029 269 | }, 270 | { 271 | "id": 81031, 272 | "name": "见习勇者", 273 | "desc": "完成30次「居民请求」。", 274 | "reward": 20, 275 | "hidden": false, 276 | "order": 1032, 277 | "preStage": 81030 278 | }, 279 | { 280 | "id": 81032, 281 | "name": "QUEST FAILED", 282 | "desc": "跟丢了悬赏目标…", 283 | "reward": 5, 284 | "hidden": true, 285 | "order": 1033 286 | }, 287 | { 288 | "id": 81033, 289 | "name": "多冷的隆冬", 290 | "desc": "因为严寒而倒下…", 291 | "reward": 5, 292 | "hidden": true, 293 | "order": 1034 294 | }, 295 | { 296 | "id": 81034, 297 | "name": "祭司、公主与记事者", 298 | "desc": "获得雪葬之都的宝物。", 299 | "reward": 5, 300 | "hidden": true, 301 | "order": 1035 302 | }, 303 | { 304 | "id": 81035, 305 | "name": "逆子的归乡", 306 | "desc": "循着过去的考察队中某人的路径,抵达他启程返乡的地方。", 307 | "reward": 5, 308 | "hidden": true, 309 | "order": 1036 310 | }, 311 | { 312 | "id": 81036, 313 | "name": "千年雪藏的事", 314 | "desc": "了解过去一支雪山考察队的结局。", 315 | "reward": 5, 316 | "hidden": true, 317 | "order": 1037 318 | }, 319 | { 320 | "id": 81037, 321 | "name": "冰冷的钢铁", 322 | "desc": "获得星银铸造的古代武器。", 323 | "reward": 5, 324 | "hidden": true, 325 | "order": 1038 326 | }, 327 | { 328 | "id": 81038, 329 | "name": "无果的远征", 330 | "desc": "发现很多遗迹机器的遗骸…", 331 | "reward": 5, 332 | "hidden": true, 333 | "order": 1039 334 | }, 335 | { 336 | "id": 81039, 337 | "name": "没能讲出的故事", 338 | "desc": "在意想不到之处,结识了意想不到的朋友。", 339 | "reward": 5, 340 | "hidden": true, 341 | "order": 1040 342 | }, 343 | { 344 | "id": 81040, 345 | "name": "一览众山小", 346 | "desc": "抵达龙脊雪山的最高峰。", 347 | "reward": 5, 348 | "hidden": true, 349 | "order": 1041 350 | }, 351 | { 352 | "id": 81041, 353 | "name": "一个冬天的童话", 354 | "desc": "在雪堆下发现了冰晶蝶。", 355 | "reward": 5, 356 | "hidden": true, 357 | "order": 1042 358 | }, 359 | { 360 | "id": 81042, 361 | "name": "猎人变成了猎物", 362 | "desc": "被大雪猪王击败。", 363 | "reward": 5, 364 | "hidden": true, 365 | "order": 1043 366 | }, 367 | { 368 | "id": 81043, 369 | "name": "冷静点!", 370 | "desc": "击败处于狂暴状态下的大雪猪王。", 371 | "reward": 5, 372 | "hidden": true, 373 | "order": 1044 374 | }, 375 | { 376 | "id": 81044, 377 | "name": "「一口吃掉了几十万摩拉!」", 378 | "desc": "掌握「稠汁蔬菜炖肉」的制作方法。", 379 | "reward": 5, 380 | "hidden": true, 381 | "order": 1045 382 | }, 383 | { 384 | "id": 81045, 385 | "name": "天雷圣裁", 386 | "desc": "被落雷击中。", 387 | "reward": 5, 388 | "hidden": true, 389 | "order": 1046 390 | }, 391 | { 392 | "id": 81046, 393 | "name": "接近天空的地方…", 394 | "desc": "登上复原后的寒天之钉。", 395 | "reward": 5, 396 | "hidden": true, 397 | "order": 1047 398 | }, 399 | { 400 | "id": 81047, 401 | "name": "嬗变核素", 402 | "desc": "利用「参量质变仪」,完成一次物质质变。", 403 | "reward": 5, 404 | "hidden": false, 405 | "order": 1048 406 | }, 407 | { 408 | "id": 81048, 409 | "name": "…你其实听得见吧?", 410 | "desc": "派蒙也会累的。", 411 | "reward": 5, 412 | "hidden": true, 413 | "order": 1049 414 | }, 415 | { 416 | "id": 81074, 417 | "name": "哟嚯嚯,再来瓶蒲公英酒", 418 | "desc": "登上「浪船」。", 419 | "reward": 5, 420 | "hidden": true, 421 | "order": 1075 422 | }, 423 | { 424 | "id": 81075, 425 | "name": "「乘风破浪真君」", 426 | "desc": "持续搭乘「浪船」达到一定时间。", 427 | "reward": 5, 428 | "hidden": true, 429 | "order": 1076 430 | }, 431 | { 432 | "id": 81076, 433 | "name": "Nice boat!", 434 | "desc": "与其他玩家交换「浪船」。", 435 | "reward": 5, 436 | "hidden": true, 437 | "order": 1077 438 | }, 439 | { 440 | "id": 81077, 441 | "name": "…其名为「玛丽·塞勒斯特」", 442 | "desc": "「浪船」被破坏了…", 443 | "reward": 5, 444 | "hidden": true, 445 | "order": 1078 446 | }, 447 | { 448 | "id": 81078, 449 | "name": "Deja Vu!", 450 | "desc": "持续高速行驶「浪船」达到一定时间。", 451 | "reward": 5, 452 | "hidden": true, 453 | "order": 1079 454 | }, 455 | { 456 | "id": 81096, 457 | "name": "山田五的木槌", 458 | "desc": "多次识破妖狸的法术。", 459 | "reward": 5, 460 | "hidden": true, 461 | "order": 1097 462 | }, 463 | { 464 | "id": 81097, 465 | "name": "「鲸井御殿流手鞠术」", 466 | "desc": "陪鲸井小弟玩「手鞠游戏」。", 467 | "reward": 5, 468 | "hidden": true, 469 | "order": 1098 470 | }, 471 | { 472 | "id": 81098, 473 | "name": "本朝手鞠戏小传", 474 | "desc": "其他玩家参加了你所设置的「手鞠游戏」。", 475 | "reward": 5, 476 | "hidden": true, 477 | "order": 1099 478 | }, 479 | { 480 | "id": 81099, 481 | "name": "派蒙的幸运日!", 482 | "desc": "在鸣神大社,抽中「大吉」的签文。", 483 | "reward": 5, 484 | "hidden": true, 485 | "order": 1100 486 | }, 487 | { 488 | "id": 81100, 489 | "name": "诸事不宜…", 490 | "desc": "在鸣神大社,抽中「大凶」的签文。", 491 | "reward": 5, 492 | "hidden": true, 493 | "order": 1101 494 | }, 495 | { 496 | "id": 81104, 497 | "name": "地宫传奇…才怪咧!", 498 | "desc": "发掘失落记忆的冒险本身,又何尝不是宝藏呢?", 499 | "reward": 5, 500 | "hidden": true, 501 | "order": 1102 502 | }, 503 | { 504 | "id": 81105, 505 | "name": "SYUUMATSU GAIDEN", 506 | "desc": "被卷入终末番与愚人众的战斗中…", 507 | "reward": 5, 508 | "hidden": true, 509 | "order": 1103 510 | }, 511 | { 512 | "id": 81106, 513 | "name": "岩藏武艺帐", 514 | "desc": "见证岩藏流的末路。", 515 | "reward": 5, 516 | "hidden": true, 517 | "order": 1104 518 | }, 519 | { 520 | "id": 81108, 521 | "name": "开门放狗", 522 | "desc": "解放寅太郎。", 523 | "reward": 5, 524 | "hidden": true, 525 | "order": 1105 526 | }, 527 | { 528 | "id": 81109, 529 | "name": "情非得已", 530 | "desc": "打开广海的心结。", 531 | "reward": 5, 532 | "hidden": true, 533 | "order": 1106 534 | }, 535 | { 536 | "id": 81111, 537 | "name": "不再变老", 538 | "desc": "向殁者献上花束。", 539 | "reward": 5, 540 | "hidden": true, 541 | "order": 1107 542 | }, 543 | { 544 | "id": 81112, 545 | "name": "为人的条件?", 546 | "desc": "见证武士的宿命。", 547 | "reward": 5, 548 | "hidden": true, 549 | "order": 1108 550 | }, 551 | { 552 | "id": 81113, 553 | "name": "无灵魂处的灵魂", 554 | "desc": "找到鹫津的遗物。", 555 | "reward": 5, 556 | "hidden": true, 557 | "order": 1109 558 | }, 559 | { 560 | "id": 81114, 561 | "name": "荒岛朝圣指南", 562 | "desc": "找到八酝岛所有的神龛。", 563 | "reward": 5, 564 | "hidden": true, 565 | "order": 1110 566 | }, 567 | { 568 | "id": 81115, 569 | "name": "三千里的起点", 570 | "desc": "在踏鞴砂和鸣神岛找到长次。", 571 | "reward": 5, 572 | "hidden": true, 573 | "order": 1111 574 | }, 575 | { 576 | "id": 81116, 577 | "name": "游医的奥德赛", 578 | "desc": "见证保本的结局。", 579 | "reward": 5, 580 | "hidden": true, 581 | "order": 1112 582 | }, 583 | { 584 | "id": 81117, 585 | "name": "「Knock Knock」", 586 | "desc": "打开「御影炉心」周围的护罩。", 587 | "reward": 5, 588 | "hidden": true, 589 | "order": 1113 590 | }, 591 | { 592 | "id": 81118, 593 | "name": "神无冢作战计划", 594 | "desc": "打倒复苏的「无相之雷」。", 595 | "reward": 5, 596 | "hidden": true, 597 | "order": 1114 598 | }, 599 | { 600 | "id": 81119, 601 | "name": "挥刀的理由", 602 | "desc": "让「公义」恢复清醒。", 603 | "reward": 5, 604 | "hidden": true, 605 | "order": 1115 606 | }, 607 | { 608 | "id": 81120, 609 | "name": "大业物", 610 | "desc": "挑战并轻松击败「公义」。", 611 | "reward": 5, 612 | "hidden": true, 613 | "order": 1116 614 | }, 615 | { 616 | "id": 81121, 617 | "name": "重开之花", 618 | "desc": "获得叶名山薰的赠礼。", 619 | "reward": 5, 620 | "hidden": true, 621 | "order": 1117 622 | }, 623 | { 624 | "id": 81122, 625 | "name": "承蒙惠顾", 626 | "desc": "获得阿敬的宝箱里的大奖。", 627 | "reward": 5, 628 | "hidden": true, 629 | "order": 1118 630 | }, 631 | { 632 | "id": 81123, 633 | "name": "雷之祸乱", 634 | "desc": "因为「雷祸」的伤害而倒下…", 635 | "reward": 5, 636 | "hidden": true, 637 | "order": 1119 638 | }, 639 | { 640 | "id": 81124, 641 | "name": "框架外收获", 642 | "desc": "用「神居岛崩炮」轰开一处藏宝地。", 643 | "reward": 5, 644 | "hidden": true, 645 | "order": 1120 646 | }, 647 | { 648 | "id": 81125, 649 | "name": "大踏鞴长正", 650 | "desc": "获得过去某把武器的绘图。", 651 | "reward": 5, 652 | "hidden": true, 653 | "order": 1121 654 | }, 655 | { 656 | "id": 81130, 657 | "name": "「…腐肉朽处花争妍。」", 658 | "desc": "终结十位已殁武士的怨念。", 659 | "reward": 5, 660 | "hidden": true, 661 | "order": 1122 662 | }, 663 | { 664 | "id": 81141, 665 | "name": "「这就是我的放生路线!」", 666 | "desc": "鱼儿在挣扎状态中逃脱。", 667 | "reward": 5, 668 | "hidden": true, 669 | "order": 1135 670 | }, 671 | { 672 | "id": 81142, 673 | "name": "「切,原来是来钓鱼的…」", 674 | "desc": "抛竿时吓跑了鱼儿。", 675 | "reward": 5, 676 | "hidden": true, 677 | "order": 1136 678 | }, 679 | { 680 | "id": 81150, 681 | "name": "如愿以偿", 682 | "desc": "请小卷婆婆占卜五次,并获得理想的结果。", 683 | "reward": 5, 684 | "hidden": true, 685 | "order": 1136 686 | }, 687 | { 688 | "id": 81151, 689 | "name": "人鱼童话", 690 | "desc": "帮助久美解开心结。", 691 | "reward": 5, 692 | "hidden": true, 693 | "order": 1137 694 | }, 695 | { 696 | "id": 81152, 697 | "name": "远海牧人的宝藏", 698 | "desc": "从酒醉的狂言中,寻到大海贼最宝贵的遗产。", 699 | "reward": 5, 700 | "hidden": true, 701 | "order": 1138 702 | }, 703 | { 704 | "id": 81153, 705 | "name": "诚实高个儿西尔弗", 706 | "desc": "找到林藏埋藏的所有宝藏。", 707 | "reward": 5, 708 | "hidden": true, 709 | "order": 1139 710 | }, 711 | { 712 | "id": 81154, 713 | "name": "是时候征服海祇岛了!", 714 | "desc": "解除雷神神龛处的封印。", 715 | "reward": 5, 716 | "hidden": true, 717 | "order": 1140 718 | }, 719 | { 720 | "id": 81155, 721 | "name": "池中宅邸", 722 | "desc": "解锁「池中宅邸」。", 723 | "reward": 5, 724 | "hidden": true, 725 | "order": 1141 726 | }, 727 | { 728 | "id": 81156, 729 | "name": "小猎犬号搁浅记", 730 | "desc": "跟随无名学者的脚步探索海祇岛。", 731 | "reward": 5, 732 | "hidden": true, 733 | "order": 1142 734 | }, 735 | { 736 | "id": 81157, 737 | "name": "「奴家是猫。名字叫寝子」", 738 | "desc": "拜见「浅濑神社代宫司」寝子。", 739 | "reward": 5, 740 | "hidden": true, 741 | "order": 1143 742 | }, 743 | { 744 | "id": 81158, 745 | "name": "云中的猫", 746 | "desc": "和「浅濑神社代宫司」寝子一起,见证某件迟来的「好事」。", 747 | "reward": 5, 748 | "hidden": true, 749 | "order": 1144 750 | }, 751 | { 752 | "id": 81159, 753 | "name": "猫的赠礼", 754 | "desc": "在清籁岛上为小猫喂食,并获得它们的好感。", 755 | "reward": 5, 756 | "hidden": true, 757 | "order": 1145 758 | }, 759 | { 760 | "id": 81160, 761 | "name": "无可质疑的宝藏", 762 | "desc": "「都说了只有一幅画啊!」", 763 | "reward": 5, 764 | "hidden": true, 765 | "order": 1146 766 | }, 767 | { 768 | "id": 81161, 769 | "name": "乡愁的另一头", 770 | "desc": "为太田太郎在清籁岛上拍摄四张画片。", 771 | "reward": 5, 772 | "hidden": true, 773 | "order": 1147 774 | }, 775 | { 776 | "id": 81162, 777 | "name": "它和它…", 778 | "desc": "…连连看?", 779 | "reward": 5, 780 | "hidden": true, 781 | "order": 1148 782 | }, 783 | { 784 | "id": 81163, 785 | "name": "戴维·琼斯的箱子", 786 | "desc": "解开「清籁丸」内的所有机关。", 787 | "reward": 5, 788 | "hidden": true, 789 | "order": 1149 790 | }, 791 | { 792 | "id": 81164, 793 | "name": "益智海域", 794 | "desc": "在清籁岛上解开一系列机关。", 795 | "reward": 5, 796 | "hidden": true, 797 | "order": 1150 798 | }, 799 | { 800 | "id": 81165, 801 | "name": "大天云峠", 802 | "desc": "解开天云峠之底的机关。", 803 | "reward": 5, 804 | "hidden": true, 805 | "order": 1151 806 | }, 807 | { 808 | "id": 81167, 809 | "name": "进入夜雾之门", 810 | "desc": "适应了鹤观的异常天候。", 811 | "reward": 5, 812 | "hidden": true, 813 | "order": 1153 814 | }, 815 | { 816 | "id": 81168, 817 | "name": "Nihil Sub Caligine Novum", 818 | "desc": "似乎又恢复了原状…", 819 | "reward": 5, 820 | "hidden": true, 821 | "order": 1154 822 | }, 823 | { 824 | "id": 81170, 825 | "name": "白之幻影", 826 | "desc": "与昔日的幻影相遇。", 827 | "reward": 5, 828 | "hidden": true, 829 | "order": 1156 830 | }, 831 | { 832 | "id": 81171, 833 | "name": "「美好的风景,望不到头」", 834 | "desc": "与「船工」告别。", 835 | "reward": 5, 836 | "hidden": true, 837 | "order": 1157 838 | }, 839 | { 840 | "id": 81172, 841 | "name": "双城记", 842 | "desc": "即使是鹤观,似乎也建立在古老遗迹的残骸上。", 843 | "reward": 5, 844 | "hidden": true, 845 | "order": 1158 846 | }, 847 | { 848 | "id": 81173, 849 | "name": "《我作为冒险家的一生》", 850 | "desc": "协助罗尔德,完成冒险日志。", 851 | "reward": 5, 852 | "hidden": true, 853 | "order": 1159 854 | }, 855 | { 856 | "id": 81174, 857 | "name": "雾里明灯", 858 | "desc": "点亮逢岳之野所有的雷石。", 859 | "reward": 5, 860 | "hidden": true, 861 | "order": 1160 862 | }, 863 | { 864 | "id": 81175, 865 | "name": "「被、被派蒙吃掉…」", 866 | "desc": "原本拿到的「木簧笛」,却意外消失了。", 867 | "reward": 5, 868 | "hidden": true, 869 | "order": 1161 870 | }, 871 | { 872 | "id": 81176, 873 | "name": "猜想时间", 874 | "desc": "从比过去更遥远的过去,来到了今天…", 875 | "reward": 5, 876 | "hidden": true, 877 | "order": 1162 878 | }, 879 | { 880 | "id": 81177, 881 | "name": "雷鸟的系谱", 882 | "desc": "完成所有「雕像」的挑战。", 883 | "reward": 5, 884 | "hidden": true, 885 | "order": 1163 886 | }, 887 | { 888 | "id": 81179, 889 | "name": "七个字母", 890 | "desc": "尝试解读「石根文字」。", 891 | "reward": 5, 892 | "hidden": true, 893 | "order": 1165 894 | }, 895 | { 896 | "id": 81180, 897 | "name": "茂知之壳", 898 | "desc": "解锁「茂知之壳」。", 899 | "reward": 5, 900 | "hidden": true, 901 | "order": 1166 902 | }, 903 | { 904 | "id": 81181, 905 | "name": "渡过雾霭的河流", 906 | "desc": "终于,抵达雾海彼端…", 907 | "reward": 5, 908 | "hidden": true, 909 | "order": 1167 910 | }, 911 | { 912 | "id": 81182, 913 | "name": "「让你再飞!」", 914 | "desc": "使用道具「四方八方之网」捕获1只晶蝶。", 915 | "reward": 5, 916 | "hidden": true, 917 | "order": 1168 918 | }, 919 | { 920 | "id": 81183, 921 | "name": "面对捕网网眼时的焦虑", 922 | "desc": "使用道具「四方八方之网」捕获1只团雀。", 923 | "reward": 5, 924 | "hidden": true, 925 | "order": 1169 926 | }, 927 | { 928 | "id": 81184, 929 | "name": "海底几万里?", 930 | "desc": "进入渊下宫。", 931 | "reward": 5, 932 | "hidden": true, 933 | "order": 1170 934 | }, 935 | { 936 | "id": 81185, 937 | "name": "野马泉,又名摩利支", 938 | "desc": "解开「阳炎之门」的秘密。", 939 | "reward": 5, 940 | "hidden": true, 941 | "order": 1171 942 | }, 943 | { 944 | "id": 81186, 945 | "name": "日月回轮", 946 | "desc": "转换一次「白夜」与「常夜」。", 947 | "reward": 5, 948 | "hidden": true, 949 | "order": 1172 950 | }, 951 | { 952 | "id": 81187, 953 | "name": "「智圆行方」小锦旗", 954 | "desc": "获得地走官的认可。", 955 | "reward": 5, 956 | "hidden": true, 957 | "order": 1173 958 | }, 959 | { 960 | "id": 81188, 961 | "name": "「明察冬鳗」小锦旗", 962 | "desc": "获得地走官的认可。", 963 | "reward": 5, 964 | "hidden": true, 965 | "order": 1174 966 | }, 967 | { 968 | "id": 81189, 969 | "name": "「常世无双」小锦旗", 970 | "desc": "获得地走官的认可。", 971 | "reward": 5, 972 | "hidden": true, 973 | "order": 1175 974 | }, 975 | { 976 | "id": 81191, 977 | "name": "「下次,试试社会派…」", 978 | "desc": "完成伊达的迷宫挑战。", 979 | "reward": 5, 980 | "hidden": true, 981 | "order": 1177 982 | }, 983 | { 984 | "id": 81192, 985 | "name": "「常世大神倘若有知…」", 986 | "desc": "归还所有的图书,并且…", 987 | "reward": 5, 988 | "hidden": true, 989 | "order": 1178 990 | }, 991 | { 992 | "id": 81193, 993 | "name": "「真的有区别吗…」", 994 | "desc": "在所有特别的位置上坐下过。", 995 | "reward": 5, 996 | "hidden": true, 997 | "order": 1179 998 | }, 999 | { 1000 | "id": 81194, 1001 | "name": "神的孩子全跳舞", 1002 | "desc": "和所有的「法厄同」残影对话。", 1003 | "reward": 5, 1004 | "hidden": true, 1005 | "order": 1180 1006 | }, 1007 | { 1008 | "id": 81195, 1009 | "name": "阴阳割昏晓", 1010 | "desc": "前往大日御舆之顶。", 1011 | "reward": 5, 1012 | "hidden": true, 1013 | "order": 1181 1014 | }, 1015 | { 1016 | "id": 81196, 1017 | "name": "射程之内好说话", 1018 | "desc": "完成弓术的挑战。", 1019 | "reward": 5, 1020 | "hidden": true, 1021 | "order": 1182 1022 | }, 1023 | { 1024 | "id": 81197, 1025 | "name": "薄缘的道与光与胤", 1026 | "desc": "归还岩藏宗主的刀。", 1027 | "reward": 5, 1028 | "hidden": true, 1029 | "order": 1183 1030 | }, 1031 | { 1032 | "id": 81198, 1033 | "name": "一把钥匙开一把锁", 1034 | "desc": "找到所有的键纹。", 1035 | "reward": 10, 1036 | "hidden": true, 1037 | "order": 1184 1038 | }, 1039 | { 1040 | "id": 81199, 1041 | "name": "岩中幽谷", 1042 | "desc": "解锁「岩中幽谷」。", 1043 | "reward": 5, 1044 | "hidden": true, 1045 | "order": 1185 1046 | }, 1047 | { 1048 | "id": 81200, 1049 | "name": "《层岩巨渊矿产志》", 1050 | "desc": "阅读层岩巨渊矿产相关书籍的全部断章。", 1051 | "reward": 5, 1052 | "hidden": true, 1053 | "order": 1186 1054 | }, 1055 | { 1056 | "id": 81201, 1057 | "name": "生命之谷的居民", 1058 | "desc": "寻得干枯的种子,而且没有贸然吃掉它。", 1059 | "reward": 5, 1060 | "hidden": true, 1061 | "order": 1187 1062 | }, 1063 | { 1064 | "id": 81202, 1065 | "name": "CREDE TENEBRIS", 1066 | "desc": "打开遗迹中的密室。", 1067 | "reward": 5, 1068 | "hidden": true, 1069 | "order": 1188 1070 | }, 1071 | { 1072 | "id": 81203, 1073 | "name": "9文字之传言", 1074 | "desc": "找到所有密文。", 1075 | "reward": 5, 1076 | "hidden": true, 1077 | "order": 1189 1078 | }, 1079 | { 1080 | "id": 81204, 1081 | "name": "狡兔之窟", 1082 | "desc": "发现盗宝团的藏宝。", 1083 | "reward": 5, 1084 | "hidden": true, 1085 | "order": 1190 1086 | }, 1087 | { 1088 | "id": 81205, 1089 | "name": "又,又,又中大奖了!", 1090 | "desc": "挖出了三次宝箱,通关老臭的挖宝游戏。", 1091 | "reward": 5, 1092 | "hidden": true, 1093 | "order": 1191 1094 | }, 1095 | { 1096 | "id": 81206, 1097 | "name": "人情练达即文章", 1098 | "desc": "完成所有生态调查任务,收到海迪夫给的推荐信。", 1099 | "reward": 5, 1100 | "hidden": true, 1101 | "order": 1192 1102 | }, 1103 | { 1104 | "id": 81207, 1105 | "name": "「舍我其谁!」", 1106 | "desc": "收集齐层岩巨渊下愚人众的信件文书。", 1107 | "reward": 5, 1108 | "hidden": true, 1109 | "order": 1193 1110 | }, 1111 | { 1112 | "id": 81208, 1113 | "name": "请保持安全距离", 1114 | "desc": "使用「安全距离爆破机关·贰壹伍陆型」开辟通路。", 1115 | "reward": 5, 1116 | "hidden": true, 1117 | "order": 1194 1118 | }, 1119 | { 1120 | "id": 81209, 1121 | "name": "黑雾,痛苦,像出生一样…", 1122 | "desc": "击败黑雾中浮现之物。", 1123 | "reward": 5, 1124 | "hidden": true, 1125 | "order": 1195 1126 | }, 1127 | { 1128 | "id": 81210, 1129 | "name": "秀逗炼金术士", 1130 | "desc": "解救克里托夫。", 1131 | "reward": 5, 1132 | "hidden": true, 1133 | "order": 1196 1134 | }, 1135 | { 1136 | "id": 81211, 1137 | "name": "勇气的余晖", 1138 | "desc": "冒险之意义,究竟存在于哪里呢?", 1139 | "reward": 5, 1140 | "hidden": true, 1141 | "order": 1197 1142 | }, 1143 | { 1144 | "id": 81212, 1145 | "name": "请勿长期食用", 1146 | "desc": "在层岩巨渊找到失踪的矿工老何。", 1147 | "reward": 5, 1148 | "hidden": true, 1149 | "order": 1198 1150 | }, 1151 | { 1152 | "id": 81213, 1153 | "name": "要求太多的大蘑头", 1154 | "desc": "在层岩巨渊完成「赞玛兰」的委托。", 1155 | "reward": 5, 1156 | "hidden": true, 1157 | "order": 1199 1158 | }, 1159 | { 1160 | "id": 81214, 1161 | "name": "唯千岩不动", 1162 | "desc": "收集所有千岩军留下的供物,得到「千岩军的宝藏」。", 1163 | "reward": 5, 1164 | "hidden": true, 1165 | "order": 1200 1166 | }, 1167 | { 1168 | "id": 81215, 1169 | "name": "三脚猫渭水非熊", 1170 | "desc": "了解山巅大侠「唐无仇」的往事。", 1171 | "reward": 5, 1172 | "hidden": true, 1173 | "order": 1201 1174 | }, 1175 | { 1176 | "id": 81216, 1177 | "name": "「好样的,施季里茨!」", 1178 | "desc": "帮助彦博完成千岩军的执法任务。", 1179 | "reward": 5, 1180 | "hidden": true, 1181 | "order": 1202 1182 | }, 1183 | { 1184 | "id": 81217, 1185 | "name": "黑暗却无法包容光…", 1186 | "desc": "第一次使用「流明石」的「纯光绽放」来清除「淤泥涌口」的漆黑结晶物。", 1187 | "reward": 5, 1188 | "hidden": true, 1189 | "order": 1203 1190 | }, 1191 | { 1192 | "id": 81218, 1193 | "name": "「…闻起来像沥青。」", 1194 | "desc": "第一次因漆黑污泥的污染而倒下。", 1195 | "reward": 5, 1196 | "hidden": true, 1197 | "order": 1204 1198 | }, 1199 | { 1200 | "id": 81220, 1201 | "name": "「只需一些柴火、一些醋…」", 1202 | "desc": "通往地面的密道…大概不止一条。", 1203 | "reward": 5, 1204 | "hidden": true, 1205 | "order": 1206 1206 | }, 1207 | { 1208 | "id": 81221, 1209 | "name": "《塔列辛之书》", 1210 | "desc": "获得塔列辛的赠礼。", 1211 | "reward": 5, 1212 | "hidden": true, 1213 | "order": 1207 1214 | }, 1215 | { 1216 | "id": 81222, 1217 | "name": "照亮黑暗", 1218 | "desc": "送出些许光明。", 1219 | "reward": 5, 1220 | "hidden": true, 1221 | "order": 1208 1222 | }, 1223 | { 1224 | "id": 81223, 1225 | "name": "慧绝烟林", 1226 | "desc": "须弥的声望等级达到10级。", 1227 | "reward": 20, 1228 | "hidden": false, 1229 | "order": 1209 1230 | }, 1231 | { 1232 | "id": 81224, 1233 | "name": "美德的报酬", 1234 | "desc": "在森林中帮助许多兰那罗。", 1235 | "reward": 5, 1236 | "hidden": true, 1237 | "order": 1210 1238 | }, 1239 | { 1240 | "id": 81225, 1241 | "name": "众妙之门", 1242 | "desc": "真正踏入「兰那罗的世界」…", 1243 | "reward": 5, 1244 | "hidden": true, 1245 | "order": 1211 1246 | }, 1247 | { 1248 | "id": 81226, 1249 | "name": "梦与无梦的隙间", 1250 | "desc": "来到现实中的桓那兰那。", 1251 | "reward": 5, 1252 | "hidden": true, 1253 | "order": 1212 1254 | }, 1255 | { 1256 | "id": 81227, 1257 | "name": "森林的大乐章", 1258 | "desc": "似乎具有成为「采歌者」的潜力…?", 1259 | "reward": 5, 1260 | "hidden": true, 1261 | "order": 1213 1262 | }, 1263 | { 1264 | "id": 81228, 1265 | "name": "悠游旅情", 1266 | "desc": "旅途中的风景不应错过。", 1267 | "reward": 5, 1268 | "hidden": true, 1269 | "order": 1214 1270 | }, 1271 | { 1272 | "id": 81229, 1273 | "name": "金光灿灿的歌", 1274 | "desc": "…他们会将这首歌永远传唱下去吧,一代又一代。", 1275 | "reward": 5, 1276 | "hidden": true, 1277 | "order": 1215 1278 | }, 1279 | { 1280 | "id": 81230, 1281 | "name": "关于森林的故事", 1282 | "desc": "从兰随尼处,听来森林的五个故事。", 1283 | "reward": 5, 1284 | "hidden": true, 1285 | "order": 1216 1286 | }, 1287 | { 1288 | "id": 81231, 1289 | "name": "不再苍翠的苗圃", 1290 | "desc": "踏入曾经的桓那兰那。", 1291 | "reward": 5, 1292 | "hidden": true, 1293 | "order": 1217 1294 | }, 1295 | { 1296 | "id": 81232, 1297 | "name": "尽末了所毁灭的", 1298 | "desc": "击败了「无留陀的化身」。接下来…", 1299 | "reward": 5, 1300 | "hidden": true, 1301 | "order": 1218 1302 | }, 1303 | { 1304 | "id": 81233, 1305 | "name": "就算回归沙尘…", 1306 | "desc": "…也要留下梦与愿望。", 1307 | "reward": 5, 1308 | "hidden": true, 1309 | "order": 1219 1310 | }, 1311 | { 1312 | "id": 81234, 1313 | "name": "永不属于森林的孩子", 1314 | "desc": "这样一来,问题应该解决了。", 1315 | "reward": 5, 1316 | "hidden": true, 1317 | "order": 1220 1318 | }, 1319 | { 1320 | "id": 81235, 1321 | "name": "桓那兰那一番!", 1322 | "desc": "帮助兰帕卡提的哥哥们完成各自的「至上珍馐」。", 1323 | "reward": 5, 1324 | "hidden": true, 1325 | "order": 1221 1326 | }, 1327 | { 1328 | "id": 81236, 1329 | "name": "「芝麻,芝麻,请开门。」", 1330 | "desc": "通过暗号,成功进入愚人众藏身的营地。", 1331 | "reward": 5, 1332 | "hidden": true, 1333 | "order": 1222 1334 | }, 1335 | { 1336 | "id": 81237, 1337 | "name": "与「宝箱」主人会谈", 1338 | "desc": "找到兰那罗的「宝箱」。", 1339 | "reward": 5, 1340 | "hidden": true, 1341 | "order": 1223 1342 | }, 1343 | { 1344 | "id": 81238, 1345 | "name": "转桓摩王", 1346 | "desc": "转动每一个藏有宝箱的「桓摩达」。", 1347 | "reward": 5, 1348 | "hidden": true, 1349 | "order": 1224 1350 | }, 1351 | { 1352 | "id": 81239, 1353 | "name": "以「安弗塔斯」之名", 1354 | "desc": "造访勇士们的终点。", 1355 | "reward": 5, 1356 | "hidden": true, 1357 | "order": 1225 1358 | }, 1359 | { 1360 | "id": 81240, 1361 | "name": "无名之城的呼唤", 1362 | "desc": "让神秘的羊皮卷安静下来。", 1363 | "reward": 5, 1364 | "hidden": true, 1365 | "order": 1226 1366 | }, 1367 | { 1368 | "id": 81241, 1369 | "name": "水与风的伙伴", 1370 | "desc": "完成「直到『桓那』痊愈」。", 1371 | "reward": 5, 1372 | "hidden": true, 1373 | "order": 1227 1374 | }, 1375 | { 1376 | "id": 81242, 1377 | "name": "…请悄悄将我忘记", 1378 | "desc": "完成「吉祥具书」。", 1379 | "reward": 10, 1380 | "hidden": true, 1381 | "order": 1228 1382 | }, 1383 | { 1384 | "id": 81243, 1385 | "name": "然后时间开始流动", 1386 | "desc": "完成兰帝裟的未竟之事。", 1387 | "reward": 5, 1388 | "hidden": true, 1389 | "order": 1229 1390 | }, 1391 | { 1392 | "id": 81244, 1393 | "name": "请安全玩耍", 1394 | "desc": "陪森林中的兰那罗游戏。", 1395 | "reward": 5, 1396 | "hidden": true, 1397 | "order": 1230 1398 | }, 1399 | { 1400 | "id": 81245, 1401 | "name": "永久食粮", 1402 | "desc": "和法莎一道,造访现实中的兰那罗苗圃。", 1403 | "reward": 5, 1404 | "hidden": true, 1405 | "order": 1231 1406 | }, 1407 | { 1408 | "id": 81246, 1409 | "name": "梦想开花时", 1410 | "desc": "让毗波耶开满兰那罗的苗圃。", 1411 | "reward": 5, 1412 | "hidden": true, 1413 | "order": 1232 1414 | }, 1415 | { 1416 | "id": 81247, 1417 | "name": "「众花园中的一棵核桃树…」", 1418 | "desc": "向海亚姆问起失落的记忆。", 1419 | "reward": 5, 1420 | "hidden": true, 1421 | "order": 1233 1422 | }, 1423 | { 1424 | "id": 81248, 1425 | "name": "须弥怪物生态调查", 1426 | "desc": "完成保护森林生态的工作。", 1427 | "reward": 5, 1428 | "hidden": true, 1429 | "order": 1234 1430 | }, 1431 | { 1432 | "id": 81249, 1433 | "name": "如狮子寻找勇气…", 1434 | "desc": "找回兰沙恭丢失的「勇气」。", 1435 | "reward": 5, 1436 | "hidden": true, 1437 | "order": 1235 1438 | }, 1439 | { 1440 | "id": 81250, 1441 | "name": "究竟一切智地", 1442 | "desc": "登上须弥城的最高处。", 1443 | "reward": 5, 1444 | "hidden": true, 1445 | "order": 1236 1446 | }, 1447 | { 1448 | "id": 81251, 1449 | "name": "搜索者", 1450 | "desc": "利用激化反应,发现原本被隐藏的事物。", 1451 | "reward": 5, 1452 | "hidden": true, 1453 | "order": 1237 1454 | }, 1455 | { 1456 | "id": 81252, 1457 | "name": "茉莉低语,石榴开怀", 1458 | "desc": "完成「正法炬书」。", 1459 | "reward": 10, 1460 | "hidden": true, 1461 | "order": 1238 1462 | }, 1463 | { 1464 | "id": 81253, 1465 | "name": "飞驰如风", 1466 | "desc": "在无郁稠林激活三处风场。", 1467 | "reward": 5, 1468 | "hidden": true, 1469 | "order": 1239 1470 | }, 1471 | { 1472 | "id": 81254, 1473 | "name": "三之定则", 1474 | "desc": "找到三篇失落的歌谱,获得三枚恒素果。", 1475 | "reward": 5, 1476 | "hidden": true, 1477 | "order": 1240 1478 | }, 1479 | { 1480 | "id": 81255, 1481 | "name": "梦凝成的苦果", 1482 | "desc": "第一次使用「苦舍桓」。", 1483 | "reward": 5, 1484 | "hidden": true, 1485 | "order": 1241 1486 | }, 1487 | { 1488 | "id": 81256, 1489 | "name": "雨落进了泥土", 1490 | "desc": "完成「水天供书」。", 1491 | "reward": 10, 1492 | "hidden": true, 1493 | "order": 1242 1494 | }, 1495 | { 1496 | "id": 81257, 1497 | "name": "…都汇进了激流", 1498 | "desc": "用留影机记录下法留纳法宝启动的瞬间。", 1499 | "reward": 5, 1500 | "hidden": true, 1501 | "order": 1243 1502 | }, 1503 | { 1504 | "id": 81258, 1505 | "name": "呼风唤雨", 1506 | "desc": "操作法留纳神机,改变水天丛林的天气。", 1507 | "reward": 5, 1508 | "hidden": true, 1509 | "order": 1244 1510 | }, 1511 | { 1512 | "id": 81259, 1513 | "name": "啊,美好的日子!", 1514 | "desc": "根据箱底的线索找到秘密宝藏。", 1515 | "reward": 5, 1516 | "hidden": true, 1517 | "order": 1245 1518 | }, 1519 | { 1520 | "id": 81260, 1521 | "name": "卡菈的孩子", 1522 | "desc": "在林中自由地飘荡吧。", 1523 | "reward": 5, 1524 | "hidden": true, 1525 | "order": 1246 1526 | }, 1527 | { 1528 | "id": 81261, 1529 | "name": "漫长的重逢", 1530 | "desc": "跟随失主的驮兽,完成它的旅程。", 1531 | "reward": 5, 1532 | "hidden": true, 1533 | "order": 1247 1534 | }, 1535 | { 1536 | "id": 81262, 1537 | "name": "「我明白了!我明白了!」", 1538 | "desc": "找到并解开须弥城内的一系列谜语。", 1539 | "reward": 5, 1540 | "hidden": true, 1541 | "order": 1248 1542 | }, 1543 | { 1544 | "id": 81263, 1545 | "name": "宵暗与晓光之歌", 1546 | "desc": "…我们一定会在何处相逢吧。", 1547 | "reward": 5, 1548 | "hidden": true, 1549 | "order": 1249 1550 | }, 1551 | { 1552 | "id": 81264, 1553 | "name": "第几类接触", 1554 | "desc": "不同寻常的「朋友」加入了考古小队。", 1555 | "reward": 5, 1556 | "hidden": true, 1557 | "order": 1250 1558 | }, 1559 | { 1560 | "id": 81265, 1561 | "name": "沙漠中的探险", 1562 | "desc": "沙漠中的探险才刚刚开始。", 1563 | "reward": 5, 1564 | "hidden": true, 1565 | "order": 1251 1566 | }, 1567 | { 1568 | "id": 81266, 1569 | "name": "像因论派学者一样思考", 1570 | "desc": "墨水瓶里拥有可怕的权力。", 1571 | "reward": 5, 1572 | "hidden": true, 1573 | "order": 1252 1574 | }, 1575 | { 1576 | "id": 81267, 1577 | "name": "法达摩加纳", 1578 | "desc": "通往「御座」的道路终于显现。", 1579 | "reward": 5, 1580 | "hidden": true, 1581 | "order": 1253 1582 | }, 1583 | { 1584 | "id": 81268, 1585 | "name": "生成、交换、储存和使用", 1586 | "desc": "钥匙也需要得到「认可」。", 1587 | "reward": 5, 1588 | "hidden": true, 1589 | "order": 1254 1590 | }, 1591 | { 1592 | "id": 81269, 1593 | "name": "神奇的匹热迷能", 1594 | "desc": "迈向隐藏真相的一小步。", 1595 | "reward": 5, 1596 | "hidden": true, 1597 | "order": 1255 1598 | }, 1599 | { 1600 | "id": 81270, 1601 | "name": "像赤王子民一样行走", 1602 | "desc": "获得了通过许多门的许可。", 1603 | "reward": 5, 1604 | "hidden": true, 1605 | "order": 1256 1606 | }, 1607 | { 1608 | "id": 81271, 1609 | "name": "笔直航道", 1610 | "desc": "到达赤王陵顶部的隐秘空间。", 1611 | "reward": 5, 1612 | "hidden": true, 1613 | "order": 1257 1614 | }, 1615 | { 1616 | "id": 81272, 1617 | "name": "通往光明之路", 1618 | "desc": "无人知晓这些巨大的遗迹如何建成,又因何失落。", 1619 | "reward": 5, 1620 | "hidden": true, 1621 | "order": 1258 1622 | }, 1623 | { 1624 | "id": 81273, 1625 | "name": "再听一遍那首歌谣", 1626 | "desc": "重新站在圣显厅的赤王御座之前。", 1627 | "reward": 5, 1628 | "hidden": true, 1629 | "order": 1259 1630 | }, 1631 | { 1632 | "id": 81274, 1633 | "name": "斜倚在大地之上", 1634 | "desc": "完成「阿弗拉图之惑」。", 1635 | "reward": 10, 1636 | "hidden": true, 1637 | "order": 1260 1638 | }, 1639 | { 1640 | "id": 81275, 1641 | "name": "让我见识一下巨像的性能吧", 1642 | "desc": "只要打不中就没有什么大不了的。", 1643 | "reward": 5, 1644 | "hidden": true, 1645 | "order": 1261 1646 | }, 1647 | { 1648 | "id": 81276, 1649 | "name": "强行突破作战", 1650 | "desc": "坎瑞亚的机器,都是怪物吗?", 1651 | "reward": 5, 1652 | "hidden": true, 1653 | "order": 1262 1654 | }, 1655 | { 1656 | "id": 81277, 1657 | "name": "请说暗语,然后进入", 1658 | "desc": "打开吞羊岩的神秘大门。", 1659 | "reward": 5, 1660 | "hidden": true, 1661 | "order": 1263 1662 | }, 1663 | { 1664 | "id": 81278, 1665 | "name": "大走廊的尽头", 1666 | "desc": "进入赤王陵地下最隐秘的房间。", 1667 | "reward": 5, 1668 | "hidden": true, 1669 | "order": 1264 1670 | }, 1671 | { 1672 | "id": 81280, 1673 | "name": "四地之王", 1674 | "desc": "找到并破解沙漠中四处透明的遗迹的秘密。", 1675 | "reward": 5, 1676 | "hidden": true, 1677 | "order": 1266 1678 | }, 1679 | { 1680 | "id": 81281, 1681 | "name": "赤王时代的沙漠与大赤沙海", 1682 | "desc": "探索沙漠中三处巨大的尖碑。", 1683 | "reward": 5, 1684 | "hidden": true, 1685 | "order": 1267 1686 | }, 1687 | { 1688 | "id": 81282, 1689 | "name": "碑铭", 1690 | "desc": "美和希望是对逝者最温柔的缅怀。", 1691 | "reward": 5, 1692 | "hidden": true, 1693 | "order": 1268 1694 | }, 1695 | { 1696 | "id": 81283, 1697 | "name": "在「我」诞生之前", 1698 | "desc": "人们不愿提及他的姓名,不愿记起他的言行。", 1699 | "reward": 5, 1700 | "hidden": true, 1701 | "order": 1269 1702 | }, 1703 | { 1704 | "id": 81284, 1705 | "name": "犍闼缚城", 1706 | "desc": "第一次遭遇沙漠中的幻象。", 1707 | "reward": 5, 1708 | "hidden": true, 1709 | "order": 1270 1710 | }, 1711 | { 1712 | "id": 81285, 1713 | "name": "发掘报告怎么写?", 1714 | "desc": "第一次探索沙漠地下的遗迹。", 1715 | "reward": 5, 1716 | "hidden": true, 1717 | "order": 1271 1718 | }, 1719 | { 1720 | "id": 81286, 1721 | "name": "在风中飘荡", 1722 | "desc": "击碎在沙漠中飘飞的风滚草。", 1723 | "reward": 5, 1724 | "hidden": true, 1725 | "order": 1272 1726 | }, 1727 | { 1728 | "id": 81288, 1729 | "name": "飞跃医院", 1730 | "desc": "曾有一位生还者逃离此处。", 1731 | "reward": 5, 1732 | "hidden": true, 1733 | "order": 1274 1734 | }, 1735 | { 1736 | "id": 81289, 1737 | "name": "训练有素的考古学家", 1738 | "desc": "让列柱沙原 、上风蚀地、下风蚀地所有的元能尖碑重新运转。", 1739 | "reward": 5, 1740 | "hidden": true, 1741 | "order": 1275 1742 | }, 1743 | { 1744 | "id": 81290, 1745 | "name": "超越时间的虚影", 1746 | "desc": "触碰沙漠中每一处神秘的壁画。", 1747 | "reward": 5, 1748 | "hidden": true, 1749 | "order": 1276 1750 | }, 1751 | { 1752 | "id": 81291, 1753 | "name": "「假若她们能知幽玄…」", 1754 | "desc": "利露帕尔自行解脱了与你的契约,选择面对自己漆黑深远的命运…", 1755 | "reward": 5, 1756 | "hidden": true, 1757 | "order": 1277 1758 | }, 1759 | { 1760 | "id": 81292, 1761 | "name": "「那只是永恒的奴役而已!」", 1762 | "desc": "沉睡千百年的镇灵利露帕尔与你订立了契约。", 1763 | "reward": 5, 1764 | "hidden": true, 1765 | "order": 1278 1766 | }, 1767 | { 1768 | "id": 81293, 1769 | "name": "无名之城的过往", 1770 | "desc": "居尔城神殿的壁画,讲述着一度辉煌的过往…", 1771 | "reward": 5, 1772 | "hidden": true, 1773 | "order": 1279 1774 | }, 1775 | { 1776 | "id": 81295, 1777 | "name": "宁静无梦的乐园", 1778 | "desc": "此处是花神的陵寝,是神明无梦的长眠…", 1779 | "reward": 5, 1780 | "hidden": true, 1781 | "order": 1282 1782 | }, 1783 | { 1784 | "id": 81296, 1785 | "name": "「…她必施行报应。」", 1786 | "desc": "当复仇者施展义怒,施行不义之人何曾预见过这一天呢?", 1787 | "reward": 5, 1788 | "hidden": true, 1789 | "order": 1283 1790 | }, 1791 | { 1792 | "id": 81297, 1793 | "name": "被染红的月亮", 1794 | "desc": "这片广阔的棋盘,曾在血红的月亮之下推演何种暴行?", 1795 | "reward": 5, 1796 | "hidden": true, 1797 | "order": 1284 1798 | }, 1799 | { 1800 | "id": 81298, 1801 | "name": "横冲直撞", 1802 | "desc": "盲目的沙虫在沙面猪突猛进,偶尔也会带来意外收获。", 1803 | "reward": 5, 1804 | "hidden": true, 1805 | "order": 1285 1806 | }, 1807 | { 1808 | "id": 81299, 1809 | "name": "「我也讨厌沙虫!」", 1810 | "desc": "第一次遭受沙虫的袭击。", 1811 | "reward": 5, 1812 | "hidden": true, 1813 | "order": 1286 1814 | }, 1815 | { 1816 | "id": 81300, 1817 | "name": "分歧的原点", 1818 | "desc": "知悉镀金旅团派往居尔城的调查队覆灭的真相。", 1819 | "reward": 5, 1820 | "hidden": true, 1821 | "order": 1287 1822 | }, 1823 | { 1824 | "id": 81301, 1825 | "name": "甚至不需要操作手册…", 1826 | "desc": "让奔奔恢复以往的活力。", 1827 | "reward": 5, 1828 | "hidden": true, 1829 | "order": 1288 1830 | }, 1831 | { 1832 | "id": 81302, 1833 | "name": "猎人的仁慈", 1834 | "desc": "让「猎鹰」塔德菈选择她的命运…", 1835 | "reward": 5, 1836 | "hidden": true, 1837 | "order": 1289 1838 | }, 1839 | { 1840 | "id": 81303, 1841 | "name": "飞毯之旅", 1842 | "desc": "看看这整个新世界,多令人眩晕的地方!", 1843 | "reward": 5, 1844 | "hidden": true, 1845 | "order": 1290 1846 | }, 1847 | { 1848 | "id": 81304, 1849 | "name": "「生命,很神奇吧?」", 1850 | "desc": "沙虫的行宫错综复杂,生命总能开辟出意想不到的通路…", 1851 | "reward": 5, 1852 | "hidden": true, 1853 | "order": 1291 1854 | }, 1855 | { 1856 | "id": 81306, 1857 | "name": "旧日的园圃与源泉", 1858 | "desc": "旧日澧泉不竭的阶池,如今已被黄沙填满…", 1859 | "reward": 5, 1860 | "hidden": true, 1861 | "order": 1293 1862 | }, 1863 | { 1864 | "id": 81307, 1865 | "name": "她的黄金时代…", 1866 | "desc": "紫红色的帕蒂莎兰盛开在空空的王座上,仿佛女主人永恒的笑容…", 1867 | "reward": 5, 1868 | "hidden": true, 1869 | "order": 1294 1870 | }, 1871 | { 1872 | "id": 81308, 1873 | "name": "「…使列邦观看你的丑陋。」", 1874 | "desc": "使残损的棋盘重现黄沙之间。", 1875 | "reward": 5, 1876 | "hidden": true, 1877 | "order": 1295 1878 | }, 1879 | { 1880 | "id": 81309, 1881 | "name": "来自泥土,归于黄沙…", 1882 | "desc": "正如沙漠中的一切生命那般…", 1883 | "reward": 5, 1884 | "hidden": true, 1885 | "order": 1296 1886 | }, 1887 | { 1888 | "id": 81310, 1889 | "name": "完美沙暴", 1890 | "desc": "「让我们直冲气象地狱。」", 1891 | "reward": 5, 1892 | "hidden": true, 1893 | "order": 1297 1894 | }, 1895 | { 1896 | "id": 81311, 1897 | "name": "无爱的塔兰图拉", 1898 | "desc": "「我非要把你煮成润滑油不可!」", 1899 | "reward": 5, 1900 | "hidden": true, 1901 | "order": 1298 1902 | }, 1903 | { 1904 | "id": 81312, 1905 | "name": "帕维兹拉万·赫瓦拉", 1906 | "desc": "让千壑沙地所有的元能尖碑重新运转。", 1907 | "reward": 5, 1908 | "hidden": true, 1909 | "order": 1299 1910 | }, 1911 | { 1912 | "id": 81313, 1913 | "name": "漫长的盟约", 1914 | "desc": "尽管命运已各自破碎,盟约依旧在沉眠中存续…", 1915 | "reward": 5, 1916 | "hidden": true, 1917 | "order": 1300 1918 | }, 1919 | { 1920 | "id": 81314, 1921 | "name": "光之大地", 1922 | "desc": "抵达甘露花海。", 1923 | "reward": 5, 1924 | "hidden": true, 1925 | "order": 1301 1926 | }, 1927 | { 1928 | "id": 81315, 1929 | "name": "从灰暗群山间升起", 1930 | "desc": "护送米希尔走完「净罪的巡礼路」。", 1931 | "reward": 5, 1932 | "hidden": true, 1933 | "order": 1302 1934 | }, 1935 | { 1936 | "id": 81316, 1937 | "name": "山上之树", 1938 | "desc": "使拉沙鲁回归甘露花海。", 1939 | "reward": 5, 1940 | "hidden": true, 1941 | "order": 1303 1942 | }, 1943 | { 1944 | "id": 81317, 1945 | "name": "浓雾之下", 1946 | "desc": "驱散弥漫在锋刃林泽的紫色烟霭。", 1947 | "reward": 5, 1948 | "hidden": true, 1949 | "order": 1304 1950 | }, 1951 | { 1952 | "id": 81318, 1953 | "name": "就在这里敲吧", 1954 | "desc": "回收全部五个「俱利般地」。", 1955 | "reward": 5, 1956 | "hidden": true, 1957 | "order": 1305 1958 | }, 1959 | { 1960 | "id": 81319, 1961 | "name": "群鸟的授记", 1962 | "desc": "在祖尔宛的见证下,斯露莎已取得「双角的花冠」…", 1963 | "reward": 5, 1964 | "hidden": true, 1965 | "order": 1306 1966 | }, 1967 | { 1968 | "id": 81320, 1969 | "name": "看我正义的一击!", 1970 | "desc": "使用遗迹重炮击破巨像的核心。", 1971 | "reward": 5, 1972 | "hidden": true, 1973 | "order": 1307 1974 | }, 1975 | { 1976 | "id": 81321, 1977 | "name": "「…将一切希望弃扬。」", 1978 | "desc": "到达地上国度的尽头。", 1979 | "reward": 5, 1980 | "hidden": true, 1981 | "order": 1308 1982 | }, 1983 | { 1984 | "id": 81322, 1985 | "name": "大铸造者", 1986 | "desc": "启动地下遗迹工坊中的大升降机。", 1987 | "reward": 5, 1988 | "hidden": true, 1989 | "order": 1309 1990 | }, 1991 | { 1992 | "id": 81323, 1993 | "name": "七谷的试炼", 1994 | "desc": "「灵光绝唱」的力量已在掌握之中。", 1995 | "reward": 5, 1996 | "hidden": true, 1997 | "order": 1310 1998 | }, 1999 | { 2000 | "id": 81324, 2001 | "name": "横跨深渊的绳索", 2002 | "desc": "完成离渡之仪,打开穿过黑渊的道路…", 2003 | "reward": 5, 2004 | "hidden": true, 2005 | "order": 1311 2006 | }, 2007 | { 2008 | "id": 81325, 2009 | "name": "骆驼、狮子和孩子", 2010 | "desc": "从沾染污秽的「染境」中取得所有「慈心」。", 2011 | "reward": 5, 2012 | "hidden": true, 2013 | "order": 1312 2014 | }, 2015 | { 2016 | "id": 81326, 2017 | "name": "蒂尔甘之日", 2018 | "desc": "洁净高天的渊薮后,灵光与甘露的力量已遍撒大地。", 2019 | "reward": 5, 2020 | "hidden": true, 2021 | "order": 1313 2022 | }, 2023 | { 2024 | "id": 81327, 2025 | "name": "奇景之旅", 2026 | "desc": "完成「画家漂流记」。", 2027 | "reward": 5, 2028 | "hidden": true, 2029 | "order": 1314 2030 | }, 2031 | { 2032 | "id": 81328, 2033 | "name": "「谜题全都解开了!」", 2034 | "desc": "完成「碑铭的研究」。", 2035 | "reward": 5, 2036 | "hidden": true, 2037 | "order": 1315 2038 | }, 2039 | { 2040 | "id": 81329, 2041 | "name": "百灵归巢", 2042 | "desc": "完成「微暗之火」。", 2043 | "reward": 5, 2044 | "hidden": true, 2045 | "order": 1316 2046 | }, 2047 | { 2048 | "id": 81339, 2049 | "name": "丰饶之海", 2050 | "desc": "花海中的所有花池都恢复了生机。", 2051 | "reward": 5, 2052 | "hidden": true, 2053 | "order": 1317 2054 | }, 2055 | { 2056 | "id": 81331, 2057 | "name": "勇者不会逃避", 2058 | "desc": "通过贾尔贾设下的全部试炼。", 2059 | "reward": 5, 2060 | "hidden": true, 2061 | "order": 1318 2062 | }, 2063 | { 2064 | "id": 81332, 2065 | "name": "闪光的道路", 2066 | "desc": "完成所有「灵宝铎」的挑战。", 2067 | "reward": 5, 2068 | "hidden": true, 2069 | "order": 1319 2070 | }, 2071 | { 2072 | "id": 81333, 2073 | "name": "历七盘而蹝蹑", 2074 | "desc": "完成所有「奇鼓跳跳菇」的挑战。", 2075 | "reward": 5, 2076 | "hidden": true, 2077 | "order": 1320 2078 | }, 2079 | { 2080 | "id": 81334, 2081 | "name": "黑泥流中的光辉", 2082 | "desc": "第一次利用灵光的力量,清除灰余晶。", 2083 | "reward": 5, 2084 | "hidden": true, 2085 | "order": 1321 2086 | }, 2087 | { 2088 | "id": 81335, 2089 | "name": "当红帕化作飞鸟…", 2090 | "desc": "第一次使用斯露莎飞行。", 2091 | "reward": 5, 2092 | "hidden": true, 2093 | "order": 1322 2094 | }, 2095 | { 2096 | "id": 81336, 2097 | "name": "在萨雷-奥杰卡的天空翱翔", 2098 | "desc": "使斯露莎维持飞行一段时间。", 2099 | "reward": 5, 2100 | "hidden": true, 2101 | "order": 1323 2102 | }, 2103 | { 2104 | "id": 81337, 2105 | "name": "你是谁的子孙,叫什么名字?", 2106 | "desc": "第一次使用斯露莎引导灵光之力。", 2107 | "reward": 5, 2108 | "hidden": true, 2109 | "order": 1324 2110 | }, 2111 | { 2112 | "id": 81338, 2113 | "name": "要用原力,斯露莎", 2114 | "desc": "使用斯露莎投掷「苦离果」,融化15个甘露凝结的晶石。", 2115 | "reward": 5, 2116 | "hidden": true, 2117 | "order": 1325 2118 | }, 2119 | { 2120 | "id": 81340, 2121 | "name": "抹消角度的人", 2122 | "desc": "借助结晶体的力量,压制兽境裂隙。", 2123 | "reward": 5, 2124 | "hidden": true, 2125 | "order": 1326 2126 | }, 2127 | { 2128 | "id": 81341, 2129 | "name": "炉心冷却", 2130 | "desc": "让翻腾的湖面重归平静。", 2131 | "reward": 5, 2132 | "hidden": true, 2133 | "order": 1327 2134 | }, 2135 | { 2136 | "id": 81342, 2137 | "name": "白船", 2138 | "desc": "「她在梦海之上遨游…」", 2139 | "reward": 5, 2140 | "hidden": true, 2141 | "order": 1328 2142 | }, 2143 | { 2144 | "id": 81362, 2145 | "name": "真是让人垂涎欲滴", 2146 | "desc": "帮助恩里改变命运。", 2147 | "reward": 5, 2148 | "hidden": true, 2149 | "order": 1329 2150 | }, 2151 | { 2152 | "id": 81344, 2153 | "name": "自然哲学百科全书", 2154 | "desc": "靠一面玻璃幕墙和一本无法解读的书发现了过去的结社集会所。", 2155 | "reward": 5, 2156 | "hidden": true, 2157 | "order": 1330 2158 | }, 2159 | { 2160 | "id": 81345, 2161 | "name": "枫丹式的消息", 2162 | "desc": "和维吉尔友好地聊了聊。", 2163 | "reward": 5, 2164 | "hidden": true, 2165 | "order": 1331 2166 | }, 2167 | { 2168 | "id": 81346, 2169 | "name": "不过是条猎犬…", 2170 | "desc": "帮助玛梅赫修好了西摩尔。", 2171 | "reward": 5, 2172 | "hidden": true, 2173 | "order": 1332 2174 | }, 2175 | { 2176 | "id": 81347, 2177 | "name": "是鱼肉,我加了鱼肉", 2178 | "desc": "与美露莘们一起品尝了奇妙的「生日蛋糕」。", 2179 | "reward": 5, 2180 | "hidden": true, 2181 | "order": 1333 2182 | }, 2183 | { 2184 | "id": 81348, 2185 | "name": "欢迎来到枫丹", 2186 | "desc": "完成一次巡轨船的航行。", 2187 | "reward": 5, 2188 | "hidden": true, 2189 | "order": 1334 2190 | }, 2191 | { 2192 | "id": 81349, 2193 | "name": "飞行的梦想", 2194 | "desc": "完成一次「安东·罗杰飞行器」的航程。", 2195 | "reward": 5, 2196 | "hidden": true, 2197 | "order": 1335 2198 | }, 2199 | { 2200 | "id": 81350, 2201 | "name": "现代钟表的诞生", 2202 | "desc": "帮助芙佳找到矿石的「用处」。", 2203 | "reward": 5, 2204 | "hidden": true, 2205 | "order": 1336 2206 | }, 2207 | { 2208 | "id": 81351, 2209 | "name": "未来水世界", 2210 | "desc": "见到「水面」之下的「水体」。", 2211 | "reward": 5, 2212 | "hidden": true, 2213 | "order": 1337 2214 | }, 2215 | { 2216 | "id": 81352, 2217 | "name": "丑的美学", 2218 | "desc": "枫丹朝美的方向前进了两步。", 2219 | "reward": 5, 2220 | "hidden": true, 2221 | "order": 1338 2222 | }, 2223 | { 2224 | "id": 81353, 2225 | "name": "就像雨中的泪水", 2226 | "desc": "揪出隐藏在猎刀鳐中的伪装者。", 2227 | "reward": 5, 2228 | "hidden": true, 2229 | "order": 1339 2230 | }, 2231 | { 2232 | "id": 81368, 2233 | "name": "圆滚滚的创化论", 2234 | "desc": "陪伴幼小的膨膨兽健康长大。", 2235 | "reward": 5, 2236 | "hidden": true, 2237 | "order": 1340 2238 | }, 2239 | { 2240 | "id": 81355, 2241 | "name": "这是我喜爱的事物中…", 2242 | "desc": "…小小的一部分。", 2243 | "reward": 5, 2244 | "hidden": true, 2245 | "order": 1341 2246 | }, 2247 | { 2248 | "id": 81356, 2249 | "name": "还施彼身", 2250 | "desc": "解决很烦人的子弹藤壶!", 2251 | "reward": 5, 2252 | "hidden": true, 2253 | "order": 1342 2254 | }, 2255 | { 2256 | "id": 81357, 2257 | "name": "你是否相信极乐城?", 2258 | "desc": "帮助缔造膨膨兽的乐园。", 2259 | "reward": 5, 2260 | "hidden": true, 2261 | "order": 1343 2262 | }, 2263 | { 2264 | "id": 81358, 2265 | "name": "历经艰险…", 2266 | "desc": "「…为了取得击败魔王的圣剑,骑士闯入了魔法封印的古城…」", 2267 | "reward": 5, 2268 | "hidden": true, 2269 | "order": 1344 2270 | }, 2271 | { 2272 | "id": 81359, 2273 | "name": "从此以后…", 2274 | "desc": "「…骑士战胜了魔王,救出了被囚禁的公主。王国终于恢复了光明…」", 2275 | "reward": 5, 2276 | "hidden": true, 2277 | "order": 1345 2278 | }, 2279 | { 2280 | "id": 81360, 2281 | "name": "黑字的研究", 2282 | "desc": "发现了自然哲学学院研究的…比较特别的对象。", 2283 | "reward": 5, 2284 | "hidden": true, 2285 | "order": 1346 2286 | }, 2287 | { 2288 | "id": 81361, 2289 | "name": "两万里格的漫游", 2290 | "desc": "随波逐流…", 2291 | "reward": 5, 2292 | "hidden": true, 2293 | "order": 1347 2294 | }, 2295 | { 2296 | "id": 81363, 2297 | "name": "旧日之歌", 2298 | "desc": "聆听来自悠远年代的伟大乐章。", 2299 | "reward": 5, 2300 | "hidden": true, 2301 | "order": 1348 2302 | }, 2303 | { 2304 | "id": 81364, 2305 | "name": "「湖畔的尼尼安涅」", 2306 | "desc": "战胜地方传奇·湖畔的尼尼安涅。", 2307 | "reward": 5, 2308 | "hidden": true, 2309 | "order": 1349 2310 | }, 2311 | { 2312 | "id": 81365, 2313 | "name": "「湖畔的维维安涅」", 2314 | "desc": "战胜地方传奇·湖畔的维维安涅。", 2315 | "reward": 5, 2316 | "hidden": true, 2317 | "order": 1350 2318 | }, 2319 | { 2320 | "id": 81366, 2321 | "name": "恪尽其责的企盼", 2322 | "desc": "物归原主…", 2323 | "reward": 5, 2324 | "hidden": true, 2325 | "order": 1351 2326 | }, 2327 | { 2328 | "id": 81367, 2329 | "name": "追忆泉华的时光", 2330 | "desc": "枫丹的声望等级达到10级。", 2331 | "reward": 20, 2332 | "hidden": false, 2333 | "order": 1352 2334 | }, 2335 | { 2336 | "id": 81369, 2337 | "name": "「海原巡回法官」", 2338 | "desc": "战胜地方传奇·海原巡回法官。", 2339 | "reward": 5, 2340 | "hidden": true, 2341 | "order": 1353 2342 | }, 2343 | { 2344 | "id": 81370, 2345 | "name": "「铁皮子爵」", 2346 | "desc": "战胜地方传奇·铁皮子爵。", 2347 | "reward": 5, 2348 | "hidden": true, 2349 | "order": 1354 2350 | }, 2351 | { 2352 | "id": 81371, 2353 | "name": "「隐者王·多尔库」", 2354 | "desc": "战胜地方传奇·隐者王·多尔库。", 2355 | "reward": 5, 2356 | "hidden": true, 2357 | "order": 1355 2358 | }, 2359 | { 2360 | "id": 81372, 2361 | "name": "「渐渐隐去的老兵」", 2362 | "desc": "战胜地方传奇「渐渐隐去的老兵」。", 2363 | "reward": 5, 2364 | "hidden": true, 2365 | "order": 1356 2366 | }, 2367 | { 2368 | "id": 81373, 2369 | "name": "「深谷之剑」", 2370 | "desc": "战胜地方传奇·深谷之剑。", 2371 | "reward": 5, 2372 | "hidden": true, 2373 | "order": 1357 2374 | }, 2375 | { 2376 | "id": 81374, 2377 | "name": "「双生妖精骑士」", 2378 | "desc": "战胜地方传奇·双生妖精骑士。", 2379 | "reward": 5, 2380 | "hidden": true, 2381 | "order": 1358 2382 | }, 2383 | { 2384 | "id": 81375, 2385 | "name": "消费社会", 2386 | "desc": "在「破烂骨头商店」尽情消费。", 2387 | "reward": 5, 2388 | "hidden": true, 2389 | "order": 1359 2390 | }, 2391 | { 2392 | "id": 81376, 2393 | "name": "当午夜钟声敲响", 2394 | "desc": "知晓了卡特皮拉的真实面目。", 2395 | "reward": 5, 2396 | "hidden": true, 2397 | "order": 1360 2398 | }, 2399 | { 2400 | "id": 81377, 2401 | "name": "非零和博弈", 2402 | "desc": "完成了特许食堂内部满意度调研。", 2403 | "reward": 5, 2404 | "hidden": true, 2405 | "order": 1361 2406 | }, 2407 | { 2408 | "id": 81378, 2409 | "name": "零余者的自述", 2410 | "desc": "听克兰茨讲述了一些往事。", 2411 | "reward": 5, 2412 | "hidden": true, 2413 | "order": 1362 2414 | }, 2415 | { 2416 | "id": 81379, 2417 | "name": "四水果击", 2418 | "desc": "完成了「秩序水果团」与布兰奇的故事。", 2419 | "reward": 5, 2420 | "hidden": true, 2421 | "order": 1363 2422 | }, 2423 | { 2424 | "id": 81380, 2425 | "name": "彩虹的脚下是…?", 2426 | "desc": "循着光线的引导抵达了终点。", 2427 | "reward": 5, 2428 | "hidden": true, 2429 | "order": 1364 2430 | }, 2431 | { 2432 | "id": 81381, 2433 | "name": "出来吧神秘矿!", 2434 | "desc": "集齐了七块神秘的黄绿色矿石。", 2435 | "reward": 5, 2436 | "hidden": true, 2437 | "order": 1365 2438 | }, 2439 | { 2440 | "id": 81382, 2441 | "name": "并不怎么窄的门", 2442 | "desc": "开启了通往某间藏书室的大门。", 2443 | "reward": 5, 2444 | "hidden": false, 2445 | "order": 1366 2446 | }, 2447 | { 2448 | "id": 81383, 2449 | "name": "长日留痕", 2450 | "desc": "花费了许多时间培育审美。", 2451 | "reward": 5, 2452 | "hidden": true, 2453 | "order": 1367 2454 | }, 2455 | { 2456 | "id": 81384, 2457 | "name": "在未来多于过去的年岁", 2458 | "desc": "我们都有光明的未来…", 2459 | "reward": 5, 2460 | "hidden": true, 2461 | "order": 1368 2462 | }, 2463 | { 2464 | "id": 81385, 2465 | "name": "打破时间墙", 2466 | "desc": "击破棘球孢囊,使该水域得到净化。", 2467 | "reward": 5, 2468 | "hidden": true, 2469 | "order": 1369 2470 | }, 2471 | { 2472 | "id": 81386, 2473 | "name": "被遗忘的纸带", 2474 | "desc": "帮助布罗意回收并整理全部的「水文观测数据」。", 2475 | "reward": 5, 2476 | "hidden": true, 2477 | "order": 1370 2478 | }, 2479 | { 2480 | "id": 81387, 2481 | "name": "当机芯陷入沉眠…", 2482 | "desc": "发现「奎瑟尔发条工坊」中隐藏的秘密。", 2483 | "reward": 5, 2484 | "hidden": true, 2485 | "order": 1371 2486 | }, 2487 | { 2488 | "id": 81388, 2489 | "name": "最凶!发条机关的八魔将", 2490 | "desc": "获得了「不完美的」发条机关的遗产。", 2491 | "reward": 5, 2492 | "hidden": true, 2493 | "order": 1372 2494 | }, 2495 | { 2496 | "id": 81389, 2497 | "name": "「自律超算型场力发生装置」", 2498 | "desc": "战胜地方传奇·自律超算型场力发生装置。", 2499 | "reward": 5, 2500 | "hidden": true, 2501 | "order": 1373 2502 | }, 2503 | { 2504 | "id": 81390, 2505 | "name": "冲击炸裂铁箱斗技", 2506 | "desc": "指导格内薇芙和布瓦列特在娱乐赛中取胜。", 2507 | "reward": 5, 2508 | "hidden": true, 2509 | "order": 1374 2510 | }, 2511 | { 2512 | "id": 81391, 2513 | "name": "未记录的功能", 2514 | "desc": "修复「二号初始能力样机」时触发了其隐藏特性。", 2515 | "reward": 5, 2516 | "hidden": true, 2517 | "order": 1375 2518 | }, 2519 | { 2520 | "id": 81392, 2521 | "name": "潜水钟与胖胖果", 2522 | "desc": "完成了水下进阶训练。", 2523 | "reward": 5, 2524 | "hidden": true, 2525 | "order": 1376 2526 | }, 2527 | { 2528 | "id": 81393, 2529 | "name": "「极彩的露珂菈」", 2530 | "desc": "战胜地方传奇·极彩的露珂菈。", 2531 | "reward": 5, 2532 | "hidden": true, 2533 | "order": 1377 2534 | }, 2535 | { 2536 | "id": 81395, 2537 | "name": "夹在章程里的人", 2538 | "desc": "通过枫丹科学院的「最终审核」。", 2539 | "reward": 5, 2540 | "hidden": true, 2541 | "order": 1379 2542 | }, 2543 | { 2544 | "id": 81396, 2545 | "name": "孤独派报告", 2546 | "desc": "获得克洛妮艾私自印制的「特别报告」。", 2547 | "reward": 5, 2548 | "hidden": true, 2549 | "order": 1380 2550 | }, 2551 | { 2552 | "id": 81398, 2553 | "name": "红恶棍的报复", 2554 | "desc": "清除了「布拉维的锻压工坊」的红恶棍与小小恶棍。", 2555 | "reward": 5, 2556 | "hidden": true, 2557 | "order": 1382 2558 | }, 2559 | { 2560 | "id": 81399, 2561 | "name": "最终枫达海", 2562 | "desc": "…畅饮世界!", 2563 | "reward": 5, 2564 | "hidden": true, 2565 | "order": 1383 2566 | }, 2567 | { 2568 | "id": 81400, 2569 | "name": "「…什么新浪潮?」", 2570 | "desc": "翻阅了全部时髦读物。", 2571 | "reward": 5, 2572 | "hidden": true, 2573 | "order": 1384 2574 | }, 2575 | { 2576 | "id": 81401, 2577 | "name": "美好的昨天", 2578 | "desc": "昨日之日不可留…", 2579 | "reward": 5, 2580 | "hidden": true, 2581 | "order": 1385 2582 | }, 2583 | { 2584 | "id": 81402, 2585 | "name": "多谢惠顾!", 2586 | "desc": "抽到了两倍幸运的幸运签。", 2587 | "reward": 5, 2588 | "hidden": true, 2589 | "order": 1386 2590 | }, 2591 | { 2592 | "id": 81403, 2593 | "name": "最终枫达海", 2594 | "desc": "…畅饮世界!", 2595 | "reward": 5, 2596 | "hidden": true, 2597 | "order": 1387, 2598 | "preStage": 81399 2599 | }, 2600 | { 2601 | "id": 81404, 2602 | "name": "最终枫达海", 2603 | "desc": "…畅饮世界!", 2604 | "reward": 5, 2605 | "hidden": true, 2606 | "order": 1388, 2607 | "preStage": 81403 2608 | }, 2609 | { 2610 | "id": 81405, 2611 | "name": "「以索忒」", 2612 | "desc": "战胜地方传奇·以索忒。", 2613 | "reward": 5, 2614 | "hidden": true, 2615 | "order": 1389 2616 | }, 2617 | { 2618 | "id": 81406, 2619 | "name": "明天交换明天", 2620 | "desc": "教会珀西芙如何道别。", 2621 | "reward": 5, 2622 | "hidden": true, 2623 | "order": 1390 2624 | }, 2625 | { 2626 | "id": 81407, 2627 | "name": "水仙十字题解·迷宫篇", 2628 | "desc": "「如何?为你描绘的这个世界?」", 2629 | "reward": 5, 2630 | "hidden": true, 2631 | "order": 1391 2632 | }, 2633 | { 2634 | "id": 81408, 2635 | "name": "只缘身在其中", 2636 | "desc": "知晓水仙十字结社位置的秘密,并击败雅各布。", 2637 | "reward": 5, 2638 | "hidden": true, 2639 | "order": 1392 2640 | }, 2641 | { 2642 | "id": 81409, 2643 | "name": "平俗宇宙的不灭帝皇", 2644 | "desc": "击败纳齐森科鲁兹。", 2645 | "reward": 5, 2646 | "hidden": true, 2647 | "order": 1393 2648 | }, 2649 | { 2650 | "id": 81411, 2651 | "name": "再见,艾利法斯先生", 2652 | "desc": "击败艾利法斯。", 2653 | "reward": 5, 2654 | "hidden": true, 2655 | "order": 1395 2656 | }, 2657 | { 2658 | "id": 81414, 2659 | "name": "饱和水力攻击", 2660 | "desc": "从猛烈的舰炮攻击中取得宝物。", 2661 | "reward": 5, 2662 | "hidden": true, 2663 | "order": 1398 2664 | }, 2665 | { 2666 | "id": 81415, 2667 | "name": "太空军校生", 2668 | "desc": "全部命中!", 2669 | "reward": 5, 2670 | "hidden": true, 2671 | "order": 1399 2672 | }, 2673 | { 2674 | "id": 81417, 2675 | "name": "故事结束了,但是…", 2676 | "desc": "「名为人生的冒险故事还在继续。」", 2677 | "reward": 5, 2678 | "hidden": true, 2679 | "order": 1401 2680 | }, 2681 | { 2682 | "id": 81419, 2683 | "name": "我畏惧我在风中的怒火…", 2684 | "desc": "…将为至真至美的花朵带来凋败。", 2685 | "reward": 5, 2686 | "hidden": true, 2687 | "order": 1403 2688 | }, 2689 | { 2690 | "id": 81422, 2691 | "name": "一个预计内的结局", 2692 | "desc": "帮助枫丹科学院重回正轨…?", 2693 | "reward": 5, 2694 | "hidden": true, 2695 | "order": 1406 2696 | }, 2697 | { 2698 | "id": 81423, 2699 | "name": "未祛魅的世界", 2700 | "desc": "三次出让神秘的异色结晶石给「锈舵」掌舵人。", 2701 | "reward": 5, 2702 | "hidden": true, 2703 | "order": 1407 2704 | }, 2705 | { 2706 | "id": 81424, 2707 | "name": "为了众人的愿望", 2708 | "desc": "获得虹彩蔷薇的承诺。", 2709 | "reward": 5, 2710 | "hidden": true, 2711 | "order": 1408 2712 | }, 2713 | { 2714 | "id": 81425, 2715 | "name": "乌鸦还是乌鸫?", 2716 | "desc": "是鹈鹕啦!", 2717 | "reward": 5, 2718 | "hidden": true, 2719 | "order": 1409 2720 | }, 2721 | { 2722 | "id": 81427, 2723 | "name": "我相信有仙子存在", 2724 | "desc": "帮助佩妮解决她的心灵危机。", 2725 | "reward": 5, 2726 | "hidden": true, 2727 | "order": 1411 2728 | }, 2729 | { 2730 | "id": 81428, 2731 | "name": "柔灯铃的花语…?", 2732 | "desc": "在无人留意的角落发现一朵无人留意的小花。", 2733 | "reward": 5, 2734 | "hidden": true, 2735 | "order": 1412 2736 | }, 2737 | { 2738 | "id": 81430, 2739 | "name": "希望是个好词", 2740 | "desc": "见识到某处废墟的新生。", 2741 | "reward": 5, 2742 | "hidden": true, 2743 | "order": 1414 2744 | }, 2745 | { 2746 | "id": 81431, 2747 | "name": "凯撒来了也不卖", 2748 | "desc": "获得这个世界上最伟大的艺术作品。", 2749 | "reward": 5, 2750 | "hidden": true, 2751 | "order": 1415 2752 | }, 2753 | { 2754 | "id": 81432, 2755 | "name": "「夏萨尼翁」", 2756 | "desc": "战胜地方传奇·夏萨尼翁。", 2757 | "reward": 5, 2758 | "hidden": true, 2759 | "order": 1416 2760 | }, 2761 | { 2762 | "id": 81433, 2763 | "name": "「魔剑柯鲁日」", 2764 | "desc": "战胜地方传奇·魔剑柯鲁日。", 2765 | "reward": 5, 2766 | "hidden": true, 2767 | "order": 1417 2768 | }, 2769 | { 2770 | "id": 81434, 2771 | "name": "「罗基·艾威尔森」", 2772 | "desc": "战胜地方传奇·罗基·艾威尔森。", 2773 | "reward": 5, 2774 | "hidden": true, 2775 | "order": 1418 2776 | }, 2777 | { 2778 | "id": 81435, 2779 | "name": "「利亚姆」", 2780 | "desc": "战胜地方传奇·利亚姆。", 2781 | "reward": 5, 2782 | "hidden": true, 2783 | "order": 1419 2784 | }, 2785 | { 2786 | "id": 81436, 2787 | "name": "「雪奈茨芙娜的蝶安奈拉」", 2788 | "desc": "战胜地方传奇·雪奈茨芙娜的蝶安奈拉。", 2789 | "reward": 5, 2790 | "hidden": true, 2791 | "order": 1420 2792 | }, 2793 | { 2794 | "id": 81437, 2795 | "name": "人间剧", 2796 | "desc": "见证勒鲁瓦一家的故事。", 2797 | "reward": 5, 2798 | "hidden": true, 2799 | "order": 1421 2800 | }, 2801 | { 2802 | "id": 81438, 2803 | "name": "「赤璋巡岳府君」", 2804 | "desc": "战胜地方传奇·赤璋巡岳府君。", 2805 | "reward": 5, 2806 | "hidden": true, 2807 | "order": 1422 2808 | }, 2809 | { 2810 | "id": 81439, 2811 | "name": "至上的秘笈", 2812 | "desc": "找到古华遗留的宝藏。", 2813 | "reward": 5, 2814 | "hidden": true, 2815 | "order": 1423 2816 | }, 2817 | { 2818 | "id": 81440, 2819 | "name": "真·枪剑双绝", 2820 | "desc": "通过王山厅内的全部试炼。", 2821 | "reward": 5, 2822 | "hidden": true, 2823 | "order": 1424 2824 | }, 2825 | { 2826 | "id": 81441, 2827 | "name": "废墟的故事", 2828 | "desc": "解开先民尘封的秘密。", 2829 | "reward": 5, 2830 | "hidden": true, 2831 | "order": 1425 2832 | }, 2833 | { 2834 | "id": 81442, 2835 | "name": "整旧如新", 2836 | "desc": "完成六处遗迹景观的修复与重建。", 2837 | "reward": 5, 2838 | "hidden": true, 2839 | "order": 1426 2840 | }, 2841 | { 2842 | "id": 81443, 2843 | "name": "破尽无明", 2844 | "desc": "破除七处氲气的根源。", 2845 | "reward": 5, 2846 | "hidden": true, 2847 | "order": 1427 2848 | }, 2849 | { 2850 | "id": 81444, 2851 | "name": "触及苍穹的容颜", 2852 | "desc": "运用仙力,短暂摆脱大地的束缚。", 2853 | "reward": 5, 2854 | "hidden": true, 2855 | "order": 1428 2856 | }, 2857 | { 2858 | "id": 81445, 2859 | "name": "不过是块石头而已…", 2860 | "desc": "…所以记得要小心轻放。", 2861 | "reward": 5, 2862 | "hidden": true, 2863 | "order": 1429 2864 | }, 2865 | { 2866 | "id": 81446, 2867 | "name": "我乃茶,釜中之茶", 2868 | "desc": "帮罗叔修好了翘英庄的茶釜。", 2869 | "reward": 5, 2870 | "hidden": true, 2871 | "order": 1430 2872 | }, 2873 | { 2874 | "id": 81447, 2875 | "name": "何岁为春,何岁为秋", 2876 | "desc": "见证古树重焕新生。", 2877 | "reward": 5, 2878 | "hidden": true, 2879 | "order": 1431 2880 | }, 2881 | { 2882 | "id": 81448, 2883 | "name": "「肉脯沉…什么出?」", 2884 | "desc": "发现玉璜古龟的栖息地。", 2885 | "reward": 5, 2886 | "hidden": true, 2887 | "order": 1432 2888 | }, 2889 | { 2890 | "id": 81449, 2891 | "name": "壶中景迥日月长", 2892 | "desc": "在沉玉谷的山川间,斟满所有的古茶杯。", 2893 | "reward": 5, 2894 | "hidden": true, 2895 | "order": 1433 2896 | }, 2897 | { 2898 | "id": 81450, 2899 | "name": "锦落云开", 2900 | "desc": "与灵渊一同进入尘封已久的锦落庭。", 2901 | "reward": 5, 2902 | "hidden": true, 2903 | "order": 1434 2904 | }, 2905 | { 2906 | "id": 81452, 2907 | "name": "五剑归王山", 2908 | "desc": "找到全部五把「古华遗剑」。", 2909 | "reward": 5, 2910 | "hidden": true, 2911 | "order": 1436 2912 | }, 2913 | { 2914 | "id": 81454, 2915 | "name": "「想学啊?我教你!」", 2916 | "desc": "战胜身份特殊的古华派非正式弟子三次。", 2917 | "reward": 5, 2918 | "hidden": true, 2919 | "order": 1438 2920 | }, 2921 | { 2922 | "id": 81455, 2923 | "name": "壁绘的面纱", 2924 | "desc": "见证四处壁画。", 2925 | "reward": 5, 2926 | "hidden": true, 2927 | "order": 1439 2928 | }, 2929 | { 2930 | "id": 81457, 2931 | "name": "铁石为开", 2932 | "desc": "帮助千岩军查获了「铁盐帮」的非法贸易。", 2933 | "reward": 5, 2934 | "hidden": true, 2935 | "order": 1441 2936 | }, 2937 | { 2938 | "id": 81458, 2939 | "name": "沉玉谷四景", 2940 | "desc": "获得了限量版的「沉玉之旅」留影纪念册。", 2941 | "reward": 5, 2942 | "hidden": true, 2943 | "order": 1442 2944 | }, 2945 | { 2946 | "id": 81459, 2947 | "name": "香莙梦", 2948 | "desc": "了解魂香花的秘密。", 2949 | "reward": 5, 2950 | "hidden": true, 2951 | "order": 1443 2952 | }, 2953 | { 2954 | "id": 81460, 2955 | "name": "从善如流", 2956 | "desc": "提升了养育驮兽的心得…真的有用吗?", 2957 | "reward": 5, 2958 | "hidden": true, 2959 | "order": 1444 2960 | }, 2961 | { 2962 | "id": 81461, 2963 | "name": "后备非隐藏能源", 2964 | "desc": "重新启动沉玉谷的遗迹机关。", 2965 | "reward": 5, 2966 | "hidden": true, 2967 | "order": 1445 2968 | }, 2969 | { 2970 | "id": 81462, 2971 | "name": "万里城垣建造时", 2972 | "desc": "找到千岩军留下的物资。", 2973 | "reward": 5, 2974 | "hidden": true, 2975 | "order": 1446 2976 | }, 2977 | { 2978 | "id": 81463, 2979 | "name": "碧水从游", 2980 | "desc": "在船歌声中观览碧水河的美景。", 2981 | "reward": 5, 2982 | "hidden": true, 2983 | "order": 1447 2984 | }, 2985 | { 2986 | "id": 81465, 2987 | "name": "鲤跃天门开", 2988 | "desc": "见证金鲤飞跃空谷。", 2989 | "reward": 5, 2990 | "hidden": true, 2991 | "order": 1449 2992 | }, 2993 | { 2994 | "id": 81466, 2995 | "name": "灵何惟兮水中", 2996 | "desc": "发现宝玦口隐藏的秘密。", 2997 | "reward": 5, 2998 | "hidden": true, 2999 | "order": 1450 3000 | }, 3001 | { 3002 | "id": 81467, 3003 | "name": "「玉璧玉璧,随我心意…」", 3004 | "desc": "回收最后的祀珑。", 3005 | "reward": 5, 3006 | "hidden": true, 3007 | "order": 1451 3008 | }, 3009 | { 3010 | "id": 81468, 3011 | "name": "时仿佛以遥见", 3012 | "desc": "畴昔梦以登天。", 3013 | "reward": 5, 3014 | "hidden": true, 3015 | "order": 1452 3016 | }, 3017 | { 3018 | "id": 81469, 3019 | "name": "悠古的巫觋歌", 3020 | "desc": "见证浮锦完成投珑仪式。", 3021 | "reward": 5, 3022 | "hidden": true, 3023 | "order": 1453 3024 | }, 3025 | { 3026 | "id": 81470, 3027 | "name": "历玄冥以幽径", 3028 | "desc": "再度回到锦落庭。", 3029 | "reward": 5, 3030 | "hidden": true, 3031 | "order": 1454 3032 | }, 3033 | { 3034 | "id": 81471, 3035 | "name": "秘密的奇迹", 3036 | "desc": "发现来歆山玉石的秘密。", 3037 | "reward": 5, 3038 | "hidden": true, 3039 | "order": 1455 3040 | }, 3041 | { 3042 | "id": 81472, 3043 | "name": "「西尼阿斯」", 3044 | "desc": "战胜地方传奇·西尼阿斯。", 3045 | "reward": 5, 3046 | "hidden": true, 3047 | "order": 1456 3048 | }, 3049 | { 3050 | "id": 81473, 3051 | "name": "龙蜥特急斯库拉号", 3052 | "desc": "第一次使用斯库拉召唤的激流前往目标地点。", 3053 | "reward": 5, 3054 | "hidden": true, 3055 | "order": 1457 3056 | }, 3057 | { 3058 | "id": 81474, 3059 | "name": "吾之所问,汝为人乎?", 3060 | "desc": "第一次停住并拾取神出鬼没的魔导书。", 3061 | "reward": 5, 3062 | "hidden": true, 3063 | "order": 1458 3064 | }, 3065 | { 3066 | "id": 81475, 3067 | "name": "为书所爱的人", 3068 | "desc": "使用魔导书激活褪色城堡里的全部神秘书柜。", 3069 | "reward": 5, 3070 | "hidden": true, 3071 | "order": 1459 3072 | }, 3073 | { 3074 | "id": 81476, 3075 | "name": "「漂泊的异乡人」", 3076 | "desc": "使失落的曲谱重见天日。", 3077 | "reward": 5, 3078 | "hidden": true, 3079 | "order": 1460 3080 | }, 3081 | { 3082 | "id": 81477, 3083 | "name": "根本就没藏嘛!", 3084 | "desc": "搜集朱利亚诺遗留的四处宝藏。", 3085 | "reward": 5, 3086 | "hidden": true, 3087 | "order": 1461 3088 | }, 3089 | { 3090 | "id": 81478, 3091 | "name": "饲主的职分", 3092 | "desc": "为「小呜斯」带来了新鲜的食物。", 3093 | "reward": 5, 3094 | "hidden": true, 3095 | "order": 1462 3096 | }, 3097 | { 3098 | "id": 81479, 3099 | "name": "第十位缪斯", 3100 | "desc": "得以掌握「乐章」的力量。", 3101 | "reward": 5, 3102 | "hidden": true, 3103 | "order": 1463 3104 | }, 3105 | { 3106 | "id": 81480, 3107 | "name": "墙上的奥德赛", 3108 | "desc": "完成褪色城堡的舞台演奏。", 3109 | "reward": 5, 3110 | "hidden": true, 3111 | "order": 1464 3112 | }, 3113 | { 3114 | "id": 81481, 3115 | "name": "「请转告王城的公民…」", 3116 | "desc": "「我们长眠于此,至死恪守誓言…」", 3117 | "reward": 5, 3118 | "hidden": true, 3119 | "order": 1465 3120 | }, 3121 | { 3122 | "id": 81482, 3123 | "name": "时间的神秘形式", 3124 | "desc": "向钟声致敬。", 3125 | "reward": 5, 3126 | "hidden": true, 3127 | "order": 1466 3128 | }, 3129 | { 3130 | "id": 81483, 3131 | "name": "曾与世界为敌", 3132 | "desc": "封印千年的龙蜥之王,苏醒了…", 3133 | "reward": 5, 3134 | "hidden": true, 3135 | "order": 1467 3136 | }, 3137 | { 3138 | "id": 81484, 3139 | "name": "条条大路通雷马", 3140 | "desc": "造访静滞的「永恒之城」。", 3141 | "reward": 5, 3142 | "hidden": true, 3143 | "order": 1468 3144 | }, 3145 | { 3146 | "id": 81485, 3147 | "name": "迟来的继业者", 3148 | "desc": "他的愿望,将由你来完成…", 3149 | "reward": 5, 3150 | "hidden": true, 3151 | "order": 1469 3152 | }, 3153 | { 3154 | "id": 81487, 3155 | "name": "宽缓的归途", 3156 | "desc": "帮助朱斯蒂诺返回故乡。", 3157 | "reward": 5, 3158 | "hidden": true, 3159 | "order": 1471 3160 | }, 3161 | { 3162 | "id": 81488, 3163 | "name": "舞!舞!舞!", 3164 | "desc": "在「回声之子」观看「钻头热舞」的比赛。", 3165 | "reward": 5, 3166 | "hidden": true, 3167 | "order": 1472 3168 | }, 3169 | { 3170 | "id": 81489, 3171 | "name": "侧耳倾听", 3172 | "desc": "在「流泉之众」观看即兴乐队的演出。", 3173 | "reward": 5, 3174 | "hidden": true, 3175 | "order": 1473 3176 | }, 3177 | { 3178 | "id": 81490, 3179 | "name": "禁止随意拿取!", 3180 | "desc": "将黑曜石的偶像还回「悬木人」祖地的祭坛之上。", 3181 | "reward": 5, 3182 | "hidden": true, 3183 | "order": 1474 3184 | }, 3185 | { 3186 | "id": 81491, 3187 | "name": "前有隐藏…", 3188 | "desc": "在浮土静界完成试炼,令中空之岛得以浮现。", 3189 | "reward": 5, 3190 | "hidden": true, 3191 | "order": 1475 3192 | }, 3193 | { 3194 | "id": 81492, 3195 | "name": "如飘向空中的丝绸…", 3196 | "desc": "开启通往浮土静界的游隙灵道。", 3197 | "reward": 5, 3198 | "hidden": true, 3199 | "order": 1476 3200 | }, 3201 | { 3202 | "id": 81493, 3203 | "name": "「哇!是大逆转!」", 3204 | "desc": "不妨把思路掉转过来…", 3205 | "reward": 5, 3206 | "hidden": true, 3207 | "order": 1477 3208 | }, 3209 | { 3210 | "id": 81494, 3211 | "name": "下次还是别讲冷笑话了…", 3212 | "desc": "「缝影针」从天而落…", 3213 | "reward": 5, 3214 | "hidden": true, 3215 | "order": 1478 3216 | }, 3217 | { 3218 | "id": 81496, 3219 | "name": "传说中的勇者传说", 3220 | "desc": "证明自己与龙伙伴的羁绊,得到「盗火贤者」的护符。", 3221 | "reward": 5, 3222 | "hidden": true, 3223 | "order": 1480 3224 | }, 3225 | { 3226 | "id": 81497, 3227 | "name": "红海啊,让开道路吧…", 3228 | "desc": "与龙伙伴携手完成「盗火贤者」的试炼,开启通往岩浆之底的通路。", 3229 | "reward": 5, 3230 | "hidden": true, 3231 | "order": 1481 3232 | }, 3233 | { 3234 | "id": 81499, 3235 | "name": "战场的召唤", 3236 | "desc": "首次触碰「夜魂试炼」的图腾。", 3237 | "reward": 5, 3238 | "hidden": true, 3239 | "order": 1483 3240 | }, 3241 | { 3242 | "id": 81500, 3243 | "name": "以战斗平息…", 3244 | "desc": "完成「夜魂试炼之所」的战斗挑战。", 3245 | "reward": 5, 3246 | "hidden": true, 3247 | "order": 1484 3248 | }, 3249 | { 3250 | "id": 81501, 3251 | "name": "献给虚无的供物", 3252 | "desc": "收集了全部的「残夜的碎玉」,合成了献贡的祭物「夜之玉」。", 3253 | "reward": 5, 3254 | "hidden": true, 3255 | "order": 1485 3256 | }, 3257 | { 3258 | "id": 81502, 3259 | "name": "真的能出成果吗?", 3260 | "desc": "将收集到的「镌光铭印」碎片交给了研究员秋纽奥。", 3261 | "reward": 5, 3262 | "hidden": true, 3263 | "order": 1486 3264 | }, 3265 | { 3266 | "id": 81503, 3267 | "name": "烦请高抬贵脚", 3268 | "desc": "危险可能从天而降。", 3269 | "reward": 5, 3270 | "hidden": true, 3271 | "order": 1487 3272 | }, 3273 | { 3274 | "id": 81504, 3275 | "name": "「好烫!好烫! 」", 3276 | "desc": "不是游泳的好地方…", 3277 | "reward": 5, 3278 | "hidden": true, 3279 | "order": 1488 3280 | }, 3281 | { 3282 | "id": 81505, 3283 | "name": "福无双至…", 3284 | "desc": "祸不单行。", 3285 | "reward": 5, 3286 | "hidden": true, 3287 | "order": 1489 3288 | }, 3289 | { 3290 | "id": 81506, 3291 | "name": "再见了伙伴", 3292 | "desc": "感谢你一路的陪伴。", 3293 | "reward": 5, 3294 | "hidden": true, 3295 | "order": 1490 3296 | }, 3297 | { 3298 | "id": 81507, 3299 | "name": "最后的仁慈", 3300 | "desc": "再一次分享食物给拦路的匿叶龙。", 3301 | "reward": 5, 3302 | "hidden": true, 3303 | "order": 1491 3304 | }, 3305 | { 3306 | "id": 81508, 3307 | "name": "新的希望", 3308 | "desc": "就像种子发出新芽…", 3309 | "reward": 5, 3310 | "hidden": true, 3311 | "order": 1492 3312 | }, 3313 | { 3314 | "id": 81509, 3315 | "name": "谢谢你们的鱼", 3316 | "desc": "多谢款待!", 3317 | "reward": 5, 3318 | "hidden": true, 3319 | "order": 1493 3320 | }, 3321 | { 3322 | "id": 81510, 3323 | "name": "走入画中…", 3324 | "desc": "打开画壁之后的世界。", 3325 | "reward": 5, 3326 | "hidden": true, 3327 | "order": 1494 3328 | }, 3329 | { 3330 | "id": 81511, 3331 | "name": "网中之梦", 3332 | "desc": "捕捉夜晚的讯息…", 3333 | "reward": 5, 3334 | "hidden": true, 3335 | "order": 1495 3336 | }, 3337 | { 3338 | "id": 81512, 3339 | "name": "正义的反抗", 3340 | "desc": "总之,邪恶的机器被关闭了…", 3341 | "reward": 5, 3342 | "hidden": true, 3343 | "order": 1496 3344 | }, 3345 | { 3346 | "id": 81513, 3347 | "name": "「为最美者」", 3348 | "desc": "令火榴树的根系汲取到足够的液态燃素,使「山王火榴」成熟。", 3349 | "reward": 5, 3350 | "hidden": true, 3351 | "order": 1497 3352 | }, 3353 | { 3354 | "id": 81516, 3355 | "name": "高速滑空", 3356 | "desc": "首次乘坐游隙灵道。", 3357 | "reward": 5, 3358 | "hidden": true, 3359 | "order": 1500 3360 | }, 3361 | { 3362 | "id": 81518, 3363 | "name": "只有锻炼的地方还留着?", 3364 | "desc": "来到了失落的古代试炼所…", 3365 | "reward": 5, 3366 | "hidden": true, 3367 | "order": 1502 3368 | }, 3369 | { 3370 | "id": 81519, 3371 | "name": "「觉醒吧!夜之头脑!」", 3372 | "desc": "…然而,什么也没有发生。", 3373 | "reward": 5, 3374 | "hidden": true, 3375 | "order": 1503 3376 | }, 3377 | { 3378 | "id": 81520, 3379 | "name": "捉回四处逃逸的色彩", 3380 | "desc": "让幻写灵回到该回的地方。", 3381 | "reward": 5, 3382 | "hidden": true, 3383 | "order": 1504 3384 | }, 3385 | { 3386 | "id": 81521, 3387 | "name": "或许是个好的营地?", 3388 | "desc": "第二次通过发光的遗迹石柱进入歇息处…", 3389 | "reward": 5, 3390 | "hidden": true, 3391 | "order": 1505 3392 | }, 3393 | { 3394 | "id": 81522, 3395 | "name": "六荣冠与夜的传说", 3396 | "desc": "纳塔所有部族的声望等级达到4级。", 3397 | "reward": 20, 3398 | "hidden": false, 3399 | "order": 1506 3400 | }, 3401 | { 3402 | "id": 81523, 3403 | "name": "只能听见夜风", 3404 | "desc": "5秒内,通过具有夜魂性质的攻击击败4名敌人。", 3405 | "reward": 5, 3406 | "hidden": true, 3407 | "order": 1507 3408 | }, 3409 | { 3410 | "id": 81524, 3411 | "name": "永夜的酬礼", 3412 | "desc": "进入夜魂加持状态并维持18秒。", 3413 | "reward": 5, 3414 | "hidden": true, 3415 | "order": 1508 3416 | }, 3417 | { 3418 | "id": 81525, 3419 | "name": "正午的海鸟", 3420 | "desc": "帮助帕尼娅解决了浮流鸟的困扰。", 3421 | "reward": 5, 3422 | "hidden": true, 3423 | "order": 1509 3424 | }, 3425 | { 3426 | "id": 81526, 3427 | "name": "湖上之光", 3428 | "desc": "见证了流泉之众大训练场的竣工…这东西真的有用吗?", 3429 | "reward": 5, 3430 | "hidden": true, 3431 | "order": 1510 3432 | }, 3433 | { 3434 | "id": 81527, 3435 | "name": "是突破天际的!", 3436 | "desc": "完成全部的「回声之子」勇士挑战并获得最高等级的评价。", 3437 | "reward": 5, 3438 | "hidden": true, 3439 | "order": 1511 3440 | }, 3441 | { 3442 | "id": 81528, 3443 | "name": "无名指追魂索", 3444 | "desc": "完成全部的「悬木人」勇士挑战并获得最高等级的评价。", 3445 | "reward": 5, 3446 | "hidden": true, 3447 | "order": 1512 3448 | }, 3449 | { 3450 | "id": 81529, 3451 | "name": "月光州", 3452 | "desc": "完成全部的「流泉之众」勇士挑战并获得最高等级的评价。", 3453 | "reward": 5, 3454 | "hidden": true, 3455 | "order": 1513 3456 | }, 3457 | { 3458 | "id": 81530, 3459 | "name": "冰上轻驰", 3460 | "desc": "完成全部的「烟谜主」勇士挑战并获得最高等级的评价。", 3461 | "reward": 5, 3462 | "hidden": true, 3463 | "order": 1514 3464 | }, 3465 | { 3466 | "id": 81531, 3467 | "name": "战斗妖精…", 3468 | "desc": "完成全部的「花羽会」勇士挑战并获得最高等级的评价。", 3469 | "reward": 5, 3470 | "hidden": true, 3471 | "order": 1515 3472 | }, 3473 | { 3474 | "id": 81532, 3475 | "name": "给虾枪用猫粮", 3476 | "desc": "为受伤的纳塔龙众快速建造了安全屋。", 3477 | "reward": 5, 3478 | "hidden": true, 3479 | "order": 1516 3480 | }, 3481 | { 3482 | "id": 81533, 3483 | "name": "枫丹兽会吃纳塔鱼吗?", 3484 | "desc": "解救被困在了犯罪营地里的膨膨兽。", 3485 | "reward": 5, 3486 | "hidden": true, 3487 | "order": 1517 3488 | }, 3489 | { 3490 | "id": 81534, 3491 | "name": "高警惕,多防范!", 3492 | "desc": "戳破了利用暝视龙的诈骗者的骗局。", 3493 | "reward": 5, 3494 | "hidden": true, 3495 | "order": 1518 3496 | }, 3497 | { 3498 | "id": 81535, 3499 | "name": "在不可逆的时间里…", 3500 | "desc": "在「游靶气球」玩法中,击破所有的气球。", 3501 | "reward": 5, 3502 | "hidden": true, 3503 | "order": 1519 3504 | }, 3505 | { 3506 | "id": 81536, 3507 | "name": "追逐的荣光,或其意义…", 3508 | "desc": "调解了飞屋三姐弟之间的矛盾与分歧。", 3509 | "reward": 5, 3510 | "hidden": true, 3511 | "order": 1520 3512 | }, 3513 | { 3514 | "id": 81537, 3515 | "name": "直到长出青苔", 3516 | "desc": "协助枫丹摄影师完成对纳塔龙众的拍摄。", 3517 | "reward": 5, 3518 | "hidden": true, 3519 | "order": 1521 3520 | }, 3521 | { 3522 | "id": 81538, 3523 | "name": "献与永恒的宁静", 3524 | "desc": "自旧日的统律者处取得如玉的机心。", 3525 | "reward": 5, 3526 | "hidden": true, 3527 | "order": 1522 3528 | }, 3529 | { 3530 | "id": 81539, 3531 | "name": "海岸边的缤纷色彩", 3532 | "desc": "陪海边的幻写灵玩耍。", 3533 | "reward": 5, 3534 | "hidden": true, 3535 | "order": 1523 3536 | }, 3537 | { 3538 | "id": 81540, 3539 | "name": "猎人从不追丢他的猎物", 3540 | "desc": "完成「目随羽视」挑战。", 3541 | "reward": 5, 3542 | "hidden": true, 3543 | "order": 1524 3544 | }, 3545 | { 3546 | "id": 81542, 3547 | "name": "心差一角此时全", 3548 | "desc": "帮助海边幽会的部族成员摆正了心型石头的一角。", 3549 | "reward": 5, 3550 | "hidden": true, 3551 | "order": 1526 3552 | }, 3553 | { 3554 | "id": 81543, 3555 | "name": "天蛇船的翼下", 3556 | "desc": "天蛇船之下的遗迹组件,从前究竟有何作用呢?", 3557 | "reward": 5, 3558 | "hidden": true, 3559 | "order": 1527 3560 | }, 3561 | { 3562 | "id": 81544, 3563 | "name": "我是谁?", 3564 | "desc": "与部族勇士一起消灭了深渊的魔物。", 3565 | "reward": 5, 3566 | "hidden": true, 3567 | "order": 1528 3568 | }, 3569 | { 3570 | "id": 81545, 3571 | "name": "把场地让出来吧", 3572 | "desc": "将游玩的场所自深渊魔物手中还给小嵴锋龙。", 3573 | "reward": 5, 3574 | "hidden": true, 3575 | "order": 1529 3576 | }, 3577 | { 3578 | "id": 81546, 3579 | "name": "烬火重燃", 3580 | "desc": "重新打开五处烬火炽燃所中的秘源机关装置。", 3581 | "reward": 5, 3582 | "hidden": true, 3583 | "order": 1530 3584 | }, 3585 | { 3586 | "id": 81547, 3587 | "name": "或许还需要走很多路…", 3588 | "desc": "在托佐兹之岛上取得了龙蛋。", 3589 | "reward": 5, 3590 | "hidden": true, 3591 | "order": 1531 3592 | }, 3593 | { 3594 | "id": 81548, 3595 | "name": "格斗龙龙!大决斗!", 3596 | "desc": "靠龙伙伴的力量在对决中获得了胜利。", 3597 | "reward": 5, 3598 | "hidden": true, 3599 | "order": 1532 3600 | }, 3601 | { 3602 | "id": 81549, 3603 | "name": "凡走过必留痕迹", 3604 | "desc": "龙龙饼干是开始也是结束。", 3605 | "reward": 5, 3606 | "hidden": true, 3607 | "order": 1533 3608 | }, 3609 | { 3610 | "id": 81550, 3611 | "name": "真的假不了", 3612 | "desc": "帮助真正的大灵显化身对抗虚假的敌人。", 3613 | "reward": 5, 3614 | "hidden": true, 3615 | "order": 1534 3616 | }, 3617 | { 3618 | "id": 81551, 3619 | "name": "饥饿派画家", 3620 | "desc": "向着山壁肆意倾泻心中的色彩。", 3621 | "reward": 5, 3622 | "hidden": true, 3623 | "order": 1535 3624 | }, 3625 | { 3626 | "id": 81552, 3627 | "name": "急急现形", 3628 | "desc": "第一次使用「灵谜涂鸦」的力量,创生「灵谜体」。", 3629 | "reward": 5, 3630 | "hidden": true, 3631 | "order": 1536 3632 | }, 3633 | { 3634 | "id": 81553, 3635 | "name": "画中有话", 3636 | "desc": "再现了昆图尔的冒险。", 3637 | "reward": 5, 3638 | "hidden": true, 3639 | "order": 1537 3640 | }, 3641 | { 3642 | "id": 81554, 3643 | "name": "套圈也是圈套", 3644 | "desc": "让每只浮流鸟都有圈可居。", 3645 | "reward": 5, 3646 | "hidden": true, 3647 | "order": 1538 3648 | }, 3649 | { 3650 | "id": 81555, 3651 | "name": "坏事不过三…", 3652 | "desc": "在纳塔三次帮助倒霉的部落人逃离困境。", 3653 | "reward": 5, 3654 | "hidden": true, 3655 | "order": 1539 3656 | }, 3657 | { 3658 | "id": 81556, 3659 | "name": "至少是个开始…", 3660 | "desc": "让「咕噜噜」服下了药剂。", 3661 | "reward": 5, 3662 | "hidden": true, 3663 | "order": 1540 3664 | }, 3665 | { 3666 | "id": 81557, 3667 | "name": "勇者的归途", 3668 | "desc": "在故事的最后,你改变了「她」的结局。", 3669 | "reward": 5, 3670 | "hidden": true, 3671 | "order": 1541 3672 | }, 3673 | { 3674 | "id": 81558, 3675 | "name": "总是雕像机关", 3676 | "desc": "将秘源龙仆放置回了为它空出的位置。", 3677 | "reward": 5, 3678 | "hidden": true, 3679 | "order": 1553 3680 | }, 3681 | { 3682 | "id": 81559, 3683 | "name": "喷发的光珥", 3684 | "desc": "见证了产生游隙灵道的巨大火山喷发。", 3685 | "reward": 5, 3686 | "hidden": true, 3687 | "order": 1554 3688 | }, 3689 | { 3690 | "id": 81560, 3691 | "name": "新火的祭台", 3692 | "desc": "到达图兰大火山的最高处。", 3693 | "reward": 5, 3694 | "hidden": true, 3695 | "order": 1555 3696 | }, 3697 | { 3698 | "id": 81561, 3699 | "name": "天轴轮转", 3700 | "desc": "启动「天轴」,前往远古圣城的深处。", 3701 | "reward": 5, 3702 | "hidden": true, 3703 | "order": 1556 3704 | }, 3705 | { 3706 | "id": 81562, 3707 | "name": "天鹰座裂隙之外", 3708 | "desc": "辉煌不过是往日残留的幻觉…", 3709 | "reward": 5, 3710 | "hidden": true, 3711 | "order": 1557 3712 | }, 3713 | { 3714 | "id": 81563, 3715 | "name": "叩问众火之心", 3716 | "desc": "打开前往「圣山之心」的道路。", 3717 | "reward": 5, 3718 | "hidden": true, 3719 | "order": 1558 3720 | }, 3721 | { 3722 | "id": 81564, 3723 | "name": "如入巨龙的眼瞳", 3724 | "desc": "清除「圣山之心」的深渊影响,展露出其真实的样貌。", 3725 | "reward": 5, 3726 | "hidden": true, 3727 | "order": 1559 3728 | }, 3729 | { 3730 | "id": 81565, 3731 | "name": "创造朝向所想之路", 3732 | "desc": "选择了自己认为的更想前往的一方。", 3733 | "reward": 5, 3734 | "hidden": true, 3735 | "order": 1560 3736 | }, 3737 | { 3738 | "id": 81566, 3739 | "name": "往后你可自由地…", 3740 | "desc": "与龙伙伴告别。", 3741 | "reward": 5, 3742 | "hidden": true, 3743 | "order": 1561 3744 | }, 3745 | { 3746 | "id": 81567, 3747 | "name": "勇者之证", 3748 | "desc": "吹响英勇号角的曲调。", 3749 | "reward": 5, 3750 | "hidden": true, 3751 | "order": 1562 3752 | }, 3753 | { 3754 | "id": 81568, 3755 | "name": "凶手就是你!", 3756 | "desc": "找到了在「沃陆之邦」部族里四处惹祸的捣蛋鬼。", 3757 | "reward": 5, 3758 | "hidden": true, 3759 | "order": 1563 3760 | }, 3761 | { 3762 | "id": 81570, 3763 | "name": "孤独的坚守", 3764 | "desc": "成功帮助秘源龙仆从被废弃的试验场中脱困。", 3765 | "reward": 5, 3766 | "hidden": true, 3767 | "order": 1565 3768 | }, 3769 | { 3770 | "id": 81571, 3771 | "name": "极品飞龙", 3772 | "desc": "完成全部的「沃陆之邦」勇士挑战并获得最高等级的评价。", 3773 | "reward": 5, 3774 | "hidden": true, 3775 | "order": 1566 3776 | }, 3777 | { 3778 | "id": 81572, 3779 | "name": "最纯粹的「热度」", 3780 | "desc": "使温泉的「热度」恢复如初。", 3781 | "reward": 5, 3782 | "hidden": true, 3783 | "order": 1567 3784 | }, 3785 | { 3786 | "id": 81573, 3787 | "name": "重量级选手", 3788 | "desc": "面对三倍以上的体重差时,「技术」亦会失效。", 3789 | "reward": 5, 3790 | "hidden": true, 3791 | "order": 1568 3792 | }, 3793 | { 3794 | "id": 81574, 3795 | "name": "炽热的大脚", 3796 | "desc": "发现了「生物火雨」的真面目。", 3797 | "reward": 5, 3798 | "hidden": true, 3799 | "order": 1569 3800 | }, 3801 | { 3802 | "id": 81575, 3803 | "name": "巨像之影", 3804 | "desc": "完成所有的挑战,击败失落在外的秘源龙像。", 3805 | "reward": 5, 3806 | "hidden": true, 3807 | "order": 1570 3808 | }, 3809 | { 3810 | "id": 81577, 3811 | "name": "没有第三只吗?", 3812 | "desc": "击败炉壳山鼬三…两兄弟。", 3813 | "reward": 5, 3814 | "hidden": true, 3815 | "order": 1572 3816 | }, 3817 | { 3818 | "id": 81578, 3819 | "name": "我曾见她缀饰荧光的裙裾", 3820 | "desc": "完成纳塔所有的夜魂图腾挑战。", 3821 | "reward": 20, 3822 | "hidden": true, 3823 | "order": 1573 3824 | }, 3825 | { 3826 | "id": 81579, 3827 | "name": "「速度,我就是速度!」", 3828 | "desc": "完成奔驰的挑战并登上领奖台。", 3829 | "reward": 5, 3830 | "hidden": true, 3831 | "order": 1574 3832 | }, 3833 | { 3834 | "id": 82008, 3835 | "name": "无坚不摧", 3836 | "desc": "在无相之岩复苏前,击碎所有复苏岩柱。", 3837 | "reward": 10, 3838 | "hidden": true, 3839 | "order": 2008 3840 | }, 3841 | { 3842 | "id": 82009, 3843 | "name": "棱镜计划", 3844 | "desc": "在无相之雷复苏前,摧毁所有复苏棱镜。", 3845 | "reward": 10, 3846 | "hidden": true, 3847 | "order": 2009 3848 | }, 3849 | { 3850 | "id": 82010, 3851 | "name": "「这风晶蝶还蛮大的」", 3852 | "desc": "在无相之风复苏前,吸收所有风之晶球。", 3853 | "reward": 10, 3854 | "hidden": true, 3855 | "order": 2010 3856 | }, 3857 | { 3858 | "id": 82012, 3859 | "name": "「…不代表最终品质」", 3860 | "desc": "击败一个进行了四种元素转变的无相之风。", 3861 | "reward": 10, 3862 | "hidden": true, 3863 | "order": 2012 3864 | }, 3865 | { 3866 | "id": 82013, 3867 | "name": "…与巨像", 3868 | "desc": "通过攻击要害,瘫痪遗迹守卫。", 3869 | "reward": 5, 3870 | "hidden": true, 3871 | "order": 2013 3872 | }, 3873 | { 3874 | "id": 82014, 3875 | "name": "传球", 3876 | "desc": "打落爆弹丘丘人手中的火史莱姆。", 3877 | "reward": 5, 3878 | "hidden": true, 3879 | "order": 2014 3880 | }, 3881 | { 3882 | "id": 82015, 3883 | "name": "「一次…的攻击」", 3884 | "desc": "通过碎冰伤害,打败一名敌人。", 3885 | "reward": 5, 3886 | "hidden": true, 3887 | "order": 2015 3888 | }, 3889 | { 3890 | "id": 82017, 3891 | "name": "大黄金丘丘王", 3892 | "desc": "在魔化状态结束前,击败丘丘岩盔王。", 3893 | "reward": 10, 3894 | "hidden": true, 3895 | "order": 2017 3896 | }, 3897 | { 3898 | "id": 82040, 3899 | "name": "向无敌大胃王致敬", 3900 | "desc": "队伍中有四名角色同时处于饱腹状态。", 3901 | "reward": 10, 3902 | "hidden": true, 3903 | "order": 2040 3904 | }, 3905 | { 3906 | "id": 82041, 3907 | "name": "摧枯拉朽", 3908 | "desc": "造成超过5000的暴击伤害。", 3909 | "reward": 5, 3910 | "hidden": true, 3911 | "order": 2041 3912 | }, 3913 | { 3914 | "id": 82042, 3915 | "name": "摧枯拉朽", 3916 | "desc": "造成超过20000的暴击伤害。", 3917 | "reward": 10, 3918 | "hidden": true, 3919 | "order": 2042, 3920 | "preStage": 82041 3921 | }, 3922 | { 3923 | "id": 82043, 3924 | "name": "摧枯拉朽", 3925 | "desc": "造成超过50000的暴击伤害。", 3926 | "reward": 20, 3927 | "hidden": true, 3928 | "order": 2043, 3929 | "preStage": 82042 3930 | }, 3931 | { 3932 | "id": 82052, 3933 | "name": "神奇四…", 3934 | "desc": "使用四个相同元素属性的角色完成一次秘境挑战。", 3935 | "reward": 10, 3936 | "hidden": true, 3937 | "order": 2052 3938 | }, 3939 | { 3940 | "id": 82063, 3941 | "name": "「什么嘛,还不如冰雾花」", 3942 | "desc": "不击破花冠弱点的情况下,击败急冻树。", 3943 | "reward": 10, 3944 | "hidden": true, 3945 | "order": 2063 3946 | }, 3947 | { 3948 | "id": 82064, 3949 | "name": "「总有比火更灼热的火」", 3950 | "desc": "不击破花冠弱点的情况下,击败爆炎树。", 3951 | "reward": 10, 3952 | "hidden": true, 3953 | "order": 2064 3954 | }, 3955 | { 3956 | "id": 82065, 3957 | "name": "异邦人与异邦人", 3958 | "desc": "队伍中所有角色都不被「公子」标记的后续攻击命中的情况下,击败「公子」。", 3959 | "reward": 10, 3960 | "hidden": true, 3961 | "order": 2065 3962 | }, 3963 | { 3964 | "id": 82074, 3965 | "name": "罚球", 3966 | "desc": "有的地方是没办法挖出火史莱姆的…", 3967 | "reward": 5, 3968 | "hidden": true, 3969 | "order": 2074 3970 | }, 3971 | { 3972 | "id": 82075, 3973 | "name": "力场侵蚀", 3974 | "desc": "粉碎无相之雷的结界。", 3975 | "reward": 5, 3976 | "hidden": true, 3977 | "order": 2075 3978 | }, 3979 | { 3980 | "id": 82076, 3981 | "name": "「…还有蜥蜴和斯波克」", 3982 | "desc": "同一个角色连续被猜拳三连击命中。", 3983 | "reward": 5, 3984 | "hidden": true, 3985 | "order": 2076 3986 | }, 3987 | { 3988 | "id": 82077, 3989 | "name": "基础不牢,地动山摇!", 3990 | "desc": "通过击碎核心停留的玄岩柱,使同一个无相之岩落地三次。", 3991 | "reward": 5, 3992 | "hidden": true, 3993 | "order": 2077 3994 | }, 3995 | { 3996 | "id": 82078, 3997 | "name": "基础再牢,也能撂倒!", 3998 | "desc": "在不击碎玄岩柱的情况下,使无相之岩进入复苏模式。", 3999 | "reward": 5, 4000 | "hidden": true, 4001 | "order": 2078 4002 | }, 4003 | { 4004 | "id": 82079, 4005 | "name": "千风散尽还复来", 4006 | "desc": "在一场战斗中,吸收至少10个无相之风创造的元素晶球。", 4007 | "reward": 5, 4008 | "hidden": true, 4009 | "order": 2079 4010 | }, 4011 | { 4012 | "id": 82080, 4013 | "name": "珠心熔毁", 4014 | "desc": "摧毁爆炎树创造的炽热之种。", 4015 | "reward": 5, 4016 | "hidden": true, 4017 | "order": 2080 4018 | }, 4019 | { 4020 | "id": 82081, 4021 | "name": "眩晕", 4022 | "desc": "在急冻树旋转喷发急冻射线时,击破其花冠弱点。", 4023 | "reward": 5, 4024 | "hidden": true, 4025 | "order": 2081 4026 | }, 4027 | { 4028 | "id": 82082, 4029 | "name": "「…唯独死亡与债务不可避」", 4030 | "desc": "击败处于隐蔽状态下的火之债务处理人。", 4031 | "reward": 5, 4032 | "hidden": true, 4033 | "order": 2082 4034 | }, 4035 | { 4036 | "id": 82083, 4037 | "name": "「孤独地融化…」", 4038 | "desc": "在冰萤术士操控的冰萤全部存在的情况下,击败冰萤术士。", 4039 | "reward": 5, 4040 | "hidden": true, 4041 | "order": 2083 4042 | }, 4043 | { 4044 | "id": 82084, 4045 | "name": "这也算四风守护?", 4046 | "desc": "触发过风拳先锋军所有元素类型的吸收反击后,击败他。", 4047 | "reward": 5, 4048 | "hidden": true, 4049 | "order": 2084 4050 | }, 4051 | { 4052 | "id": 82085, 4053 | "name": "碰·一·碰", 4054 | "desc": "利用护盾反制岩龙蜥的某一式冲撞攻击。", 4055 | "reward": 5, 4056 | "hidden": true, 4057 | "order": 2085 4058 | }, 4059 | { 4060 | "id": 82086, 4061 | "name": "反弹!", 4062 | "desc": "利用护盾,反制古岩龙蜥的「原岩喷吐」攻击。", 4063 | "reward": 5, 4064 | "hidden": true, 4065 | "order": 2086 4066 | }, 4067 | { 4068 | "id": 82087, 4069 | "name": "悉数奉还!", 4070 | "desc": "利用同种元素类型或岩元素的护盾,反制古岩龙蜥的「原岩喷吐」攻击,并造成大量伤害。", 4071 | "reward": 5, 4072 | "hidden": true, 4073 | "order": 2087 4074 | }, 4075 | { 4076 | "id": 82088, 4077 | "name": "我们之中最坚强的灵魂", 4078 | "desc": "击败所有形态的若陀龙王。", 4079 | "reward": 20, 4080 | "hidden": true, 4081 | "order": 2088 4082 | }, 4083 | { 4084 | "id": 82089, 4085 | "name": "「…一日之寒」", 4086 | "desc": "击败处于虚弱状态的无相之冰。", 4087 | "reward": 5, 4088 | "hidden": true, 4089 | "order": 2089 4090 | }, 4091 | { 4092 | "id": 82090, 4093 | "name": "「冰冻三尺…」", 4094 | "desc": "击败一个复苏了三次的无相之冰。", 4095 | "reward": 5, 4096 | "hidden": true, 4097 | "order": 2090 4098 | }, 4099 | { 4100 | "id": 82099, 4101 | "name": "只要我跑的够快", 4102 | "desc": "不被幻影击中的情况下,击败魔偶剑鬼。", 4103 | "reward": 10, 4104 | "hidden": true, 4105 | "order": 2100 4106 | }, 4107 | { 4108 | "id": 82100, 4109 | "name": "堂堂正正的决斗!", 4110 | "desc": "不触发「枉死之面」的格挡的情况下,击败魔偶剑鬼。", 4111 | "reward": 5, 4112 | "hidden": true, 4113 | "order": 2101 4114 | }, 4115 | { 4116 | "id": 82101, 4117 | "name": "…全靠我们自己", 4118 | "desc": "不触发「原岩喷吐」的反噬的情况下,击败古岩龙蜥。", 4119 | "reward": 5, 4120 | "hidden": true, 4121 | "order": 2102 4122 | }, 4123 | { 4124 | "id": 82102, 4125 | "name": "把自己烧着了吧?", 4126 | "desc": "击败一个复燃过两次的无相之火。", 4127 | "reward": 5, 4128 | "hidden": true, 4129 | "order": 2103 4130 | }, 4131 | { 4132 | "id": 82103, 4133 | "name": "Smells like Animal Spirit!", 4134 | "desc": "被无相之火的拟态三连击命中后,击败它。", 4135 | "reward": 5, 4136 | "hidden": true, 4137 | "order": 2104 4138 | }, 4139 | { 4140 | "id": 82104, 4141 | "name": "机元突破", 4142 | "desc": "在一场战斗中,使恒常机关阵列的所有四种遗迹机兵均进入瘫痪状态,并击败恒常机关阵列。", 4143 | "reward": 10, 4144 | "hidden": true, 4145 | "order": 2105 4146 | }, 4147 | { 4148 | "id": 82105, 4149 | "name": "无关机械请立即离场!", 4150 | "desc": "不击败任何恒常机关阵列的遗迹机兵的情况下,击败恒常机关阵列。", 4151 | "reward": 10, 4152 | "hidden": true, 4153 | "order": 2106 4154 | }, 4155 | { 4156 | "id": 82106, 4157 | "name": "遇火斩火", 4158 | "desc": "在海乱鬼·炎威的武器附有烈焰的情况下,击败海乱鬼·炎威。", 4159 | "reward": 5, 4160 | "hidden": true, 4161 | "order": 2107 4162 | }, 4163 | { 4164 | "id": 82107, 4165 | "name": "遇雷切雷", 4166 | "desc": "在海乱鬼·雷腾的武器附有电流的情况下,击败海乱鬼·雷腾。", 4167 | "reward": 5, 4168 | "hidden": true, 4169 | "order": 2108 4170 | }, 4171 | { 4172 | "id": 82108, 4173 | "name": "雷自东来", 4174 | "desc": "被雷斧丘丘暴徒引来的落雷击中…", 4175 | "reward": 10, 4176 | "hidden": true, 4177 | "order": 2109 4178 | }, 4179 | { 4180 | "id": 82110, 4181 | "name": "A Kill without Water", 4182 | "desc": "不击败任何「水滴」的情况下(无相之水恢复时除外),击败无相之水。", 4183 | "reward": 5, 4184 | "hidden": true, 4185 | "order": 2110 4186 | }, 4187 | { 4188 | "id": 82111, 4189 | "name": "海洋生物学者,欧拉!", 4190 | "desc": "被无相之水幻化的某种生物击中…", 4191 | "reward": 5, 4192 | "hidden": true, 4193 | "order": 2111 4194 | }, 4195 | { 4196 | "id": 82112, 4197 | "name": "无法传达的恋波", 4198 | "desc": "不曾被探针的侦测锁定的情况下,击败雷音权现。", 4199 | "reward": 5, 4200 | "hidden": true, 4201 | "order": 2112 4202 | }, 4203 | { 4204 | "id": 82113, 4205 | "name": "雷音坠落", 4206 | "desc": "击败飞翔的雷音权现。", 4207 | "reward": 5, 4208 | "hidden": true, 4209 | "order": 2113 4210 | }, 4211 | { 4212 | "id": 82114, 4213 | "name": "红莲冰河与红莲魔女", 4214 | "desc": "在不破坏任何「炎之心」与「霜之眼」的情况下,击败「女士」。", 4215 | "reward": 10, 4216 | "hidden": true, 4217 | "order": 2114 4218 | }, 4219 | { 4220 | "id": 82121, 4221 | "name": "犬神家的末路", 4222 | "desc": "短时间内击破两个「兽境犬首」。", 4223 | "reward": 5, 4224 | "hidden": true, 4225 | "order": 2121 4226 | }, 4227 | { 4228 | "id": 82122, 4229 | "name": "硬着陆", 4230 | "desc": "将攀援中的深海龙蜥击落。", 4231 | "reward": 5, 4232 | "hidden": true, 4233 | "order": 2122 4234 | }, 4235 | { 4236 | "id": 82123, 4237 | "name": "正法眼藏", 4238 | "desc": "仅仅击落真正的对手…", 4239 | "reward": 5, 4240 | "hidden": true, 4241 | "order": 2123 4242 | }, 4243 | { 4244 | "id": 82124, 4245 | "name": "猛犬注意", 4246 | "desc": "击败正在咆哮的兽境猎犬。", 4247 | "reward": 5, 4248 | "hidden": true, 4249 | "order": 2124 4250 | }, 4251 | { 4252 | "id": 82125, 4253 | "name": "基本上无害", 4254 | "desc": "击败没有积攒任何怒气的飘浮灵。", 4255 | "reward": 5, 4256 | "hidden": true, 4257 | "order": 2125 4258 | }, 4259 | { 4260 | "id": 82127, 4261 | "name": "光之流溢", 4262 | "desc": "在遗迹巨蛇的挑战中,利用一次「纯光绽放」破坏二个「淤泥涌口」。", 4263 | "reward": 5, 4264 | "hidden": true, 4265 | "order": 2127 4266 | }, 4267 | { 4268 | "id": 82129, 4269 | "name": "「汉总是先开枪…」", 4270 | "desc": "…所以不要带着刀进入枪战。", 4271 | "reward": 5, 4272 | "hidden": true, 4273 | "order": 2129 4274 | }, 4275 | { 4276 | "id": 82130, 4277 | "name": "渔人之利", 4278 | "desc": "见证了蕈兽间的友军伤害。", 4279 | "reward": 5, 4280 | "hidden": true, 4281 | "order": 2130 4282 | }, 4283 | { 4284 | "id": 82131, 4285 | "name": "「给我下来!」", 4286 | "desc": "击落飞行中的有翼蕈兽。", 4287 | "reward": 5, 4288 | "hidden": true, 4289 | "order": 2131 4290 | }, 4291 | { 4292 | "id": 82132, 4293 | "name": "金风玉露一相逢", 4294 | "desc": "放任掣电树释放的电荷相撞。", 4295 | "reward": 5, 4296 | "hidden": true, 4297 | "order": 2132 4298 | }, 4299 | { 4300 | "id": 82133, 4301 | "name": "…三而竭?", 4302 | "desc": "见识过活化状态下的翠翎恐蕈的三种强力技能。", 4303 | "reward": 5, 4304 | "hidden": true, 4305 | "order": 2133 4306 | }, 4307 | { 4308 | "id": 82142, 4309 | "name": "遗迹先生,别再冲了——!", 4310 | "desc": "通过攻击头部的核心,中断兆载永劫龙兽的冲锋攻击。", 4311 | "reward": 5, 4312 | "hidden": true, 4313 | "order": 2142 4314 | }, 4315 | { 4316 | "id": 82143, 4317 | "name": "那诺曼辛,孩子!", 4318 | "desc": "击败处于活化状态下正在施展强力技能的翠翎恐蕈…", 4319 | "reward": 5, 4320 | "hidden": true, 4321 | "order": 2143 4322 | }, 4323 | { 4324 | "id": 82144, 4325 | "name": "展开攻性防壁", 4326 | "desc": "见识过半永恒统辖矩阵的超频冲击…", 4327 | "reward": 5, 4328 | "hidden": true, 4329 | "order": 2144 4330 | }, 4331 | { 4332 | "id": 82145, 4333 | "name": "看不见的手", 4334 | "desc": "在不破除元能构装体的不可视状态的情况下将其击败。", 4335 | "reward": 5, 4336 | "hidden": true, 4337 | "order": 2145 4338 | }, 4339 | { 4340 | "id": 82155, 4341 | "name": "神奇的固氮作用", 4342 | "desc": "在一次无相之草挑战中,使三枚愈疗草芯同时处于活化状态。", 4343 | "reward": 5, 4344 | "hidden": true, 4345 | "order": 2155 4346 | }, 4347 | { 4348 | "id": 82156, 4349 | "name": "落草之谈", 4350 | "desc": "在无相之草进行下落攻击时,烧毁它的藤蔓外壳。", 4351 | "reward": 5, 4352 | "hidden": true, 4353 | "order": 2156 4354 | }, 4355 | { 4356 | "id": 82157, 4357 | "name": "落落磊磊", 4358 | "desc": "利用元素矩阵,使正机之神过载瘫痪。", 4359 | "reward": 10, 4360 | "hidden": true, 4361 | "order": 2157 4362 | }, 4363 | { 4364 | "id": 82158, 4365 | "name": "生灭去来", 4366 | "desc": "刹那生灭中,一切皆有正机…", 4367 | "reward": 10, 4368 | "hidden": true, 4369 | "order": 2158 4370 | }, 4371 | { 4372 | "id": 82160, 4373 | "name": "控制了香料的人…", 4374 | "desc": "通过使风蚀弹发生扩散反应,击落浮游状态的风蚀沙虫。", 4375 | "reward": 5, 4376 | "hidden": true, 4377 | "order": 2160 4378 | }, 4379 | { 4380 | "id": 82168, 4381 | "name": "此时无声胜有声", 4382 | "desc": "在深罪浸礼者进行初始之吟唱时,通过摧毁其所有的元素之环,使之瘫痪。", 4383 | "reward": 5, 4384 | "hidden": true, 4385 | "order": 2168 4386 | }, 4387 | { 4388 | "id": 82175, 4389 | "name": "二河白道之卷", 4390 | "desc": "惜败于与传奇猎刀鳐的决斗中…", 4391 | "reward": 5, 4392 | "hidden": true, 4393 | "order": 2175 4394 | }, 4395 | { 4396 | "id": 82176, 4397 | "name": "单元格碎片", 4398 | "desc": "通过荒性或芒性的攻击,中断隙境原体的应激状态。", 4399 | "reward": 5, 4400 | "hidden": true, 4401 | "order": 2176 4402 | }, 4403 | { 4404 | "id": 82177, 4405 | "name": "热腾腾!", 4406 | "desc": "不断尝试冰冻浊水幻灵…", 4407 | "reward": 5, 4408 | "hidden": true, 4409 | "order": 2177 4410 | }, 4411 | { 4412 | "id": 82178, 4413 | "name": "送葬的风暴", 4414 | "desc": "通过芒性的攻击,削弱歌裴莉娅演出高潮时的旋风。", 4415 | "reward": 5, 4416 | "hidden": true, 4417 | "order": 2178 4418 | }, 4419 | { 4420 | "id": 82180, 4421 | "name": "坚冰的赌咒", 4422 | "desc": "通过荒性的攻击,移除科培琉司演出高潮时的护罩。", 4423 | "reward": 5, 4424 | "hidden": true, 4425 | "order": 2179 4426 | }, 4427 | { 4428 | "id": 82179, 4429 | "name": "吾王崩御,吾王万岁!", 4430 | "desc": "中断铁甲熔火帝皇的「烈焰加冕」。", 4431 | "reward": 5, 4432 | "hidden": true, 4433 | "order": 2180 4434 | }, 4435 | { 4436 | "id": 82187, 4437 | "name": "我们是万众一体", 4438 | "desc": "在一次挑战中,两次阻止水形幻人吸收半幻人。", 4439 | "reward": 5, 4440 | "hidden": true, 4441 | "order": 2186 4442 | }, 4443 | { 4444 | "id": 82188, 4445 | "name": "银河搭便车指南", 4446 | "desc": "在一次挑战中,两次进入巨鲸之腹。", 4447 | "reward": 10, 4448 | "hidden": true, 4449 | "order": 2187 4450 | }, 4451 | { 4452 | "id": 82189, 4453 | "name": "冰与风的鼓动", 4454 | "desc": "探寻隐山猊兽与冰元素之间的关系。", 4455 | "reward": 5, 4456 | "hidden": true, 4457 | "order": 2188 4458 | }, 4459 | { 4460 | "id": 82190, 4461 | "name": "「我警惕雷穆利亚人…」", 4462 | "desc": "「…即使他们带着乐器。」", 4463 | "reward": 5, 4464 | "hidden": true, 4465 | "order": 2190 4466 | }, 4467 | { 4468 | "id": 82191, 4469 | "name": "同样的错误", 4470 | "desc": "「远程作战对我们有利…咦?」", 4471 | "reward": 5, 4472 | "hidden": true, 4473 | "order": 2191 4474 | }, 4475 | { 4476 | "id": 82192, 4477 | "name": "盛宴之后", 4478 | "desc": "在厄月的见证下,渡越血色的盛宴。", 4479 | "reward": 10, 4480 | "hidden": true, 4481 | "order": 2192 4482 | }, 4483 | { 4484 | "id": 82250, 4485 | "name": "猎龙的黑箭…", 4486 | "desc": "击破「金焰」形态下金焰绒翼龙暴君的火元素护罩,使其从空中坠落。", 4487 | "reward": 5, 4488 | "hidden": true, 4489 | "order": 2250 4490 | }, 4491 | { 4492 | "id": 82251, 4493 | "name": "你也是迪诺巴鲁托?", 4494 | "desc": "在贪食匿叶龙山王吞下火榴果之前将其点燃,使果子在被吞下后爆炸。", 4495 | "reward": 5, 4496 | "hidden": true, 4497 | "order": 2251 4498 | }, 4499 | { 4500 | "id": 82252, 4501 | "name": "月亮还没有出来", 4502 | "desc": "在秘源机兵·构型械准备「球状雷炮」时,破坏「汲聚械」打断它的蓄能。", 4503 | "reward": 5, 4504 | "hidden": true, 4505 | "order": 2252 4506 | }, 4507 | { 4508 | "id": 82253, 4509 | "name": "元素穿甲弹", 4510 | "desc": "破除一次深邃摹结株的虚界力护罩。", 4511 | "reward": 5, 4512 | "hidden": true, 4513 | "order": 2253 4514 | }, 4515 | { 4516 | "id": 82294, 4517 | "name": "按下自爆按钮!", 4518 | "desc": "通过持续的火元素攻击,使熔岩辉龙像熔化崩解。", 4519 | "reward": 5, 4520 | "hidden": true, 4521 | "order": 2294 4522 | }, 4523 | { 4524 | "id": 82295, 4525 | "name": "当那突角龙杀到", 4526 | "desc": "利用突角龙或「沃陆之邦」的部族成员的冲刺,中断炉壳山鼬的冲撞。", 4527 | "reward": 5, 4528 | "hidden": true, 4529 | "order": 2295 4530 | }, 4531 | { 4532 | "id": 82296, 4533 | "name": "「深蓝」", 4534 | "desc": "解开弈局中的所有谜题。", 4535 | "reward": 5, 4536 | "hidden": true, 4537 | "order": 2296 4538 | }, 4539 | { 4540 | "id": 82297, 4541 | "name": "液流冰结", 4542 | "desc": "连续使用冰元素进行攻击,阻碍「液流动量」的积累。", 4543 | "reward": 5, 4544 | "hidden": true, 4545 | "order": 2297 4546 | }, 4547 | { 4548 | "id": 84000, 4549 | "name": "漫长旅途的开端", 4550 | "desc": "完成蒙德的魔神任务。", 4551 | "reward": 20, 4552 | "hidden": true, 4553 | "order": 4001 4554 | }, 4555 | { 4556 | "id": 84001, 4557 | "name": "捕风的异乡人", 4558 | "desc": "完成「捕风的异乡人」。", 4559 | "reward": 10, 4560 | "hidden": true, 4561 | "order": 4002 4562 | }, 4563 | { 4564 | "id": 84002, 4565 | "name": "为了没有眼泪的明天", 4566 | "desc": "完成「为了没有眼泪的明天」。", 4567 | "reward": 10, 4568 | "hidden": true, 4569 | "order": 4003 4570 | }, 4571 | { 4572 | "id": 84003, 4573 | "name": "巨龙与自由之歌", 4574 | "desc": "完成「巨龙与自由之歌」。", 4575 | "reward": 10, 4576 | "hidden": true, 4577 | "order": 4004 4578 | }, 4579 | { 4580 | "id": 84004, 4581 | "name": "听凭风引", 4582 | "desc": "掌握「风」的元素力。", 4583 | "reward": 5, 4584 | "hidden": true, 4585 | "order": 4005 4586 | }, 4587 | { 4588 | "id": 84005, 4589 | "name": "…还是新的风暴呢?", 4590 | "desc": "驱逐袭击蒙德城的巨龙。", 4591 | "reward": 5, 4592 | "hidden": true, 4593 | "order": 4006 4594 | }, 4595 | { 4596 | "id": 84006, 4597 | "name": "骑士精神", 4598 | "desc": "成为西风骑士团的荣誉骑士。", 4599 | "reward": 5, 4600 | "hidden": true, 4601 | "order": 4007 4602 | }, 4603 | { 4604 | "id": 84007, 4605 | "name": "骑士团的诸多麻烦", 4606 | "desc": "没能「借」到圣物…但认识了「骑士团的麻烦」。", 4607 | "reward": 5, 4608 | "hidden": true, 4609 | "order": 4008 4610 | }, 4611 | { 4612 | "id": 84008, 4613 | "name": "风向是会转变的", 4614 | "desc": "被特瓦林所救。", 4615 | "reward": 5, 4616 | "hidden": true, 4617 | "order": 4009 4618 | }, 4619 | { 4620 | "id": 84009, 4621 | "name": "浮世浮生千岩间", 4622 | "desc": "完成「浮世浮生千岩间」。", 4623 | "reward": 10, 4624 | "hidden": true, 4625 | "order": 4010 4626 | }, 4627 | { 4628 | "id": 84010, 4629 | "name": "辞行久远之躯", 4630 | "desc": "完成「辞行久远之躯」。", 4631 | "reward": 10, 4632 | "hidden": true, 4633 | "order": 4011 4634 | }, 4635 | { 4636 | "id": 84011, 4637 | "name": "异乡异客", 4638 | "desc": "在「本地人不会去的景点」被外地人搭救。", 4639 | "reward": 5, 4640 | "hidden": true, 4641 | "order": 4012 4642 | }, 4643 | { 4644 | "id": 84012, 4645 | "name": "…五丘丘怎么了?", 4646 | "desc": "与小冥约定一起玩。", 4647 | "reward": 5, 4648 | "hidden": true, 4649 | "order": 4013 4650 | }, 4651 | { 4652 | "id": 84013, 4653 | "name": "春香窑的「副业」", 4654 | "desc": "了解「岩王帝君」中意的香膏品类。", 4655 | "reward": 5, 4656 | "hidden": true, 4657 | "order": 4014 4658 | }, 4659 | { 4660 | "id": 84014, 4661 | "name": "派蒙都进不去吧?", 4662 | "desc": "将萍姥姥的「壶」打扫干净。", 4663 | "reward": 5, 4664 | "hidden": true, 4665 | "order": 4015 4666 | }, 4667 | { 4668 | "id": 84015, 4669 | "name": "「勇敢的冒险者啊…」", 4670 | "desc": "不被摩拉束缚手脚,委托他人完成工作。", 4671 | "reward": 5, 4672 | "hidden": true, 4673 | "order": 4016 4674 | }, 4675 | { 4676 | "id": 84016, 4677 | "name": "文物保护", 4678 | "desc": "虽然无缘得见「椰羊」…但修好了古迹。", 4679 | "reward": 5, 4680 | "hidden": true, 4681 | "order": 4017 4682 | }, 4683 | { 4684 | "id": 84017, 4685 | "name": "漫长的送别", 4686 | "desc": "筹备好「送仙典仪」所需的道具。", 4687 | "reward": 5, 4688 | "hidden": true, 4689 | "order": 4018 4690 | }, 4691 | { 4692 | "id": 84018, 4693 | "name": "史莱姆,糖适量", 4694 | "desc": "精心制作糖霜史莱姆。", 4695 | "reward": 5, 4696 | "hidden": true, 4697 | "order": 4019 4698 | }, 4699 | { 4700 | "id": 84019, 4701 | "name": "一步登天", 4702 | "desc": "登上俯瞰璃月港的「空中楼阁」。", 4703 | "reward": 5, 4704 | "hidden": true, 4705 | "order": 4020 4706 | }, 4707 | { 4708 | "id": 84020, 4709 | "name": "爱乐之花", 4710 | "desc": "对琉璃百合唱了蒙德的曲子…", 4711 | "reward": 5, 4712 | "hidden": true, 4713 | "order": 4021 4714 | }, 4715 | { 4716 | "id": 84021, 4717 | "name": "审判之时…还没到", 4718 | "desc": "击败「公子」。", 4719 | "reward": 5, 4720 | "hidden": true, 4721 | "order": 4022 4722 | }, 4723 | { 4724 | "id": 84022, 4725 | "name": "轨道抛掷", 4726 | "desc": "击退「漩涡之魔神」。", 4727 | "reward": 5, 4728 | "hidden": true, 4729 | "order": 4023 4730 | }, 4731 | { 4732 | "id": 84023, 4733 | "name": "终有一别", 4734 | "desc": "参与「送仙典仪」。", 4735 | "reward": 5, 4736 | "hidden": true, 4737 | "order": 4024 4738 | }, 4739 | { 4740 | "id": 84024, 4741 | "name": "迫近的客星", 4742 | "desc": "完成「迫近的客星」。", 4743 | "reward": 5, 4744 | "hidden": true, 4745 | "order": 4025 4746 | }, 4747 | { 4748 | "id": 84508, 4749 | "name": "哎呀!海盗!", 4750 | "desc": "陪璐璐、阿飞与小蒙各玩一次海盗游戏。", 4751 | "reward": 5, 4752 | "hidden": false, 4753 | "order": 4033 4754 | }, 4755 | { 4756 | "id": 84509, 4757 | "name": "厨子与渔夫", 4758 | "desc": "完成「独钓江雪」与「勿言勿笑」。", 4759 | "reward": 5, 4760 | "hidden": false, 4761 | "order": 4034 4762 | }, 4763 | { 4764 | "id": 84510, 4765 | "name": "「知天命…」", 4766 | "desc": "在「好兆头」中,帮助志华找到五个爱情运来临的征兆。", 4767 | "reward": 5, 4768 | "hidden": false, 4769 | "order": 4035 4770 | }, 4771 | { 4772 | "id": 84512, 4773 | "name": "过量的思念", 4774 | "desc": "完成五次「愿风带走思念」。", 4775 | "reward": 5, 4776 | "hidden": false, 4777 | "order": 4036 4778 | }, 4779 | { 4780 | "id": 84513, 4781 | "name": "更上一层楼", 4782 | "desc": "帮助淮安修复望舒客栈的断桥。", 4783 | "reward": 5, 4784 | "hidden": false, 4785 | "order": 4037 4786 | }, 4787 | { 4788 | "id": 84514, 4789 | "name": "时也运也", 4790 | "desc": "一次就选中了最高价值的璞石。", 4791 | "reward": 5, 4792 | "hidden": true, 4793 | "order": 4038 4794 | }, 4795 | { 4796 | "id": 84515, 4797 | "name": "略表歉意", 4798 | "desc": "向提米道歉。", 4799 | "reward": 5, 4800 | "hidden": true, 4801 | "order": 4039 4802 | }, 4803 | { 4804 | "id": 84516, 4805 | "name": "凑合…也能用", 4806 | "desc": "只带给赫尔曼木桩的材料。", 4807 | "reward": 5, 4808 | "hidden": true, 4809 | "order": 4040 4810 | }, 4811 | { 4812 | "id": 84517, 4813 | "name": "善事有善报", 4814 | "desc": "拆穿玛乔丽小姐,并获得杰克的答谢。", 4815 | "reward": 5, 4816 | "hidden": true, 4817 | "order": 4041 4818 | }, 4819 | { 4820 | "id": 84518, 4821 | "name": "「您好,亲爱的爸爸…」", 4822 | "desc": "了解提米的故事。", 4823 | "reward": 5, 4824 | "hidden": true, 4825 | "order": 4042 4826 | }, 4827 | { 4828 | "id": 84519, 4829 | "name": "妙手怪医", 4830 | "desc": "治好安娜的病。", 4831 | "reward": 5, 4832 | "hidden": true, 4833 | "order": 4043 4834 | }, 4835 | { 4836 | "id": 84520, 4837 | "name": "西风佑我", 4838 | "desc": "见证吉丽安娜的故事。", 4839 | "reward": 5, 4840 | "hidden": true, 4841 | "order": 4044 4842 | }, 4843 | { 4844 | "id": 84522, 4845 | "name": "学者与「学者」", 4846 | "desc": "完成「『遗落』的文物」与「『夺宝』小行动」。", 4847 | "reward": 5, 4848 | "hidden": true, 4849 | "order": 4046 4850 | }, 4851 | { 4852 | "id": 84523, 4853 | "name": "梦想与工作,诗与面包", 4854 | "desc": "完成「所谓『工作』」,并获得霖铃的诗集。", 4855 | "reward": 5, 4856 | "hidden": true, 4857 | "order": 4047 4858 | }, 4859 | { 4860 | "id": 84524, 4861 | "name": "故人久未归", 4862 | "desc": "完成「久久望故人」任务。", 4863 | "reward": 5, 4864 | "hidden": true, 4865 | "order": 4048 4866 | }, 4867 | { 4868 | "id": 84525, 4869 | "name": "这本小说真厉害!", 4870 | "desc": "偷看常九爷的书稿。", 4871 | "reward": 5, 4872 | "hidden": true, 4873 | "order": 4049 4874 | }, 4875 | { 4876 | "id": 84526, 4877 | "name": "「…而尽人事。」", 4878 | "desc": "破坏了四种爱情运来临的征兆。", 4879 | "reward": 5, 4880 | "hidden": true, 4881 | "order": 4050 4882 | }, 4883 | { 4884 | "id": 84527, 4885 | "name": "这不是应急食品", 4886 | "desc": "在「餐品订单」任务中吃掉了餐品…?", 4887 | "reward": 5, 4888 | "hidden": true, 4889 | "order": 4051 4890 | }, 4891 | { 4892 | "id": 84528, 4893 | "name": "瞳孔中的伪装者", 4894 | "desc": "帮助珊瑚和龙二破获案件。", 4895 | "reward": 5, 4896 | "hidden": true, 4897 | "order": 4052 4898 | }, 4899 | { 4900 | "id": 84529, 4901 | "name": "真相只有一个…?", 4902 | "desc": "见证龙二的故事。", 4903 | "reward": 5, 4904 | "hidden": true, 4905 | "order": 4053 4906 | }, 4907 | { 4908 | "id": 84530, 4909 | "name": "璃月一番", 4910 | "desc": "用美味的料理治愈汤雯。", 4911 | "reward": 5, 4912 | "hidden": true, 4913 | "order": 4054 4914 | }, 4915 | { 4916 | "id": 84531, 4917 | "name": "噼咔,为什么又是噼咔", 4918 | "desc": "向香菱请教到特别的烹饪手法。", 4919 | "reward": 5, 4920 | "hidden": true, 4921 | "order": 4055 4922 | }, 4923 | { 4924 | "id": 84532, 4925 | "name": "双人餐行", 4926 | "desc": "帮助旭东和龟井宗久各完成一次烹饪。", 4927 | "reward": 5, 4928 | "hidden": true, 4929 | "order": 4056 4930 | }, 4931 | { 4932 | "id": 84533, 4933 | "name": "饮食问题", 4934 | "desc": "帮助芭尔瓦涅校对全部食谱。", 4935 | "reward": 5, 4936 | "hidden": true, 4937 | "order": 4057 4938 | }, 4939 | { 4940 | "id": 84534, 4941 | "name": "武士饭", 4942 | "desc": "帮助龟井宗久搜集过全部两侧营地的食材。", 4943 | "reward": 5, 4944 | "hidden": true, 4945 | "order": 4058 4946 | }, 4947 | { 4948 | "id": 84535, 4949 | "name": "「给您添蘑菇了!」", 4950 | "desc": "在「售后服务」中收到顾客绀田传助的抱怨。", 4951 | "reward": 5, 4952 | "hidden": true, 4953 | "order": 4059 4954 | }, 4955 | { 4956 | "id": 84536, 4957 | "name": "饮食武士", 4958 | "desc": "见证龟井宗久加入全能美食队。", 4959 | "reward": 5, 4960 | "hidden": true, 4961 | "order": 4060 4962 | }, 4963 | { 4964 | "id": 84537, 4965 | "name": "喂——有人吗?", 4966 | "desc": "在离岛中发现一处秘密通道。", 4967 | "reward": 5, 4968 | "hidden": true, 4969 | "order": 4061 4970 | }, 4971 | { 4972 | "id": 84538, 4973 | "name": "编辑部的一己之见", 4974 | "desc": "帮助阿茂和顺吉回到正确的创作轨道。", 4975 | "reward": 5, 4976 | "hidden": true, 4977 | "order": 4062 4978 | }, 4979 | { 4980 | "id": 84539, 4981 | "name": "同心训练家?", 4982 | "desc": "协助朝仓进行5次训练。", 4983 | "reward": 5, 4984 | "hidden": true, 4985 | "order": 4063 4986 | }, 4987 | { 4988 | "id": 84540, 4989 | "name": "猜猜我是谁?", 4990 | "desc": "获知「枕玉」老师的真实身份。", 4991 | "reward": 5, 4992 | "hidden": true, 4993 | "order": 4064 4994 | }, 4995 | { 4996 | "id": 84541, 4997 | "name": "至少有了个结局", 4998 | "desc": "听顺吉讲述完他所构思的故事。", 4999 | "reward": 5, 5000 | "hidden": true, 5001 | "order": 4065 5002 | }, 5003 | { 5004 | "id": 84542, 5005 | "name": "她和她的猫", 5006 | "desc": "陪寝子前往影向山,寻找「阿响」的痕迹。", 5007 | "reward": 5, 5008 | "hidden": true, 5009 | "order": 4066 5010 | }, 5011 | { 5012 | "id": 84543, 5013 | "name": "啊哈…什么上钩了?", 5014 | "desc": "与凯万一起钓起奇怪的东西…", 5015 | "reward": 5, 5016 | "hidden": true, 5017 | "order": 4067 5018 | }, 5019 | { 5020 | "id": 84544, 5021 | "name": "卡里米之蕈兽", 5022 | "desc": "见证哈特姆在「期货交易」大赚一笔!", 5023 | "reward": 5, 5024 | "hidden": true, 5025 | "order": 4068 5026 | }, 5027 | { 5028 | "id": 84545, 5029 | "name": "当财运来敲门", 5030 | "desc": "将苹果酿带给哈特姆。", 5031 | "reward": 5, 5032 | "hidden": true, 5033 | "order": 4069 5034 | }, 5035 | { 5036 | "id": 84546, 5037 | "name": "捉猫记", 5038 | "desc": "帮莎莉寻找过所有小猫。", 5039 | "reward": 5, 5040 | "hidden": true, 5041 | "order": 4070 5042 | }, 5043 | { 5044 | "id": 84547, 5045 | "name": "推分算数原理", 5046 | "desc": "帮助加尔恰完善他的机器。", 5047 | "reward": 5, 5048 | "hidden": true, 5049 | "order": 4071 5050 | }, 5051 | { 5052 | "id": 84548, 5053 | "name": "「为了工作。」", 5054 | "desc": "为范兵卫采到更多的蘑菇。", 5055 | "reward": 5, 5056 | "hidden": true, 5057 | "order": 4072 5058 | }, 5059 | { 5060 | "id": 84549, 5061 | "name": "放松疗法", 5062 | "desc": "满足三个病人的愿望。", 5063 | "reward": 5, 5064 | "hidden": true, 5065 | "order": 4073 5066 | }, 5067 | { 5068 | "id": 84550, 5069 | "name": "斩花除根", 5070 | "desc": "找到并打倒逃走的骗骗花。", 5071 | "reward": 5, 5072 | "hidden": true, 5073 | "order": 4074 5074 | }, 5075 | { 5076 | "id": 84551, 5077 | "name": "出港日", 5078 | "desc": "拿到亚历山德拉的留信…", 5079 | "reward": 5, 5080 | "hidden": true, 5081 | "order": 4075 5082 | }, 5083 | { 5084 | "id": 84552, 5085 | "name": "摩拉无罪", 5086 | "desc": "见证全能美食队在须弥的故事。", 5087 | "reward": 5, 5088 | "hidden": true, 5089 | "order": 4076 5090 | }, 5091 | { 5092 | "id": 84553, 5093 | "name": "天有多高,地有多…", 5094 | "desc": "协助法伽尼进行测量工作。", 5095 | "reward": 5, 5096 | "hidden": true, 5097 | "order": 4077 5098 | }, 5099 | { 5100 | "id": 84554, 5101 | "name": "结题时刻", 5102 | "desc": "见证爱拉尼在须弥的故事。", 5103 | "reward": 5, 5104 | "hidden": true, 5105 | "order": 4078 5106 | }, 5107 | { 5108 | "id": 84555, 5109 | "name": "蔷薇绽放的若干条件", 5110 | "desc": "帮助柯莱照顾须弥蔷薇。", 5111 | "reward": 5, 5112 | "hidden": true, 5113 | "order": 4079 5114 | }, 5115 | { 5116 | "id": 84556, 5117 | "name": "梦想,梦想!你们去了哪里?", 5118 | "desc": "见证贾维与「梦想」的故事。", 5119 | "reward": 5, 5120 | "hidden": true, 5121 | "order": 4080 5122 | }, 5123 | { 5124 | "id": 84557, 5125 | "name": "非必要需求", 5126 | "desc": "找到古拉布吉尔给小蛇制作的所有道具。", 5127 | "reward": 5, 5128 | "hidden": true, 5129 | "order": 4081 5130 | }, 5131 | { 5132 | "id": 84558, 5133 | "name": "船说了算", 5134 | "desc": "与拉菲克成功地测试了船体强度。", 5135 | "reward": 5, 5136 | "hidden": true, 5137 | "order": 4082 5138 | }, 5139 | { 5140 | "id": 84559, 5141 | "name": "问题何在?", 5142 | "desc": "享受三道贾法尔制作的料理。", 5143 | "reward": 5, 5144 | "hidden": true, 5145 | "order": 4083 5146 | }, 5147 | { 5148 | "id": 84560, 5149 | "name": "须弥博学者", 5150 | "desc": "答对六道不同的问题。", 5151 | "reward": 5, 5152 | "hidden": true, 5153 | "order": 4084 5154 | }, 5155 | { 5156 | "id": 84561, 5157 | "name": "一步之遥", 5158 | "desc": "在与希尔米的赛跑中大意落败…", 5159 | "reward": 5, 5160 | "hidden": true, 5161 | "order": 4085 5162 | }, 5163 | { 5164 | "id": 84562, 5165 | "name": "医用笔迹", 5166 | "desc": "帮助马鲁夫正确地解析药方。", 5167 | "reward": 5, 5168 | "hidden": true, 5169 | "order": 4086 5170 | }, 5171 | { 5172 | "id": 84563, 5173 | "name": "手有余香", 5174 | "desc": "见证内尔敏的故事。", 5175 | "reward": 5, 5176 | "hidden": true, 5177 | "order": 4087 5178 | }, 5179 | { 5180 | "id": 84564, 5181 | "name": "四方求剑", 5182 | "desc": "见证岚姐与「藏锋」的故事。", 5183 | "reward": 5, 5184 | "hidden": true, 5185 | "order": 4088 5186 | }, 5187 | { 5188 | "id": 84565, 5189 | "name": "行万里路…?", 5190 | "desc": "见证孙宇的故事。", 5191 | "reward": 5, 5192 | "hidden": true, 5193 | "order": 4089 5194 | }, 5195 | { 5196 | "id": 84566, 5197 | "name": "大街上的办公室", 5198 | "desc": "见证枫丹廷内的些许琐事。", 5199 | "reward": 5, 5200 | "hidden": true, 5201 | "order": 4090 5202 | }, 5203 | { 5204 | "id": 84567, 5205 | "name": "优选风味", 5206 | "desc": "调制出一杯特别的咖啡。", 5207 | "reward": 5, 5208 | "hidden": true, 5209 | "order": 4091 5210 | }, 5211 | { 5212 | "id": 84568, 5213 | "name": "审美力批判", 5214 | "desc": "聆听德皮耶里的「美学」理论。", 5215 | "reward": 5, 5216 | "hidden": true, 5217 | "order": 4092 5218 | }, 5219 | { 5220 | "id": 84569, 5221 | "name": "在童年", 5222 | "desc": "和孩子们一同玩耍,并且见证他们的故事。", 5223 | "reward": 5, 5224 | "hidden": true, 5225 | "order": 4093 5226 | }, 5227 | { 5228 | "id": 84570, 5229 | "name": "一场风波", 5230 | "desc": "见证艾尤恩的工作故事。", 5231 | "reward": 5, 5232 | "hidden": true, 5233 | "order": 4094 5234 | }, 5235 | { 5236 | "id": 84571, 5237 | "name": "新灵感!新产品!", 5238 | "desc": "帮助安里研制三种新型的枫达,并且品尝一次「实验饮品」。", 5239 | "reward": 5, 5240 | "hidden": true, 5241 | "order": 4095 5242 | }, 5243 | { 5244 | "id": 84572, 5245 | "name": "谁来说出真相?", 5246 | "desc": "帮助吉雅罗寻找到了新的灵感…?", 5247 | "reward": 5, 5248 | "hidden": true, 5249 | "order": 4096 5250 | }, 5251 | { 5252 | "id": 84573, 5253 | "name": "同流者", 5254 | "desc": "见证某件与水文和光影有关的故事…", 5255 | "reward": 5, 5256 | "hidden": true, 5257 | "order": 4097 5258 | }, 5259 | { 5260 | "id": 84574, 5261 | "name": "在那梦中之墟…", 5262 | "desc": "见证「空想俱乐部」的故事。", 5263 | "reward": 5, 5264 | "hidden": true, 5265 | "order": 4098 5266 | }, 5267 | { 5268 | "id": 84575, 5269 | "name": "龙的摇篮", 5270 | "desc": "与一只小匿叶龙成为了朋友。", 5271 | "reward": 5, 5272 | "hidden": true, 5273 | "order": 4099 5274 | }, 5275 | { 5276 | "id": 84576, 5277 | "name": "纳塔博学者", 5278 | "desc": "在凯塔的一轮提问中,正确地回答了所有问题。", 5279 | "reward": 5, 5280 | "hidden": true, 5281 | "order": 4100 5282 | }, 5283 | { 5284 | "id": 84578, 5285 | "name": "「霍莱,过来——」", 5286 | "desc": "和霍莱玩过了头…", 5287 | "reward": 5, 5288 | "hidden": true, 5289 | "order": 4102 5290 | }, 5291 | { 5292 | "id": 84579, 5293 | "name": "音乐不灭!", 5294 | "desc": "将唱片完整地交给米卢·努伊。", 5295 | "reward": 5, 5296 | "hidden": true, 5297 | "order": 4103 5298 | }, 5299 | { 5300 | "id": 84580, 5301 | "name": "飞叶捎来的胜利", 5302 | "desc": "在限定时间内到达了终点。", 5303 | "reward": 5, 5304 | "hidden": true, 5305 | "order": 4104 5306 | }, 5307 | { 5308 | "id": 84581, 5309 | "name": "原信奉还", 5310 | "desc": "将四封快件都归还原主。", 5311 | "reward": 5, 5312 | "hidden": true, 5313 | "order": 4105 5314 | }, 5315 | { 5316 | "id": 84582, 5317 | "name": "妙手采风", 5318 | "desc": "帮助子澄寻找到作诗的灵感…?", 5319 | "reward": 5, 5320 | "hidden": true, 5321 | "order": 4106 5322 | }, 5323 | { 5324 | "id": 84583, 5325 | "name": "更高,更快,更强!", 5326 | "desc": "为阿蕾梅做出完美的锻炼示范。", 5327 | "reward": 5, 5328 | "hidden": true, 5329 | "order": 4107 5330 | }, 5331 | { 5332 | "id": 85000, 5333 | "name": "除了时间,什么也没丢", 5334 | "desc": "解开两座日晷的秘密。", 5335 | "reward": 5, 5336 | "hidden": true, 5337 | "order": 5000 5338 | }, 5339 | { 5340 | "id": 85001, 5341 | "name": "与一位往昔神灵的谈话", 5342 | "desc": "了解一位往昔神灵的故事。", 5343 | "reward": 5, 5344 | "hidden": true, 5345 | "order": 5001 5346 | }, 5347 | { 5348 | "id": 85002, 5349 | "name": "卧龙藏螭", 5350 | "desc": "了解关于「螭」的故事。", 5351 | "reward": 5, 5352 | "hidden": true, 5353 | "order": 5002 5354 | }, 5355 | { 5356 | "id": 85003, 5357 | "name": "战祸不息", 5358 | "desc": "将某个古老遗迹中的宝物卖个好价钱…", 5359 | "reward": 5, 5360 | "hidden": true, 5361 | "order": 5003 5362 | }, 5363 | { 5364 | "id": 85004, 5365 | "name": "渌华池之影", 5366 | "desc": "帮助梵米尔取到他想要的景致。", 5367 | "reward": 5, 5368 | "hidden": true, 5369 | "order": 5004 5370 | }, 5371 | { 5372 | "id": 85005, 5373 | "name": "零号玩家", 5374 | "desc": "陪小姜玩一场简单的游戏。", 5375 | "reward": 5, 5376 | "hidden": true, 5377 | "order": 5005 5378 | }, 5379 | { 5380 | "id": 85006, 5381 | "name": "盘木森森,荫蔽家庭", 5382 | "desc": "见证元鸿一家的故事。", 5383 | "reward": 5, 5384 | "hidden": true, 5385 | "order": 5006 5386 | }, 5387 | { 5388 | "id": 84025, 5389 | "name": "命运初动", 5390 | "desc": "完成任务「拾枝者·戴因斯雷布」。", 5391 | "reward": 5, 5392 | "hidden": true, 5393 | "order": 5007 5394 | }, 5395 | { 5396 | "id": 84029, 5397 | "name": "贼寇、狂人与漆黑之谜", 5398 | "desc": "确认大盗宝家的异状。", 5399 | "reward": 5, 5400 | "hidden": true, 5401 | "order": 5008 5402 | }, 5403 | { 5404 | "id": 84030, 5405 | "name": "命运交叉的废都", 5406 | "desc": "逃离诡异的遗迹。", 5407 | "reward": 5, 5408 | "hidden": true, 5409 | "order": 5009 5410 | }, 5411 | { 5412 | "id": 84031, 5413 | "name": "将诸神的力量付之一笑", 5414 | "desc": "得知「命运的织机」正在进行中…", 5415 | "reward": 5, 5416 | "hidden": true, 5417 | "order": 5010 5418 | }, 5419 | { 5420 | "id": 84032, 5421 | "name": "狂言破碎之时", 5422 | "desc": "击退深渊使徒。", 5423 | "reward": 5, 5424 | "hidden": true, 5425 | "order": 5011 5426 | }, 5427 | { 5428 | "id": 84033, 5429 | "name": "我们终将重逢", 5430 | "desc": "完成「我们终将重逢」。", 5431 | "reward": 5, 5432 | "hidden": true, 5433 | "order": 5012 5434 | }, 5435 | { 5436 | "id": 84034, 5437 | "name": "雷电将至", 5438 | "desc": "得到搭乘「死兆星」号前往稻妻的机会。", 5439 | "reward": 5, 5440 | "hidden": true, 5441 | "order": 5013 5442 | }, 5443 | { 5444 | "id": 84035, 5445 | "name": "开战!", 5446 | "desc": "在「南十字武斗会」中取得首次胜利。", 5447 | "reward": 5, 5448 | "hidden": true, 5449 | "order": 5014 5450 | }, 5451 | { 5452 | "id": 84036, 5453 | "name": "振袖秋风问红叶", 5454 | "desc": "完成「振袖秋风问红叶」。", 5455 | "reward": 10, 5456 | "hidden": true, 5457 | "order": 5015 5458 | }, 5459 | { 5460 | "id": 84037, 5461 | "name": "朝着雷霆骤雨", 5462 | "desc": "抵达「异人居留地」。", 5463 | "reward": 5, 5464 | "hidden": true, 5465 | "order": 5016 5466 | }, 5467 | { 5468 | "id": 84038, 5469 | "name": "柊三十郎", 5470 | "desc": "顺利押送货物,离开离岛。", 5471 | "reward": 5, 5472 | "hidden": true, 5473 | "order": 5017 5474 | }, 5475 | { 5476 | "id": 84039, 5477 | "name": "所有人的愿望之诗", 5478 | "desc": "接触「永恒」的象征,「千手百眼神像」。", 5479 | "reward": 5, 5480 | "hidden": true, 5481 | "order": 5018 5482 | }, 5483 | { 5484 | "id": 84040, 5485 | "name": "屏风后的白鹭公主", 5486 | "desc": "与神里家的大小姐正式会面。", 5487 | "reward": 5, 5488 | "hidden": true, 5489 | "order": 5019 5490 | }, 5491 | { 5492 | "id": 84041, 5493 | "name": "御守、仁义、天下一", 5494 | "desc": "完成「三个小心愿」。", 5495 | "reward": 5, 5496 | "hidden": true, 5497 | "order": 5020 5498 | }, 5499 | { 5500 | "id": 84042, 5501 | "name": "牢屋敷花火祭", 5502 | "desc": "成功营救正胜。", 5503 | "reward": 5, 5504 | "hidden": true, 5505 | "order": 5021 5506 | }, 5507 | { 5508 | "id": 84043, 5509 | "name": "直面雷光", 5510 | "desc": "成为「眼狩令」的目标。", 5511 | "reward": 5, 5512 | "hidden": true, 5513 | "order": 5022 5514 | }, 5515 | { 5516 | "id": 84044, 5517 | "name": "异人一揆", 5518 | "desc": "顺利融入反抗军中。", 5519 | "reward": 5, 5520 | "hidden": true, 5521 | "order": 5023 5522 | }, 5523 | { 5524 | "id": 84045, 5525 | "name": "不动鸣神,恒常乐土", 5526 | "desc": "完成「不动鸣神,恒常乐土」。", 5527 | "reward": 10, 5528 | "hidden": true, 5529 | "order": 5024 5530 | }, 5531 | { 5532 | "id": 84046, 5533 | "name": "无念无想,泡影断灭", 5534 | "desc": "完成「无念无想,泡影断灭」。", 5535 | "reward": 10, 5536 | "hidden": true, 5537 | "order": 5025 5538 | }, 5539 | { 5540 | "id": 84047, 5541 | "name": "SWORDFISH Ⅱ", 5542 | "desc": "获得剑鱼二番队的认可。", 5543 | "reward": 5, 5544 | "hidden": true, 5545 | "order": 5026 5546 | }, 5547 | { 5548 | "id": 84048, 5549 | "name": "虽是露水般的愿望…", 5550 | "desc": "找到派发邪眼的幕后黑手。", 5551 | "reward": 5, 5552 | "hidden": true, 5553 | "order": 5027 5554 | }, 5555 | { 5556 | "id": 84049, 5557 | "name": "特大号花火祭", 5558 | "desc": "燃放烟花引开守卫。", 5559 | "reward": 5, 5560 | "hidden": true, 5561 | "order": 5028 5562 | }, 5563 | { 5564 | "id": 84050, 5565 | "name": "御前生死斗", 5566 | "desc": "在「御前决斗」中,获得胜利。", 5567 | "reward": 5, 5568 | "hidden": true, 5569 | "order": 5029 5570 | }, 5571 | { 5572 | "id": 84051, 5573 | "name": "「他们」的愿望…", 5574 | "desc": "回应「千手百眼神像」中所有的愿望。", 5575 | "reward": 5, 5576 | "hidden": true, 5577 | "order": 5030 5578 | }, 5579 | { 5580 | "id": 84052, 5581 | "name": "千手百眼,天下人间", 5582 | "desc": "完成「千手百眼,天下人间」。", 5583 | "reward": 10, 5584 | "hidden": true, 5585 | "order": 5031 5586 | }, 5587 | { 5588 | "id": 84053, 5589 | "name": "「诸事平安」", 5590 | "desc": "与王平安一起重修铜雀的庙宇。", 5591 | "reward": 5, 5592 | "hidden": true, 5593 | "order": 5032 5594 | }, 5595 | { 5596 | "id": 84054, 5597 | "name": "安娜冒险记", 5598 | "desc": "帮助安娜成为一名冒险家。", 5599 | "reward": 5, 5600 | "hidden": true, 5601 | "order": 5033 5602 | }, 5603 | { 5604 | "id": 84055, 5605 | "name": "远大前程", 5606 | "desc": "一位少年即将启程远行…", 5607 | "reward": 5, 5608 | "hidden": true, 5609 | "order": 5034 5610 | }, 5611 | { 5612 | "id": 84056, 5613 | "name": "群玉临空", 5614 | "desc": "完成群玉阁重建工作。", 5615 | "reward": 5, 5616 | "hidden": true, 5617 | "order": 5035 5618 | }, 5619 | { 5620 | "id": 84057, 5621 | "name": "沧海生威", 5622 | "desc": "击退「漩涡的余威」跋掣。", 5623 | "reward": 5, 5624 | "hidden": true, 5625 | "order": 5036 5626 | }, 5627 | { 5628 | "id": 84058, 5629 | "name": "前尘一梦", 5630 | "desc": "见证村庄历史中的真相。", 5631 | "reward": 5, 5632 | "hidden": true, 5633 | "order": 5037 5634 | }, 5635 | { 5636 | "id": 84059, 5637 | "name": "风起鹤归", 5638 | "desc": "完成「风起鹤归」。", 5639 | "reward": 10, 5640 | "hidden": true, 5641 | "order": 5038 5642 | }, 5643 | { 5644 | "id": 84060, 5645 | "name": "窥伺「深渊」时…", 5646 | "desc": "虽然与戴因再会,却正被深渊窥伺…", 5647 | "reward": 5, 5648 | "hidden": true, 5649 | "order": 5039 5650 | }, 5651 | { 5652 | "id": 84061, 5653 | "name": "美丽的与被诅咒的", 5654 | "desc": "知晓黑蛇骑士与丘丘人的秘密。", 5655 | "reward": 5, 5656 | "hidden": true, 5657 | "order": 5040 5658 | }, 5659 | { 5660 | "id": 84062, 5661 | "name": "生命意志与痛苦深渊", 5662 | "desc": "击败深渊使徒。", 5663 | "reward": 5, 5664 | "hidden": true, 5665 | "order": 5041 5666 | }, 5667 | { 5668 | "id": 84063, 5669 | "name": "愿荣光同在", 5670 | "desc": "完成「回响渊底的安魂曲」。", 5671 | "reward": 10, 5672 | "hidden": true, 5673 | "order": 5042 5674 | }, 5675 | { 5676 | "id": 84064, 5677 | "name": "蹈刃不旋", 5678 | "desc": "在「危途疑踪」中突破阻碍成功与魈会合。", 5679 | "reward": 5, 5680 | "hidden": true, 5681 | "order": 5043 5682 | }, 5683 | { 5684 | "id": 84065, 5685 | "name": "层层惊骇", 5686 | "desc": "成功逃离位于层岩巨渊最下方的神秘空间。", 5687 | "reward": 5, 5688 | "hidden": true, 5689 | "order": 5044 5690 | }, 5691 | { 5692 | "id": 84066, 5693 | "name": "以魂证心", 5694 | "desc": "完成「危途疑踪」。", 5695 | "reward": 10, 5696 | "hidden": true, 5697 | "order": 5045 5698 | }, 5699 | { 5700 | "id": 84067, 5701 | "name": "阿卡西之声", 5702 | "desc": "聆听神明的智慧之声。", 5703 | "reward": 5, 5704 | "hidden": true, 5705 | "order": 5046 5706 | }, 5707 | { 5708 | "id": 84068, 5709 | "name": "商人与知识之门", 5710 | "desc": "与多莉见面并买下罐装知识。", 5711 | "reward": 5, 5712 | "hidden": true, 5713 | "order": 5047 5714 | }, 5715 | { 5716 | "id": 84069, 5717 | "name": "罐装时光屋", 5718 | "desc": "使用罐装知识提升了战力。", 5719 | "reward": 5, 5720 | "hidden": true, 5721 | "order": 5048 5722 | }, 5723 | { 5724 | "id": 84070, 5725 | "name": "穿越烟帷与暗林", 5726 | "desc": "完成「穿越烟帷与暗林」。", 5727 | "reward": 10, 5728 | "hidden": true, 5729 | "order": 5049 5730 | }, 5731 | { 5732 | "id": 84071, 5733 | "name": "负荷口味的既视感", 5734 | "desc": "依靠本能选到日落果口味的糖果盒。", 5735 | "reward": 5, 5736 | "hidden": true, 5737 | "order": 5050 5738 | }, 5739 | { 5740 | "id": 84072, 5741 | "name": "派蒙都不吃!", 5742 | "desc": "吃掉一看就难吃的「椰炭饼」。", 5743 | "reward": 5, 5744 | "hidden": true, 5745 | "order": 5051 5746 | }, 5747 | { 5748 | "id": 84073, 5749 | "name": "是梦终将醒来", 5750 | "desc": "从「花神诞日的轮回」中醒来。", 5751 | "reward": 5, 5752 | "hidden": true, 5753 | "order": 5052 5754 | }, 5755 | { 5756 | "id": 84074, 5757 | "name": "千朵玫瑰带来的黎明", 5758 | "desc": "完成「千朵玫瑰带来的黎明」。", 5759 | "reward": 10, 5760 | "hidden": true, 5761 | "order": 5053 5762 | }, 5763 | { 5764 | "id": 84075, 5765 | "name": "穿行躯壳之灵", 5766 | "desc": "在纳西妲通过虚空「附身」他人后共享感官。", 5767 | "reward": 5, 5768 | "hidden": true, 5769 | "order": 5054 5770 | }, 5771 | { 5772 | "id": 84076, 5773 | "name": "虚构的凯旋式", 5774 | "desc": "被遭到「博士」控制的民众们视为拯救世界的英雄。", 5775 | "reward": 5, 5776 | "hidden": true, 5777 | "order": 5055 5778 | }, 5779 | { 5780 | "id": 84077, 5781 | "name": "「神明」回以凝视", 5782 | "desc": "在连接「神明意识」后看到「散兵」的过去。", 5783 | "reward": 5, 5784 | "hidden": true, 5785 | "order": 5056 5786 | }, 5787 | { 5788 | "id": 84078, 5789 | "name": "迷梦与空幻与欺骗", 5790 | "desc": "完成「迷梦与空幻与欺骗」。", 5791 | "reward": 10, 5792 | "hidden": true, 5793 | "order": 5057 5794 | }, 5795 | { 5796 | "id": 84079, 5797 | "name": "沙海奇兵", 5798 | "desc": "发现流沙之下的古代神殿。", 5799 | "reward": 5, 5800 | "hidden": true, 5801 | "order": 5058 5802 | }, 5803 | { 5804 | "id": 84080, 5805 | "name": "残阳浩劫之后", 5806 | "desc": "通过赤王祭司的「遗言」了解到过去的事情。", 5807 | "reward": 5, 5808 | "hidden": true, 5809 | "order": 5059 5810 | }, 5811 | { 5812 | "id": 84081, 5813 | "name": "赤土之王与三朝圣者", 5814 | "desc": "完成「赤土之王与三朝圣者」。", 5815 | "reward": 10, 5816 | "hidden": true, 5817 | "order": 5060 5818 | }, 5819 | { 5820 | "id": 84082, 5821 | "name": "Eremitis ne credite", 5822 | "desc": "协同赛诺将拉赫曼一行带入须弥。", 5823 | "reward": 5, 5824 | "hidden": true, 5825 | "order": 5061 5826 | }, 5827 | { 5828 | "id": 84083, 5829 | "name": "胜利的方程式", 5830 | "desc": "完成「计划」的准备工作。", 5831 | "reward": 5, 5832 | "hidden": true, 5833 | "order": 5062 5834 | }, 5835 | { 5836 | "id": 84084, 5837 | "name": "最长的一日", 5838 | "desc": "在「识藏日」当天拯救神明。", 5839 | "reward": 5, 5840 | "hidden": true, 5841 | "order": 5063 5842 | }, 5843 | { 5844 | "id": 84085, 5845 | "name": "…并非是适格者", 5846 | "desc": "阻止「伪神」的诞生。", 5847 | "reward": 5, 5848 | "hidden": true, 5849 | "order": 5064 5850 | }, 5851 | { 5852 | "id": 84086, 5853 | "name": "虚空鼓动,劫火高扬", 5854 | "desc": "完成「虚空鼓动,劫火高扬」。", 5855 | "reward": 10, 5856 | "hidden": true, 5857 | "order": 5065 5858 | }, 5859 | { 5860 | "id": 84087, 5861 | "name": "踏鞴之谜", 5862 | "desc": "在世界树内部查看有关踏鞴砂往事的回忆。", 5863 | "reward": 5, 5864 | "hidden": true, 5865 | "order": 5066 5866 | }, 5867 | { 5868 | "id": 84088, 5869 | "name": "历史的涟漪", 5870 | "desc": "确认散兵进入世界树内部引发的种种后果。", 5871 | "reward": 5, 5872 | "hidden": true, 5873 | "order": 5067 5874 | }, 5875 | { 5876 | "id": 84089, 5877 | "name": "经变·狐猫鸟与怪", 5878 | "desc": "解开纳西妲藏起的谜题,得知散兵过去的经历。", 5879 | "reward": 5, 5880 | "hidden": true, 5881 | "order": 5068 5882 | }, 5883 | { 5884 | "id": 84090, 5885 | "name": "如我是我非我相", 5886 | "desc": "击败回忆中的七叶寂照秘密主。", 5887 | "reward": 5, 5888 | "hidden": true, 5889 | "order": 5069 5890 | }, 5891 | { 5892 | "id": 84091, 5893 | "name": "倾落伽蓝", 5894 | "desc": "完成「倾落伽蓝」。", 5895 | "reward": 10, 5896 | "hidden": true, 5897 | "order": 5070 5898 | }, 5899 | { 5900 | "id": 84092, 5901 | "name": "漫游星河之夜", 5902 | "desc": "回想关于血亲的回忆。", 5903 | "reward": 5, 5904 | "hidden": true, 5905 | "order": 5071 5906 | }, 5907 | { 5908 | "id": 84093, 5909 | "name": "尚未致死的疾病", 5910 | "desc": "制作带来希望的「药物」。", 5911 | "reward": 5, 5912 | "hidden": true, 5913 | "order": 5072 5914 | }, 5915 | { 5916 | "id": 84094, 5917 | "name": "「命运」的彼岸", 5918 | "desc": "见证「罪人」赐予的「奇迹」。", 5919 | "reward": 5, 5920 | "hidden": true, 5921 | "order": 5073 5922 | }, 5923 | { 5924 | "id": 84095, 5925 | "name": "卡利贝尔", 5926 | "desc": "完成「卡利贝尔」。", 5927 | "reward": 10, 5928 | "hidden": true, 5929 | "order": 5074 5930 | }, 5931 | { 5932 | "id": 84096, 5933 | "name": "就像水消失在水中", 5934 | "desc": "知晓在枫丹流传的「预言」。", 5935 | "reward": 5, 5936 | "hidden": true, 5937 | "order": 5075 5938 | }, 5939 | { 5940 | "id": 84097, 5941 | "name": "行动派侦探出击", 5942 | "desc": "作为林尼的「代理人」调查事件的真相。", 5943 | "reward": 5, 5944 | "hidden": true, 5945 | "order": 5076 5946 | }, 5947 | { 5948 | "id": 84098, 5949 | "name": "逆转的大魔术", 5950 | "desc": "「谕示裁定枢机」已作出无罪判决。", 5951 | "reward": 5, 5952 | "hidden": true, 5953 | "order": 5077 5954 | }, 5955 | { 5956 | "id": 84099, 5957 | "name": "白露与黑潮的序诗", 5958 | "desc": "完成「白露与黑潮的序诗」。", 5959 | "reward": 10, 5960 | "hidden": true, 5961 | "order": 5078 5962 | }, 5963 | { 5964 | "id": 84300, 5965 | "name": "我愿是急流", 5966 | "desc": "听见「纯水精灵」的呼唤并与其意识连接。", 5967 | "reward": 5, 5968 | "hidden": true, 5969 | "order": 5079 5970 | }, 5971 | { 5972 | "id": 84301, 5973 | "name": "灰河往事", 5974 | "desc": "在刺玫会的据点下榻并了解到娜维娅父亲的事。", 5975 | "reward": 5, 5976 | "hidden": true, 5977 | "order": 5080 5978 | }, 5979 | { 5980 | "id": 84302, 5981 | "name": "悲剧的复写", 5982 | "desc": "使「少女连环失踪案」真相大白。", 5983 | "reward": 5, 5984 | "hidden": true, 5985 | "order": 5081 5986 | }, 5987 | { 5988 | "id": 84303, 5989 | "name": "仿若无因飘落的轻雨", 5990 | "desc": "完成「仿若无因飘落的轻雨」。", 5991 | "reward": 10, 5992 | "hidden": true, 5993 | "order": 5082 5994 | }, 5995 | { 5996 | "id": 84304, 5997 | "name": "水族馆的来访者", 5998 | "desc": "在完成所有手续后,前往梅洛彼得堡。", 5999 | "reward": 5, 6000 | "hidden": true, 6001 | "order": 5083 6002 | }, 6003 | { 6004 | "id": 84305, 6005 | "name": "梦寻幻景", 6006 | "desc": "在梦境中经历「公子」经历过的「视角」。", 6007 | "reward": 5, 6008 | "hidden": true, 6009 | "order": 5084 6010 | }, 6011 | { 6012 | "id": 84306, 6013 | "name": "角落社会的规则", 6014 | "desc": "调查了监狱中的两种「隐秘规矩」。", 6015 | "reward": 5, 6016 | "hidden": true, 6017 | "order": 5085 6018 | }, 6019 | { 6020 | "id": 84307, 6021 | "name": "向深水中的晨星", 6022 | "desc": "完成「向深水中的晨星」。", 6023 | "reward": 10, 6024 | "hidden": true, 6025 | "order": 5086 6026 | }, 6027 | { 6028 | "id": 84308, 6029 | "name": "浪潮已至", 6030 | "desc": "菲米尼回忆起了自己的遭遇…", 6031 | "reward": 5, 6032 | "hidden": true, 6033 | "order": 5087 6034 | }, 6035 | { 6036 | "id": 84309, 6037 | "name": "海底下的不可思议", 6038 | "desc": "知晓梅洛彼得堡的历史与秘密。", 6039 | "reward": 5, 6040 | "hidden": true, 6041 | "order": 5088 6042 | }, 6043 | { 6044 | "id": 84310, 6045 | "name": "万古的孑遗", 6046 | "desc": "获知那维莱特的真实身份。", 6047 | "reward": 5, 6048 | "hidden": true, 6049 | "order": 5089 6050 | }, 6051 | { 6052 | "id": 84311, 6053 | "name": "谕示胎动的终焉之刻", 6054 | "desc": "完成「谕示胎动的终焉之刻」。", 6055 | "reward": 10, 6056 | "hidden": true, 6057 | "order": 5090 6058 | }, 6059 | { 6060 | "id": 84312, 6061 | "name": "群鸥曾呜咽", 6062 | "desc": "目睹白淞镇的灾难。", 6063 | "reward": 5, 6064 | "hidden": true, 6065 | "order": 5091 6066 | }, 6067 | { 6068 | "id": 84313, 6069 | "name": "Love is Destructive", 6070 | "desc": "娜维娅从胎海水中幸存。", 6071 | "reward": 5, 6072 | "hidden": true, 6073 | "order": 5092 6074 | }, 6075 | { 6076 | "id": 84314, 6077 | "name": "命运的舞台", 6078 | "desc": "与伙伴们共同计划搭建「审判神明」的「陷阱」。", 6079 | "reward": 5, 6080 | "hidden": true, 6081 | "order": 5093 6082 | }, 6083 | { 6084 | "id": 84315, 6085 | "name": "为了美好的明天", 6086 | "desc": "人们正在重建家园。", 6087 | "reward": 5, 6088 | "hidden": true, 6089 | "order": 5094 6090 | }, 6091 | { 6092 | "id": 84316, 6093 | "name": "罪人舞步旋", 6094 | "desc": "完成「罪人舞步旋」。", 6095 | "reward": 10, 6096 | "hidden": true, 6097 | "order": 5095 6098 | }, 6099 | { 6100 | "id": 84317, 6101 | "name": "只有我消失的村落", 6102 | "desc": "调查「只存在于记忆里的人」。", 6103 | "reward": 5, 6104 | "hidden": true, 6105 | "order": 5096 6106 | }, 6107 | { 6108 | "id": 84318, 6109 | "name": "渴盼已久之时", 6110 | "desc": "在你不知道的时候,戴因斯雷布与你的血亲展开了战斗…", 6111 | "reward": 5, 6112 | "hidden": true, 6113 | "order": 5097 6114 | }, 6115 | { 6116 | "id": 84319, 6117 | "name": "存在的证明", 6118 | "desc": "来到卡利贝尔的「意识空间」。", 6119 | "reward": 5, 6120 | "hidden": true, 6121 | "order": 5098 6122 | }, 6123 | { 6124 | "id": 84320, 6125 | "name": "睡前故事", 6126 | "desc": "完成「睡前故事」。", 6127 | "reward": 10, 6128 | "hidden": true, 6129 | "order": 5099 6130 | }, 6131 | { 6132 | "id": 84321, 6133 | "name": "龙的国度", 6134 | "desc": "一切都很特别。", 6135 | "reward": 5, 6136 | "hidden": true, 6137 | "order": 5100 6138 | }, 6139 | { 6140 | "id": 84322, 6141 | "name": "一切荣光的归处", 6142 | "desc": "梦想碰撞时,会迸发最耀眼的火花。", 6143 | "reward": 5, 6144 | "hidden": true, 6145 | "order": 5101 6146 | }, 6147 | { 6148 | "id": 84323, 6149 | "name": "冰与火的战场", 6150 | "desc": "立场需要强大的力量做支撑。", 6151 | "reward": 5, 6152 | "hidden": true, 6153 | "order": 5102 6154 | }, 6155 | { 6156 | "id": 84325, 6157 | "name": "再相见", 6158 | "desc": "我一定会找到你,无论跨过多么遥远的距离。", 6159 | "reward": 5, 6160 | "hidden": true, 6161 | "order": 5103 6162 | }, 6163 | { 6164 | "id": 84324, 6165 | "name": "逃出生天", 6166 | "desc": "困住归路的边界破碎,有光照入混沌的黑暗。", 6167 | "reward": 5, 6168 | "hidden": true, 6169 | "order": 5104 6170 | }, 6171 | { 6172 | "id": 84326, 6173 | "name": "黑石湮落白石下", 6174 | "desc": "完成「黑石湮落白石下」。", 6175 | "reward": 10, 6176 | "hidden": true, 6177 | "order": 5105 6178 | }, 6179 | { 6180 | "id": 84327, 6181 | "name": "荣花与炎日之途", 6182 | "desc": "完成「荣花与炎日之途」。", 6183 | "reward": 10, 6184 | "hidden": true, 6185 | "order": 5106 6186 | }, 6187 | { 6188 | "id": 84328, 6189 | "name": "「杜麦尼」的诗篇", 6190 | "desc": "记忆填满圣夜旅织,而纳塔的故事还在继续…", 6191 | "reward": 20, 6192 | "hidden": true, 6193 | "order": 5107 6194 | }, 6195 | { 6196 | "id": 84329, 6197 | "name": "谜境中的将军", 6198 | "desc": "与愚人众执行官「队长」的正式会面。", 6199 | "reward": 5, 6200 | "hidden": true, 6201 | "order": 5108 6202 | }, 6203 | { 6204 | "id": 84330, 6205 | "name": "未奉献的牺牲", 6206 | "desc": "他所追寻的究竟是什么…", 6207 | "reward": 5, 6208 | "hidden": true, 6209 | "order": 5109 6210 | }, 6211 | { 6212 | "id": 84331, 6213 | "name": "镜与谜烟的彼方", 6214 | "desc": "完成「镜与谜烟的彼方」。", 6215 | "reward": 10, 6216 | "hidden": true, 6217 | "order": 5110 6218 | }, 6219 | { 6220 | "id": 84332, 6221 | "name": "在夜明之前", 6222 | "desc": "唯有携手,才能觅见光明。", 6223 | "reward": 5, 6224 | "hidden": true, 6225 | "order": 5111 6226 | }, 6227 | { 6228 | "id": 84333, 6229 | "name": "胜者重燃", 6230 | "desc": "终于,纳塔再一次迎来了胜利。", 6231 | "reward": 5, 6232 | "hidden": true, 6233 | "order": 5112 6234 | }, 6235 | { 6236 | "id": 84334, 6237 | "name": "命定将焚的虹光", 6238 | "desc": "完成「命定将焚的虹光」。", 6239 | "reward": 10, 6240 | "hidden": true, 6241 | "order": 5113 6242 | }, 6243 | { 6244 | "id": 84335, 6245 | "name": "小小的一步", 6246 | "desc": "在过程中积累的经验,与在开始前进行的思考同样重要。", 6247 | "reward": 5, 6248 | "hidden": true, 6249 | "order": 5114 6250 | }, 6251 | { 6252 | "id": 84336, 6253 | "name": "万火归一", 6254 | "desc": "完成「万火归一」。", 6255 | "reward": 10, 6256 | "hidden": true, 6257 | "order": 5115 6258 | }, 6259 | { 6260 | "id": 84337, 6261 | "name": "梦醒时分", 6262 | "desc": "隐藏在梦境中的,是过去与未来的回音。", 6263 | "reward": 5, 6264 | "hidden": true, 6265 | "order": 5116 6266 | }, 6267 | { 6268 | "id": 84338, 6269 | "name": "羁旅未竟", 6270 | "desc": "还有许多要与「同伴」一起经历。", 6271 | "reward": 5, 6272 | "hidden": true, 6273 | "order": 5117 6274 | }, 6275 | { 6276 | "id": 84339, 6277 | "name": "终战之战", 6278 | "desc": "在长夜的尽头,终现名为「希望」的曙光。", 6279 | "reward": 5, 6280 | "hidden": true, 6281 | "order": 5118 6282 | }, 6283 | { 6284 | "id": 84340, 6285 | "name": "人创造的奇迹", 6286 | "desc": "为纳塔夺取最终的胜利。", 6287 | "reward": 5, 6288 | "hidden": true, 6289 | "order": 5119 6290 | }, 6291 | { 6292 | "id": 84341, 6293 | "name": "炽烈的还魂诗", 6294 | "desc": "完成「炽烈的还魂诗」。", 6295 | "reward": 10, 6296 | "hidden": true, 6297 | "order": 5120 6298 | }, 6299 | { 6300 | "id": 84342, 6301 | "name": "如孩童的躁动般", 6302 | "desc": "与伙伴们一同抵御自雪山而来的魔物。", 6303 | "reward": 5, 6304 | "hidden": true, 6305 | "order": 5121 6306 | }, 6307 | { 6308 | "id": 84343, 6309 | "name": "瓦尔普吉斯的游戏", 6310 | "desc": "通过魔女会设下的试炼。", 6311 | "reward": 5, 6312 | "hidden": true, 6313 | "order": 5122 6314 | }, 6315 | { 6316 | "id": 84344, 6317 | "name": "悖理", 6318 | "desc": "完成「悖理」。", 6319 | "reward": 5, 6320 | "hidden": true, 6321 | "order": 5123 6322 | } 6323 | ] 6324 | } -------------------------------------------------------------------------------- /resources/images/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zolay-poi/achievements-plugin/f18d0de16c235e9a9adc14bf9538fb5a625e3e26/resources/images/icon.png -------------------------------------------------------------------------------- /resources/template/font/tttgbnumber.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zolay-poi/achievements-plugin/f18d0de16c235e9a9adc14bf9538fb5a625e3e26/resources/template/font/tttgbnumber.ttf -------------------------------------------------------------------------------- /resources/template/img/background_bottom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zolay-poi/achievements-plugin/f18d0de16c235e9a9adc14bf9538fb5a625e3e26/resources/template/img/background_bottom.png -------------------------------------------------------------------------------- /resources/template/img/background_middle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zolay-poi/achievements-plugin/f18d0de16c235e9a9adc14bf9538fb5a625e3e26/resources/template/img/background_middle.png -------------------------------------------------------------------------------- /resources/template/img/background_top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zolay-poi/achievements-plugin/f18d0de16c235e9a9adc14bf9538fb5a625e3e26/resources/template/img/background_top.png -------------------------------------------------------------------------------- /resources/template/img/done_time.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zolay-poi/achievements-plugin/f18d0de16c235e9a9adc14bf9538fb5a625e3e26/resources/template/img/done_time.png -------------------------------------------------------------------------------- /resources/template/img/icon0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zolay-poi/achievements-plugin/f18d0de16c235e9a9adc14bf9538fb5a625e3e26/resources/template/img/icon0.png -------------------------------------------------------------------------------- /resources/template/img/icon1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zolay-poi/achievements-plugin/f18d0de16c235e9a9adc14bf9538fb5a625e3e26/resources/template/img/icon1.png -------------------------------------------------------------------------------- /resources/template/img/icon3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zolay-poi/achievements-plugin/f18d0de16c235e9a9adc14bf9538fb5a625e3e26/resources/template/img/icon3.png -------------------------------------------------------------------------------- /resources/template/img/psd.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zolay-poi/achievements-plugin/f18d0de16c235e9a9adc14bf9538fb5a625e3e26/resources/template/img/psd.psd -------------------------------------------------------------------------------- /resources/template/img/reward.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zolay-poi/achievements-plugin/f18d0de16c235e9a9adc14bf9538fb5a625e3e26/resources/template/img/reward.png -------------------------------------------------------------------------------- /resources/template/img/thumb-1920-1271.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zolay-poi/achievements-plugin/f18d0de16c235e9a9adc14bf9538fb5a625e3e26/resources/template/img/thumb-1920-1271.jpg -------------------------------------------------------------------------------- /resources/template/img/top_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zolay-poi/achievements-plugin/f18d0de16c235e9a9adc14bf9538fb5a625e3e26/resources/template/img/top_background.png -------------------------------------------------------------------------------- /resources/template/img/wonders_of_the_world.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zolay-poi/achievements-plugin/f18d0de16c235e9a9adc14bf9538fb5a625e3e26/resources/template/img/wonders_of_the_world.png -------------------------------------------------------------------------------- /resources/template/import_image.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /resources/template/import_video.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /resources/template/statistics.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 成就查漏 6 | 7 | 8 | 9 | 10 | 11 |
12 |
13 | {{if showTopInfo}} 14 |
15 |
16 |
天地万象
17 |
18 | {{if achievement_number != null}} 19 | 总达成成就{{achievement_number}}个 20 | {{else}} 21 | 总成就数量获取失败 22 | {{/if}} 23 |
24 |
25 |
26 |
27 | 头像 28 |
29 |
30 |
{{name}}
31 |
UID:{{uid}}
32 |
33 |
34 |
35 | {{/if}} 36 | 37 |
38 |
39 |
40 |
41 |
42 | {{each page.records item}} 43 |
44 |
45 | {{item.name}} 46 | ID:{{item.id}} 47 |
48 |
{{item.desc}}
49 |
50 |
{{item.reward}}
51 |
52 |
53 | {{/each}} 54 |
55 |
{{pageInfo}}
56 |
57 | 58 | 59 | 60 |
61 | 62 | 63 | -------------------------------------------------------------------------------- /resources/template/style/common.css: -------------------------------------------------------------------------------- 1 | @font-face{font-family:"Number";src:url("../font/tttgbnumber.ttf");font-weight:normal;font-style:normal}*{margin:0;padding:0;box-sizing:border-box;user-select:none}#container{width:600px;padding:8px;background-size:contain;position:relative}.copyright{font-size:16px;font-family:Number,sans-serif;text-align:center;color:#fff;position:relative;padding-left:10px;text-shadow:1px 1px 1px #000;margin-bottom:10px} -------------------------------------------------------------------------------- /resources/template/style/common.less: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: "Number"; 3 | src: url("../font/tttgbnumber.ttf"); 4 | font-weight: normal; 5 | font-style: normal; 6 | } 7 | 8 | * { 9 | margin: 0; 10 | padding: 0; 11 | box-sizing: border-box; 12 | user-select: none; 13 | } 14 | 15 | #container { 16 | width: 600px; 17 | padding: 8px; 18 | background-size: contain; 19 | position: relative; 20 | } 21 | 22 | .copyright { 23 | font-size: 16px; 24 | font-family: Number, sans-serif; 25 | text-align: center; 26 | color: #fff; 27 | position: relative; 28 | padding-left: 10px; 29 | text-shadow: 1px 1px 1px #000; 30 | margin-bottom: 10px; 31 | } 32 | -------------------------------------------------------------------------------- /resources/template/style/statistics.css: -------------------------------------------------------------------------------- 1 | #container{width:1240px;padding:20px 20px 0 20px}#container .background{background:url("../img/thumb-1920-1271.jpg") 0 0 repeat;position:absolute;top:-50px;left:-50px;width:calc(100% + 50px);height:calc(100% + 50px);z-index:-1;filter:blur(10px)}#container .info{padding:8px;width:1184px;height:120px;margin-bottom:20px;background:#ece5d8 url("../img/top_background.png") calc(100% - 8px) 8px no-repeat;position:relative;border-radius:10px;filter:drop-shadow(0 0 12px #fff);display:flex}#container .info:before{content:'';display:block;width:calc(100% - 13px);height:108px;border:3px solid #d1cbc0;position:absolute;top:3px;left:3px;border-radius:8px}#container .info .left,#container .info .right{width:50%;height:100%;display:flex}#container .info .left{flex-direction:column;background:url("../img/wonders_of_the_world.png") 10px 10px no-repeat;background-size:80px;padding:8px 0 0 120px}#container .info .left .name{font-size:32px;font-weight:bold;margin-bottom:4px;color:#4d4d4d}#container .info .left .count{color:#bca895;font-weight:bold;font-size:24px}#container .info .left .count span{color:#4d4d4d;padding:0 4px}#container .info .right{flex-direction:row-reverse;padding:10px}#container .info .right .avatar{margin-left:20px}#container .info .right .avatar img{width:80px;height:80px;border-radius:50%}#container .info .right .detail{font-size:32px;font-weight:bold;margin-bottom:4px;color:#4d4d4d;text-align:right}#container .info .right .detail .uid{margin-top:8px;font-size:24px}#container .list{position:relative;filter:drop-shadow(0 0 12px #fff)}#container .list .bag-top{background:url("../img/background_top.png") -2px 0 no-repeat;height:202px}#container .list .bag-middle{background:url("../img/background_middle.png") 0 0 repeat-y}#container .list .bag-bottom{background:url("../img/background_bottom.png") -2px 0 no-repeat;height:228px}#container .list .item-box{position:absolute;top:20px;left:22px;width:1140px;padding:20px 30px}#container .list .item-box .item{border:2px solid #e0d6cb;background:#f5f1eb no-repeat;padding:25px 0 25px 140px;margin-bottom:3px;position:relative}#container .list .item-box .item .name{font-size:24px;font-weight:bold;color:#4d4d4d;margin-bottom:8px}#container .list .item-box .item .name .item-id{font-size:12px;color:#bca895;position:relative;bottom:10px}#container .list .item-box .item .desc{color:#bca895;font-size:16px;font-weight:bold}#container .list .item-box .item .reward{position:absolute;top:20px;right:20px;background:url("../img/reward.png") 0 0 no-repeat;width:71px;height:72px}#container .list .item-box .item .reward .reward-num{position:absolute;bottom:0;width:100%;color:white;font-weight:bold;text-align:center}#container .list .item-box .item.icon0{background-image:url("../img/icon0.png");background-position-x:18px;background-position-y:4px}#container .list .page-info{position:absolute;bottom:80px;left:0;width:100%;text-align:center;font-weight:bold;color:#4d4d4d}#container .copyright{position:absolute;bottom:4px;left:0;width:100%;text-align:center} -------------------------------------------------------------------------------- /resources/template/style/statistics.less: -------------------------------------------------------------------------------- 1 | 2 | body { 3 | } 4 | 5 | #container { 6 | width: 1240px; 7 | padding: 20px 20px 0 20px; 8 | 9 | .background { 10 | background: url("../img/thumb-1920-1271.jpg") 0 0 repeat; 11 | position: absolute; 12 | top: -50px; 13 | left: -50px; 14 | width: calc(100% + 50px); 15 | height: calc(100% + 50px); 16 | z-index: -1; 17 | filter: blur(10px); 18 | } 19 | 20 | .info { 21 | padding: 8px; 22 | width: 1184px; 23 | height: 120px; 24 | margin-bottom: 20px; 25 | background: #ece5d8 url("../img/top_background.png") calc(100% - 8px) 8px no-repeat; 26 | position: relative; 27 | border-radius: 10px; 28 | filter: drop-shadow(0 0 12px rgba(255, 255, 255, 1)); 29 | display: flex; 30 | 31 | &:before { 32 | content: ''; 33 | display: block; 34 | width: calc(100% - 13px); 35 | height: 108px; 36 | border: 3px solid #d1cbc0; 37 | position: absolute; 38 | top: 3px; 39 | left: 3px; 40 | border-radius: 8px; 41 | } 42 | 43 | .left, .right { 44 | //display: inline-block; 45 | width: 50%; 46 | height: 100%; 47 | display: flex; 48 | } 49 | 50 | .left { 51 | flex-direction: column; 52 | background: url("../img/wonders_of_the_world.png") 10px 10px no-repeat; 53 | background-size: 80px; 54 | padding: 8px 0 0 120px; 55 | 56 | .name { 57 | font-size: 32px; 58 | font-weight: bold; 59 | margin-bottom: 4px; 60 | color: #4d4d4d; 61 | } 62 | 63 | .count { 64 | color: #bca895; 65 | font-weight: bold; 66 | font-size: 24px; 67 | 68 | span { 69 | color: #4d4d4d; 70 | padding: 0 4px; 71 | } 72 | } 73 | } 74 | 75 | .right { 76 | flex-direction: row-reverse; 77 | padding: 10px; 78 | 79 | .avatar { 80 | img { 81 | width: 80px; 82 | height: 80px; 83 | border-radius: 50%; 84 | } 85 | 86 | margin-left: 20px; 87 | } 88 | 89 | .detail { 90 | font-size: 32px; 91 | font-weight: bold; 92 | margin-bottom: 4px; 93 | color: #4d4d4d; 94 | text-align: right; 95 | 96 | .uid { 97 | margin-top: 8px; 98 | font-size: 24px; 99 | } 100 | } 101 | } 102 | 103 | 104 | .detail { 105 | 106 | } 107 | 108 | } 109 | 110 | .list { 111 | position: relative; 112 | filter: drop-shadow(0 0 12px rgba(255, 255, 255, 1)); 113 | 114 | 115 | .bag-top { 116 | background: url("../img/background_top.png") -2px 0 no-repeat; 117 | height: 202px; 118 | } 119 | 120 | .bag-middle { 121 | background: url("../img/background_middle.png") 0 0 repeat-y; 122 | } 123 | 124 | .bag-bottom { 125 | background: url("../img/background_bottom.png") -2px 0 no-repeat; 126 | height: 228px; 127 | } 128 | 129 | .item-box { 130 | position: absolute; 131 | top: 20px; 132 | left: 22px; 133 | width: 1140px; 134 | padding: 20px 30px; 135 | 136 | .item { 137 | border: 2px solid #e0d6cb; 138 | background: #f5f1eb no-repeat; 139 | padding: 25px 0 25px 140px; 140 | margin-bottom: 3px; 141 | position: relative; 142 | 143 | .name { 144 | font-size: 24px; 145 | font-weight: bold; 146 | color: #4d4d4d; 147 | margin-bottom: 8px; 148 | 149 | .item-id { 150 | font-size: 12px; 151 | color: #bca895; 152 | position: relative; 153 | bottom: 10px; 154 | } 155 | } 156 | 157 | .desc { 158 | color: #bca895; 159 | font-size: 16px; 160 | font-weight: bold; 161 | } 162 | 163 | .reward { 164 | position: absolute; 165 | top: 20px; 166 | right: 20px; 167 | background: url("../img/reward.png") 0 0 no-repeat; 168 | width: 71px; 169 | height: 72px; 170 | 171 | .reward-num { 172 | position: absolute; 173 | bottom: 0; 174 | width: 100%; 175 | color: white; 176 | font-weight: bold; 177 | text-align: center; 178 | } 179 | } 180 | 181 | &.icon0 { 182 | background-image: url("../img/icon0.png"); 183 | background-position-x: 18px; 184 | background-position-y: 4px; 185 | } 186 | } 187 | } 188 | 189 | .page-info { 190 | position: absolute; 191 | bottom: 80px; 192 | left: 0; 193 | width: 100%; 194 | text-align: center; 195 | font-weight: bold; 196 | color: #4d4d4d; 197 | } 198 | 199 | } 200 | 201 | .copyright { 202 | position: absolute; 203 | bottom: 4px; 204 | left: 0; 205 | width: 100%; 206 | text-align: center; 207 | } 208 | 209 | } -------------------------------------------------------------------------------- /utils/Data.js: -------------------------------------------------------------------------------- 1 | /* 2 | * 说明:由于 v3 版本没有这个工具类了 3 | * 所以单独复制进插件了一份 4 | */ 5 | import lodash from "lodash"; 6 | import fs from "fs"; 7 | 8 | let Data = { 9 | 10 | /* 11 | * 根据指定的path依次检查与创建目录 12 | * */ 13 | createDir(rootPath = "", path = "", includeFile = false) { 14 | let pathList = path.split("/"), 15 | nowPath = rootPath; 16 | pathList.forEach((name, idx) => { 17 | name = name.trim(); 18 | if (!includeFile && idx <= pathList.length - 1) { 19 | nowPath += name + "/"; 20 | if (name) { 21 | if (!fs.existsSync(nowPath)) { 22 | fs.mkdirSync(nowPath); 23 | } 24 | } 25 | } 26 | }) 27 | }, 28 | 29 | /* 30 | * 读取json 31 | * */ 32 | readJSON(root, path) { 33 | if (!/\.json$/.test(path)) { 34 | path = path + ".json"; 35 | } 36 | // 检查并创建目录 37 | Data.createDir(root, path, true); 38 | 39 | let jsonRet = fs.readFileSync(`${root}/${path}`, "utf8"); 40 | return JSON.parse(jsonRet); 41 | }, 42 | 43 | /* 44 | * 写JSON 45 | * */ 46 | writeJson(path, file, data, space = "\t") { 47 | if (!/\.json$/.test(file)) { 48 | file = file + ".json"; 49 | } 50 | 51 | // 检查并创建目录 52 | Data.createDir(path, true); 53 | return fs.writeFileSync(`${path}/${file}`, JSON.stringify(data, null, space)); 54 | }, 55 | 56 | /* 57 | * 返回一个从 target 中选中的属性的对象 58 | * 59 | * keyList : 获取字段列表,逗号分割字符串 60 | * key1, key2, toKey1:fromKey1, toKey2:fromObj.key 61 | * 62 | * defaultData: 当某个字段为空时会选取defaultData的对应内容 63 | * toKeyPrefix:返回数据的字段前缀,默认为空。defaultData中的键值无需包含toKeyPrefix 64 | * 65 | * */ 66 | 67 | getData(target, keyList = "", cfg = {}) { 68 | target = target || {}; 69 | let defaultData = cfg.defaultData || {}; 70 | let ret = {}; 71 | // 分割逗号 72 | if (typeof (keyList) === "string") { 73 | keyList = keyList.split(","); 74 | } 75 | 76 | lodash.forEach(keyList, (keyCfg) => { 77 | // 处理通过:指定 toKey & fromKey 78 | let _keyCfg = keyCfg.split(":"); 79 | let keyTo = _keyCfg[0].trim(), 80 | keyFrom = (_keyCfg[1] || _keyCfg[0]).trim(), 81 | keyRet = keyTo; 82 | if (cfg.lowerFirstKey) { 83 | keyRet = lodash.lowerFirst(keyRet); 84 | } 85 | if (cfg.keyPrefix) { 86 | keyRet = cfg.keyPrefix + keyRet; 87 | } 88 | // 通过Data.getVal获取数据 89 | ret[keyRet] = Data.getVal(target, keyFrom, defaultData[keyTo], cfg); 90 | }) 91 | return ret; 92 | }, 93 | 94 | getVal(target, keyFrom, defaultValue) { 95 | return lodash.get(target, keyFrom, defaultValue); 96 | }, 97 | 98 | getDayEnd() { 99 | let now = new Date(); 100 | let dayEnd = new Date(now.getFullYear(), now.getMonth(), now.getDate(), "23", "59", "59").getTime() / 1000; 101 | return dayEnd - parseInt(now.getTime() / 1000); 102 | }, 103 | 104 | 105 | }; 106 | export default Data; 107 | -------------------------------------------------------------------------------- /utils/adapter.js: -------------------------------------------------------------------------------- 1 | const weChatFileRegex = /file\.wx2\.qq\.com.*?&filename=([^&]*)/ 2 | 3 | export function isWeChatFile(url) { 4 | return weChatFileRegex.test(url) 5 | } 6 | 7 | /** 8 | * 获取文件名 9 | * @param fileUrl 10 | * @return {string|null} 11 | */ 12 | export function matchFilename(fileUrl) { 13 | const match = fileUrl?.match?.(weChatFileRegex); 14 | if (match) { 15 | return decodeURIComponent(match[1]); 16 | } 17 | return null; 18 | } 19 | -------------------------------------------------------------------------------- /utils/common.js: -------------------------------------------------------------------------------- 1 | import fs from 'fs'; 2 | import path from 'path'; 3 | import lodash from 'lodash'; 4 | import fetch from 'node-fetch'; 5 | import { promisify } from 'util'; 6 | import { pipeline } from 'stream'; 7 | import Data from './Data.js'; 8 | import Settings, { _method } from '../models/Settings.js'; 9 | import { dynamicImport, isV3, isMiao } from '../version/getVersion.js'; 10 | import { isWeChatFile } from "./adapter.js"; 11 | 12 | let { browserInit, default: Puppeteer } = await dynamicImport( 13 | '../../../lib/render.js', 14 | '../../../lib/puppeteer/puppeteer.js', 15 | // TODO 兼容miao-yunzai (临时吧,可能,后续还要改) 16 | '../../../renderers/puppeteer/lib/puppeteer.js' 17 | ); 18 | 19 | if (isV3) { 20 | if (isMiao) { 21 | const getPuppeteer = new Puppeteer({}) 22 | browserInit = getPuppeteer.browserInit.bind(getPuppeteer); 23 | } else { 24 | browserInit = Puppeteer.browserInit.bind(Puppeteer); 25 | } 26 | } 27 | 28 | const pluginName = 'achievements-plugin'; 29 | const _path = process.cwd(); 30 | // 插件目录 31 | const pluginsPath = path.join(_path, 'plugins', pluginName); 32 | // 资源目录 33 | const resourcesPath = path.join(pluginsPath, 'resources'); 34 | // 模板目录 35 | const templatePath = path.join(resourcesPath, 'template'); 36 | // 用户已完成的成就记录保存目录 37 | const userDataPath = path.join(_path, 'data', pluginName); 38 | // 配置目录 39 | const settingsPath = path.join(userDataPath, 'settings.json'); 40 | 41 | export const _version = '1.3.5'; 42 | 43 | export const _paths = { 44 | rootPath: _path, 45 | pluginsPath, 46 | resourcesPath, 47 | templatePath, 48 | userDataPath, 49 | settingsPath, 50 | }; 51 | 52 | export const settings = new Settings(); 53 | 54 | // 全成就 map 55 | export const achievementsMap = new Map(); 56 | 57 | /** 58 | * 读取成就列表 59 | * 数据来源 https://github.com/dvaJi/genshin-data 60 | * @param force 强制从本地重新读取 61 | */ 62 | export function loadAchievements(force) { 63 | if (force) { 64 | achievementsMap.clear(); 65 | } 66 | if (achievementsMap.size > 0) { 67 | return true; 68 | } 69 | // 读取“天地万象”的成就JSON 70 | let json = Data.readJSON(resourcesPath, 'achievements/wonders_of_the_world.json'); 71 | if (json && json.achievements) { 72 | for (const achievement of json.achievements) { 73 | // 过滤重复成就数据,以椰羊上的ID为准(啊这……为什么会有重复数据?) 74 | if (DUPLICATE_ID.includes(achievement.id)) continue; 75 | // 查找是否有系列成就 76 | findNextStage(achievement, json.achievements); 77 | achievementsMap.set(achievement.id, achievement); 78 | } 79 | // console.log(achievementsMap.values()); 80 | return true; 81 | } else { 82 | return false; 83 | } 84 | } 85 | 86 | /** 重复的,或者已经被废弃的成就ID */ 87 | const DUPLICATE_ID = [81006, 81007, 81008, 81009, 81011, 81012, 81013, 81219, 82018, 82011]; 88 | 89 | function findNextStage(achievement, achievements) { 90 | for (const next of achievements) { 91 | if (next.preStage === achievement.id) { 92 | achievement.nextStage = next.id; 93 | break; 94 | } 95 | } 96 | } 97 | 98 | /** 获取用户保存的成就数据 */ 99 | export function readUserJson(jsonName) { 100 | let userJsonFile = path.join(_paths.userDataPath, jsonName); 101 | let saveData = null; 102 | if (fs.existsSync(userJsonFile)) { 103 | saveData = Data.readJSON(_paths.userDataPath, jsonName); 104 | } 105 | if (!saveData || !saveData.wonders_of_the_world) { 106 | saveData = { wonders_of_the_world: [] }; 107 | } 108 | // 保存JSON到本地 109 | const writeUserJson = () => fs.writeFileSync(userJsonFile, JSON.stringify(saveData)); 110 | return { saveData, writeUserJson }; 111 | } 112 | 113 | /** 自动判断是否需要艾特(只有群聊里才艾特) */ 114 | export function replyAt(e, msg, quote) { 115 | let message = [autoAt(e)]; 116 | if (Array.isArray(msg)) { 117 | message = message.concat(msg); 118 | } else { 119 | message.push(msg); 120 | } 121 | return e.reply(message, quote); 122 | } 123 | 124 | /** 125 | * 动态at,只有在群聊里才at人 126 | */ 127 | export function autoAt(e, ellipsis = true) { 128 | if (e.isGroup) { 129 | let name = e.sender.card; 130 | if (ellipsis) { 131 | name = lodash.truncate(name, { length: 8 }); 132 | } 133 | return segment.at(e.user_id, name); 134 | } 135 | return ''; 136 | } 137 | 138 | /* 139 | * 统一调用 e.getMysApi 140 | * */ 141 | export async function getMysApi(e) { 142 | if (isV3) { 143 | let { default: MysInfo } = await import('../../genshin/model/mys/mysInfo.js'); 144 | if (MysInfo) { 145 | let uid = await MysInfo.getUid(e); 146 | return { 147 | // 【兼容】v3版本 148 | uid, targetUid: uid, 149 | }; 150 | } 151 | } 152 | return await e.getMysApi({ 153 | auth: 'all', 154 | targetType: 'self', 155 | cookieType: 'all', 156 | }); 157 | } 158 | 159 | export async function downloadFiles(e, urls, suffix) { 160 | let tempPath = '/.temp/' + e.user_id; 161 | let savePath = path.join(_paths.userDataPath, tempPath.toString()); 162 | if (!fs.existsSync(savePath)) { 163 | Data.createDir(_paths.userDataPath, tempPath.toString()); 164 | } 165 | let filePaths = []; 166 | let errorCount = 0; 167 | for (let url of urls) { 168 | try { 169 | let fileName = randomString(18) + suffix; 170 | let filePath = path.join(savePath, fileName); 171 | if (isWeChatFile(url)) { 172 | let response = await downloadForWeChat(e, url); 173 | if (!response?.data) { 174 | errorCount++; 175 | continue; 176 | } 177 | fs.writeFileSync(filePath, Buffer.from(response.data)); 178 | } else { 179 | let response = await fetch(url, { 180 | agent: await getAgent(url), 181 | }); 182 | if (!response.ok) { 183 | errorCount++; 184 | continue; 185 | } 186 | let streamPipeline = promisify(pipeline); 187 | await streamPipeline(response.body, fs.createWriteStream(filePath)); 188 | } 189 | filePaths.push(filePath); 190 | } catch (e) { 191 | errorCount++; 192 | console.error(e) 193 | } 194 | } 195 | return { filePaths, errorCount }; 196 | } 197 | 198 | function downloadForWeChat(e, uri) { 199 | const url = new URL(uri); 200 | const fromUser = url.searchParams.get('fromuser') 201 | const mediaId = url.searchParams.get('mediaid') 202 | const fileName = url.searchParams.get('filename') 203 | return e.bot.getDoc(fromUser, mediaId, fileName) 204 | } 205 | 206 | let HttpsProxyAgent = null 207 | 208 | const autoEnableProxyReg = [ 209 | /cdn\.discordapp\.com/, 210 | /media\.discordapp\.net/ 211 | ] 212 | 213 | async function getAgent(url) { 214 | let enableProxy = settings.get('system.enableProxy') 215 | if (!enableProxy) { 216 | // 某些地址可自动开启代理 217 | if (!autoEnableProxyReg.some(reg => reg.test(url))) { 218 | return null; 219 | } 220 | } 221 | let proxyAddress; 222 | if (isV3) { 223 | const { default: cfg } = await import( '../../../lib/config/config.js'); 224 | proxyAddress = cfg.bot.proxyAddress; 225 | } else { 226 | return null; 227 | } 228 | if (!proxyAddress) return null 229 | if (proxyAddress === 'http://0.0.0.0:0') return null 230 | if (!HttpsProxyAgent) { 231 | HttpsProxyAgent = await import('https-proxy-agent').catch((err) => { 232 | logger.error('import https-proxy-agent fail: ' + err); 233 | }) 234 | HttpsProxyAgent = HttpsProxyAgent ? HttpsProxyAgent.HttpsProxyAgent : undefined 235 | } 236 | return HttpsProxyAgent ? new HttpsProxyAgent(proxyAddress) : null; 237 | } 238 | 239 | /**获取任意长度的随机数字字母组合字符串*/ 240 | export function randomString(length) { 241 | const charSet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; 242 | return lodash.sampleSize(charSet, length).join(''); 243 | } 244 | 245 | export { 246 | _method, 247 | Data, 248 | browserInit, 249 | }; -------------------------------------------------------------------------------- /utils/waitInput.js: -------------------------------------------------------------------------------- 1 | import { autoAt } from './common.js'; 2 | 3 | export const waitMap = new Map(); 4 | 5 | /** 6 | * 异步等待用户输入内容 7 | * @param e 8 | * @param key 标识符 9 | * @param checkFn 检查函数,也可以是regExp 10 | * @param timeout 超时时间,默认为10秒 11 | * @param message 提示信息 12 | * @param successCb 成功回调,只有当checkFn为regExp时才会调用 13 | * @param timeoutCb 超时回调,等待超时后会调用 14 | */ 15 | export function waitInput(e, { key, checkFn, timeout = 10000, message = ["请输入"], successCb, timeoutCb }) { 16 | let mapKey = getMapKey(e, key); 17 | let wait = waitMap.get(mapKey); 18 | if (wait) { 19 | clearTimeout(wait.timer); 20 | } 21 | wait = { 22 | checkFn, 23 | originKey: key, 24 | timer: setTimeout(() => { 25 | waitMap.delete(mapKey); 26 | timeoutCb && timeoutCb(); 27 | }, timeout), 28 | successCb, 29 | } 30 | waitMap.set(mapKey, wait); 31 | return e.reply(message); 32 | } 33 | 34 | export function waitInputAt(e, opt) { 35 | if (opt.message) { 36 | if (!Array.isArray(opt.message)) { 37 | opt.message = [opt.message]; 38 | } 39 | opt.message.unshift(autoAt(e)); 40 | } 41 | return waitInput(e, opt); 42 | } 43 | 44 | export function getMapKey(e, key) { 45 | let mapKey = `${key}-${e.user_id}` 46 | if (e.isGroup) { 47 | mapKey += `-${e.group_id}`; 48 | } 49 | return mapKey 50 | } -------------------------------------------------------------------------------- /version/2x.js: -------------------------------------------------------------------------------- 1 | import { init, achRouter, waitInputCheck } from './common.js'; 2 | 3 | export const rule = { 4 | achRouter: { 5 | reg: '^#成就.+$', 6 | priority: 100, 7 | describe: '成就查漏功能', 8 | hashMark: true, 9 | }, 10 | // 用户输入检测 11 | waitInputCheck: { reg: '', priority: 0, describe: '' }, 12 | }; 13 | 14 | // 路由 15 | export { 16 | achRouter, 17 | waitInputCheck, 18 | }; 19 | 20 | init(); 21 | -------------------------------------------------------------------------------- /version/3x.js: -------------------------------------------------------------------------------- 1 | import { init, achRouter, waitInputCheck } from './common.js'; 2 | 3 | // plugin 是全局对象,不用单独引用 4 | export class AchievementsPlugin extends plugin { 5 | constructor() { 6 | super({ 7 | name: '成就查漏', 8 | dsc: '提供成就查漏、搜索、统计等功能', 9 | event: 'message', 10 | priority: 100, 11 | rule: [ 12 | { 13 | reg: '^#成就.+$', 14 | fnc: 'achRouter', 15 | }, 16 | ], 17 | }); 18 | } 19 | 20 | async achRouter(e) { 21 | let ret = await achRouter(e, {}); 22 | if (ret) { 23 | // 返回任意,代表跳出循环(相当于2.x的return true) 24 | return ret; 25 | } 26 | // 返回false代表继续循环 27 | return false; 28 | } 29 | 30 | // 此方法不经过正则校验,每次收到消息都会调用 31 | async accept(...args) { 32 | let ret = await waitInputCheck(...args); 33 | return ret ? ret : false; 34 | } 35 | 36 | } 37 | 38 | init(); -------------------------------------------------------------------------------- /version/common.js: -------------------------------------------------------------------------------- 1 | import fs from 'fs'; 2 | import { _paths, _version, loadAchievements, replyAt } from '../utils/common.js'; 3 | import { dynamicImport, isV2 } from './getVersion.js'; 4 | 5 | import * as otherApp from '../apps/other.js'; 6 | import * as importApp from '../apps/import.js'; 7 | import * as statisticsApp from '../apps/statistics.js'; 8 | import * as settingsApp from '../apps/settings.js'; 9 | import * as searchApp from '../apps/search.js'; 10 | import path from 'path'; 11 | 12 | const common = await dynamicImport('../../../lib/common.js', '../../../lib/common/common.js'); 13 | const { default: Puppeteer } = await dynamicImport('', '../../../lib/puppeteer/puppeteer.js'); 14 | 15 | const actionsMap = new Map(); 16 | use(settingsApp); 17 | use(otherApp); 18 | use(importApp); 19 | use(statisticsApp); 20 | use(searchApp); 21 | 22 | export function use(app) { 23 | if (typeof app.install === 'function') { 24 | let register = (reg, func, options) => { 25 | actionsMap.set(reg, bind(func, options)); 26 | }; 27 | app.install({ register }); 28 | } else { 29 | throw 'app.install is not a function'; 30 | } 31 | } 32 | 33 | /** 路由 */ 34 | export function achRouter(e, components) { 35 | for (const [reg, func] of actionsMap.entries()) { 36 | if (reg.test(e.msg)) { 37 | return func(e, components, reg); 38 | } 39 | } 40 | } 41 | 42 | export const waitInputCheck = bind(otherApp.waitInputCheck); 43 | 44 | export function bind(fn, options = {}) { 45 | if (isV2) { 46 | return v2Bind(fn, options); 47 | } 48 | return v3Bind(fn, options); 49 | } 50 | 51 | // 兼容v2 52 | function v2Bind(fn, options = {}) { 53 | return function (e, components, ...args) { 54 | if (options.isMaster && !e.isMaster) return; 55 | e.replyAt = (...args) => replyAt(e, ...args); 56 | let render = components.render; 57 | components.render = async (...args) => { 58 | let base64 = await render('template', ...args); 59 | // 这里统一一下新版v3的写法 60 | if (base64) { 61 | return segment.image(`base64://${base64}`); 62 | } 63 | }; 64 | return fn(e, components, ...args); 65 | }; 66 | } 67 | 68 | // 兼容v3 69 | function v3Bind(fn, options = {}) { 70 | return function (e, components = {}, ...args) { 71 | if (options.isMaster && !e.isMaster) return; 72 | e.replyAt = (...args) => replyAt(e, ...args); 73 | components.render = (name, data = {}) => Puppeteer.screenshot(name, { 74 | // v3渲染图片必须要写这些参数 75 | // 模板路径 76 | tplFile: path.join(_paths.templatePath, `${name}.html`), 77 | // 绝对路径 78 | pluResPath: _paths.resourcesPath, 79 | // 【兼容】v2 80 | _res_path: _paths.resourcesPath, 81 | ...data, 82 | }); 83 | return fn(e, components, ...args); 84 | }; 85 | } 86 | 87 | export function init() { 88 | // 初始化目录 89 | if (!fs.existsSync(_paths.userDataPath)) { 90 | fs.mkdirSync(_paths.userDataPath); 91 | } 92 | // 初始化全成就列表 93 | loadAchievements(true); 94 | 95 | console.log(`成就查漏插件${_version}初始化完成~`); 96 | 97 | setTimeout(async function () { 98 | let msgStr = await redis.get('zolay:restart-msg'); 99 | if (msgStr) { 100 | let msg = JSON.parse(msgStr); 101 | await common.relpyPrivate(msg.qq, msg.msg); 102 | await redis.del('zolay:restart-msg'); 103 | let msgs = [`当前插件版本: ${_version}`]; 104 | await common.relpyPrivate(msg.qq, msgs.join('\n')); 105 | } 106 | }, 1000); 107 | } 108 | -------------------------------------------------------------------------------- /version/getVersion.js: -------------------------------------------------------------------------------- 1 | import fs from 'fs'; 2 | 3 | let isV2 = false, isV3 = false, isMiao = false; 4 | 5 | let pkg = JSON.parse(fs.readFileSync('./package.json', 'utf8')); 6 | if (pkg && pkg.version) { 7 | // 2.x 版本 8 | if (pkg.version.startsWith('2')) { 9 | isV2 = true; 10 | } else { 11 | isV3 = true; 12 | } 13 | } 14 | 15 | // 兼容 miao-yunzai 16 | if (pkg && pkg.name) { 17 | if (pkg.name === 'miao-yunzai') { 18 | isMiao = true; 19 | } 20 | } 21 | 22 | /** 23 | * 动态引入 24 | * @param v2Path 25 | * @param v3Path 26 | * @param miaoPath 27 | */ 28 | export async function dynamicImport(v2Path, v3Path, miaoPath) { 29 | if (isV2) { 30 | if (v2Path) { 31 | return await import(v2Path); 32 | } 33 | } else { 34 | if (isMiao && miaoPath) { 35 | return await import(miaoPath); 36 | } else if (v3Path) { 37 | return await import(v3Path); 38 | } 39 | } 40 | // 默认返回空对象,防止取值报错 41 | return {}; 42 | } 43 | 44 | export { isV2, isV3, isMiao }; 45 | --------------------------------------------------------------------------------