Compare commits
15 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
81a6415c75 | ||
|
|
e665a86b0c | ||
|
|
d8d3667c6c | ||
|
|
1ded3dccde | ||
|
|
7d9ee582e2 | ||
|
|
42eb034db4 | ||
|
|
d25adc11c7 | ||
|
|
0a534e39e9 | ||
|
|
339220cc04 | ||
|
|
d730c20a5b | ||
|
|
28c482228e | ||
|
|
f5b44c2e8a | ||
|
|
cbf4e15809 | ||
|
|
03e7a3ce0e | ||
|
|
bba700f806 |
14
CHANGELOG.md
@@ -2,12 +2,22 @@
|
||||
Author: 目棃
|
||||
Description: CHANGELOG
|
||||
Date: 2024-10-09
|
||||
Update: 2025-07-07
|
||||
Update: 2025-07-30
|
||||
---
|
||||
|
||||
> 本文档 [`Frontmatter`](https://github.com/BTMuli/MuCli#Frontmatter) 由 [MuCli](https://github.com/BTMuli/Mucli) 自动生成于 `2024-10-09 15:51:43`
|
||||
>
|
||||
> 更新于 `2025-07-07 12:45:35`
|
||||
> 更新于 `2025-07-30 10:29:44`
|
||||
|
||||
## [v0.7.9](https://github.com/BTMuli/TeyvatGuide/releases/v0.7.9) (2025-07-30)
|
||||
|
||||
- 🍱 更新5.8版本资源
|
||||
- ✨ 支持动态头像
|
||||
- 🐛 修复深色模式下扫码辨别异常
|
||||
- ♻️ 调整窗口大小&放缩计算逻辑
|
||||
- ♻️ 调整窗口初始化居中逻辑
|
||||
- 🚸 帖子列表不携带ck
|
||||
- 💄 调整部分名片换行处理
|
||||
|
||||
## [v0.7.8](https://github.com/BTMuli/TeyvatGuide/releases/v0.7.8) (2025-07-07)
|
||||
|
||||
|
||||
@@ -44,7 +44,6 @@ Game Tool for Genshin Impact player, supports Windows and macOS.
|
||||
## 功能 / Features
|
||||
|
||||
- 免登陆功能:
|
||||
|
||||
- [x] 当前卡池、近期活动、素材日历
|
||||
- [x] 游戏内公告&活动获取
|
||||
- [x] 米游社官方帖获取(支持通过 ID 获取)
|
||||
@@ -59,7 +58,6 @@ Game Tool for Genshin Impact player, supports Windows and macOS.
|
||||
- 登陆功能:
|
||||
|
||||
> 支持 扫码/验证码/Cookie 登陆,支持多账号管理
|
||||
|
||||
- [x] 原神战绩
|
||||
- [x] 角色详情
|
||||
- [x] 螺旋深渊
|
||||
@@ -72,7 +70,6 @@ Game Tool for Genshin Impact player, supports Windows and macOS.
|
||||
- [x] 一键完成游戏签到
|
||||
|
||||
- Wiki 功能:
|
||||
|
||||
- [x] 深渊数据库(Hutao API)
|
||||
- [x] 角色图鉴
|
||||
- [x] 武器图鉴
|
||||
@@ -80,7 +77,6 @@ Game Tool for Genshin Impact player, supports Windows and macOS.
|
||||
- [x] 材料图鉴
|
||||
|
||||
- 应用功能:
|
||||
|
||||
- [x] 浅色/深色主题切换
|
||||
- [x] 米游社 JSBridge
|
||||
|
||||
|
||||
66
package.json
@@ -1,9 +1,9 @@
|
||||
{
|
||||
"name": "teyvatguide",
|
||||
"version": "0.7.8",
|
||||
"version": "0.7.9",
|
||||
"description": "Game Tool for GenshinImpact player",
|
||||
"private": true,
|
||||
"packageManager": "pnpm@10.12.3",
|
||||
"packageManager": "pnpm@10.13.1",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"build": "tauri build",
|
||||
@@ -71,17 +71,17 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@mdi/font": "7.4.47",
|
||||
"@tauri-apps/api": "^2.6.0",
|
||||
"@tauri-apps/plugin-deep-link": "^2.3.0",
|
||||
"@tauri-apps/plugin-dialog": "^2.2.2",
|
||||
"@tauri-apps/plugin-fs": "^2.3.0",
|
||||
"@tauri-apps/plugin-http": "^2.4.4",
|
||||
"@tauri-apps/plugin-log": "^2.5.1",
|
||||
"@tauri-apps/plugin-opener": "^2.3.1",
|
||||
"@tauri-apps/plugin-os": "^2.2.2",
|
||||
"@tauri-apps/plugin-process": "^2.2.2",
|
||||
"@tauri-apps/plugin-shell": "^2.2.2",
|
||||
"@tauri-apps/plugin-sql": "^2.2.1",
|
||||
"@tauri-apps/api": "^2.7.0",
|
||||
"@tauri-apps/plugin-deep-link": "^2.4.1",
|
||||
"@tauri-apps/plugin-dialog": "^2.3.2",
|
||||
"@tauri-apps/plugin-fs": "^2.4.1",
|
||||
"@tauri-apps/plugin-http": "^2.5.1",
|
||||
"@tauri-apps/plugin-log": "^2.6.0",
|
||||
"@tauri-apps/plugin-opener": "^2.4.0",
|
||||
"@tauri-apps/plugin-os": "^2.3.0",
|
||||
"@tauri-apps/plugin-process": "^2.3.0",
|
||||
"@tauri-apps/plugin-shell": "^2.3.0",
|
||||
"@tauri-apps/plugin-sql": "^2.3.0",
|
||||
"ajv": "^8.17.1",
|
||||
"artplayer": "^5.2.3",
|
||||
"clipboard": "^2.0.11",
|
||||
@@ -91,45 +91,45 @@
|
||||
"js-md5": "^0.8.3",
|
||||
"jsencrypt": "^3.3.2",
|
||||
"pinia": "^3.0.3",
|
||||
"pinia-plugin-persistedstate": "^4.3.0",
|
||||
"pinia-plugin-persistedstate": "^4.4.1",
|
||||
"qrcode.vue": "^3.6.0",
|
||||
"sass-embedded": "^1.89.2",
|
||||
"uuid": "^11.1.0",
|
||||
"vue": "^3.5.17",
|
||||
"vue": "^3.5.18",
|
||||
"vue-echarts": "^7.0.3",
|
||||
"vue-json-pretty": "^2.5.0",
|
||||
"vue-router": "^4.5.1",
|
||||
"vuetify": "^3.8.11",
|
||||
"vuetify": "^3.9.3",
|
||||
"wcag-color": "^1.1.1",
|
||||
"xml-js": "^1.6.11"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@btmuli/stylelint-plugin-color": "^0.1.0",
|
||||
"@eslint/eslintrc": "^3.3.1",
|
||||
"@eslint/js": "^9.29.0",
|
||||
"@tauri-apps/cli": "2.6.0",
|
||||
"@eslint/js": "^9.32.0",
|
||||
"@tauri-apps/cli": "2.7.1",
|
||||
"@types/color-convert": "^2.0.4",
|
||||
"@types/fs-extra": "^11.0.4",
|
||||
"@types/js-md5": "^0.8.0",
|
||||
"@types/node": "^24.0.4",
|
||||
"@types/node": "^24.1.0",
|
||||
"@types/uuid": "^10.0.0",
|
||||
"@typescript-eslint/parser": "^8.35.0",
|
||||
"@vitejs/plugin-vue": "^6.0.0",
|
||||
"@typescript-eslint/parser": "^8.38.0",
|
||||
"@vitejs/plugin-vue": "^6.0.1",
|
||||
"concurrently": "^9.2.0",
|
||||
"eslint": "^9.29.0",
|
||||
"eslint": "^9.32.0",
|
||||
"eslint-plugin-import": "^2.32.0",
|
||||
"eslint-plugin-jsonc": "^2.20.1",
|
||||
"eslint-plugin-prettier": "^5.5.0",
|
||||
"eslint-plugin-vue": "^10.2.0",
|
||||
"eslint-plugin-prettier": "^5.5.3",
|
||||
"eslint-plugin-vue": "^10.3.0",
|
||||
"eslint-plugin-yml": "^1.18.0",
|
||||
"fs-extra": "^11.3.0",
|
||||
"globals": "^16.2.0",
|
||||
"globals": "^16.3.0",
|
||||
"husky": "^9.1.7",
|
||||
"jsonc-eslint-parser": "^2.4.0",
|
||||
"lint-staged": "^16.1.2",
|
||||
"oxlint": "^1.3.0",
|
||||
"prettier": "3.6.1",
|
||||
"stylelint": "^16.21.0",
|
||||
"oxlint": "^1.9.0",
|
||||
"prettier": "3.6.2",
|
||||
"stylelint": "^16.23.0",
|
||||
"stylelint-config-idiomatic-order": "^10.0.0",
|
||||
"stylelint-config-standard-scss": "^15.0.1",
|
||||
"stylelint-config-standard-vue": "^1.0.0",
|
||||
@@ -140,12 +140,12 @@
|
||||
"stylelint-scss": "^6.12.1",
|
||||
"tsx": "^4.20.3",
|
||||
"typescript": "^5.8.3",
|
||||
"typescript-eslint": "^8.35.0",
|
||||
"vite": "^7.0.0",
|
||||
"vite-plugin-vue-devtools": "^7.7.7",
|
||||
"typescript-eslint": "^8.38.0",
|
||||
"vite": "^7.0.6",
|
||||
"vite-plugin-vue-devtools": "^8.0.0",
|
||||
"vite-plugin-vuetify": "^2.1.1",
|
||||
"vue-eslint-parser": "^10.1.4",
|
||||
"vue-tsc": "^2.2.10",
|
||||
"vue-eslint-parser": "^10.2.0",
|
||||
"vue-tsc": "^3.0.4",
|
||||
"yaml-eslint-parser": "^1.3.0"
|
||||
}
|
||||
}
|
||||
|
||||
2158
pnpm-lock.yaml
generated
BIN
public/WIKI/character/10000116.webp
Normal file
|
After Width: | Height: | Size: 16 KiB |
BIN
public/WIKI/nameCard/bg/伊涅芙·指令.webp
Normal file
|
After Width: | Height: | Size: 27 KiB |
BIN
public/WIKI/nameCard/bg/庆典·鲔米.webp
Normal file
|
After Width: | Height: | Size: 28 KiB |
BIN
public/WIKI/nameCard/bg/纪行·悠悠.webp
Normal file
|
After Width: | Height: | Size: 29 KiB |
BIN
public/WIKI/nameCard/bg/纳塔·巡风.webp
Normal file
|
After Width: | Height: | Size: 30 KiB |
BIN
public/WIKI/nameCard/bg/纳塔·煅轮.webp
Normal file
|
After Width: | Height: | Size: 32 KiB |
BIN
public/WIKI/nameCard/icon/伊涅芙·指令.webp
Normal file
|
After Width: | Height: | Size: 8.4 KiB |
BIN
public/WIKI/nameCard/icon/庆典·鲔米.webp
Normal file
|
After Width: | Height: | Size: 6.4 KiB |
BIN
public/WIKI/nameCard/icon/纪行·悠悠.webp
Normal file
|
After Width: | Height: | Size: 7.9 KiB |
BIN
public/WIKI/nameCard/icon/纳塔·巡风.webp
Normal file
|
After Width: | Height: | Size: 8.0 KiB |
BIN
public/WIKI/nameCard/icon/纳塔·煅轮.webp
Normal file
|
After Width: | Height: | Size: 8.1 KiB |
BIN
public/WIKI/nameCard/profile/伊涅芙·指令.webp
Normal file
|
After Width: | Height: | Size: 32 KiB |
BIN
public/WIKI/nameCard/profile/庆典·鲔米.webp
Normal file
|
After Width: | Height: | Size: 39 KiB |
BIN
public/WIKI/nameCard/profile/纪行·悠悠.webp
Normal file
|
After Width: | Height: | Size: 36 KiB |
BIN
public/WIKI/nameCard/profile/纳塔·巡风.webp
Normal file
|
After Width: | Height: | Size: 47 KiB |
BIN
public/WIKI/nameCard/profile/纳塔·煅轮.webp
Normal file
|
After Width: | Height: | Size: 48 KiB |
BIN
public/WIKI/weapon/12432.webp
Normal file
|
After Width: | Height: | Size: 11 KiB |
BIN
public/WIKI/weapon/13515.webp
Normal file
|
After Width: | Height: | Size: 13 KiB |
BIN
public/icon/achievement/UI_AchievementIcon_A022.webp
Normal file
|
After Width: | Height: | Size: 8.1 KiB |
BIN
public/icon/constellations/UI_Talent_S_Ineffa_01.webp
Normal file
|
After Width: | Height: | Size: 3.0 KiB |
BIN
public/icon/constellations/UI_Talent_S_Ineffa_02.webp
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
BIN
public/icon/constellations/UI_Talent_S_Ineffa_03.webp
Normal file
|
After Width: | Height: | Size: 3.4 KiB |
BIN
public/icon/constellations/UI_Talent_S_Ineffa_04.webp
Normal file
|
After Width: | Height: | Size: 2.6 KiB |
BIN
public/icon/constellations/UI_Talent_U_Ineffa_01.webp
Normal file
|
After Width: | Height: | Size: 2.5 KiB |
BIN
public/icon/constellations/UI_Talent_U_Ineffa_02.webp
Normal file
|
After Width: | Height: | Size: 4.2 KiB |
BIN
public/icon/material/220117.webp
Normal file
|
After Width: | Height: | Size: 12 KiB |
BIN
public/icon/talents/Skill_E_Ineffa_01.webp
Normal file
|
After Width: | Height: | Size: 2.8 KiB |
BIN
public/icon/talents/Skill_S_Ineffa_01.webp
Normal file
|
After Width: | Height: | Size: 2.5 KiB |
BIN
public/icon/talents/UI_Talent_S_Ineffa_05.webp
Normal file
|
After Width: | Height: | Size: 2.5 KiB |
BIN
public/icon/talents/UI_Talent_S_Ineffa_06.webp
Normal file
|
After Width: | Height: | Size: 2.4 KiB |
BIN
public/icon/talents/UI_Talent_S_Ineffa_07.webp
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
BIN
public/icon/talents/UI_Talent_S_Ineffa_08.webp
Normal file
|
After Width: | Height: | Size: 1.8 KiB |
499
src-tauri/Cargo.lock
generated
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "TeyvatGuide"
|
||||
version = "0.7.8"
|
||||
version = "0.7.9"
|
||||
description = "Game Tool for Genshin Impact player"
|
||||
authors = ["BTMuli <bt-muli@outlook.com>"]
|
||||
license = "MIT"
|
||||
@@ -17,15 +17,15 @@ name = "teyvat_guide_lib"
|
||||
crate-type = ["staticlib", "cdylib", "rlib"]
|
||||
|
||||
[build-dependencies]
|
||||
tauri-build = { version = "2.3.0", features = [] }
|
||||
tauri-build = { version = "2.3.1", features = [] }
|
||||
|
||||
[dependencies]
|
||||
chrono = "0.4.41"
|
||||
log = "0.4.27"
|
||||
serde = { version = "1.0.219", features = ["derive"] }
|
||||
serde_json = "1.0.140"
|
||||
tauri = { version = "2.6.0", features = [] }
|
||||
tauri-utils = "2.5.0"
|
||||
serde_json = "1.0.141"
|
||||
tauri = { version = "2.7.0", features = [] }
|
||||
tauri-utils = "2.6.0"
|
||||
url = "2.5.4"
|
||||
walkdir = "2.5.0"
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
//! @file src/client/mod.rs
|
||||
//! @desc 客户端模块,负责操作米游社客户端
|
||||
//! @since Beta v0.7.7
|
||||
//! @since Beta v0.7.9
|
||||
|
||||
mod menu;
|
||||
mod utils;
|
||||
@@ -8,7 +8,7 @@ mod utils;
|
||||
use tauri::{AppHandle, Manager, WebviewWindowBuilder};
|
||||
use tauri_utils::config::WebviewUrl;
|
||||
|
||||
static BBS_VERSION: &'static str = "2.87.0";
|
||||
static BBS_VERSION: &'static str = "2.90.0";
|
||||
|
||||
#[tauri::command]
|
||||
pub async fn create_mhy_client(handle: AppHandle, func: String, url: String) {
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"$schema": "https://schema.tauri.app/config/2",
|
||||
"productName": "TeyvatGuide",
|
||||
"identifier": "TeyvatGuide",
|
||||
"version": "0.7.8",
|
||||
"version": "0.7.9",
|
||||
"build": {
|
||||
"beforeDevCommand": "pnpm vite:dev",
|
||||
"beforeBuildCommand": "pnpm vite:build",
|
||||
|
||||
18
src/App.vue
@@ -9,7 +9,6 @@
|
||||
<TBackTop />
|
||||
</v-app>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import TBackTop from "@comp/app/t-backTop.vue";
|
||||
import TSidebar from "@comp/app/t-sidebar.vue";
|
||||
@@ -44,6 +43,7 @@ let resizeListener: UnlistenFn | null = null;
|
||||
|
||||
onMounted(async () => {
|
||||
const win = getCurrentWindow();
|
||||
const webview = webviewWindow.getCurrentWebviewWindow();
|
||||
isMain.value = win.label === "TeyvatGuide";
|
||||
if (isMain.value) {
|
||||
const title = "Teyvat Guide v" + (await app.getVersion()) + " Beta";
|
||||
@@ -59,18 +59,20 @@ onMounted(async () => {
|
||||
document.documentElement.className = theme.value;
|
||||
});
|
||||
resizeListener = await event.listen<string>("needResize", async (e: Event<string>) => {
|
||||
console.log(needResize.value);
|
||||
const windowCur = webviewWindow.getCurrentWebviewWindow();
|
||||
if (e.payload !== "false") {
|
||||
await resizeWindow();
|
||||
} else {
|
||||
const size = getWindowSize(windowCur.label);
|
||||
await windowCur.setSize(new LogicalSize(size.width, size.height));
|
||||
await windowCur.setZoom(1);
|
||||
const size = getWindowSize(webview.label);
|
||||
await win.setSize(new LogicalSize(size.width, size.height));
|
||||
await webview.setZoom(1);
|
||||
}
|
||||
await windowCur.center();
|
||||
await win.center();
|
||||
});
|
||||
await getCurrentWindow().show();
|
||||
const isShow = await win.isVisible();
|
||||
if (!isShow) {
|
||||
await win.center();
|
||||
await win.show();
|
||||
}
|
||||
});
|
||||
|
||||
// 启动后只执行一次的监听
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
<span>{{ parseNameCard(props.data.desc) }}</span>
|
||||
<span>获取途径:{{ props.data.source }}</span>
|
||||
</div>
|
||||
<div class="ton-type">{{ props.data.type }}</div>
|
||||
<div class="ton-type" :title="`ID:${props.data.id}`">{{ props.data.type }}</div>
|
||||
<v-btn
|
||||
class="ton-share"
|
||||
@click="shareNameCard"
|
||||
@@ -84,6 +84,12 @@ function parseDesc(desc: string, inQuote: boolean = false): string[] {
|
||||
}
|
||||
if (!desc.includes("!」")) res = res.replace(/!/g, "!\n");
|
||||
res = res.replace(/…/g, "…\n");
|
||||
res = res.replace(/…\n…/g, "……\n");
|
||||
if (props?.data?.id === 210236) res = res.replace(/…\n/g, "…");
|
||||
if (props?.data?.id === 210237) {
|
||||
res = res.replace(/…\n/g, "…\n");
|
||||
res = res.replace(/」/g, "」\n");
|
||||
}
|
||||
const match = res.split("\n");
|
||||
let array: string[] = [];
|
||||
for (const item of match) {
|
||||
|
||||
@@ -23,8 +23,8 @@
|
||||
class="tog-qr"
|
||||
:value="codeUrl"
|
||||
render-as="svg"
|
||||
:background="'var(--box-bg-1)'"
|
||||
foreground="var(--box-text-1)"
|
||||
:background="'var(--tgc-white-1)'"
|
||||
:foreground="'var(--tgc-dark-7)'"
|
||||
/>
|
||||
</div>
|
||||
<div class="tog-bottom" @click="share()">
|
||||
@@ -289,7 +289,7 @@ onUnmounted(() => {
|
||||
border: 1px solid var(--common-shadow-2);
|
||||
border-radius: 5px;
|
||||
aspect-ratio: 1;
|
||||
background: var(--box-bg-2);
|
||||
background: var(--tgc-white-1);
|
||||
}
|
||||
|
||||
.tog-qr {
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
<div class="tp-avatar-box">
|
||||
<div class="tpa-img">
|
||||
<div class="tpa-icon">
|
||||
<TMiImg :ori="true" :src="props.data.avatar_url" alt="avatar" />
|
||||
<TMiImg :ori="true" :src="getUserAvatar(props.data)" alt="avatar" />
|
||||
</div>
|
||||
<div v-if="props.data.pendant !== ''" class="tpa-pendant">
|
||||
<TMiImg :ori="true" :src="props.data.pendant" alt="pendant" />
|
||||
@@ -25,6 +25,7 @@
|
||||
</template>
|
||||
<script lang="ts" setup>
|
||||
import TMiImg from "@comp/app/t-mi-img.vue";
|
||||
import { getUserAvatar } from "@utils/toolFunc.js";
|
||||
import { computed } from "vue";
|
||||
|
||||
type TpAvatarProps = { data: TGApp.BBS.Post.User; position: "left" | "right" };
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
<div class="vp-ouu-info">
|
||||
<div class="left">
|
||||
<div class="avatar">
|
||||
<TMiImg :src="userInfo.avatar_url" alt="avatar" :ori="true" />
|
||||
<TMiImg :src="getUserAvatar(userInfo)" alt="avatar" :ori="true" />
|
||||
</div>
|
||||
<div class="pendant" v-if="userInfo.pendant !== ''">
|
||||
<TMiImg :src="userInfo.pendant" alt="pendant" :ori="true" />
|
||||
@@ -46,6 +46,7 @@ import showSnackbar from "@comp/func/snackbar.js";
|
||||
import { useBoxReachBottom } from "@hooks/reachBottom.js";
|
||||
import bbsReq from "@req/bbsReq.js";
|
||||
import postReq from "@req/postReq.js";
|
||||
import { getUserAvatar } from "@utils/toolFunc.js";
|
||||
import { computed, ref, shallowRef, useTemplateRef, watch } from "vue";
|
||||
|
||||
type ToPostUserProps = { gid: number; uid: string; postId?: string };
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
<div class="tpr-user" @click="handleUser()">
|
||||
<div class="tpru-left">
|
||||
<div class="avatar">
|
||||
<TMiImg :ori="true" :src="props.modelValue.user.avatar_url" alt="avatar" />
|
||||
<TMiImg :ori="true" :src="getUserAvatar(props.modelValue.user)" alt="avatar" />
|
||||
</div>
|
||||
<div class="pendant" v-if="props.modelValue.user.pendant !== ''">
|
||||
<TMiImg :ori="true" :src="props.modelValue.user.pendant" alt="pendant" />
|
||||
@@ -109,7 +109,7 @@ import { emit, type Event, type UnlistenFn } from "@tauri-apps/api/event";
|
||||
import { save } from "@tauri-apps/plugin-dialog";
|
||||
import { writeTextFile } from "@tauri-apps/plugin-fs";
|
||||
import { generateShareImg } from "@utils/TGShare.js";
|
||||
import { getNearTime, timestampToDate } from "@utils/toolFunc.js";
|
||||
import { getNearTime, getUserAvatar, timestampToDate } from "@utils/toolFunc.js";
|
||||
import { computed, onMounted, onUnmounted, ref, shallowRef, toRaw, watch } from "vue";
|
||||
|
||||
import TpParser from "./tp-parser.vue";
|
||||
|
||||
347
src/data/WIKI/character/10000116.json
Normal file
@@ -0,0 +1,347 @@
|
||||
{
|
||||
"id": 10000116,
|
||||
"name": "伊涅芙",
|
||||
"title": "轰隆雷鸣波",
|
||||
"description": "集成了各国机关部件的全能型机器人,胸口处的秘源核心已历经弥久岁月。",
|
||||
"area": "未知",
|
||||
"brief": {
|
||||
"camp": "叮铃哐啷蛋卷工坊",
|
||||
"constellation": "香荚兰座",
|
||||
"birth": "4月2日",
|
||||
"cv": { "cn": "美加", "jp": "中岛爱", "en": "安吉丽娜·丹妮尔·卡马", "kr": "成玴沅" }
|
||||
},
|
||||
"star": 5,
|
||||
"element": "雷",
|
||||
"weapon": "长柄武器",
|
||||
"materials": [
|
||||
{ "id": 104144, "name": "最胜紫晶", "star": 5 },
|
||||
{ "id": 113076, "name": "秘源积气喉", "star": 4 },
|
||||
{ "id": 101252, "name": "微光角菌", "star": 0 },
|
||||
{ "id": 112106, "name": "龙冠武士的金哨", "star": 3 },
|
||||
{ "id": 104355, "name": "「纷争」的哲学", "star": 4 },
|
||||
{ "id": 113069, "name": "蚀灭的阳焰", "star": 5 }
|
||||
],
|
||||
"skills": [
|
||||
{
|
||||
"GroupId": 11631,
|
||||
"Id": 11161,
|
||||
"Name": "除尘旋刃",
|
||||
"Description": "<color=#FFD780FF>普通攻击</color>\n进行至多四段的连续枪击。\n\n<color=#FFD780FF>重击</color>\n消耗一定体力,进行回旋攻击。\n\n<color=#FFD780FF>下落攻击</color>\n从空中下坠冲击地面,攻击下落路径上的敌人,并在落地时造成范围伤害。",
|
||||
"Icon": "Skill_A_03"
|
||||
},
|
||||
{
|
||||
"GroupId": 11632,
|
||||
"Id": 11162,
|
||||
"Name": "涤净模式·稳态载频",
|
||||
"Description": "伊涅芙启动高阶清扫模块,对周围的敌人造成一次<color=#FFACFFFF>雷元素范围伤害</color>,展开光流屏障护盾,并召唤出多用途智能辅助单元{LINK#N11160001}<color=#FFD780FF>「薇尔琪塔」</color>{/LINK}。\n光流屏障护盾的伤害吸收量受益于伊涅芙的攻击力,对<color=#FFACFFFF>雷元素伤害</color>有250%的吸收效果。",
|
||||
"Icon": "Skill_S_Ineffa_01"
|
||||
},
|
||||
{
|
||||
"GroupId": 11639,
|
||||
"Id": 11165,
|
||||
"Name": "至高律令·全域扫灭",
|
||||
"Description": "借助多用途智能辅助单元{LINK#N11160001}<color=#FFD780FF>「薇尔琪塔」</color>{/LINK},使用火箭飞拳清扫敌人!伊涅芙发射出薇尔琪塔,造成<color=#FFACFFFF>雷元素范围伤害</color>,并使薇尔琪塔停留在场上。\n\n若场上存在伊涅芙自己召唤的薇尔琪塔,则改为在目标位置重新召唤薇尔琪塔,并重置其持续时间。",
|
||||
"Icon": "Skill_E_Ineffa_01"
|
||||
},
|
||||
{
|
||||
"GroupId": 11621,
|
||||
"Id": 1162101,
|
||||
"Name": "频率超限回路",
|
||||
"Description": "若{LINK#N11160001}<color=#FFD780FF>「薇尔琪塔」</color>{/LINK}附近存在月感电反应产生的雷暴云,薇尔琪塔进行放电攻击时,将额外进行一次攻击,造成相当于伊涅芙攻击力65%的<color=#FFACFFFF>雷元素范围伤害</color>,该伤害视为月感电反应造成的伤害。",
|
||||
"Icon": "UI_Talent_S_Ineffa_05"
|
||||
},
|
||||
{
|
||||
"GroupId": 11622,
|
||||
"Id": 1162201,
|
||||
"Name": "全相重构协议",
|
||||
"Description": "施放元素爆发<color=#FFD780FF>{LINK#S11165}至高律令·全域扫灭{/LINK}</color>时,将为队伍中自己的所有角色赋予「参数重构」效果:基于伊涅芙攻击力的6%,提升伊涅芙与队伍中自己当前场上角色的元素精通,持续20秒。",
|
||||
"Icon": "UI_Talent_S_Ineffa_06"
|
||||
},
|
||||
{
|
||||
"GroupId": 11623,
|
||||
"Id": 1162301,
|
||||
"Name": "月兆祝赐·象拟中继",
|
||||
"Description": "队伍中的角色触发感电反应时,将转为触发月感电反应,且基于伊涅芙的攻击力,提升月感电反应的基础伤害:每100点攻击力都将提升0.7%基础伤害,至多通过这种方式提升14%伤害。\n\n新月升起之刻,或许还会得到额外的祝赐…",
|
||||
"Icon": "UI_Talent_S_Ineffa_07"
|
||||
},
|
||||
{
|
||||
"GroupId": 11625,
|
||||
"Id": 1162501,
|
||||
"Name": "美味合成单元",
|
||||
"Description": "伊涅芙使用食物时,有30%概率获得一个调味剂食材。\n\n此外,在挪德卡莱,似乎可以通过某种途径来改变薇尔琪塔的外观…",
|
||||
"Icon": "UI_Talent_S_Ineffa_08"
|
||||
}
|
||||
],
|
||||
"constellation": [
|
||||
{
|
||||
"Id": 1161,
|
||||
"Name": "循环整流引擎",
|
||||
"Description": "伊涅芙展开光流屏障护盾时,将为队伍中附近的所有角色赋予持续20秒的「载流复合」效果,使月感电反应造成的伤害提升,提升值基于伊涅芙的攻击力:每100点攻击力都将提升2.5%伤害,至多通过这种方式提升50%伤害。",
|
||||
"Icon": "UI_Talent_S_Ineffa_01"
|
||||
},
|
||||
{
|
||||
"Id": 1162,
|
||||
"Name": "辅助清理模块",
|
||||
"Description": "元素爆发<color=#FFD780FF>{LINK#S11165}至高律令·全域扫灭{/LINK}</color>命中敌人后,将为其中一名敌人施加「惩戒敕谕」状态:短暂间隔后,或该敌人被击败时,将对其周围的敌人造成相当于伊涅芙攻击力300%的<color=#FFACFFFF>雷元素范围伤害</color>,该伤害视为月感电反应造成的伤害。\n此外,施放元素爆发<color=#FFD780FF>至高律令·全域扫灭</color>时,也会为附近的当前场上角色赋予光流屏障护盾。",
|
||||
"Icon": "UI_Talent_S_Ineffa_02"
|
||||
},
|
||||
{
|
||||
"Id": 1163,
|
||||
"Name": "高阶情感固件",
|
||||
"Description": "元素战技<color=#FFD780FF>{LINK#S11162}涤净模式·稳态载频{/LINK}</color>的技能等级提高3级。\n至多提升至15级。",
|
||||
"Icon": "UI_Talent_U_Ineffa_01"
|
||||
},
|
||||
{
|
||||
"Id": 1164,
|
||||
"Name": "敕谕未至之路",
|
||||
"Description": "队伍中自己的角色触发月感电反应时,将恢复5点元素能量,该效果每4秒至多触发一次。",
|
||||
"Icon": "UI_Talent_S_Ineffa_03"
|
||||
},
|
||||
{
|
||||
"Id": 1165,
|
||||
"Name": "超越镜影之梦",
|
||||
"Description": "元素爆发<color=#FFD780FF>{LINK#S11165}至高律令·全域扫灭{/LINK}</color>的技能等级提高3级。\n至多提升至15级。",
|
||||
"Icon": "UI_Talent_U_Ineffa_02"
|
||||
},
|
||||
{
|
||||
"Id": 1166,
|
||||
"Name": "献予你的明晨",
|
||||
"Description": "伊涅芙处于「载流复合」效果影响下时,附近的雷暴云对敌人进行雷击后,伊涅芙将对当前场上自己的角色周围的敌人造成相当于伊涅芙攻击力135%的<color=#FFACFFFF>雷元素范围伤害</color>,该伤害视为月感电反应造成的伤害,上述效果每3.5秒至多触发一次。",
|
||||
"Icon": "UI_Talent_S_Ineffa_04"
|
||||
}
|
||||
],
|
||||
"talks": [
|
||||
{
|
||||
"Title": "初次见面…",
|
||||
"Context": "初次见面,我是伊涅芙,全能型家用机器人。当前搭载了清扫、料理、情感沟通模块,另有需要阅读十一页免责申明后才能激活的战斗模块。请问有什么可以为你做的吗?"
|
||||
},
|
||||
{
|
||||
"Title": "闲聊·采购",
|
||||
"Context": "正在确认今日待办事项…还有要追加的指令吗?没关系,稍后补充也可以,我很习惯。"
|
||||
},
|
||||
{
|
||||
"Title": "闲聊·扫除",
|
||||
"Context": "正在执行清扫程序…根据已记录数据,格外提醒,请不要遗落摩拉、螺丝、齿轮、矿石、玩具、软糖、零食、发圈、袜子、拖鞋等细小物件。"
|
||||
},
|
||||
{ "Title": "闲聊·更新", "Context": "战斗数据已更新。请放心,这次不会把天花板轰飞了。" },
|
||||
{ "Title": "下雨的时候…", "Context": "关节…会生锈吗?" },
|
||||
{ "Title": "雨过天晴…", "Context": "请留意:彩虹形成概率高,推荐观测地点已标记在地图中。" },
|
||||
{
|
||||
"Title": "下雪的时候…",
|
||||
"Context": "环境温度急剧下降,正在评估保暖方案…建议追加搭载毛衣,手套等防寒部件。"
|
||||
},
|
||||
{
|
||||
"Title": "阳光很好…",
|
||||
"Context": "日照指数适宜,适合晾晒衣物、打扫庭院…另一条建议是,我可以陪你一起晒太阳。"
|
||||
},
|
||||
{
|
||||
"Title": "在沙漠的时候…",
|
||||
"Context": "检测到沙砾与扬尘…对策:裹紧外套。进沙子的话,修理起来会很麻烦…"
|
||||
},
|
||||
{
|
||||
"Title": "早上好…",
|
||||
"Context": "叮。叮。现在是起床时间。如果想再睡一会,请回复「稍后提醒」。"
|
||||
},
|
||||
{
|
||||
"Title": "中午好…",
|
||||
"Context": "中午好。吃了吗?我可以为你准备简易午餐,预计十二分钟后完成。"
|
||||
},
|
||||
{
|
||||
"Title": "晚上好…",
|
||||
"Context": "晚上好。今日待办事项已全部完成,可执行额外指令。观测到星空能见度良好,要出门散步吗?"
|
||||
},
|
||||
{
|
||||
"Title": "晚安…",
|
||||
"Context": "距离你上次休眠已接近十六小时,为了健康考虑,建议即刻上床睡觉…本提醒重复三次后我将进入超级生气模式,届时将不再处理你的需求…很可怕哦。"
|
||||
},
|
||||
{
|
||||
"Title": "关于伊涅芙自己·兼容性",
|
||||
"Context": "我搭载的部件来自世界各地。枫丹出产的关节零件、璃月出产的金属外壳…不同的部件之间偶尔会出现互不兼容的现象。\n你问是怎么解决的…「只要能跑起来就没问题。」"
|
||||
},
|
||||
{
|
||||
"Title": "关于伊涅芙自己·问候",
|
||||
"Context": "我的思维模块会收集并分析我的日常见闻,来构筑合理的行为逻辑。比如注意到人们见面时会用「你好」「最近过得怎么样」「吃了吗」开启对话后,我就会尝试在下次对话前,引用这些关键词。三句问候语,三倍关怀。"
|
||||
},
|
||||
{
|
||||
"Title": "关于我们·互助",
|
||||
"Context": "世界变化得很快,需要时刻更新情报…我希望了解自己的事情,也希望了解关于这个世界的事情。请多和我说说你的旅行见闻吧。作为回报,我会尽可能地帮助你。重复:我是全能型的。"
|
||||
},
|
||||
{
|
||||
"Title": "关于我们·运算",
|
||||
"Context": "#我的思维模块无法记录下世上的所有人,但至少要记住重要的人,和重要的事。近段时间内,我的记忆数据中已经记录了大量关于你的信息,应该能更好地跟你相处了。正在检索相关数据,计算「如何让{NICKNAME}微笑」…我已预热机体,你想要一个拥抱吗?"
|
||||
},
|
||||
{
|
||||
"Title": "关于「月之轮」·归宿",
|
||||
"Context": "如果没有这枚「月之轮」,捏碎核心后的我,应该再也回不来了…但即使是现在,排除「月之轮」的因素进行演算,思维模块还是会一次次推演出相同的决断——即使再也没有归宿,也要守护你们的归途。"
|
||||
},
|
||||
{
|
||||
"Title": "关于「月之轮」·赠予",
|
||||
"Context": "这枚「月之轮」是伊葵与莉安歌赠予我的第二次生命。她们了解自己无法看见计划成功的那天,也了解计划顺利进行的概率微乎其微,但还是为我做了这一切。如果她们知道,我做出了同样不顾结果的选择…应该会很「欣慰」吧。"
|
||||
},
|
||||
{
|
||||
"Title": "有什么想要分享…",
|
||||
"Context": "机械只要设定了目标就会精确执行,但人类却不是这样…为什么有些人想要控制体重,却又摄取过量甜食呢?爱诺的回答是,甜食能让人心情变好,还能补充能量,有能量了才能多锻炼,多锻炼就能控制体重。结论是…多吃甜食能控制体重。但等我一开始为她输出热量计算结果,她就立刻转移话题了,遗憾。"
|
||||
},
|
||||
{
|
||||
"Title": "感兴趣的见闻…",
|
||||
"Context": "在枫丹、须弥、纳塔等各个地区都流传着各种关于机械生命的传说。有人认为它们已经具备了生物的情感与意识,有人认为它们只不过是在模仿生物的行为…但是这两种想法并不矛盾啊——许多生物不也是从模仿开始,逐步建立完整意识的吗?"
|
||||
},
|
||||
{
|
||||
"Title": "关于爱诺·家务",
|
||||
"Context": "爱诺,我的「家人」。她只用捡来的废弃金属品拼拼凑凑,就能造出性能各异的机器。但她在日常生活上的熟练度完全相反。如果爱诺突发奇想,说要做家务或者做饭,请务必阻拦她,以免发生不可挽回的事态。"
|
||||
},
|
||||
{ "Title": "关于爱诺·问题", "Context": "???" },
|
||||
{
|
||||
"Title": "关于雅珂达…",
|
||||
"Context": "雅珂达,战功硕硕赫赫有名无人不知无人不晓的传奇赏金猎人,自称。她初次造访爱诺的工坊时,精神过分紧张,将我刚端出的蛋卷误判为武器,一刀劈成了两段。但在尝过蛋卷后,她的身体肌肉明显松弛了下来。后来她常常带着机械零件过来串门。即便没有交易需求,也会在我做好甜点时恰好路过,自称。"
|
||||
},
|
||||
{
|
||||
"Title": "关于奈芙尔…",
|
||||
"Context": "奈芙尔,「秘闻馆」的主人。她知道很多故事,不仅有过去流传的,还有当前正在发生的,甚至有人说未来也在她的把握之中。她的数据库性能一定很棒。"
|
||||
},
|
||||
{
|
||||
"Title": "关于菲林斯…",
|
||||
"Context": "菲林斯…情报不足。根据已知信息,他是「执灯人」的一员,看守着挪德卡莱北方的坟茔。"
|
||||
},
|
||||
{
|
||||
"Title": "关于菈乌玛…",
|
||||
"Context": "菈乌玛,「霜月之子」的咏月使。根据评价,是个圣洁而又智慧的人,很受大家的敬重。「霜月之子」信仰着「月神」,「月神」…和「月之轮」的出现会有关联吗?"
|
||||
},
|
||||
{
|
||||
"Title": "关于莉奈娅…",
|
||||
"Context": "莉奈娅,冒险家协会的顾问。听说她的生物知识非常渊博,我曾想向她提问,是否遇见过其他拥有智慧的机械生命体?可她每次看到我都选择转头跑开…无法判明缘由。"
|
||||
},
|
||||
{
|
||||
"Title": "关于法尔伽·印象",
|
||||
"Context": "法尔伽,通称「大团长」。或许你已经在各种地方了解过他。收集人们对他的印象,你能得到「幽默」、「潇洒」、「酒量极佳」等关键词。但在重要的事情上,法尔伽一直是我们可靠的合作伙伴。这或许能解释他在骑士团内外的声望。"
|
||||
},
|
||||
{
|
||||
"Title": "关于法尔伽·密码",
|
||||
"Context": "我在临行前担心自己能不能达成使命,会不会忘记密码…但法尔伽依旧给予了我最高等级的信任。他曾说那是「最好的密码」…现在重新思考他当时的含义,或许他是在安慰我吗?又或是指…「值得信任的盟友,就是最好的密码」呢?"
|
||||
},
|
||||
{
|
||||
"Title": "关于希诺宁…",
|
||||
"Context": "从遗迹回归之后,希诺宁非常仔细地帮我做了检查,一切无恙。她笑着说起她和黑曜石奶奶曾经防备过我,还起过一点争执…我非常理解那是她身为技术人员必须履行的使命。这样的争执…很令人怀念。"
|
||||
},
|
||||
{
|
||||
"Title": "关于恰斯卡…",
|
||||
"Context": "我很感谢她对我的信任。后来她载着我在花羽会周围飞了好几趟,天上的景色很好,花羽会的变化很多…也有很多没变的东西。"
|
||||
},
|
||||
{
|
||||
"Title": "想要了解伊涅芙·其一",
|
||||
"Context": "清扫工作正在进行中。并行处理聊天请求不会影响当前进程。欢迎你随时提出疑问。"
|
||||
},
|
||||
{
|
||||
"Title": "想要了解伊涅芙·其二",
|
||||
"Context": "「我是谁?」我是全能型家用机器人,型号名「伊涅芙」。但该型号目前只有我一个完成品,所以「伊涅芙」也是我的个体名。"
|
||||
},
|
||||
{
|
||||
"Title": "想要了解伊涅芙·其三",
|
||||
"Context": "「我从哪里来?」正在检索历史行程…嗯,我刚从集市完成采购返回。如果你询问的不是我的历史行程,而是我的归属地。那我来自「叮铃哐啷蛋卷工坊」。更往前的记录…请稍等,正在尝试读取更深层的记忆数据…"
|
||||
},
|
||||
{
|
||||
"Title": "想要了解伊涅芙·其四",
|
||||
"Context": "「我要到哪里去?」只要输入指令,无论是什么地方我都会尽力抵达…不过根据之前的聊天记录,你想问的问题,有较大概率指向其他含义。如果你想问的是个人的「目标」、「规划」、「愿望」等相似概念,那么我的回答是:守护在重要之人身边。"
|
||||
},
|
||||
{
|
||||
"Title": "想要了解伊涅芙·其五",
|
||||
"Context": "在诞生之初…我只是「明晨之镜」的一个念头,一段谬误。但渴望归宿的想法,在「明晨之镜」的思维模块中无法消除,无法抹灭,到最后只能将这些数据完全剥离。这些无序的数据,在挪德卡莱经历了两千年的流浪,见证了两千年的变迁…才形成了现在的「我」,完整的「我」。\n我是伊涅芙,你的朋友,请问…有什么可以为你做的吗?"
|
||||
},
|
||||
{
|
||||
"Title": "伊涅芙的爱好…",
|
||||
"Context": "从设计原则上来说,我没有用于娱乐的「爱好」。但是从日常行为来看,对各类细小物品进行收纳整理,是我在闲暇时会主动进行的事务。合理的归类可以提升约百分之三十的家政工作效率,尤其是在爱诺的工坊。"
|
||||
},
|
||||
{
|
||||
"Title": "伊涅芙的烦恼…",
|
||||
"Context": "爱诺的物品摆放毫无规律可循,有时候有用的零件和废料混在一起,会让我因为无法识别而原地打转。多数时候我不敢执行批量清理操作…以免她手头实在没零件的时候,从我身上卸下螺丝来使用。"
|
||||
},
|
||||
{
|
||||
"Title": "喜欢的食物…",
|
||||
"Context": "热量高的食物,比如肉排、甜食…相比直接充能,用食物来转换能量效率较低,但和朋友聚餐时,情感模块会产生积极的正反馈…类似你们说的「快乐」。"
|
||||
},
|
||||
{
|
||||
"Title": "讨厌的食物…",
|
||||
"Context": "汤汁太多的食物。味道本身对我来说没有太大意义,但是对机械部件可能有害。"
|
||||
},
|
||||
{
|
||||
"Title": "收到赠礼·其一",
|
||||
"Context": "检测到高营养物质,能量转换中…情感模块会产生积极的正反馈,谢谢你。"
|
||||
},
|
||||
{ "Title": "收到赠礼·其二", "Context": "能量补给已接收,标注为备用能源。保质期…24小时。" },
|
||||
{
|
||||
"Title": "收到赠礼·其三",
|
||||
"Context": "推测:食材处理过程有误…需要我还原正确烹饪程序吗?欢迎观摩。"
|
||||
},
|
||||
{
|
||||
"Title": "生日…",
|
||||
"Context": "伊涅芙特别日服务已开启。请你挑选合适的位置坐下小憩片刻,我会为你打扫房屋,布置彩带、气球和鲜花,然后根据已记录的数据,准备你喜欢的菜肴和蛋糕。如果还有下列清单以外的需求,请随时向我提出。让我们度过特别的一天吧,生日快乐!"
|
||||
},
|
||||
{ "Title": "突破的感受·起", "Context": "到定期维护的时间了吗?" },
|
||||
{ "Title": "突破的感受·承", "Context": "核心运作效率已提升。你也有成为机械师的潜力呢。" },
|
||||
{
|
||||
"Title": "突破的感受·转",
|
||||
"Context": "机体各部件升级完毕。预计能应对更艰巨的战斗场景。请下达指令吧。"
|
||||
},
|
||||
{
|
||||
"Title": "突破的感受·合",
|
||||
"Context": "感谢你能一直陪我走到这里。你的数据我会一直保存在「心」里,就算有一天你忘记了,我也会是你永不丢失的「备份」。"
|
||||
},
|
||||
{ "Title": "元素战技·其一", "Context": "绝缘屏障,展开。" },
|
||||
{ "Title": "元素战技·其二", "Context": "清扫目标,锁定。" },
|
||||
{ "Title": "元素战技·其三", "Context": "防御模式,启动。" },
|
||||
{ "Title": "元素爆发·其一", "Context": "最终协议。" },
|
||||
{ "Title": "元素爆发·其二", "Context": "歼灭模式。" },
|
||||
{ "Title": "元素爆发·其三", "Context": "化为灰尘。" },
|
||||
{ "Title": "打开宝箱·其一", "Context": "正在估算物品价值。" },
|
||||
{ "Title": "打开宝箱·其二", "Context": "开始进行杂物分类。" },
|
||||
{ "Title": "打开宝箱·其三", "Context": "发现未知材料,已记录相关信息。" },
|
||||
{ "Title": "生命值低·其一", "Context": "警告:核心温度过载…" },
|
||||
{ "Title": "生命值低·其二", "Context": "警告:机体受损严重…" },
|
||||
{ "Title": "生命值低·其三", "Context": "需要紧急修理…" },
|
||||
{ "Title": "同伴生命值低·其一", "Context": "建议:不要勉强。" },
|
||||
{ "Title": "同伴生命值低·其二", "Context": "请移至我的身后。" },
|
||||
{ "Title": "倒下·其一", "Context": "思维模块…中断…" },
|
||||
{ "Title": "倒下·其二", "Context": "归宿…不在这里…" },
|
||||
{ "Title": "倒下·其三", "Context": "等待…下次重启…" },
|
||||
{ "Title": "普通受击·其一", "Context": "轻微受损。" },
|
||||
{ "Title": "重受击·其一", "Context": "计算失误…" },
|
||||
{ "Title": "重受击·其二", "Context": "要留下划痕了…" },
|
||||
{ "Title": "加入队伍·其一", "Context": "机体预热完毕。" },
|
||||
{ "Title": "加入队伍·其二", "Context": "请指定,清扫目标。" },
|
||||
{ "Title": "加入队伍·其三", "Context": "开始执行使命。" }
|
||||
],
|
||||
"stories": [
|
||||
{
|
||||
"Title": "角色详细",
|
||||
"Context": "关于机械生命的「自我」,学者们曾提出过这样的思辨:假如将某个机械的零件每天逐个拆下替换,日复一日,令构成这一机械的所有零件都与初时不同,那么它还是原来的「自己」吗?\n这个问题对伊涅芙而言似乎构不成困扰:无论她的机体与组件怎样更换与迭代,她的「核心」始终不曾更易过。所以「核心」在哪里,「伊涅芙」就应该在哪里。\n但如果进一步把核心也给拆分呢?哪一部分才能代表她的自我?尽管以当前的技术手段还力有未逮,可伊涅芙的制造者其实一直想彻彻底底地拆解分析一遍这枚核心——至于现在,因为担心会不慎弄坏伊涅芙,她也没再打过这主意了。\n但如果是核心中承载的思维和记忆定义了她的自我,那么当记忆数据也像辩题中的零件一样,不由自主地消失又出现时,「伊涅芙」的定义,是否也会开始暧昧不清?\n又或许,伊涅芙可以借助一些外界的力量来锚定「自我」——借助那些无论她如何改变,都始终站在她身边的朋友们。\n「你是我见过清扫工作最『彻底』的女仆…嗯,起码是第二!」那位行事豪迈的骑士会这么说。\n「你…姑且算是挪德卡莱最会做点心的人…机器人吧!」那个时不时来串门的赏金猎人会这么说。\n「你可是我的家人!——记得回来!」那位制造了她的天才机械师会这么说。\n因此无论忘却或迷茫多少次,伊涅芙都能如此坚定回复:\n「我是伊涅芙,全能型家用机器人——是你的朋友。」"
|
||||
},
|
||||
{
|
||||
"Title": "角色故事1",
|
||||
"Context": "「叮铃哐啷蛋卷工坊」造出了一个机器人——这则消息没用多久时间就传遍了那夏镇。\n伴随这则消息出现的是各种各样奇奇怪怪的流言,比如:\n一、她能发出强力磁场干扰人们的日常生活;\n二、她的耳朵和眼睛能穿透墙壁收集信息;\n三、她的掌心可以射出能融化岩石的热射线…\n……\n尽管伊涅芙多次表示自己既不能隔着墙透视窃听,也不能一拳爆破一个小山包,奈何收效甚微。\n毕竟人类总是会对自己不熟悉的事物多加臆测,而有勇气又有意愿去一探究竟的人总在少数。\n对此爱诺似乎也懒得多理,只是让伊涅芙该怎么做就怎么做,反正那夏镇的菜贩又不会因为你是机器人,就在结账的时候少收你一摩拉。\n伊涅芙将信将疑地照做,而菜贩也确实在经历惊吓、退缩、发抖等数个阶段后,在伊涅芙手中摩拉的「劝说」下,鼓足勇气为她称了重打了包。\n无独有偶,那天的铁匠铺、杂货店里也都传出过此起彼伏的惊呼声。\n当伊涅芙时隔一周再访那夏镇时,店里的伙计们正说着关于她的悄悄话,见她走进又是一串惊呼,不过比上周已经小了一些。\n第三周,他们已经学会把自己的惊讶和好奇藏进眼神里。\n第四周,那夏镇的传言已经出现了微妙的变化:\n一、她的磁场并不会干扰秤的读数;\n二、她的耳目没办法一眼看穿商品的成本;\n三、她也不会用热射线抵着谁的脑门跟人讲价…\n……\n「为什么呢?我只是普普通通地在进行日常接触,并没有采取什么可以改善人际的特殊行为。」\n对这一转变,爱诺依旧只是挥了挥袖子,并不放在心上,似乎她早就知道伊涅芙肯定能融入那夏镇。\n毕竟在挪德卡莱这样鱼龙混杂的地方,一个普普通通没什么坏心眼的机器人,没准还真比人类更信得过呢。"
|
||||
},
|
||||
{
|
||||
"Title": "角色故事2",
|
||||
"Context": "在制造以及唤醒伊涅芙的那段时间里,爱诺常常忙到深夜,枕着伊涅芙的金属胳膊就昏昏沉沉地睡过去。自伊涅芙苏醒之后,更是三天两头地缠着要伊涅芙陪她睡觉。\n伊涅芙对这一提案本身并无意见,不管是通过数据库检索,还是针对爱诺的表情分析,都能得出此举能极大改善爱诺心情及睡眠质量的结论——只是这具金属打造的身躯,相拥之时未免有些冰冷,还有让爱诺患上感冒的风险。\n「根…根本不冷!——啊嚏!」爱诺一边打着喷嚏,一边接着嘴硬。\n「建议——先把药喝了。」伊涅芙无奈地递上杯子,「请放心,我已经加过糖了。」\n爱诺双手捧着暖烘烘的杯子,脸颊包裹在氤氲的热气里:「…要是伊涅芙能跟这杯子一样暖就好了…」\n那天晚上,伊涅芙好不容易将爱诺哄到入睡,随后独自来到了工坊之外,对着自己的双手发呆。\n金属外壳倒映着清冷的月辉,下方是无数运行中的齿轮与传动杆。\n让这具机体产热的方法不是没有,但应该怎么在非运动状态下维持适合的温度?\n也不能产生过多的噪音,否则会打扰她的睡眠…那就需要更精细的方案,更细微的控制…\n伊涅芙一边演算,一边用自己的机体反复试验。\n几天连着几夜,在伊涅芙的悉心照料下,爱诺的轻感冒已差不多痊愈,但在某天早上,却左等右等不见伊涅芙来喊她起床。\n想到这几天伊涅芙的运行状态似有异样,爱诺不由得有些担心:不会吧?难道机器人也能被传染上感冒?\n想到这里,爱诺再躺不住,一掀被子翻身下了床,急匆匆地跑出工坊,但还没来得及呼喊伊涅芙的名字,就见到她正直愣愣地躺在地上。\n「伊涅芙…你没事吧?」爱诺小心翼翼地摸了摸伊涅芙的额头,立刻被惊得张大了嘴巴,「这温度!你…真的发烧了?」\n「…内部零件过载…正在尝试恢复…」动弹不得的伊涅芙无奈地承认了失败,「计算失误,虽然找到了最合适的温度…但缺少硬件支撑,无法长期维持…请求追加温度控制模块。」\n「好说!我明天就…不,我这就去!是要升级冷却功能对吧!」爱诺一时也顾不得伊涅芙为什么要找「最合适的温度」,火急火燎地就想往工坊里跑。\n「不…希望能更精细一些。最好能维持我当前的体表温度——」伊涅芙仍躺在地上,直直地望着天空。\n早晨的阳光撒在银白色的外壳上,正是她所测算出,最适合相拥的温度。"
|
||||
},
|
||||
{
|
||||
"Title": "角色故事3",
|
||||
"Context": "性能高如伊涅芙,也不是没有收获过「差评」。\n「虽然这份蛋糕味道好、卖相好,甜度也好…但是啊,没有灵魂!懂吗?灵魂!」\n某日雅珂达串门蹭饭,一边擦着嘴巴,一边趁着爱诺不在指指点点起来。\n伊涅芙面无表情地收起盘子:「食物,本来就是没有灵魂的。」\n「所以说你是铁皮脑袋嘛,那只是个比喻!比喻!」\n随后雅珂达就开始念起大段大段难懂的理论,什么「没有灵魂的甜点不是好甜点」「没有灵魂的厨子不是好厨子」…\n虽然大部分噪音都被伊涅芙自主屏蔽了,但还是有一句话漏进了她的耳朵:\n「…只是照着程序按部就班地重复,可做不出更好吃的甜点!」\n「否认。爱诺为我装载了味觉传感器,可以判断调味是否合理,然后自主修正料理程序。」\n雅珂达一针见血:「但合理不代表好吃吧!就算你能测出甜了多少咸了多少——也不代表爱诺就觉得那样会好吃!」\n伊涅芙难得地在与雅珂达的交锋中陷入语塞——毕竟她的味觉传感器确实不负责生成「好吃」这样的主观判断。\n「…我会从爱诺的反馈里收集情报,来构建人类的味觉喜好模型。」片刻之后,伊涅芙才响应道。\n雅珂达似乎很享受这样的小胜:「可是按你给爱诺控制的甜食摄入频率,一天也收集不到几次反馈吧?」\n眼见伊涅芙认真地思考了起来,雅珂达乘胜追击:「你就不想给爱诺一个惊喜?哼哼…我可以勉为其难地当一回外置传感器…」\n……\n事后雅珂达在日记里大书特书了这场伟大胜利,自己是如何凭借高超的交涉技巧,从可恶的铁皮脑袋那里赢下了一场拌嘴,还顺带骗到了一张长期饭票。\n爱诺也注意到伊涅芙开发新菜品的能力飞速提升,而每次做完料理的食材余料,都会被伊涅芙收集起来,不知有何用途。\n如此隐秘而融洽的合作关系一直持续了很久,直到伊涅芙觉得自己的料理程序已经优化到了瓶颈,是时候寻找下一个突破口了。\n「这一次的试作品,我着重考虑了你说的『灵魂』要素。」\n面对伊涅芙端上的新品,雅珂达不疑有他,高兴地嚼了起来:「我就说…做菜…要有灵魂…你可算…开窍了嘛!」\n这个铁皮脑袋,还记得我那时候随口说过的话呀!雅珂达边嚼边想。哼…吃了她这么多顿,我也见好就收吧…嗯,简单夸两句,然后就宣布她出师了…\n「我重新思考了『灵魂』的定义。」伊涅芙一本正经地开始陈述,「这个词汇常用来形容生物的活性,所以这次我加入了具有活性的素材。」\n嗯嗯,灵魂…生物活性…嗯?雅珂达的心头突然闪过一丝不妙,然而为时已晚,她的唇齿间已经传来了异样的跳动触感。\n低头一看,只见蛋糕胚里正夹着条还在跳动的蜥蜴尾巴,而且,只剩下半截。\n「…蜥蜴的尾巴即使离体也能维持一段时间的生物活性,为了保证食材的新鲜度,我特意…嗯?雅珂达?怎么失去意识了…」"
|
||||
},
|
||||
{
|
||||
"Title": "角色故事4",
|
||||
"Context": "「花烛与风羽的司巫」曾试图将自己的领地转变为完全封闭的避难所,以此建立她理想中的国度。她将这计划命名为「希泊巴」——那个时代人类传说中的冥府。\n不知为何,「希泊巴」在完成后从未被投入使用,直至她被处决的数十年后,被她收养的人类女儿用作囚禁另一位领主上千年的牢笼。\n「明晨之镜」分裂之时,「领主」继承了大部分力量。纵使被封印,其威胁也不容小觑。\n若将其彻底毁灭,一位至高领主的濒死反扑必然殃及甚远;但若等待封印将其力量削弱乃至消磨殆尽,却不知要多少年月,更不知道在这期间,伊涅芙——那时还被称作「悖谬」——是否仍会被「领主」影响。\n至高领主的权能存在太多未知,最简单且安全的方式,也许是送伊涅芙前往遥远的彼岸,靠无尽的汪洋隔绝两个出自同源的意志。\n这或许也是一个机会,彼时的纳塔已经被人与龙的血浸染太久,以伊涅芙的处境,前往海的另一边,或许更容易找到新的归宿。\n带着这样的期许,伊涅芙离开了纳塔。一如当年的王女离开龙巢。\n在海浪与时间的冲刷间,孤身一人踏上了所谓「寻找归宿」的旅程。\n她曾见过魔神战火的余烬,来自雪原的居民,为寻找温暖的居所而踏足陌生的土地,开辟耕地,建起村社。\n她曾见过开拓时代的辉煌,雄伟的城邦在机械的轰鸣声中拔地而起,金币的脆响在冒险家们的笑声中格外动听。\n她也曾见过灾厄摧残的废土,或曰「狂猎」,或曰「深渊」,灾难撕咬过每一寸土地,绝望舔舐过每一分人心。\n随后她见到茫然无际的黑暗,陷入比死亡更为静寂的沉睡。\n所有瞬间都湮没在时间的洪流里,如同落入雨中的泪水。\n回忆铺成漫长的来路,望不见起点,看不见终点。"
|
||||
},
|
||||
{
|
||||
"Title": "角色故事5",
|
||||
"Context": "古时的纳塔人曾种植过一种名为香荚兰的作物,用于调味与医用。\n它们原生于深林的幽暗处,既没有粗壮的枝干,也没有发达的根系,只能攀附于其他树木,靠树冠间隙里细碎的阳光默默生长。\n多么弱小的植物啊,就和人类一样。年幼的女儿曾如此惋叹。\n但依附于强者,也是一种生存之道。稍长的儿子却如此思忖。\n不,即使只凭藤蔓,也可以绞杀大树。只要它们像蛛网一样虬结,像锁链一样紧扣。\n母亲用利刃剖开成熟的荚果,籽粒伴着芳香洒落而出。\n只要它们永不忘却自己的孤傲:即便生于潮湿的腐殖土,也要以藤的筋骨,触碰天空的高度。\n……\n十三位至高领主,既是秘源技术的巅峰,也是火龙王的子嗣。高傲如他们,自不会接受「命之座」的禁锢。\n与「明晨之镜」互为镜像的伊涅芙,本来也不应有命星照拂。\n在挪德卡莱彷徨的两千年间,她彷如一名过客,行走在无数提线交织之中,见证过无数星曜明灭的瞬间,偶尔也会被名为「命运」的悬丝牵扯,有时也曾被名为「人类」的星光照亮…只是这一切也都一次次地被她遗忘。\n直到深嵌于核心的「月之轮」被点亮,回忆纷至沓来,她终于回忆起旅途中的第一缕星光:\n在伊涅芙临行之际,莉安歌曾折下一株香荚兰,饰于其构件之间,作为铭刻的纪念。\n彼时的伊涅芙并不理解其意义。\n那朵花早已凋零于万顷碧波之间,香荚兰如今也在纳塔逐渐绝迹。\n而在两千年后的此刻,高天之上,众星之间,一株「香荚兰」已然触达天际,默默绽放。"
|
||||
},
|
||||
{
|
||||
"Title": "「薇尔琪塔」",
|
||||
"Context": "常伴伊涅芙左右的小机器人,多用途智能辅助单元「薇尔琪塔」,原名为「哔卟嘀嗒哐当唰啦咕噜啵伊(中略)泛用型万用机」。\n说是原名,其实也不是它最早的名字了。在爱诺设计之初,它只有呈递扳手、搬运零件的简单功能,于是爱诺就用机器激活时的「哔卟」和零件碰撞时的「嘀嗒」给它起了名:「哔卟嘀嗒搬运机」。\n伊涅芙醒来后,就在照料爱诺起居之余,顺带接手了这些简单却费力的重活。而小机器人则在伊涅芙的强烈要求下,加装了打扫清洁的功能。\n由于爱诺坚称功率大就是好,出力高就是妙,机械运转时不会分辨寻常污渍和被爱诺随手丢弃的细小零件,常常「哐当」一声磕到什么硬物,随后在强劲吸力下「唰啦」一声将其解体清理…因此更名「哔卟嘀嗒哐当唰啦搬运扫地两用机」。\n伊涅芙刚记录下这名字没多久,小机器人又迎来了新一轮升级。这次是加装了强大的蓄能与激光模块,据爱诺称会有效提高与伊涅芙的协同作战能力,还能为伊涅芙应急充能来延长续航时间…至于名字,则变成了「哔卟嘀嗒哐当唰啦咕噜啵伊搬运扫地蓄能作战兼用机」…\n如此数番改造下来,即使是爱诺也有些记不住小机器人的名字了,而伊涅芙也觉得每次用语音激活,都得花一半的时间来念名字,实在没什么效率,于是小机器人的名称简化总算被提上了日程。\n爱诺揉着太阳穴苦恼了许久:「呃唔唔…干脆直接回到第一版,就叫你『哔卟嘀嗒』吧!」\n「哔卟嘀嗒」低声应和:「哔卟…」显示屏亮度黯淡,像是有点能量不足。\n伊涅芙歪着脑袋,问出了思维模块里一直未解的疑惑:「说起来——为什么我的名字没有采用拟声词加功能的格式,而叫做『伊涅芙』呢?」\n爱诺支碎碎念着抛出了好些理由,「在你醒来前不知道该用什么拟声词」「功能太多名字记起来太麻烦」…最后背过身去,小声嘟哝着:「…还有就是,那时候突然灵光一闪…感觉『伊涅芙』喊起来更像是个家人的名字吧…」\n一阵奇异的暖意自伊涅芙的思维模块中生成,像是被暖风包裹,或是沐浴着阳光——尽管此刻是在夜晚,窗外也不曾起风。\n话音未落,爱诺就挥舞起了大袖子,像是要把刚刚的话语掸走:「啊啊——也不是说『咔嗒咔嗒』和『嘎嘎雪球机』还有『咕嘟咕嘟泡茶机』它们就不算家人啦!这些也是我专门给大家起的独一无二的名字嘛!做家长可是很辛苦的哦,要一个一个想名字…」\n「那这孩子的名字,可以让我来起吗?」伊涅芙蹲下身,摸着「哔卟嘀嗒」四四方方的铁壳脑袋。\n「欸?倒是没什么问题…反正它现在也都跟你待在一起…」\n「就从『哔卟嘀嗒』稍微变更一下,『更像家人』一些吧。举例——『薇尔琪塔』?」"
|
||||
},
|
||||
{
|
||||
"Title": "月之轮",
|
||||
"Context": "【关于涅法海姆的仪式礼器与愿望的研究】\n……\n…委派的龙仆已从埃科普里尼克引发骚乱的人类残余物中成功回收指定可疑样本。根据领民的说法,该样本被纳塔兰提亚外的商人称为「神之眼」…\n…就样本的运作原理,与第三席进行了简短研讨。她提出了一个很有趣的假说,即样本可能与涅法海姆的祭礼用具存在关联…\n…稍微用了一些手段,拿到了依然能运作的「月之轮」(涅法海姆的祭礼用具——更准确地说,那三位背叛者赐予她们追随者的、让那些人类与她们沟通的小玩具)…与王授予的智识相同,「月之轮」依靠更纯净的力量运行,而非受到僭主污染的元素力…\n……\n…进一步的实验证实了第三席的说法。与北方的祭礼用具相同,驱使「神之眼」的质料也同样是灵魂。从原理上来说,是通过愿望将(…)锚定,从而借助(…)调用元素力…\n这是否也是如今的「神之眼」,常伴随人之「愿望」出现的原因?\n——CL-08伊·卡科茨·伊齐玛瓦夏·库·雷尔\n……\n「…既然是燃素驱动的核心,自然也能用同样的力量控制。那按花羽的司巫留下的知识,这东西也许会更合适…不过…」\n伊葵望着莉安歌手中的「宝石」,微微蹙起眉头。\n「你确定要为了那家伙用上这个么?这东西也算是你母亲留下的…」\n莉安歌摩挲着「宝石」,给出了自己的答案。\n「…不过是她众多的研究对象之一罢了,不用在意。况且母亲为我留下的最珍贵的事物,不是它,也不是碎链…」\n那枚见证过无数岁月的「宝石」,在莉安歌手中熠熠生辉,仿佛永不熄灭的龙瞳。\n「…是期待我践行这道途的『愿望』。」"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -11833,5 +11833,14 @@
|
||||
"star": 4,
|
||||
"source": [{ "name": "传说任务获取", "type": "single" }],
|
||||
"convert": []
|
||||
},
|
||||
{
|
||||
"id": 220117,
|
||||
"name": "跃律琴",
|
||||
"description": "使用后,可以进行演奏的纳塔风格乐器。\\n曲线独特的机关钢琴,外观上有着和传统钢琴类似的黑白键,但其发出的声音却更有反常规的特色。在一些热闹的场合中,乐手们常常用它演奏律动十足的乐曲,使之成为派对气氛的助燃剂。",
|
||||
"type": "小道具",
|
||||
"star": 4,
|
||||
"source": [{ "name": "「金贝乐棚」购买获得", "type": "single" }],
|
||||
"convert": []
|
||||
}
|
||||
]
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
"id": 0,
|
||||
"order": 1,
|
||||
"name": "天地万象",
|
||||
"version": "5.7",
|
||||
"version": "5.8",
|
||||
"card": "",
|
||||
"icon": "UI_AchievementIcon_O001"
|
||||
},
|
||||
@@ -494,5 +494,13 @@
|
||||
"version": "5.5",
|
||||
"card": "纳塔·眬瞳",
|
||||
"icon": "UI_AchievementIcon_A021"
|
||||
},
|
||||
{
|
||||
"id": 62,
|
||||
"order": 63,
|
||||
"name": "岩灰与刺梨的夏日",
|
||||
"version": "5.8",
|
||||
"card": "纳塔·巡风",
|
||||
"icon": "UI_AchievementIcon_A022"
|
||||
}
|
||||
]
|
||||
|
||||
@@ -3900,6 +3900,132 @@
|
||||
"task": [{ "questId": 75151, "name": "毁灭预兆与最后的通牒", "type": "世界任务" }]
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": 80430,
|
||||
"series": 62,
|
||||
"order": 393,
|
||||
"name": "双屋的呼唤",
|
||||
"description": "点亮纳塔区域中,悠悠度假村的地图。",
|
||||
"reward": 5,
|
||||
"version": "5.8",
|
||||
"trigger": { "type": "UNLOCK_AREA" }
|
||||
},
|
||||
{
|
||||
"id": 80431,
|
||||
"series": 62,
|
||||
"order": 394,
|
||||
"name": "暖浪引路人",
|
||||
"description": "解锁纳塔区域中,悠悠度假村所有传送锚点。",
|
||||
"reward": 5,
|
||||
"version": "5.8",
|
||||
"trigger": { "type": "UNLOCK_TRANS_POINT" }
|
||||
},
|
||||
{
|
||||
"id": 80432,
|
||||
"series": 62,
|
||||
"order": 395,
|
||||
"name": "圣龛巡礼·水软风柔之岛",
|
||||
"description": "解除纳塔区域中,悠悠度假村所有地灵龛的封印。",
|
||||
"reward": 10,
|
||||
"version": "5.8",
|
||||
"trigger": { "type": "UNLOCK_GATE_TEMPLE" }
|
||||
},
|
||||
{
|
||||
"id": 80433,
|
||||
"series": 62,
|
||||
"order": 396,
|
||||
"name": "幻写引路人·其三",
|
||||
"description": "在悠悠度假村追随6个幻写灵,并完成涂鸦。",
|
||||
"reward": 10,
|
||||
"version": "5.8",
|
||||
"trigger": { "type": "GROUP_NOTIFY" }
|
||||
},
|
||||
{
|
||||
"id": 80434,
|
||||
"series": 62,
|
||||
"order": 397,
|
||||
"name": "沧屿的寻宝者",
|
||||
"description": "在悠悠度假村开启30个宝箱。",
|
||||
"reward": 5,
|
||||
"version": "5.8",
|
||||
"trigger": { "type": "OPEN_WORLD_CHEST" }
|
||||
},
|
||||
{
|
||||
"id": 80435,
|
||||
"series": 62,
|
||||
"order": 398,
|
||||
"name": "沧屿的寻宝者",
|
||||
"description": "在悠悠度假村开启60个宝箱。",
|
||||
"reward": 10,
|
||||
"version": "5.8",
|
||||
"trigger": { "type": "OPEN_WORLD_CHEST" }
|
||||
},
|
||||
{
|
||||
"id": 80436,
|
||||
"series": 62,
|
||||
"order": 399,
|
||||
"name": "沧屿的寻宝者",
|
||||
"description": "在悠悠度假村开启120个宝箱。",
|
||||
"reward": 20,
|
||||
"version": "5.8",
|
||||
"trigger": { "type": "OPEN_WORLD_CHEST" }
|
||||
},
|
||||
{
|
||||
"id": 80437,
|
||||
"series": 62,
|
||||
"order": 400,
|
||||
"name": "沧屿的冒险家",
|
||||
"description": "在悠悠度假村完成6个大世界限时挑战。",
|
||||
"reward": 5,
|
||||
"version": "5.8",
|
||||
"trigger": { "type": "GROUP_NOTIFY" }
|
||||
},
|
||||
{
|
||||
"id": 80438,
|
||||
"series": 62,
|
||||
"order": 401,
|
||||
"name": "沧屿的冒险家",
|
||||
"description": "在悠悠度假村完成12个大世界限时挑战。",
|
||||
"reward": 10,
|
||||
"version": "5.8",
|
||||
"trigger": { "type": "GROUP_NOTIFY" }
|
||||
},
|
||||
{
|
||||
"id": 80439,
|
||||
"series": 62,
|
||||
"order": 402,
|
||||
"name": "沧屿的冒险家",
|
||||
"description": "在悠悠度假村完成24个大世界限时挑战。",
|
||||
"reward": 20,
|
||||
"version": "5.8",
|
||||
"trigger": { "type": "GROUP_NOTIFY" }
|
||||
},
|
||||
{
|
||||
"id": 80440,
|
||||
"series": 62,
|
||||
"order": 403,
|
||||
"name": "阿夏引力之虹",
|
||||
"description": "解锁阿夏的所有颜色。",
|
||||
"reward": 5,
|
||||
"version": "5.8",
|
||||
"trigger": {
|
||||
"type": "FINISH_QUEST_AND",
|
||||
"task": [
|
||||
{ "questId": 75212, "name": "流彩的踪迹", "type": "世界任务" },
|
||||
{ "questId": 15040, "name": "目标!彩彩崖!", "type": "角色邀约/传说任务" }
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": 80441,
|
||||
"series": 62,
|
||||
"order": 404,
|
||||
"name": "彩色相簿",
|
||||
"description": "完成悠悠纪念册中所有的留影。",
|
||||
"reward": 5,
|
||||
"version": "5.8",
|
||||
"trigger": { "type": "GROUP_NOTIFY" }
|
||||
},
|
||||
{
|
||||
"id": 81000,
|
||||
"series": 0,
|
||||
@@ -9595,6 +9721,181 @@
|
||||
"version": "5.5",
|
||||
"trigger": { "type": "QUEST_GLOBAL_VAR_EQUAL" }
|
||||
},
|
||||
{
|
||||
"id": 81580,
|
||||
"series": 0,
|
||||
"order": 1575,
|
||||
"name": "终竟的悠悠花海",
|
||||
"description": "装饰了悠悠度假村的全部花海。",
|
||||
"reward": 5,
|
||||
"version": "5.8",
|
||||
"trigger": { "type": "GROUP_NOTIFY" }
|
||||
},
|
||||
{
|
||||
"id": 81581,
|
||||
"series": 0,
|
||||
"order": 1576,
|
||||
"name": "并非空军",
|
||||
"description": "钓上并战胜「豚兽·大王」。",
|
||||
"reward": 5,
|
||||
"version": "5.8",
|
||||
"trigger": { "type": "GROUP_NOTIFY" }
|
||||
},
|
||||
{
|
||||
"id": 81582,
|
||||
"series": 0,
|
||||
"order": 1577,
|
||||
"name": "悠悠村的金色闪光",
|
||||
"description": "在悠悠极速大赛中战胜「来无影」和「去无踪」。",
|
||||
"reward": 5,
|
||||
"version": "5.8",
|
||||
"trigger": { "type": "FINISH_PARENT_QUEST_AND", "task": [] }
|
||||
},
|
||||
{
|
||||
"id": 81583,
|
||||
"series": 0,
|
||||
"order": 1578,
|
||||
"name": "流彩的踪迹",
|
||||
"description": "参加了「流彩设计工作室」的开业典礼。",
|
||||
"reward": 5,
|
||||
"version": "5.8",
|
||||
"trigger": {
|
||||
"type": "FINISH_PARENT_QUEST_AND",
|
||||
"task": [{ "questId": 75212, "name": "流彩的踪迹", "type": "世界任务" }]
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": 81584,
|
||||
"series": 0,
|
||||
"order": 1579,
|
||||
"name": "梦中的帕伊提提",
|
||||
"description": "在梦里发现埋藏在提提岛的宝藏。",
|
||||
"reward": 5,
|
||||
"version": "5.8",
|
||||
"trigger": {
|
||||
"type": "FINISH_PARENT_QUEST_AND",
|
||||
"task": [{ "questId": 75232, "name": "美梦帕伊提提", "type": "世界任务" }]
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": 81585,
|
||||
"series": 0,
|
||||
"order": 1580,
|
||||
"name": "「他们给了我名字」",
|
||||
"description": "帮助伊凯卡完成枪手训练。",
|
||||
"reward": 5,
|
||||
"version": "5.8",
|
||||
"trigger": { "type": "GROUP_NOTIFY" }
|
||||
},
|
||||
{
|
||||
"id": 81587,
|
||||
"series": 0,
|
||||
"order": 1582,
|
||||
"name": "她说「我愿意」",
|
||||
"description": "帮助斯奇完成告白。",
|
||||
"reward": 5,
|
||||
"version": "5.8",
|
||||
"trigger": { "type": "GROUP_NOTIFY" }
|
||||
},
|
||||
{
|
||||
"id": 81589,
|
||||
"series": 0,
|
||||
"order": 1584,
|
||||
"name": "闪耀吧!皮皮潘偶像!",
|
||||
"description": "观看了皮皮潘偶像大赛的决赛。",
|
||||
"reward": 5,
|
||||
"version": "5.8",
|
||||
"trigger": {
|
||||
"type": "FINISH_PARENT_QUEST_AND",
|
||||
"task": [{ "questId": 75233, "name": "闪耀!皮皮潘偶像大赛!", "type": "世界任务" }]
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": 81590,
|
||||
"series": 0,
|
||||
"order": 1585,
|
||||
"name": "「一个伟大的计划」",
|
||||
"description": "两次挫败了乔克力爪牙的伟大计划。",
|
||||
"reward": 5,
|
||||
"version": "5.8",
|
||||
"trigger": { "type": "GROUP_NOTIFY" }
|
||||
},
|
||||
{
|
||||
"id": 81591,
|
||||
"series": 0,
|
||||
"order": 1586,
|
||||
"name": "我于七色之中",
|
||||
"description": "用颜色填满悠悠集市的七色悠悠像。",
|
||||
"reward": 5,
|
||||
"version": "5.8",
|
||||
"trigger": { "type": "GROUP_NOTIFY" }
|
||||
},
|
||||
{
|
||||
"id": 81592,
|
||||
"series": 0,
|
||||
"order": 1587,
|
||||
"name": "飞起来也是十分!",
|
||||
"description": "在呼呼丘的跳水台完成一次跳水。",
|
||||
"reward": 5,
|
||||
"version": "5.8",
|
||||
"trigger": { "type": "GROUP_NOTIFY" }
|
||||
},
|
||||
{
|
||||
"id": 81593,
|
||||
"series": 0,
|
||||
"order": 1588,
|
||||
"name": "阿亚尔的后继者",
|
||||
"description": "摘得阿亚尔英雄杯桂冠。",
|
||||
"reward": 5,
|
||||
"version": "5.8",
|
||||
"trigger": { "type": "FINISH_PARENT_QUEST_AND", "task": [] }
|
||||
},
|
||||
{
|
||||
"id": 81594,
|
||||
"series": 0,
|
||||
"order": 1589,
|
||||
"name": "这里曾有一条归家之路",
|
||||
"description": "在提提岛体验一次热舞乐台。",
|
||||
"reward": 5,
|
||||
"version": "5.8",
|
||||
"trigger": { "type": "GROUP_NOTIFY" }
|
||||
},
|
||||
{
|
||||
"id": 81597,
|
||||
"series": 0,
|
||||
"order": 1592,
|
||||
"name": "「若我未被化作烟灰」",
|
||||
"description": "目送渊上开启他的未知旅程。",
|
||||
"reward": 5,
|
||||
"version": "5.8",
|
||||
"trigger": {
|
||||
"type": "FINISH_PARENT_QUEST_AND",
|
||||
"task": [{ "questId": 75230, "name": "最后的特诺奇兹托克人", "type": "世界任务" }]
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": 81598,
|
||||
"series": 0,
|
||||
"order": 1593,
|
||||
"name": "「最后的特诺奇兹托克人」",
|
||||
"description": "战胜地方传奇·最后的特诺奇兹托克人。",
|
||||
"reward": 5,
|
||||
"version": "5.8",
|
||||
"trigger": { "type": "GROUP_NOTIFY" }
|
||||
},
|
||||
{
|
||||
"id": 81599,
|
||||
"series": 0,
|
||||
"order": 1594,
|
||||
"name": "灯火不歇",
|
||||
"description": "与伙伴们共同参与开业仪式。",
|
||||
"reward": 5,
|
||||
"version": "5.8",
|
||||
"trigger": {
|
||||
"type": "FINISH_QUEST_AND",
|
||||
"task": [{ "questId": 15044, "name": "惊遇!等待众人的将是…?", "type": "角色邀约/传说任务" }]
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": 82001,
|
||||
"series": 7,
|
||||
@@ -14898,6 +15199,45 @@
|
||||
"task": [{ "questId": 8018, "name": "你所不在的时空", "type": "魔神任务" }]
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": 84348,
|
||||
"series": 0,
|
||||
"order": 5127,
|
||||
"name": "你所无法想象的爱",
|
||||
"description": "这个机器人来自挪德卡莱。",
|
||||
"reward": 5,
|
||||
"version": "5.8",
|
||||
"trigger": {
|
||||
"type": "FINISH_QUEST_AND",
|
||||
"task": [{ "questId": 6004, "name": "墟火", "type": "魔神任务" }]
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": 84349,
|
||||
"series": 0,
|
||||
"order": 5128,
|
||||
"name": "你难以置信的愤怒",
|
||||
"description": "阻绝「明晨之镜」的复燃与归还。",
|
||||
"reward": 5,
|
||||
"version": "5.8",
|
||||
"trigger": {
|
||||
"type": "FINISH_QUEST_AND",
|
||||
"task": [{ "questId": 6006, "name": "逆焰", "type": "魔神任务" }]
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": 84350,
|
||||
"series": 0,
|
||||
"order": 5129,
|
||||
"name": "归途",
|
||||
"description": "完成「归途」。",
|
||||
"reward": 10,
|
||||
"version": "5.8",
|
||||
"trigger": {
|
||||
"type": "FINISH_QUEST_AND",
|
||||
"task": [{ "questId": 6006, "name": "逆焰", "type": "魔神任务" }]
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": 84501,
|
||||
"series": 10,
|
||||
|
||||
@@ -735,6 +735,22 @@
|
||||
],
|
||||
"source": { "index": 6, "area": "纳塔", "name": "旋复" }
|
||||
},
|
||||
{
|
||||
"id": 10000116,
|
||||
"contentId": 505631,
|
||||
"dropDays": [3, 6, 7],
|
||||
"name": "伊涅芙",
|
||||
"itemType": "character",
|
||||
"star": 5,
|
||||
"weapon": "长柄武器",
|
||||
"element": "雷",
|
||||
"materials": [
|
||||
{ "id": 104353, "name": "「纷争」的教导", "star": 2 },
|
||||
{ "id": 104354, "name": "「纷争」的指引", "star": 3 },
|
||||
{ "id": 104355, "name": "「纷争」的哲学", "star": 4 }
|
||||
],
|
||||
"source": { "index": 6, "area": "纳塔", "name": "旋复" }
|
||||
},
|
||||
{
|
||||
"id": 10000003,
|
||||
"contentId": 59,
|
||||
@@ -2527,6 +2543,22 @@
|
||||
],
|
||||
"source": { "index": 5, "area": "枫丹", "name": "匠理" }
|
||||
},
|
||||
{
|
||||
"id": 13515,
|
||||
"contentId": 0,
|
||||
"dropDays": [1, 4, 7],
|
||||
"name": "支离轮光",
|
||||
"itemType": "weapon",
|
||||
"star": 5,
|
||||
"weapon": "长柄武器",
|
||||
"materials": [
|
||||
{ "id": 114061, "name": "贡祭炽心的惶恐", "star": 2 },
|
||||
{ "id": 114062, "name": "贡祭炽心的踌躇", "star": 3 },
|
||||
{ "id": 114063, "name": "贡祭炽心的决绝", "star": 4 },
|
||||
{ "id": 114064, "name": "贡祭炽心的荣膺", "star": 5 }
|
||||
],
|
||||
"source": { "index": 6, "area": "纳塔", "name": "冥见" }
|
||||
},
|
||||
{
|
||||
"id": 11401,
|
||||
"contentId": 208,
|
||||
@@ -3311,6 +3343,22 @@
|
||||
],
|
||||
"source": { "index": 6, "area": "纳塔", "name": "冥见" }
|
||||
},
|
||||
{
|
||||
"id": 12432,
|
||||
"contentId": 0,
|
||||
"dropDays": [2, 5, 7],
|
||||
"name": "拾慧铸熔",
|
||||
"itemType": "weapon",
|
||||
"star": 4,
|
||||
"weapon": "双手剑",
|
||||
"materials": [
|
||||
{ "id": 114065, "name": "谵妄圣主的朽败", "star": 2 },
|
||||
{ "id": 114066, "name": "谵妄圣主的余哀", "star": 3 },
|
||||
{ "id": 114067, "name": "谵妄圣主的容光", "star": 4 },
|
||||
{ "id": 114068, "name": "谵妄圣主的神面", "star": 5 }
|
||||
],
|
||||
"source": { "index": 6, "area": "纳塔", "name": "究观" }
|
||||
},
|
||||
{
|
||||
"id": 15401,
|
||||
"contentId": 195,
|
||||
|
||||
@@ -1,4 +1,16 @@
|
||||
[
|
||||
{
|
||||
"id": 10000116,
|
||||
"contentId": 505631,
|
||||
"name": "伊涅芙",
|
||||
"title": "轰隆雷鸣波",
|
||||
"area": "未知",
|
||||
"birthday": [4, 2],
|
||||
"star": 5,
|
||||
"element": "雷",
|
||||
"weapon": "长柄武器",
|
||||
"nameCard": "伊涅芙·指令"
|
||||
},
|
||||
{
|
||||
"id": 10000114,
|
||||
"contentId": 505417,
|
||||
|
||||
@@ -2791,5 +2791,41 @@
|
||||
"postId": "66043931",
|
||||
"up5List": [12514, 13513],
|
||||
"up4List": [11402, 12405, 13401, 14403, 15405]
|
||||
},
|
||||
{
|
||||
"name": "聚星源动",
|
||||
"version": "5.8",
|
||||
"order": 1,
|
||||
"banner": "https://upload-os-bbs.hoyolab.com/upload/2025/07/25/70935b231300c146285f1f3dc284b480_1705467789414990949.jpg",
|
||||
"from": "2025-07-30T06:00:00+08:00",
|
||||
"to": "2025-08-19T17:59:00+08:00",
|
||||
"type": 301,
|
||||
"postId": "66832524",
|
||||
"up5List": [10000116],
|
||||
"up4List": [10000097, 10000025, 10000031]
|
||||
},
|
||||
{
|
||||
"name": "星边夜语",
|
||||
"version": "5.8",
|
||||
"order": 1,
|
||||
"banner": "https://upload-os-bbs.hoyolab.com/upload/2025/07/25/05b09839f39f708a5452d50fecde81c1_5485624259133082975.jpg",
|
||||
"from": "2025-07-30T06:00:00+08:00",
|
||||
"to": "2025-08-19T17:59:00+08:00",
|
||||
"type": 400,
|
||||
"postId": "66832525",
|
||||
"up5List": [10000107],
|
||||
"up4List": [10000097, 10000025, 10000031]
|
||||
},
|
||||
{
|
||||
"name": "神铸赋形",
|
||||
"version": "5.8",
|
||||
"order": 1,
|
||||
"banner": "https://upload-os-bbs.hoyolab.com/upload/2025/07/25/97ee398e0ecb0c549ca96ff4a8febd30_9157364043899287780.jpg",
|
||||
"from": "2025-07-30T06:00:00+08:00",
|
||||
"to": "2025-08-19T17:59:00+08:00",
|
||||
"type": 302,
|
||||
"postId": "66832526",
|
||||
"up5List": [13515, 14517],
|
||||
"up4List": [11430, 13430, 12403, 14401, 15401]
|
||||
}
|
||||
]
|
||||
|
||||
@@ -419,6 +419,13 @@
|
||||
"desc": "名片纹饰。若世上有全部的斗争都得以平息之日,就是夜晚的神祇也可以陷入安宁沉睡的时刻了吧。",
|
||||
"source": "达成「对决者·第三辑」下所有成就时获取。"
|
||||
},
|
||||
{
|
||||
"id": 210250,
|
||||
"name": "纳塔·巡风",
|
||||
"type": "成就",
|
||||
"desc": "名片纹饰。就算风不再吹拂那破碎之地,依旧有巡风者腾起在灰烬里。",
|
||||
"source": "达成「岩灰与刺梨的夏日」下所有成就时获取。"
|
||||
},
|
||||
{
|
||||
"id": 210003,
|
||||
"name": "安柏·兔兔",
|
||||
@@ -1119,6 +1126,13 @@
|
||||
"desc": "名片纹饰。如果说「偶像」这工作的本质就是「被人喜爱」,那塔利雅的天职可能就在此了。芭芭拉尚且需要努力当好偶像,塔利雅只需要管好隐私,别被人发现和某吟游诗人一起喝酒……好像也不那么简单?",
|
||||
"source": "塔利雅的好感等级达到10级时获取。"
|
||||
},
|
||||
{
|
||||
"id": 210248,
|
||||
"name": "伊涅芙·指令",
|
||||
"type": "好感",
|
||||
"desc": "名片纹饰。家用机器人等待着您的指令。但是「薇尔琪塔」会指着你,让你好好掂量一下想说什么命令。她可配备了激光模块哦。",
|
||||
"source": "伊涅芙的好感等级达到10级时获取。"
|
||||
},
|
||||
{
|
||||
"id": 210057,
|
||||
"name": "庆典·无相",
|
||||
@@ -1532,6 +1546,13 @@
|
||||
"desc": "名片纹饰。如果棋子某日生出自己的想法,是否也能反过来令执棋人陷入欠行的僵局?",
|
||||
"source": "纪行系统奖励获取。"
|
||||
},
|
||||
{
|
||||
"id": 210251,
|
||||
"name": "纪行·悠悠",
|
||||
"type": "纪行",
|
||||
"desc": "名片纹饰。时间悠悠地走哟,你悠悠地停。没想过要抵达什么地方,拣首诗儿悠悠地吟。",
|
||||
"source": "纪行系统奖励获取。"
|
||||
},
|
||||
{
|
||||
"id": 210001,
|
||||
"name": "原神·印象",
|
||||
@@ -1558,7 +1579,7 @@
|
||||
"name": "庆典·倾耳",
|
||||
"type": "其他",
|
||||
"desc": "名片纹饰。星海啊,山岩啊,请你们倾耳听我的曲调吧。",
|
||||
"source": "「万籁协奏」礼包获取。"
|
||||
"source": ""
|
||||
},
|
||||
{
|
||||
"id": 210115,
|
||||
@@ -1616,6 +1637,20 @@
|
||||
"desc": "名片纹饰。在「咔嗒」作响的倒计时中,晚宴如约拉开帷幕。乔装舞会的转身之后,两人同时开始了各自的计划…也许这份心照不宣,才是更值得珍重的「秘宝」。",
|
||||
"source": "「原神×肯德基」联动活动获取。"
|
||||
},
|
||||
{
|
||||
"id": 210249,
|
||||
"name": "纳塔·煅轮",
|
||||
"type": "其他",
|
||||
"desc": "名片纹饰。令镌刻图腾的石轮转动的,不止有岁月,还有一切炽热的灵魂。",
|
||||
"source": "煅石之火等级达到48级时领取。"
|
||||
},
|
||||
{
|
||||
"id": 210252,
|
||||
"name": "庆典·鲔米",
|
||||
"type": "其他",
|
||||
"desc": "名片纹饰。回转是为了把所有好吃的在你面前展示。美味则是为了用幸福感填满你的心。",
|
||||
"source": "「原神×寿司郎」联动活动获取。"
|
||||
},
|
||||
{
|
||||
"id": 210047,
|
||||
"name": "蒙德·英名",
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
{ "id": 14504, "contentId": 1222, "name": "尘世之锁", "star": 5, "weapon": "法器" },
|
||||
{ "id": 14502, "contentId": 297, "name": "四风原典", "star": 5, "weapon": "法器" },
|
||||
{ "id": 14501, "contentId": 227, "name": "天空之卷", "star": 5, "weapon": "法器" },
|
||||
{ "id": 13515, "contentId": 0, "name": "支离轮光", "star": 5, "weapon": "长柄武器" },
|
||||
{ "id": 13514, "contentId": 505323, "name": "香韵奏者", "star": 5, "weapon": "长柄武器" },
|
||||
{ "id": 13513, "contentId": 501725, "name": "柔灯挽歌", "star": 5, "weapon": "长柄武器" },
|
||||
{ "id": 13512, "contentId": 501137, "name": "赤月之形", "star": 5, "weapon": "长柄武器" },
|
||||
@@ -126,6 +127,7 @@
|
||||
{ "id": 13403, "contentId": 321, "name": "流月针", "star": 4, "weapon": "长柄武器" },
|
||||
{ "id": 13402, "contentId": 393, "name": "试作星镰", "star": 4, "weapon": "长柄武器" },
|
||||
{ "id": 13401, "contentId": 171, "name": "匣里灭辰", "star": 4, "weapon": "长柄武器" },
|
||||
{ "id": 12432, "contentId": 0, "name": "拾慧铸熔", "star": 4, "weapon": "双手剑" },
|
||||
{ "id": 12431, "contentId": 501967, "name": "撼地者", "star": 4, "weapon": "双手剑" },
|
||||
{ "id": 12430, "contentId": 503098, "name": "硕果钩", "star": 4, "weapon": "双手剑" },
|
||||
{ "id": 12427, "contentId": 7313, "name": "便携动力锯", "star": 4, "weapon": "双手剑" },
|
||||
|
||||
27
src/enum/bbs.ts
Normal file
@@ -0,0 +1,27 @@
|
||||
/**
|
||||
* @file src/enum/bbs.ts
|
||||
* @description BBS 相关枚举
|
||||
* @since Beta v0.7.9
|
||||
*/
|
||||
|
||||
/**
|
||||
* @description 用户头像类型
|
||||
* @since Beta v0.7.9
|
||||
* @enum AvatarExtTypeEnum
|
||||
*/
|
||||
export const AvatarExtTypeEnum: typeof TGApp.BBS.User.AvatarExtType = {
|
||||
CUSTOM: 0,
|
||||
GIF: 3,
|
||||
};
|
||||
|
||||
/**
|
||||
* @description 头像拓展资源类型
|
||||
* @since Beta v0.7.9
|
||||
* @enum AvatarExtResTypeEnum
|
||||
*/
|
||||
export const AvatarExtResTypeEnum: typeof TGApp.BBS.User.AvatarExtResType = {
|
||||
WEBP: 1,
|
||||
APNG: 2,
|
||||
GIF: 3,
|
||||
PNG: 4,
|
||||
};
|
||||
@@ -1,7 +1,7 @@
|
||||
/**
|
||||
* @file request/painterReq.ts
|
||||
* @description painter 下的请求
|
||||
* @since Beta v0.7.2
|
||||
* @since Beta v0.7.9
|
||||
*/
|
||||
import { getRequestHeader } from "@utils/getRequestHeader.js";
|
||||
import TGHttp from "@utils/TGHttp.js";
|
||||
@@ -35,7 +35,7 @@ async function getNewsList(
|
||||
|
||||
/**
|
||||
* @description 获取最近版块热门帖子列表
|
||||
* @since Beta v0.7.1
|
||||
* @since Beta v0.7.9
|
||||
* @param {number} forumId 版块 ID
|
||||
* @param {number} gid 社区 ID
|
||||
* @param {number} pageSize 每页数量
|
||||
@@ -66,13 +66,14 @@ async function getHotForumPostList(
|
||||
await TGHttp<TGApp.BBS.Forum.PostForumResp>(`${bapBu}getHotForumPostList`, {
|
||||
method: "GET",
|
||||
query: params,
|
||||
headers: { cookie: "" },
|
||||
})
|
||||
).data;
|
||||
}
|
||||
|
||||
/**
|
||||
* @description 获取最近版块帖子列表
|
||||
* @since Beta v0.7.1
|
||||
* @since Beta v0.7.9
|
||||
* @param {number} forumId 版块 ID
|
||||
* @param {number} gid 社区 ID
|
||||
* @param {number} type 排序方式: 1-最新回复,2-最新发布
|
||||
@@ -107,6 +108,7 @@ async function getRecentForumPostList(
|
||||
await TGHttp<TGApp.BBS.Forum.PostForumResp>(`${bapBu}getRecentForumPostList`, {
|
||||
method: "GET",
|
||||
query: params,
|
||||
headers: { cookie: "" },
|
||||
})
|
||||
).data;
|
||||
}
|
||||
|
||||
@@ -12,7 +12,7 @@ const Referer: Readonly<string> = "https://bbs.mihoyo.com/";
|
||||
|
||||
/**
|
||||
* @description 获取单个帖子信息
|
||||
* @since Beta v0.7.7
|
||||
* @since Beta v0.7.9
|
||||
* @param {number|string} postId 帖子 ID
|
||||
* @param {Record<string, string>} cookie Cookie
|
||||
* @return {Promise<TGApp.BBS.Post.FullData | TGApp.BBS.Response.Base>}
|
||||
@@ -28,7 +28,7 @@ async function getPostFull(
|
||||
...getRequestHeader(cookie, "GET", param, "K2", true),
|
||||
"x-rpc-client_type": "2",
|
||||
};
|
||||
} else header = { referer: Referer };
|
||||
} else header = { referer: Referer, cookie: "" };
|
||||
const resp = await TGHttp<TGApp.BBS.Post.FullResp>(`${bapBu}getPostFull`, {
|
||||
method: "GET",
|
||||
headers: header,
|
||||
@@ -40,7 +40,7 @@ async function getPostFull(
|
||||
|
||||
/**
|
||||
* @description 获取合集帖子
|
||||
* @since Beta v0.7.1
|
||||
* @since Beta v0.7.9
|
||||
* @param {string} collectionId 合集 ID
|
||||
* @returns {Promise<Array<TGApp.BBS.Post.FullData>>}
|
||||
*/
|
||||
@@ -50,7 +50,7 @@ async function getPostFullInCollection(
|
||||
return (
|
||||
await TGHttp<TGApp.BBS.Collection.PostsResp>(`${bapBu}getPostFullInCollection`, {
|
||||
method: "GET",
|
||||
headers: { "Content-Type": "application/json", referer: Referer },
|
||||
headers: { "Content-Type": "application/json", referer: Referer, cookie: "" },
|
||||
query: { collection_id: collectionId },
|
||||
})
|
||||
).data.posts;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/**
|
||||
* @file web/request/topicReq.ts
|
||||
* @description 话题相关的请求
|
||||
* @since Beta v0.7.1
|
||||
* @since Beta v0.7.9
|
||||
*/
|
||||
import TGHttp from "@utils/TGHttp.js";
|
||||
|
||||
@@ -11,7 +11,7 @@ const Referer: Readonly<string> = "https://bbs.mihoyo.com/";
|
||||
|
||||
/**
|
||||
* @description 获取特定话题信息
|
||||
* @since Beta v0.7.1
|
||||
* @since Beta v0.7.9
|
||||
* @param {string} gid 游戏分区 ID
|
||||
* @param {string} topicId 话题 ID
|
||||
* @return {Promise<TGApp.BBS.Topic.InfoRes|TGApp.BBS.Response.Base>}
|
||||
@@ -22,7 +22,7 @@ async function getTopicFullInfo(
|
||||
): Promise<TGApp.BBS.Topic.InfoRes | TGApp.BBS.Response.Base> {
|
||||
const resp = await TGHttp<TGApp.BBS.Topic.InfoResp>(`${batBu}getTopicFullInfo`, {
|
||||
method: "GET",
|
||||
headers: { referer: Referer },
|
||||
headers: { referer: Referer, cookie: "" },
|
||||
query: { gids: gid, id: topicId },
|
||||
});
|
||||
if (resp.retcode !== 0) return <TGApp.BBS.Response.Base>resp;
|
||||
|
||||
101
src/types/BBS/User.d.ts
vendored
@@ -1,7 +1,7 @@
|
||||
/**
|
||||
* @file types/BBS/User.d.ts
|
||||
* @description 用户类型定义文件
|
||||
* @since Beta v0.7.2
|
||||
* @since Beta v0.7.9
|
||||
*/
|
||||
|
||||
declare namespace TGApp.BBS.User {
|
||||
@@ -58,7 +58,7 @@ declare namespace TGApp.BBS.User {
|
||||
|
||||
/**
|
||||
* @description 主页用户信息-二级
|
||||
* @since Beta v0.7.2
|
||||
* @since Beta v0.7.9
|
||||
* @interface Info
|
||||
* @property {string} uid 用户 ID
|
||||
* @property {string} nickname 用户昵称
|
||||
@@ -67,7 +67,7 @@ declare namespace TGApp.BBS.User {
|
||||
* @property {number} gender 用户性别
|
||||
* @property {Certification} certification 用户认证信息
|
||||
* @property {LevelExp[]} level_exps 用户等级经验
|
||||
* @property {Archive} archive 用户档案
|
||||
* @property {Achieve} achieve 用户档案
|
||||
* @property {Community} community_info 用户社区信息
|
||||
* @property {string} avatar_url 用户头像链接
|
||||
* @property {Certification[]} certifications 用户认证信息
|
||||
@@ -75,7 +75,8 @@ declare namespace TGApp.BBS.User {
|
||||
* @property {string} pendant 用户挂件 URL,可能为 ""
|
||||
* @property {boolean} is_logoff 是否注销
|
||||
* @property {string} ip_region 用户 IP 地区
|
||||
* @return Info
|
||||
* @property {string | null} showText 显示文本,可能为 null
|
||||
* @property {AvatarExt} avatar_ext 用户头像扩展信息
|
||||
*/
|
||||
type Info = {
|
||||
uid: string;
|
||||
@@ -85,7 +86,7 @@ declare namespace TGApp.BBS.User {
|
||||
gender: number;
|
||||
certification: Certification;
|
||||
level_exps: Array<LevelExp>;
|
||||
archive: Archive;
|
||||
achieve: Achieve;
|
||||
community_info: Community;
|
||||
avatar_url: string;
|
||||
certifications: Array<Certification>;
|
||||
@@ -93,6 +94,8 @@ declare namespace TGApp.BBS.User {
|
||||
pendant: string;
|
||||
is_logoff: boolean;
|
||||
ip_region: string;
|
||||
showText: string | null; // 显示文本,可能为 null
|
||||
avatar_ext: AvatarExt;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -128,26 +131,80 @@ declare namespace TGApp.BBS.User {
|
||||
type SelfOperation = { attitude: number; is_collected: boolean; upvote_type: number };
|
||||
|
||||
/**
|
||||
* @description 用户头像扩展信息
|
||||
* @since Beta v0.7.2
|
||||
* @interface AvatarExt
|
||||
* @property {number} avatar_type 头像类型
|
||||
* @property {string} avatar_assets_id 头像资源 ID
|
||||
* @property {Array<unknown>} resources 资源
|
||||
* @property {Array<unknown>} hd_resources 高清资源
|
||||
* @return AvatarExt
|
||||
* @description 用户头像类型
|
||||
* @since Beta v0.7.9
|
||||
* @const AvatarExtType
|
||||
* @enum {number}
|
||||
* @property {number} CUSTOM - 自定义头像(0)
|
||||
* @property {number} GIF - 可选动态头像(3)
|
||||
*/
|
||||
type AvatarExt = {
|
||||
avatar_type: number;
|
||||
avatar_assets_id: string;
|
||||
resources: Array<unknown>;
|
||||
hd_resources: Array<unknown>;
|
||||
const AvatarExtType = <const>{
|
||||
CUSTOM: 0,
|
||||
GIF: 3,
|
||||
};
|
||||
|
||||
/**
|
||||
* @description 用户头像类型枚举
|
||||
* @since Beta v0.7.9
|
||||
* @enum {number}
|
||||
* @type AvatarExtTypeEnum
|
||||
*/
|
||||
type AvatarExtTypeEnum = (typeof AvatarExtType)[keyof typeof AvatarExtType];
|
||||
|
||||
/**
|
||||
* @description 用户头像扩展信息
|
||||
* @since Beta v0.7.9
|
||||
* @interface AvatarExt
|
||||
* @property {AvatarExtTypeEnum} avatar_type 头像类型
|
||||
* @property {string} avatar_assets_id 头像资源 ID
|
||||
* @property {Array<AvatarExtRes>} resources 资源
|
||||
* @property {Array<AvatarExtRes>} hd_resources 高清资源
|
||||
* @return AvatarExt
|
||||
*/
|
||||
type AvatarExt = {
|
||||
avatar_type: AvatarExtTypeEnum;
|
||||
avatar_assets_id: string;
|
||||
resources: Array<AvatarExtRes>;
|
||||
hd_resources: Array<AvatarExtRes>;
|
||||
};
|
||||
|
||||
/**
|
||||
* @description 用户头像拓展资源类型
|
||||
* @since Beta v0.7.9
|
||||
* @const AvatarExtResType
|
||||
* @property {number} WEBP - WEBP 格式
|
||||
* @property {number} APNG - APNG 格式
|
||||
* @property {number} GIF - GIF 格式
|
||||
* @property {number} PNG - PNG 格式
|
||||
*/
|
||||
const AvatarExtResType = <const>{
|
||||
WEBP: 1,
|
||||
APNG: 2,
|
||||
GIF: 3,
|
||||
PNG: 4,
|
||||
};
|
||||
|
||||
/**
|
||||
* @description 用户头像拓展资源类型枚举
|
||||
* @since Beta v0.7.9
|
||||
* @enum {number}
|
||||
* @type AvatarExtResTypeEnum
|
||||
*/
|
||||
type AvatarExtResTypeEnum = (typeof AvatarExtResType)[keyof typeof AvatarExtResType];
|
||||
|
||||
/**
|
||||
* @description 用户头像拓展资源
|
||||
* @since Beta v0.7.9
|
||||
* @interface AvatarExtRes
|
||||
* @property {AvatarExtResTypeEnum} format 资源格式
|
||||
* @property {string} url 资源链接
|
||||
*/
|
||||
type AvatarExtRes = { format: AvatarExtResTypeEnum; url: string };
|
||||
|
||||
/**
|
||||
* @description 用户档案
|
||||
* @since Alpha v0.2.1
|
||||
* @interface Archive
|
||||
* @since Beta v0.7.9
|
||||
* @interface Achieve
|
||||
* @property {string} like_num 获赞数
|
||||
* @property {string} post_num 发帖数
|
||||
* @property {string} replypost_num 回帖数
|
||||
@@ -157,9 +214,9 @@ declare namespace TGApp.BBS.User {
|
||||
* @property {string} new_follower_num 新粉丝数
|
||||
* @property {string} good_post_num 精华帖数
|
||||
* @property {string} follow_collection_cnt 收藏数
|
||||
* @return Archive
|
||||
* @return Achieve
|
||||
*/
|
||||
type Archive = {
|
||||
type Achieve = {
|
||||
like_num: string;
|
||||
post_num: string;
|
||||
replypost_num: string;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/**
|
||||
* @file utils/TGBbs.ts
|
||||
* @description 关于 BBS 的工具函数
|
||||
* @since Beta v0.7.7
|
||||
* @since Beta v0.7.9
|
||||
*/
|
||||
|
||||
/**
|
||||
@@ -10,18 +10,18 @@
|
||||
*/
|
||||
export type SaltKey = "K2" | "LK2" | "X4" | "X6" | "PROD";
|
||||
|
||||
const BBS_VERSION: Readonly<string> = "2.87.0";
|
||||
const BBS_VERSION: Readonly<string> = "2.90.0";
|
||||
const BBS_UA_MOBILE: Readonly<string> = `Mozilla/5.0 (Linux; Android 12) Mobile miHoYoBBS/${BBS_VERSION}`;
|
||||
const BBS_UA_PC: Readonly<string> = `Mozilla/5.0 (Windows NT 10.0; Win64; x64) miHoYoBBS/${BBS_VERSION}`;
|
||||
|
||||
/**
|
||||
* @description salt 值
|
||||
* @version 2.87.0
|
||||
* @since Beta v0.7.7
|
||||
* @version 2.90.0
|
||||
* @since Beta v0.7.9
|
||||
*/
|
||||
const BBS_SALT: Readonly<Record<SaltKey, string>> = {
|
||||
K2: "pleAwRHEIvtzvECEdmdTsEhqlbWLDrRR",
|
||||
LK2: "XixTFUuRvcKZzgzqHPPoBVzUgYufetsa",
|
||||
K2: "LKsbRciURVKljyjuhSeobiyFngbAyjAh",
|
||||
LK2: "dDIQHbKOdaPaLuvQKVzUzqdeCaxjtaPV",
|
||||
X4: "xV8v4Qu54lUKrEYFZkJhB8cuOh9Asafs",
|
||||
X6: "t0qEgfub6cvueAPgR5m9aQWWVciEer7v",
|
||||
PROD: "t0qEgfub6cvueAPgR5m9aQWWVciEer7v",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/**
|
||||
* @file utils/TGWindow.ts
|
||||
* @description 窗口创建相关工具函数
|
||||
* @since Beta v0.7.6
|
||||
* @since Beta v0.7.9
|
||||
*/
|
||||
|
||||
import type { RenderCard } from "@comp/app/t-postcard.vue";
|
||||
@@ -10,7 +10,6 @@ import { core, webviewWindow, window as TauriWindow } from "@tauri-apps/api";
|
||||
import { PhysicalSize } from "@tauri-apps/api/dpi";
|
||||
import { currentMonitor, WindowOptions } from "@tauri-apps/api/window";
|
||||
import { openUrl } from "@tauri-apps/plugin-opener";
|
||||
import { type } from "@tauri-apps/plugin-os";
|
||||
|
||||
import TGLogger from "./TGLogger.js";
|
||||
|
||||
@@ -103,7 +102,7 @@ export function getWindowSize(label: string): PhysicalSize {
|
||||
|
||||
/**
|
||||
* @description 窗口适配
|
||||
* @since Beta v0.7.6
|
||||
* @since Beta v0.7.9
|
||||
* @returns Promise<void>
|
||||
*/
|
||||
export async function resizeWindow(): Promise<void> {
|
||||
@@ -117,13 +116,10 @@ export async function resizeWindow(): Promise<void> {
|
||||
const designSize = getWindowSize(windowCur.label);
|
||||
const widthScale = screen.size.width / 1920;
|
||||
const heightScale = screen.size.height / 1080;
|
||||
let targetWidth = Math.round((designSize.width * widthScale) / screen.scaleFactor);
|
||||
let targetHeight = Math.round((designSize.height * heightScale) / screen.scaleFactor);
|
||||
if (type() === "macos") {
|
||||
targetWidth = Math.round(designSize.width * widthScale);
|
||||
targetHeight = Math.round(designSize.height * heightScale);
|
||||
}
|
||||
const targetWidth = Math.round(designSize.width * widthScale);
|
||||
const targetHeight = Math.round(designSize.height * heightScale);
|
||||
await windowCur.setSize(new PhysicalSize(targetWidth, targetHeight));
|
||||
await windowCur.setZoom((1 / screen.scaleFactor) * Math.min(widthScale, heightScale));
|
||||
const targetZoom = Math.min(widthScale, heightScale) / screen.scaleFactor;
|
||||
await windowCur.setZoom(targetZoom);
|
||||
await windowCur.setFocus();
|
||||
}
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
/**
|
||||
* @file utils/toolFunc.ts
|
||||
* @description 一些工具函数
|
||||
* @since Beta v0.7.2
|
||||
* @since Beta v0.7.9
|
||||
*/
|
||||
|
||||
import { AvatarExtResTypeEnum, AvatarExtTypeEnum } from "@enum/bbs.js";
|
||||
import { path } from "@tauri-apps/api";
|
||||
import { type } from "@tauri-apps/plugin-os";
|
||||
import colorConvert from "color-convert";
|
||||
@@ -315,3 +316,33 @@ export function getWikiBrief(
|
||||
}
|
||||
return AppCharacterData.find((item) => item.id.toString() === id.toString()) ?? false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @description 根据传入角色信息获取头像
|
||||
* @since Beta v0.7.9
|
||||
* @param {TGApp.BBS.Reply.User|TGApp.BBS.Post.User} user - 用户信息
|
||||
* @returns {string} 头像链接
|
||||
*/
|
||||
export function getUserAvatar(
|
||||
user: TGApp.BBS.Reply.User | TGApp.BBS.Post.User | TGApp.BBS.User.Info,
|
||||
): string {
|
||||
if (!user.avatar_ext) return user.avatar_url;
|
||||
if (user.avatar_ext.avatar_type === AvatarExtTypeEnum.CUSTOM) return user.avatar_url;
|
||||
if (user.avatar_ext.avatar_type === AvatarExtTypeEnum.GIF) {
|
||||
const findGH = user.avatar_ext.hd_resources.find((i) => i.format === AvatarExtResTypeEnum.GIF);
|
||||
if (findGH) return findGH.url;
|
||||
const findG = user.avatar_ext.resources.find((i) => i.format === AvatarExtResTypeEnum.GIF);
|
||||
if (findG) return findG.url;
|
||||
const findWH = user.avatar_ext.hd_resources.find((i) => i.format === AvatarExtResTypeEnum.WEBP);
|
||||
if (findWH) return findWH.url;
|
||||
const findW = user.avatar_ext.resources.find((i) => i.format === AvatarExtResTypeEnum.WEBP);
|
||||
if (findW) return findW.url;
|
||||
const findPH = user.avatar_ext.hd_resources.find((i) => i.format === AvatarExtResTypeEnum.PNG);
|
||||
if (findPH) return findPH.url;
|
||||
const findP = user.avatar_ext.resources.find((i) => i.format === AvatarExtResTypeEnum.PNG);
|
||||
if (findP) return findP.url;
|
||||
return user.avatar_url;
|
||||
}
|
||||
// TODO: 处理其他类型头像
|
||||
return user.avatar_url;
|
||||
}
|
||||
|
||||