Compare commits
184 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c1cf8b4aa4 | ||
|
|
02bb7b9d6b | ||
|
|
b3a7d92887 | ||
|
|
a46f037075 | ||
|
|
d0669d4a32 | ||
|
|
ae88c4b5ab | ||
|
|
e332dcf384 | ||
|
|
054a0839c6 | ||
|
|
18c96102b3 | ||
|
|
d78b794dc6 | ||
|
|
c9f74537b0 | ||
|
|
da78d27239 | ||
|
|
a3c78ce134 | ||
|
|
59b601a620 | ||
|
|
c8db77f32d | ||
|
|
a542174f54 | ||
|
|
adaa7b1080 | ||
|
|
4713cd4119 | ||
|
|
fbd3d0703d | ||
|
|
0d4ce338f3 | ||
|
|
54b98c7efe | ||
|
|
8e68ca36bb | ||
|
|
8ecaed05ea | ||
|
|
e8a79fb409 | ||
|
|
b6ea50a597 | ||
|
|
547cb2cce7 | ||
|
|
5f6f6e0ea6 | ||
|
|
dd7e8e2261 | ||
|
|
9d995994ca | ||
|
|
a7ca51dcc1 | ||
|
|
0fd9e9a934 | ||
|
|
0464c0fff1 | ||
|
|
0e6a15bd8f | ||
|
|
63b7f685c1 | ||
|
|
aba87dfac0 | ||
|
|
08785514ee | ||
|
|
940ad44052 | ||
|
|
2cdd15b726 | ||
|
|
3c0b02d26b | ||
|
|
72a9408d38 | ||
|
|
b867c008ae | ||
|
|
274eb75754 | ||
|
|
e7bd815b08 | ||
|
|
b7f9d083e7 | ||
|
|
6744c875b6 | ||
|
|
73f7247b59 | ||
|
|
8b5aa106ce | ||
|
|
248130312c | ||
|
|
4f718288c3 | ||
|
|
c7b13983bc | ||
|
|
98dea9d912 | ||
|
|
d5f40a5775 | ||
|
|
f801363440 | ||
|
|
151f854fd3 | ||
|
|
28b9706933 | ||
|
|
e384ac8833 | ||
|
|
70615dd79b | ||
|
|
f0d48e866c | ||
|
|
3a33ca13c7 | ||
|
|
1350ca17df | ||
|
|
4cfb19dc21 | ||
|
|
a98cb5dbd1 | ||
|
|
7c0ad79f67 | ||
|
|
02049dbdd6 | ||
|
|
f154ae4836 | ||
|
|
377caed0f4 | ||
|
|
f6ae5b335a | ||
|
|
00ebacac23 | ||
|
|
c9aafac5d9 | ||
|
|
3bc70bbf46 | ||
|
|
9cf4e7b00e | ||
|
|
ab5dfa9b57 | ||
|
|
f401b8d0a2 | ||
|
|
6494a85397 | ||
|
|
2c2d9d319c | ||
|
|
1c85a0b43b | ||
|
|
e80fb197d2 | ||
|
|
664e87b21c | ||
|
|
fe9737c229 | ||
|
|
c6a9548a43 | ||
|
|
582d2cffb8 | ||
|
|
24e3f11c4a | ||
|
|
1f167845a4 | ||
|
|
53479ac0fb | ||
|
|
67a241471a | ||
|
|
07954d0c24 | ||
|
|
3f0115ecba | ||
|
|
1b817cff5e | ||
|
|
3ed6d503d4 | ||
|
|
86bfc80b57 | ||
|
|
ef710dfb99 | ||
|
|
604108491f | ||
|
|
fb0a6c3ac4 | ||
|
|
a09092c524 | ||
|
|
b7c8fb233f | ||
|
|
aaf685c653 | ||
|
|
6dd9929cc1 | ||
|
|
245edefcec | ||
|
|
c158245618 | ||
|
|
5eb298b9db | ||
|
|
91062485dd | ||
|
|
bb217cf7a8 | ||
|
|
7108741400 | ||
|
|
45debc85d8 | ||
|
|
702fda94bd | ||
|
|
7fd5292174 | ||
|
|
81b1e15e31 | ||
|
|
87a970b776 | ||
|
|
d5ec4b1b0e | ||
|
|
c7f24d2345 | ||
|
|
a54f2f5f53 | ||
|
|
a69fb8ca50 | ||
|
|
d15cece933 | ||
|
|
6a3d2d6b36 | ||
|
|
dd65bb565d | ||
|
|
f4678be198 | ||
|
|
dbed43bf7e | ||
|
|
5357df3743 | ||
|
|
02ddb441a0 | ||
|
|
2a83fcbcb8 | ||
|
|
1e47b4fd29 | ||
|
|
2f8f77940d | ||
|
|
f7c59bbd3c | ||
|
|
ad1e8339ac | ||
|
|
da5fae7e3c | ||
|
|
f47c1619e8 | ||
|
|
d56ed5f64a | ||
|
|
202b31e6fa | ||
|
|
5f77344fa3 | ||
|
|
3fd33176a4 | ||
|
|
a90779f992 | ||
|
|
1efab84da0 | ||
|
|
116d29823e | ||
|
|
53c045e419 | ||
|
|
3fef8467f4 | ||
|
|
e1f85d1d92 | ||
|
|
878eef66fa | ||
|
|
be4e2c1039 | ||
|
|
62171b78d9 | ||
|
|
7932de8654 | ||
|
|
c6f45f0a35 | ||
|
|
9b1fa22cbe | ||
|
|
63929bc9fd | ||
|
|
53f2612d32 | ||
|
|
c17339bab5 | ||
|
|
8a89883784 | ||
|
|
4bc1808478 | ||
|
|
c7b5bf34ef | ||
|
|
6b66467cff | ||
|
|
680a54a0f1 | ||
|
|
2f60e128a5 | ||
|
|
863246707f | ||
|
|
8f0853c41b | ||
|
|
3166567486 | ||
|
|
82f937a33e | ||
|
|
6974ada1c0 | ||
|
|
0c24b95fff | ||
|
|
c87ec77543 | ||
|
|
36b0d198a9 | ||
|
|
76f8bc3c16 | ||
|
|
f655b6b235 | ||
|
|
83e0d35245 | ||
|
|
10a5b88d24 | ||
|
|
afe53f3d30 | ||
|
|
b8afab093f | ||
|
|
ac6dbe0cdf | ||
|
|
20b9631468 | ||
|
|
857d99361a | ||
|
|
eaa07601a5 | ||
|
|
d88e1d1429 | ||
|
|
da4a095618 | ||
|
|
d35b94f79f | ||
|
|
272f3bc14a | ||
|
|
a2ce468e2f | ||
|
|
6b8cbe0e57 | ||
|
|
dafcc30239 | ||
|
|
044059beb0 | ||
|
|
eea9287cfa | ||
|
|
8020d623e3 | ||
|
|
74ff33e1fb | ||
|
|
cae2a0a1e6 | ||
|
|
45bc398626 | ||
|
|
7b5bf201ce | ||
|
|
8df9370932 |
12
.github/workflows/build.yml
vendored
@@ -26,6 +26,14 @@ jobs:
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
- name: Setup SSH
|
||||
uses: webfactory/ssh-agent@v0.9.0
|
||||
with:
|
||||
ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }}
|
||||
- name: Add SSH known hosts
|
||||
run: ssh-keyscan -t rsa github.com >> ~/.ssh/known_hosts
|
||||
- name: Test SSH connection
|
||||
run: ssh -T git@github.com || true
|
||||
- name: Add Rust targets(macOS Intel)
|
||||
if: matrix.settings.target == 'macos-intel'
|
||||
run: rustup target add x86_64-apple-darwin
|
||||
@@ -43,11 +51,11 @@ jobs:
|
||||
- name: setup node
|
||||
uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: 23.1.0
|
||||
node-version: 23.3.0
|
||||
- name: setup pnpm
|
||||
uses: pnpm/action-setup@v2
|
||||
with:
|
||||
version: 9.12.3
|
||||
version: 9.15.0
|
||||
- name: Install frontend dependencies
|
||||
run: pnpm install
|
||||
|
||||
|
||||
4
.github/workflows/qodana_code_quality.yml
vendored
@@ -12,11 +12,11 @@ jobs:
|
||||
- name: setup node
|
||||
uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: 23.1.0
|
||||
node-version: 23.3.0
|
||||
- name: setup pnpm
|
||||
uses: pnpm/action-setup@v2
|
||||
with:
|
||||
version: 9.12.3
|
||||
version: 9.15.0
|
||||
- name: Install dependencies
|
||||
run: pnpm install --no-frozen-lockfile
|
||||
- name: "Qodana Scan"
|
||||
|
||||
68
.github/workflows/test.yml
vendored
Normal file
@@ -0,0 +1,68 @@
|
||||
name: Build Test
|
||||
on:
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
version:
|
||||
description: "Version to build"
|
||||
required: true
|
||||
default: "0.1.0"
|
||||
|
||||
jobs:
|
||||
build-tauri:
|
||||
permissions:
|
||||
contents: write
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
settings:
|
||||
- platform: windows-latest
|
||||
args: ""
|
||||
target: "windows"
|
||||
bundlePath: msi/
|
||||
- platform: macos-latest
|
||||
args: "--target x86_64-apple-darwin"
|
||||
target: "macos-intel"
|
||||
bundlePath: macos/TeyvatGuide.app
|
||||
- platform: macos-latest
|
||||
args: "--target aarch64-apple-darwin"
|
||||
target: "macos-arm"
|
||||
bundlePath: macos/TeyvatGuide.app
|
||||
runs-on: ${{ matrix.settings.platform }}
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
- name: Setup SSH
|
||||
uses: webfactory/ssh-agent@v0.9.0
|
||||
with:
|
||||
ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }}
|
||||
- name: Add SSH known hosts
|
||||
run: ssh-keyscan -t rsa github.com >> ~/.ssh/known_hosts
|
||||
- name: Test SSH connection
|
||||
run: ssh -T git@github.com || true
|
||||
- name: Rust setup
|
||||
uses: dtolnay/rust-toolchain@stable
|
||||
- name: Add Rust targets(macOS Intel)
|
||||
if: matrix.settings.target == 'macos-intel'
|
||||
run: rustup target add x86_64-apple-darwin
|
||||
- name: Add Rust targets(macOS ARM)
|
||||
if: matrix.settings.target == 'macos-arm'
|
||||
run: rustup target add aarch64-apple-darwin
|
||||
- name: setup node
|
||||
uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: 23.3.0
|
||||
- name: setup pnpm
|
||||
uses: pnpm/action-setup@v2
|
||||
with:
|
||||
version: 9.15.0
|
||||
- name: Install frontend dependencies
|
||||
run: pnpm install
|
||||
- name: Build app
|
||||
run: pnpm build ${{ matrix.settings.args }}
|
||||
- name: Upload Artifact
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: TeyvatGuide_v${{ github.event.inputs.version }}_${{ matrix.settings.target }}
|
||||
path: src-tauri/target/release/bundle/${{ matrix.settings.bundlePath }}
|
||||
if-no-files-found: error
|
||||
@@ -16,3 +16,4 @@ qodana.yaml
|
||||
# data
|
||||
!src/data/**/*.json
|
||||
src-tauri/gen/*.json
|
||||
!eslint
|
||||
|
||||
@@ -5,10 +5,11 @@ extends:
|
||||
- stylelint-config-standard-vue
|
||||
- stylelint-config-idiomatic-order
|
||||
plugins:
|
||||
- stylelint-scss
|
||||
- stylelint-prettier
|
||||
- stylelint-order
|
||||
rules:
|
||||
prettier/prettier: true
|
||||
property-no-vendor-prefix:
|
||||
- true
|
||||
- ignoreProperties: [backdrop-filter]
|
||||
prettier/prettier: true
|
||||
|
||||
101
CHANGELOG.md
@@ -2,14 +2,109 @@
|
||||
Author: 目棃
|
||||
Description: CHANGELOG
|
||||
Date: 2024-10-09
|
||||
Update: 2024-10-31
|
||||
Update: 2025-01-22
|
||||
---
|
||||
|
||||
> 本文档 [`Frontmatter`](https://github.com/BTMuli/MuCli#Frontmatter) 由 [MuCli](https://github.com/BTMuli/Mucli) 自动生成于 `2024-10-09 15:51:43`
|
||||
>
|
||||
> 更新于 `2024-10-31 10:36:33`
|
||||
> 更新于 `2025-01-22 10:59:31`
|
||||
|
||||
## [0.6.2](https://github.com/BTMuli/TeyvatGuide/releases/v0.6.2)
|
||||
## [0.6.8](https://github.com/BTMuli/TeyvatGuide/releases/v0.6.8) (2025-01-22)
|
||||
|
||||
- ✨ 扫码登录
|
||||
- ✨ 调整祈愿记录图表样式,新增祈愿日历&祈愿堆叠柱状图
|
||||
- ✨ 支持配置帖子详情图像质量,默认80%
|
||||
- ✨ 支持帖子详情图像查看原图,当质量配置为100%时,该按钮不显示
|
||||
- ✨ 深渊上传支持胡桃账户设置
|
||||
- 🚸 降低祈愿全量刷新耗时
|
||||
- 🚸 加快帖子加载速度,降低内存占用
|
||||
- 💄 调整角色卡片样式
|
||||
- 💄 调整角色名片样式,增加描述清晰度
|
||||
- 💄 调整深渊Wiki队伍搭配窗口高度
|
||||
- 💄 mac下不显示分享设置
|
||||
- 💄 调整战绩页新洞天渲染样式
|
||||
- 🔥 深渊Wiki移除第10层数据
|
||||
- 🐛 修复深渊数据恢复异常
|
||||
- 🐛 修复 loading 组件 empty 状态设置异常
|
||||
- ♻️ 优化帖子加载逻辑,当刷新内容不足20条时,下次刷新数量为20-当前数量,如刷新数量为19条,则下次刷新数量为1条
|
||||
- ♻️ 动态获取分区列表&版块列表
|
||||
- ♻️ 重构部分路由处理,当话题/帖子切换分区/版块时,页面刷新不重置当前分区/版块
|
||||
|
||||
## [0.6.7](https://github.com/BTMuli/TeyvatGuide/releases/v0.6.7) (2024-12-31)
|
||||
|
||||
- 🍱 更新5.3版本游戏资源 [`#139`](https://github.com/BTMuli/TeyvatGuide/issues/139)
|
||||
- ✨ 支持嵌入B站视频的分享图渲染
|
||||
- 🐛 修复版块跳转异常
|
||||
- 🐛 修复清理日志异常
|
||||
- 🐛 修复特定帖子`link_card_ids`数据解析异常
|
||||
- 🐛 修复帖子文本居中异常
|
||||
- 🐛 修复侧边栏跳转角色/武器图鉴异常
|
||||
- ✏️ 调整分享图大小计算方式,采用1024进制而非原有的1000进制
|
||||
- 💄 调整用户等级UI,浅色深色下统一为白色文字
|
||||
- 💄 调整回复弹窗位置,上移一段距离以避免底部提示遮挡
|
||||
- 💄 首页素材日历组件只显示日期,移除具体时间
|
||||
- 💄 调整链接卡片提示文字
|
||||
- 💄 调整剧诗角色列表显示UI
|
||||
- 🚸 版块/咨讯页数据获取/刷新显示成功提示
|
||||
- 🚸 首页近期活动卡片Icon补充缺失的点击逻辑
|
||||
- 🚸 调整合集组件改版后的滚动逻辑,更加流畅
|
||||
- 👽️ 由于API变更,调整版块数据获取逻辑
|
||||
- 👽️ 由于返回数据格式变更,调整视频时长的计算逻辑
|
||||
- 👽️ 由于返回数据格式变更,处理帖子内的转义字符
|
||||
- ♻️ loading组件重构,部分页面显示更精准的进度
|
||||
- ♻️ 应用元数据格式重构,剔除冗余数据
|
||||
|
||||
## [0.6.6](https://github.com/BTMuli/TeyvatGuide/releases/v0.6.6) (2024-12-13)
|
||||
|
||||
- 🐛 修复主题切换响应异常
|
||||
- 🐛 修复增量刷新逻辑异常
|
||||
- ⚡️ 显著降低运行内存占用
|
||||
|
||||
## [0.6.5](https://github.com/BTMuli/TeyvatGuide/releases/v0.6.5) (2024-12-11)
|
||||
|
||||
- 🍱 添加下半卡池数据&部分资源
|
||||
- ✨ 帖子内容中涉及的话题链接支持应用内跳转
|
||||
- ♻️ 首页组件加载逻辑重构
|
||||
- ✨ UIGF4导入/导出浮窗,支持自选UID
|
||||
- 💄 调整剧诗部分数据缺失时的显示
|
||||
- 🐛 调整部分UI,修复切换账户后角色详情刷新异常
|
||||
|
||||
## [0.6.4](https://github.com/BTMuli/TeyvatGuide/releases/v0.6.4) (2024-12-03)
|
||||
|
||||
- 🐛 修复子回复渲染异常
|
||||
- ✏️ 祈愿记录将验证非空ID
|
||||
- 🐛 修复战绩分享图渲染异常
|
||||
- 🐛 修复`dialog`组件`input`默认值无效
|
||||
- 🎨 调整帖子查找overlay逻辑
|
||||
- ✨ 分享图生成阈值自定义
|
||||
- 👽️ 全量刷新时清理旧数据,修复由于米哈游数据异常导致的重复数据
|
||||
|
||||
## [0.6.3](https://github.com/BTMuli/TeyvatGuide/releases/v0.6.3) (2024-11-19)
|
||||
|
||||
- 🐛 修复用户战绩角色数据`undefined`
|
||||
- 🐛 修复咨讯页加载更多异常
|
||||
- 🐛 修复验证码登录提示`-100`,数据刷新后若为已登录UID则不会再提示切换
|
||||
- 🐛 修复部分公告渲染异常
|
||||
- 🐛 修复成就页面在存在搜索内容时点击左侧成就系列无响应
|
||||
- ✨ 帖子新增 UID 卡片解析&渲染
|
||||
- ✨ 帖子新增自定义表情解析&渲染
|
||||
- ✨ 真境剧诗适配,新增真境剧诗页面,支持获取&分享&上传(胡桃数据库),可通过深渊页面进入
|
||||
- ✨ 新增话题页面,可通过帖子卡片标签点击或帖子详情顶部标签点击进入
|
||||
- ✨ 更完善的`loading`显示,调整了组件UI
|
||||
- 🍱 更新5.2版本资源 [`#133`](https://github.com/BTMuli/TeyvatGuide/issues/133)
|
||||
- 💄 调整祈愿记录UP四星颜色
|
||||
- 💄 修复帖子页兑换码弹窗高度异常
|
||||
- 💄 调整帖子卡片UI,增加显示帖子话题(如存在),话题&版块支持点击跳转
|
||||
- 💄 调整帖子详情页UI,顶部话题&版块支持点击跳转
|
||||
- 💄 调整帖子显示数量,支持加载更多,默认排序改为`最新回复`,移除`默认排序`,增加`热门`排序
|
||||
- 💄 咨讯、帖子等页面刷新时自动滚动到顶部
|
||||
- 🔥 深渊数据库显示移除第9层统计数据
|
||||
- 👽️ 米游社子窗口增加`genshinnet`域名支持
|
||||
- 🎨 优化帖子详情数据加载的错误处理
|
||||
- ♻️ `snackbar`、`confirm`、`loading`组件重构
|
||||
- ♻️ 请求模块重构
|
||||
|
||||
## [0.6.2](https://github.com/BTMuli/TeyvatGuide/releases/v0.6.2) (2024-10-31)
|
||||
|
||||
- 🐛 修复用户登录状态异常 [`#132`](https://github.com/BTMuli/TeyvatGudie/issues/132)
|
||||
- 💄 帖子子回复取消保持,点击其他隐藏
|
||||
|
||||
25
README.md
@@ -2,12 +2,12 @@
|
||||
Author: 目棃
|
||||
Description: 说明文档
|
||||
Date: 2023-03-05
|
||||
Update: 2024-10-07
|
||||
Update: 2025-01-22
|
||||
---
|
||||
|
||||
> 本文档 [`Frontmatter`](https://github.com/BTMuli/MuCli#Frontmatter) 由 [MuCli](https://github.com/BTMuli/Mucli) 自动生成于 `2023-03-05 14:41:55`
|
||||
>
|
||||
> 更新于 `2024-10-07 21:51:00`
|
||||
> 更新于 `2025-01-22 10:48:07`
|
||||
|
||||
 
|
||||
|
||||
@@ -49,6 +49,7 @@ Game Tool for Genshin Impact player, supports Windows and macOS.
|
||||
- [x] 游戏内公告&活动获取
|
||||
- [x] 米游社官方帖获取(支持通过 ID 获取)
|
||||
- [x] 米游社各分区帖子获取(支持通过 ID 获取)
|
||||
- [x] 米游社话题帖子获取(通过话题点击跳转)
|
||||
- [x] 成就管理(UIAF v1.1),支持 [`YaeAchievement`](https://github.com/HolographicHat/YaeAchievement) 导入
|
||||
- [x] 祈愿管理(UIGF v3.0,UIGF v4.0)
|
||||
- [x] 留影叙佳期画片查看
|
||||
@@ -57,10 +58,14 @@ Game Tool for Genshin Impact player, supports Windows and macOS.
|
||||
|
||||
- 登陆功能:
|
||||
|
||||
- [x] 原神战绩数据获取
|
||||
- [x] 角色详情数据获取
|
||||
- [x] 螺旋深渊数据获取
|
||||
- [x] 祈愿数据获取(近一年)
|
||||
> 支持 扫码/验证码/Cookie 登陆,支持多账号管理
|
||||
|
||||
- [x] 原神战绩数据获取
|
||||
- [x] 角色详情数据获取
|
||||
- [x] 螺旋深渊数据获取
|
||||
- [x] 真境剧诗数据获取
|
||||
- [x] 祈愿数据获取(近一年)
|
||||
- [x] 用户收藏帖子获取
|
||||
|
||||
- Wiki 功能:
|
||||
|
||||
@@ -93,14 +98,14 @@ Game Tool for Genshin Impact player, supports Windows and macOS.
|
||||
- Changelog: [CHANGELOG](CHANGELOG.md)
|
||||
- 资源来源:[项目资源说明](docs/项目资源说明.md)
|
||||
- UIAF:[UIAF v1.1](docs/UIAF.md)
|
||||
- UIGF:[UIGF v3.0](docs/UIGF.md)
|
||||
- UIGF:[UIGF v3.0](docs/UIGF3.md),[UIGF v4.0](docs/UIGF.md)
|
||||
- [macOS 平台门禁属性导致应用无法打开应用的修复指引](docs/macos-gatekeeper/README.md)
|
||||
|
||||
## 特定项目 / Special Project
|
||||
|
||||
- [MuCli](https://github.com/BTMuli/MuCli):基于 NodeJS 的命令行工具,用于生成项目文档。
|
||||
- [TGAssistant](https://github.com/BTMuli/TGAssistant):Teyvat Guide 的资源获取、解析、处理仓库。
|
||||
- ~~[WhiteTea](https://github.com/BTMuli/WhiteTea):Github Bot,(半)自动化处理 Teyvat Guide 的 Issue 和 Pull Request。~~ 服务已挂T_T
|
||||
- [WhiteTea](https://github.com/BTMuli/WhiteTea):Github Bot,(半)自动化处理 Teyvat Guide 的 Issue 和 Pull Request。
|
||||
|
||||
## 技术栈 / Tech Stack
|
||||
|
||||
@@ -122,7 +127,7 @@ Game Tool for Genshin Impact player, supports Windows and macOS.
|
||||
|
||||
应用版本号遵循 [Semantic Versioning 2.0.0](https://semver.org/lang/zh-CN/) 规范。
|
||||
|
||||
隐私政策:[Privacy](https://app.btmuli.ink/docs/privacy.html)
|
||||
隐私政策:[Privacy](https://app.btmuli.ink/docs/TeyvatGuide/privacy.html)
|
||||
|
||||
## 鸣谢 / Thanks
|
||||
|
||||
@@ -140,3 +145,5 @@ Game Tool for Genshin Impact player, supports Windows and macOS.
|
||||
感谢 JetBrains 提供的开源许可证。
|
||||
|
||||

|
||||
|
||||
[](https://star-history.com/#BTMuli/TeyvatGuide&Timeline)
|
||||
|
||||
445
docs/UIGF.md
@@ -1,190 +1,371 @@
|
||||
---
|
||||
Author: 目棃
|
||||
Description: UIGF v2.4 Backup
|
||||
Date: 2023-11-15
|
||||
Update: 2024-03-13
|
||||
Description: UIGF v4 Backup
|
||||
Date: 2024-11-11
|
||||
Update: 2024-11-11
|
||||
---
|
||||
|
||||
> 本文档 [`Frontmatter`](https://github.com/BTMuli/MuCli#Frontmatter) 由 [MuCli](https://github.com/BTMuli/Mucli) 自动生成于 `2023-11-15 20:58:36`
|
||||
> 本文档 [`Frontmatter`](https://github.com/BTMuli/MuCli#Frontmatter) 由 [MuCli](https://github.com/BTMuli/Mucli) 自动生成于 `2024-11-11 11:57:27`
|
||||
>
|
||||
> 更新于 `2024-03-13 15:50:36`
|
||||
> 更新于 `2024-11-11 11:57:27`
|
||||
|
||||
> 本文档为 [UIGF v3.0](https://github.com/UIGF-org/UIGF-org.github.io/blob/main/docs/zh/standards/UIGF.md) 的备份,仅供参考。
|
||||
> 本文档为 [UIGF v4.0](https://github.com/UIGF-org/UIGF-org.github.io/blob/main/docs/zh/standards/uigf.md) 的备份,仅供参考。
|
||||
|
||||
# 统一可交换抽卡记录标准 v3.0
|
||||
# 统一可交换抽卡记录标准 v4.0
|
||||
|
||||
> Uniformed Interchangeable GachaLog Format standard (UIGF) v3.0 <Badge text="Current" type="message" />
|
||||
>
|
||||
> ::: warning UIGF 标准使用声明
|
||||
> 应用必须在同时支持 UIGF 数据格式**导入**和**导出**功能并在相关功能区域或文档中提供跳转至 [UIGF-Org](https://uigf.org) 的超链接后声明支持 UIGF 格式
|
||||
> Uniformed Interchangeable GachaLog Format standard (UIGF) v4.0 <Badge text="Current" type="message" />
|
||||
|
||||
仅包含导入或导出功能降低了用户数据可流通性,且将数据至于用户不可控的风险中,不符合 UIGF-Org 设计的初衷。
|
||||
::: warning 中断性更新警告
|
||||
`UIGF v4.0 及更高版本` 对于 `UIGF v3.0 及更低版本` 和 `SRGF v1.0` **不具备向下兼容性**。UIGF/SRGF 合作项目如需适配,需重新认证。
|
||||
:::
|
||||
|
||||
## 更新记录
|
||||
|
||||
| 版本 | 说明 | 兼容 |
|
||||
| ----------------------------- | ---------------------------------------------------------- | -------------- |
|
||||
| `v2.0` | 首个正式版本 | v2.0 |
|
||||
| `v2.1` | 简化了部分语言表述,与 v2.0在数据格式上完全一致 | v2.1 and lower |
|
||||
| [`v2.2`](UIGF-legacy-v2.2.md) | 新增 `info.export_timestamp` 填充 UNIX 时间戳 | v2.2 and lower |
|
||||
| [`v2.3`](UIGF-legacy-v2.3.md) | 扩充至非中文语境,使用 Json Schema 表述。移除了 Excel 格式 | v2.3 and lower |
|
||||
| [`v2.4`](UIGF-legacy-v2.4.md) | 新增 `info.region_time_zone` 支持时区处理 | v2.4 and lower |
|
||||
| `v3.0` | 新增 集录祈愿类型支持 | v3.0 and lower |
|
||||
| 版本 | 说明 | 兼容 |
|
||||
| ------ | --------------------------------- | --------------- |
|
||||
| `v3.0` | 低版本的更新日志请查看历史版本 | v3.0 及更低版本 |
|
||||
| `v4.0` | 合并 SRGF,新增绝区零抽卡格式支持 | v4.0 |
|
||||
|
||||
### v3.0 更新内容
|
||||
## 前言
|
||||
|
||||
- `gacha_type` 增加新枚举项
|
||||
- 在 `gacha_type` 枚举新增值为 `500` 的项,用于表示集录祈愿类型
|
||||
为了统一不同应用、不同游戏、不同账号间的抽卡记录导入导出行为,我们决定将所有支持的游戏抽卡格式合并入 UIGF 中。不同的游戏、不同的账号将能够以单个文件或字符串的形式进行表示,导入与导出操作对用户而言将变得史无前例的简单。
|
||||
|
||||
## `info` 字段说明
|
||||
## 实现与认证
|
||||
|
||||
### `region_time_zone`
|
||||
实现 `UIGF v4.0 及更高版本`格式的导入导出并不意味着需要移除对 `UIGF v3.0 及更低版本`或 `SRGF v1.0` 的导入导出支持。但是,不建议对 `UIGF v4.0 和更高版本` 与 `UIGF v3.0 及更低版本`或 `SRGF v1.0` 使用同一套导入导出逻辑。
|
||||
|
||||
由于在获取祈愿记录时得到的`time`为服务器时间,为了准确判断时间的时区偏移,引入此字段。
|
||||
导出方可以选择性地填充针对每个游戏的字段或直接忽略;导入方可以选择性地读取针对每个游戏的字段或直接忽略。
|
||||
|
||||
与 SRGF 不同,由于无法直接从服务器获取`region_time_zone`,在导出方未提供此字段时,需要根据 `uid` 进行推断。
|
||||
针对对某一款游戏的支持,必须同时实现数据的导入和导出功能,否则将无法通过认证。
|
||||
|
||||
#### 映射关系
|
||||
::: info UIGF 标准使用声明
|
||||
请在应用内提供跳转至 [UIGF-Org](https://uigf.org) 的超链接,声明支持 UIGF 数据格式。
|
||||
|
||||
| `uid`首个字符 | `region_time_zone` | 游戏服务器 |
|
||||
| ------------- | ------------------ | --------------------------------- |
|
||||
| `'6'` | `-5` | os_usa |
|
||||
| `'7'` | `1` | os_euro |
|
||||
| 剩余情况 | `8` | os_cht, os_asia, cn_gf01, cn_qd01 |
|
||||
|
||||
App 不应假定 `region_time_zone` 的值为上表中给出的值,应具有处理非标准 `region_time_zone` 值的能力。
|
||||
若 `region_time_zone` 的值与 `uid` 推断结果不一致,则优先选择 `region_time_zone` 给出的值。
|
||||
|
||||
## `list` 字段说明
|
||||
|
||||
### `id`
|
||||
|
||||
物品内包含了一项较为特殊的字段: `id`,为原神官方 API 中包含的,代表每条抽卡记录唯一性的 `id`。App 导出 UIGF 时
|
||||
|
||||
- 需要确保每个物品都有一个有效的唯一 `id`
|
||||
- 若有记录中不包含`id`,则应从下一个自带有效 `id` 的物品开始,为每条缺失`id`字段的数据补全`id`。
|
||||
赋值数据向前(时间排序)依次递减,每次递减的值应保持为 `1`
|
||||
|
||||
### `gacha_type`
|
||||
|
||||
由于存在会共享保底与概率的卡池,所以需要一个额外的字段来界定
|
||||
我们在 `UIGF` 的所有格式中注入了 `uigf_gacha_type` 字段
|
||||
在导出到 `UIGF` 格式时需要注意添加对应的 `uigf_gacha_type` 字段
|
||||
|
||||
#### 映射关系
|
||||
|
||||
| `uigf_gacha_type` | `gacha_type` |
|
||||
| ----------------- | -------------- |
|
||||
| `100` | `100` |
|
||||
| `200` | `200` |
|
||||
| `301` | `301` or `400` |
|
||||
| `302` | `302` |
|
||||
| `500` | `500` |
|
||||
|
||||
### `item_id`
|
||||
|
||||
物品游戏内ID,你可以通过 [UIGF API](../API.md) 获取这一数据
|
||||
仅包含导入或导出功能降低了用户数据的流通性,且将数据置于用户不可控的风险中,不符合 UIGF-Org 设计的初衷。
|
||||
:::
|
||||
|
||||
## Json Schema
|
||||
|
||||
> UIGF-Org 提供[Json Schema](/schema/uigf.json) 用于验证
|
||||
> UIGF-Org 提供下述 Json Schema 以用于验证资料结构的正确性。
|
||||
|
||||
::: warning 注意字段类型
|
||||
开发者务必遵循 Schema 内定义的字段类型。使用错误的类型可能会导致其他由强类型编程语言编写的工具在解析 Json 文件时产生错误,进而导致数据转移失败。
|
||||
|
||||
为了避免这类问题,我们建议您针对 UIGF 格式设计专用的数据结构。同时,设计相关的单元测试以确保导入导出的一致性。
|
||||
|
||||
我们也提供 [UIGF 格式校验工具](https://schema.uigf.org/?schema=uigf)来帮助你校验 Json 文件。
|
||||
:::
|
||||
|
||||
```json
|
||||
{
|
||||
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"info": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"uid": {
|
||||
"type": "string",
|
||||
"title": "导出记录的 UID"
|
||||
},
|
||||
"lang": {
|
||||
"type": "string",
|
||||
"title": "语言 languagecode2-country/regioncode2"
|
||||
},
|
||||
"export_timestamp": {
|
||||
"type": "number",
|
||||
"title": "导出 UNIX 时间戳(秒)"
|
||||
},
|
||||
"export_time": {
|
||||
"type": "string",
|
||||
"title": "导出时间",
|
||||
"description": "yyyy-MM-dd HH:mm:ss"
|
||||
"oneOf": [
|
||||
{
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"type": "integer"
|
||||
}
|
||||
],
|
||||
"description": "导出档案的时间戳,秒级"
|
||||
},
|
||||
"export_app": {
|
||||
"type": "string",
|
||||
"title": "导出 App 名称"
|
||||
"description": "导出档案的 App 名称"
|
||||
},
|
||||
"export_app_version": {
|
||||
"type": "string",
|
||||
"title": "导出 App 版本"
|
||||
"description": "导出档案的 App 版本"
|
||||
},
|
||||
"uigf_version": {
|
||||
"version": {
|
||||
"type": "string",
|
||||
"title": "UIGF 版本号",
|
||||
"pattern": "v\\d+\\.\\d+"
|
||||
},
|
||||
"region_time_zone": {
|
||||
"type": "number",
|
||||
"title": "区域时区偏移"
|
||||
"pattern": "^v\\d+\\.\\d+$",
|
||||
"description": "导出档案的 UIGF 版本号,格式为 'v{major}.{minor}',如 v4.0"
|
||||
}
|
||||
},
|
||||
"required": ["uid", "uigf_version"],
|
||||
"title": "UIGF 导出信息"
|
||||
"required": ["export_timestamp", "export_app", "export_app_version", "version"]
|
||||
},
|
||||
"list": {
|
||||
"hk4e": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"uigf_gacha_type": {
|
||||
"type": "string",
|
||||
"title": "UIGF 卡池类型",
|
||||
"description": "用于区分卡池类型不同,但卡池保底计算相同的物品"
|
||||
"uid": {
|
||||
"oneOf": [
|
||||
{
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"type": "integer"
|
||||
}
|
||||
],
|
||||
"description": "UID"
|
||||
},
|
||||
"gacha_type": {
|
||||
"type": "string",
|
||||
"title": "卡池类型"
|
||||
"timezone": {
|
||||
"type": "integer",
|
||||
"description": "时区偏移,由米哈游 API 返回,若与服务器时区不同请注意 list 中 time 的转换"
|
||||
},
|
||||
"item_id": {
|
||||
"lang": {
|
||||
"type": "string",
|
||||
"title": "物品的内部 ID"
|
||||
"description": "语言代码",
|
||||
"enum": [
|
||||
"de-de",
|
||||
"en-us",
|
||||
"es-es",
|
||||
"fr-fr",
|
||||
"id-id",
|
||||
"it-it",
|
||||
"ja-jp",
|
||||
"ko-kr",
|
||||
"pt-pt",
|
||||
"ru-ru",
|
||||
"th-th",
|
||||
"tr-tr",
|
||||
"vi-vn",
|
||||
"zh-cn",
|
||||
"zh-tw"
|
||||
]
|
||||
},
|
||||
"count": {
|
||||
"type": "string",
|
||||
"title": "个数,一般为1"
|
||||
},
|
||||
"time": {
|
||||
"type": "string",
|
||||
"title": "获取物品的时间"
|
||||
},
|
||||
"name": {
|
||||
"type": "string",
|
||||
"title": "物品名称"
|
||||
},
|
||||
"item_type": {
|
||||
"type": "string",
|
||||
"title": "物品类型"
|
||||
},
|
||||
"rank_type": {
|
||||
"type": "string",
|
||||
"title": "物品等级"
|
||||
},
|
||||
"id": {
|
||||
"type": "string",
|
||||
"title": "记录内部 ID"
|
||||
"list": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"uigf_gacha_type": {
|
||||
"type": "string",
|
||||
"description": "UIGF 卡池类型,用于区分卡池类型不同,但卡池保底计算相同的物品",
|
||||
"enum": ["100", "200", "301", "302", "500"]
|
||||
},
|
||||
"gacha_type": {
|
||||
"type": "string",
|
||||
"description": "卡池类型,米哈游 API 返回",
|
||||
"enum": ["100", "200", "301", "302", "400", "500"]
|
||||
},
|
||||
"item_id": {
|
||||
"type": "string",
|
||||
"description": "物品的内部 ID"
|
||||
},
|
||||
"count": {
|
||||
"type": "string",
|
||||
"description": "物品个数,一般为1,米哈游 API 返回"
|
||||
},
|
||||
"time": {
|
||||
"type": "string",
|
||||
"description": "抽取物品时对应时区(timezone)下的当地时间"
|
||||
},
|
||||
"name": {
|
||||
"type": "string",
|
||||
"description": "物品名称,米哈游 API 返回"
|
||||
},
|
||||
"item_type": {
|
||||
"type": "string",
|
||||
"description": "物品类型,米哈游 API 返回"
|
||||
},
|
||||
"rank_type": {
|
||||
"type": "string",
|
||||
"description": "物品等级,米哈游 API 返回"
|
||||
},
|
||||
"id": {
|
||||
"type": "string",
|
||||
"description": "记录内部 ID,米哈游 API 返回"
|
||||
}
|
||||
},
|
||||
"required": ["uigf_gacha_type", "gacha_type", "item_id", "time", "id"]
|
||||
}
|
||||
}
|
||||
},
|
||||
"required": ["uigf_gacha_type", "gacha_type", "id", "item_id", "time"],
|
||||
"title": "UIGF 物品"
|
||||
},
|
||||
"title": "物品列表"
|
||||
"required": ["uid", "timezone", "list"]
|
||||
}
|
||||
},
|
||||
"hkrpg": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"uid": {
|
||||
"oneOf": [
|
||||
{
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"type": "integer"
|
||||
}
|
||||
],
|
||||
"description": "UID"
|
||||
},
|
||||
"timezone": {
|
||||
"type": "integer",
|
||||
"description": "时区偏移,由米哈游 API 返回,若与服务器时区不同请注意 list 中 time 的转换"
|
||||
},
|
||||
"lang": {
|
||||
"type": "string",
|
||||
"description": "语言代码",
|
||||
"enum": [
|
||||
"de-de",
|
||||
"en-us",
|
||||
"es-es",
|
||||
"fr-fr",
|
||||
"id-id",
|
||||
"it-it",
|
||||
"ja-jp",
|
||||
"ko-kr",
|
||||
"pt-pt",
|
||||
"ru-ru",
|
||||
"th-th",
|
||||
"tr-tr",
|
||||
"vi-vn",
|
||||
"zh-cn",
|
||||
"zh-tw"
|
||||
]
|
||||
},
|
||||
"list": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"gacha_id": {
|
||||
"type": "string",
|
||||
"description": "卡池 Id"
|
||||
},
|
||||
"gacha_type": {
|
||||
"type": "string",
|
||||
"description": "卡池类型",
|
||||
"enum": ["1", "2", "11", "12"]
|
||||
},
|
||||
"item_id": {
|
||||
"type": "string",
|
||||
"description": "物品的内部 ID"
|
||||
},
|
||||
"count": {
|
||||
"type": "string",
|
||||
"description": "物品个数,一般为1,米哈游 API 返回"
|
||||
},
|
||||
"time": {
|
||||
"type": "string",
|
||||
"description": "抽取物品时对应时区(timezone)下的当地时间"
|
||||
},
|
||||
"name": {
|
||||
"type": "string",
|
||||
"description": "物品名称,米哈游 API 返回"
|
||||
},
|
||||
"item_type": {
|
||||
"type": "string",
|
||||
"description": "物品类型,米哈游 API 返回"
|
||||
},
|
||||
"rank_type": {
|
||||
"type": "string",
|
||||
"description": "物品等级,米哈游 API 返回"
|
||||
},
|
||||
"id": {
|
||||
"type": "string",
|
||||
"description": "记录内部 ID,米哈游 API 返回"
|
||||
}
|
||||
},
|
||||
"required": ["gacha_type", "gacha_id", "time", "item_id", "id"]
|
||||
}
|
||||
}
|
||||
},
|
||||
"required": ["uid", "timezone", "list"]
|
||||
}
|
||||
},
|
||||
"nap": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"uid": {
|
||||
"oneOf": [
|
||||
{
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"type": "integer"
|
||||
}
|
||||
],
|
||||
"description": "UID"
|
||||
},
|
||||
"timezone": {
|
||||
"type": "integer",
|
||||
"description": "时区偏移,由米哈游 API 返回,若与服务器时区不同请注意 list 中 time 的转换"
|
||||
},
|
||||
"lang": {
|
||||
"type": "string",
|
||||
"description": "语言代码",
|
||||
"enum": [
|
||||
"de-de",
|
||||
"en-us",
|
||||
"es-es",
|
||||
"fr-fr",
|
||||
"id-id",
|
||||
"it-it",
|
||||
"ja-jp",
|
||||
"ko-kr",
|
||||
"pt-pt",
|
||||
"ru-ru",
|
||||
"th-th",
|
||||
"tr-tr",
|
||||
"vi-vn",
|
||||
"zh-cn",
|
||||
"zh-tw"
|
||||
]
|
||||
},
|
||||
"list": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"gacha_id": {
|
||||
"type": "string",
|
||||
"description": "卡池 Id"
|
||||
},
|
||||
"gacha_type": {
|
||||
"type": "string",
|
||||
"description": "卡池类型",
|
||||
"enum": ["1", "2", "3", "5"]
|
||||
},
|
||||
"item_id": {
|
||||
"type": "string",
|
||||
"description": "物品的内部 ID"
|
||||
},
|
||||
"count": {
|
||||
"type": "string",
|
||||
"description": "物品个数,一般为1,米哈游 API 返回"
|
||||
},
|
||||
"time": {
|
||||
"type": "string",
|
||||
"description": "抽取物品时对应时区(timezone)下的当地时间"
|
||||
},
|
||||
"name": {
|
||||
"type": "string",
|
||||
"description": "物品名称,米哈游 API 返回"
|
||||
},
|
||||
"item_type": {
|
||||
"type": "string",
|
||||
"description": "物品类型,米哈游 API 返回"
|
||||
},
|
||||
"rank_type": {
|
||||
"type": "string",
|
||||
"description": "物品等级,米哈游 API 返回"
|
||||
},
|
||||
"id": {
|
||||
"type": "string",
|
||||
"description": "记录内部 ID,米哈游 API 返回"
|
||||
}
|
||||
},
|
||||
"required": ["gacha_type", "item_id", "time", "id"]
|
||||
}
|
||||
}
|
||||
},
|
||||
"required": ["uid", "timezone", "list"]
|
||||
}
|
||||
}
|
||||
},
|
||||
"required": ["info", "list"],
|
||||
"title": "UIGF 根对象"
|
||||
"required": ["info"]
|
||||
}
|
||||
```
|
||||
|
||||
190
docs/UIGF3.md
Normal file
@@ -0,0 +1,190 @@
|
||||
---
|
||||
Author: 目棃
|
||||
Description: UIGF v3 Backup
|
||||
Date: 2023-11-15
|
||||
Update: 2024-11-11
|
||||
---
|
||||
|
||||
> 本文档 [`Frontmatter`](https://github.com/BTMuli/MuCli#Frontmatter) 由 [MuCli](https://github.com/BTMuli/Mucli) 自动生成于 `2023-11-15 20:58:36`
|
||||
>
|
||||
> 更新于 `2024-11-11 11:56:11`
|
||||
|
||||
> 本文档为 [UIGF v3.0](https://github.com/UIGF-org/UIGF-org.github.io/blob/main/docs/zh/standards/uigf-legacy-v3.0.md) 的备份,仅供参考。
|
||||
|
||||
# 统一可交换抽卡记录标准 v3.0
|
||||
|
||||
> Uniformed Interchangeable GachaLog Format standard (UIGF) v3.0 <Badge text="Current" type="message" />
|
||||
>
|
||||
> ::: warning UIGF 标准使用声明
|
||||
> 应用必须在同时支持 UIGF 数据格式**导入**和**导出**功能并在相关功能区域或文档中提供跳转至 [UIGF-Org](https://uigf.org) 的超链接后声明支持 UIGF 格式
|
||||
|
||||
仅包含导入或导出功能降低了用户数据可流通性,且将数据至于用户不可控的风险中,不符合 UIGF-Org 设计的初衷。
|
||||
:::
|
||||
|
||||
## 更新记录
|
||||
|
||||
| 版本 | 说明 | 兼容 |
|
||||
| ----------------------------- | ---------------------------------------------------------- | -------------- |
|
||||
| `v2.0` | 首个正式版本 | v2.0 |
|
||||
| `v2.1` | 简化了部分语言表述,与 v2.0在数据格式上完全一致 | v2.1 and lower |
|
||||
| [`v2.2`](UIGF-legacy-v2.2.md) | 新增 `info.export_timestamp` 填充 UNIX 时间戳 | v2.2 and lower |
|
||||
| [`v2.3`](UIGF-legacy-v2.3.md) | 扩充至非中文语境,使用 Json Schema 表述。移除了 Excel 格式 | v2.3 and lower |
|
||||
| [`v2.4`](UIGF-legacy-v2.4.md) | 新增 `info.region_time_zone` 支持时区处理 | v2.4 and lower |
|
||||
| `v3.0` | 新增 集录祈愿类型支持 | v3.0 and lower |
|
||||
|
||||
### v3.0 更新内容
|
||||
|
||||
- `gacha_type` 增加新枚举项
|
||||
- 在 `gacha_type` 枚举新增值为 `500` 的项,用于表示集录祈愿类型
|
||||
|
||||
## `info` 字段说明
|
||||
|
||||
### `region_time_zone`
|
||||
|
||||
由于在获取祈愿记录时得到的`time`为服务器时间,为了准确判断时间的时区偏移,引入此字段。
|
||||
|
||||
与 SRGF 不同,由于无法直接从服务器获取`region_time_zone`,在导出方未提供此字段时,需要根据 `uid` 进行推断。
|
||||
|
||||
#### 映射关系
|
||||
|
||||
| `uid`首个字符 | `region_time_zone` | 游戏服务器 |
|
||||
| ------------- | ------------------ | --------------------------------- |
|
||||
| `'6'` | `-5` | os_usa |
|
||||
| `'7'` | `1` | os_euro |
|
||||
| 剩余情况 | `8` | os_cht, os_asia, cn_gf01, cn_qd01 |
|
||||
|
||||
App 不应假定 `region_time_zone` 的值为上表中给出的值,应具有处理非标准 `region_time_zone` 值的能力。
|
||||
若 `region_time_zone` 的值与 `uid` 推断结果不一致,则优先选择 `region_time_zone` 给出的值。
|
||||
|
||||
## `list` 字段说明
|
||||
|
||||
### `id`
|
||||
|
||||
物品内包含了一项较为特殊的字段: `id`,为原神官方 API 中包含的,代表每条抽卡记录唯一性的 `id`。App 导出 UIGF 时
|
||||
|
||||
- 需要确保每个物品都有一个有效的唯一 `id`
|
||||
- 若有记录中不包含`id`,则应从下一个自带有效 `id` 的物品开始,为每条缺失`id`字段的数据补全`id`。
|
||||
赋值数据向前(时间排序)依次递减,每次递减的值应保持为 `1`
|
||||
|
||||
### `gacha_type`
|
||||
|
||||
由于存在会共享保底与概率的卡池,所以需要一个额外的字段来界定
|
||||
我们在 `UIGF` 的所有格式中注入了 `uigf_gacha_type` 字段
|
||||
在导出到 `UIGF` 格式时需要注意添加对应的 `uigf_gacha_type` 字段
|
||||
|
||||
#### 映射关系
|
||||
|
||||
| `uigf_gacha_type` | `gacha_type` |
|
||||
| ----------------- | -------------- |
|
||||
| `100` | `100` |
|
||||
| `200` | `200` |
|
||||
| `301` | `301` or `400` |
|
||||
| `302` | `302` |
|
||||
| `500` | `500` |
|
||||
|
||||
### `item_id`
|
||||
|
||||
物品游戏内ID,你可以通过 [UIGF API](../API.md) 获取这一数据
|
||||
|
||||
## Json Schema
|
||||
|
||||
> UIGF-Org 提供[Json Schema](/schema/uigf.json) 用于验证
|
||||
|
||||
```json
|
||||
{
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"info": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"uid": {
|
||||
"type": "string",
|
||||
"title": "导出记录的 UID"
|
||||
},
|
||||
"lang": {
|
||||
"type": "string",
|
||||
"title": "语言 languagecode2-country/regioncode2"
|
||||
},
|
||||
"export_timestamp": {
|
||||
"type": "number",
|
||||
"title": "导出 UNIX 时间戳(秒)"
|
||||
},
|
||||
"export_time": {
|
||||
"type": "string",
|
||||
"title": "导出时间",
|
||||
"description": "yyyy-MM-dd HH:mm:ss"
|
||||
},
|
||||
"export_app": {
|
||||
"type": "string",
|
||||
"title": "导出 App 名称"
|
||||
},
|
||||
"export_app_version": {
|
||||
"type": "string",
|
||||
"title": "导出 App 版本"
|
||||
},
|
||||
"uigf_version": {
|
||||
"type": "string",
|
||||
"title": "UIGF 版本号",
|
||||
"pattern": "v\\d+\\.\\d+"
|
||||
},
|
||||
"region_time_zone": {
|
||||
"type": "number",
|
||||
"title": "区域时区偏移"
|
||||
}
|
||||
},
|
||||
"required": ["uid", "uigf_version"],
|
||||
"title": "UIGF 导出信息"
|
||||
},
|
||||
"list": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"uigf_gacha_type": {
|
||||
"type": "string",
|
||||
"title": "UIGF 卡池类型",
|
||||
"description": "用于区分卡池类型不同,但卡池保底计算相同的物品"
|
||||
},
|
||||
"gacha_type": {
|
||||
"type": "string",
|
||||
"title": "卡池类型"
|
||||
},
|
||||
"item_id": {
|
||||
"type": "string",
|
||||
"title": "物品的内部 ID"
|
||||
},
|
||||
"count": {
|
||||
"type": "string",
|
||||
"title": "个数,一般为1"
|
||||
},
|
||||
"time": {
|
||||
"type": "string",
|
||||
"title": "获取物品的时间"
|
||||
},
|
||||
"name": {
|
||||
"type": "string",
|
||||
"title": "物品名称"
|
||||
},
|
||||
"item_type": {
|
||||
"type": "string",
|
||||
"title": "物品类型"
|
||||
},
|
||||
"rank_type": {
|
||||
"type": "string",
|
||||
"title": "物品等级"
|
||||
},
|
||||
"id": {
|
||||
"type": "string",
|
||||
"title": "记录内部 ID"
|
||||
}
|
||||
},
|
||||
"required": ["uigf_gacha_type", "gacha_type", "id", "item_id", "time"],
|
||||
"title": "UIGF 物品"
|
||||
},
|
||||
"title": "物品列表"
|
||||
}
|
||||
},
|
||||
"required": ["info", "list"],
|
||||
"title": "UIGF 根对象"
|
||||
}
|
||||
```
|
||||
@@ -1,11 +1,20 @@
|
||||
import eslint_jsonc from "eslint-plugin-jsonc";
|
||||
import eslint_js from "@eslint/js";
|
||||
import eslint_ts from "typescript-eslint";
|
||||
import eslint_vue from "eslint-plugin-vue";
|
||||
|
||||
import { jsonEslintConfig } from "./eslint/jsonEslint.js";
|
||||
import { vueEslintConfig } from "./eslint/vueEslint.js";
|
||||
import ymlEslintConfig from "./eslint/ymlEslint.js";
|
||||
|
||||
export default [
|
||||
eslint_js.configs.recommended,
|
||||
...eslint_jsonc.configs["flat/recommended-with-jsonc"],
|
||||
...eslint_ts.configs.recommended,
|
||||
...eslint_vue.configs["flat/essential"],
|
||||
...jsonEslintConfig,
|
||||
ymlEslintConfig,
|
||||
...vueEslintConfig,
|
||||
ymlEslintConfig,
|
||||
{
|
||||
ignores: [
|
||||
"dist",
|
||||
@@ -13,7 +22,7 @@ export default [
|
||||
"pnpm-lock.yaml",
|
||||
"src/data/**/*.json",
|
||||
"src-tauri/tauri.conf.json",
|
||||
"src-tauri/gen/*.json",
|
||||
"src-tauri/**/*.json",
|
||||
"qodana.yaml",
|
||||
".github",
|
||||
".vscode",
|
||||
@@ -1,14 +1,10 @@
|
||||
import eslint_jsonc from "eslint-plugin-jsonc";
|
||||
import jsonc_parser from "jsonc-eslint-parser";
|
||||
import pluginJsonc from "eslint-plugin-jsonc";
|
||||
import parserJsonc from "jsonc-eslint-parser";
|
||||
|
||||
const pkgJsonConfig = {
|
||||
files: ["package.json"],
|
||||
plugins: {
|
||||
jsonc: eslint_jsonc,
|
||||
},
|
||||
languageOptions: {
|
||||
parser: jsonc_parser,
|
||||
},
|
||||
plugins: { jsonc: pluginJsonc },
|
||||
languageOptions: { parser: parserJsonc },
|
||||
rules: {
|
||||
"jsonc/comma-dangle": ["error", "never"],
|
||||
"jsonc/sort-keys": [
|
||||
@@ -38,12 +34,8 @@ const pkgJsonConfig = {
|
||||
|
||||
const tscJsonConfig = {
|
||||
files: ["tsconfig.json"],
|
||||
plugins: {
|
||||
jsonc: eslint_jsonc,
|
||||
},
|
||||
languageOptions: {
|
||||
parser: jsonc_parser,
|
||||
},
|
||||
plugins: { jsonc: pluginJsonc },
|
||||
languageOptions: { parser: parserJsonc },
|
||||
rules: {
|
||||
"jsonc/comma-dangle": ["error", "never"],
|
||||
"jsonc/sort-keys": [
|
||||
@@ -66,29 +58,12 @@ const tscJsonConfig = {
|
||||
|
||||
const jsoncConfig = {
|
||||
files: ["source/data/out/**/*.json", ".vscode/**/*.json"],
|
||||
plugins: {
|
||||
jsonc: eslint_jsonc,
|
||||
},
|
||||
languageOptions: {
|
||||
parser: jsonc_parser,
|
||||
},
|
||||
plugins: { jsonc: pluginJsonc },
|
||||
languageOptions: { parser: parserJsonc },
|
||||
rules: {
|
||||
"jsonc/comma-dangle": ["error", "never"],
|
||||
"jsonc/sort-keys": [
|
||||
"error",
|
||||
{
|
||||
pathPattern: "^$",
|
||||
order: {
|
||||
type: "asc",
|
||||
},
|
||||
},
|
||||
],
|
||||
"jsonc/sort-keys": ["error", { pathPattern: "^$", order: { type: "asc" } }],
|
||||
},
|
||||
};
|
||||
|
||||
export const jsonEslintConfig = [
|
||||
...eslint_jsonc.configs["flat/recommended-with-json"],
|
||||
pkgJsonConfig,
|
||||
tscJsonConfig,
|
||||
jsoncConfig,
|
||||
];
|
||||
export const jsonEslintConfig = [pkgJsonConfig, tscJsonConfig, jsoncConfig];
|
||||
|
||||
@@ -1,87 +1,52 @@
|
||||
import eslint_js from "@eslint/js";
|
||||
import eslint_import from "eslint-plugin-import";
|
||||
import eslint_prettier from "eslint-plugin-prettier";
|
||||
import eslint_vue from "eslint-plugin-vue";
|
||||
import pluginImport from "eslint-plugin-import";
|
||||
import pluginPrettier from "eslint-plugin-prettier";
|
||||
import pluginVue from "eslint-plugin-vue";
|
||||
import globals from "globals";
|
||||
import eslint_ts from "typescript-eslint";
|
||||
import vue_parser from "vue-eslint-parser";
|
||||
import eslintTs from "typescript-eslint";
|
||||
import parserVue from "vue-eslint-parser";
|
||||
|
||||
const tsConfigRules = {
|
||||
"@typescript-eslint/consistent-type-assertions": [
|
||||
"error",
|
||||
{
|
||||
assertionStyle: "angle-bracket",
|
||||
},
|
||||
],
|
||||
"@typescript-eslint/consistent-type-assertions": ["error", { assertionStyle: "angle-bracket" }],
|
||||
"@typescript-eslint/no-import-type-side-effects": "error",
|
||||
"@typescript-eslint/strict-boolean-expressions": "off",
|
||||
"@typescript-eslint/no-explicit-any": "off",
|
||||
"@typescript-eslint/no-unused-expressions": ["error", { allowShortCircuit: false }],
|
||||
"import/order": [
|
||||
"error",
|
||||
{
|
||||
groups: ["builtin", "external", "internal", "parent", "sibling", "index", "unknown"],
|
||||
"newlines-between": "always",
|
||||
alphabetize: {
|
||||
order: "asc",
|
||||
caseInsensitive: true,
|
||||
},
|
||||
alphabetize: { order: "asc", caseInsensitive: true },
|
||||
},
|
||||
],
|
||||
"prettier/prettier": "error",
|
||||
};
|
||||
|
||||
const tsConfig = {
|
||||
files: ["*.ts"],
|
||||
plugins: {
|
||||
typescript: eslint_ts,
|
||||
import: eslint_import,
|
||||
prettier: eslint_prettier,
|
||||
},
|
||||
files: ["*.ts", "*.d.ts", "src/**/*.ts", "src/**/*.d.ts"],
|
||||
plugins: { typescript: eslintTs, import: pluginImport, prettier: pluginPrettier },
|
||||
languageOptions: {
|
||||
parser: eslint_ts.parser,
|
||||
parserOptions: {
|
||||
project: "tsconfig.json",
|
||||
tsconfigRootDir: ".",
|
||||
},
|
||||
parser: eslintTs.parser,
|
||||
parserOptions: { project: "tsconfig.json", tsconfigRootDir: "." },
|
||||
},
|
||||
rules: tsConfigRules,
|
||||
};
|
||||
|
||||
const vueConfig = {
|
||||
plugins: {
|
||||
vue: eslint_vue,
|
||||
import: eslint_import,
|
||||
prettier: eslint_prettier,
|
||||
},
|
||||
files: ["src/**/*.vue", "src/App.vue"],
|
||||
plugins: { vue: pluginVue, import: pluginImport, prettier: pluginPrettier },
|
||||
languageOptions: {
|
||||
globals: {
|
||||
...globals.browser,
|
||||
...globals.es2021,
|
||||
TGApp: "readonly",
|
||||
window: "readonly",
|
||||
},
|
||||
globals: { ...globals.browser, ...globals.es2021, TGApp: "readonly", window: "readonly" },
|
||||
ecmaVersion: "latest",
|
||||
sourceType: "module",
|
||||
parser: vue_parser,
|
||||
parser: parserVue,
|
||||
parserOptions: {
|
||||
project: "tsconfig.json",
|
||||
parser: eslint_ts.parser,
|
||||
parser: eslintTs.parser,
|
||||
extraFileExtensions: [".vue"],
|
||||
tsconfigRootDir: ".",
|
||||
},
|
||||
},
|
||||
rules: {
|
||||
...tsConfigRules,
|
||||
"vue/multi-word-component-names": "off",
|
||||
},
|
||||
rules: { ...tsConfigRules, "vue/multi-word-component-names": "off" },
|
||||
};
|
||||
|
||||
export const vueEslintConfig = [
|
||||
eslint_js.configs.recommended,
|
||||
...eslint_ts.configs.recommended,
|
||||
...eslint_vue.configs["flat/essential"],
|
||||
...pluginVue.configs["flat/essential"],
|
||||
tsConfig,
|
||||
vueConfig,
|
||||
];
|
||||
export const vueEslintConfig = [tsConfig, vueConfig];
|
||||
|
||||
@@ -1,28 +1,17 @@
|
||||
import eslint_yml from "eslint-plugin-yml";
|
||||
import yml_parser from "yaml-eslint-parser";
|
||||
import pluginYml from "eslint-plugin-yml";
|
||||
import parserYml from "yaml-eslint-parser";
|
||||
|
||||
const ymlEslintConfig = {
|
||||
files: ["**/*.yml", "**/*.yaml"],
|
||||
plugins: {
|
||||
yml: eslint_yml,
|
||||
},
|
||||
plugins: { yml: pluginYml },
|
||||
languageOptions: {
|
||||
parser: yml_parser,
|
||||
parserOptions: {
|
||||
defaultYAMLVersion: "1.2",
|
||||
extraFileExtensions: [".yaml", ".yml"],
|
||||
},
|
||||
parser: parserYml,
|
||||
parserOptions: { defaultYAMLVersion: "1.2", extraFileExtensions: [".yaml", ".yml"] },
|
||||
},
|
||||
rules: {
|
||||
"yml/indent": ["error", 2],
|
||||
"yml/key-spacing": ["error"],
|
||||
"yml/quotes": [
|
||||
"error",
|
||||
{
|
||||
prefer: "double",
|
||||
avoidEscape: true,
|
||||
},
|
||||
],
|
||||
"yml/quotes": ["error", { prefer: "double", avoidEscape: true }],
|
||||
"yml/sort-keys": ["error", "asc"],
|
||||
},
|
||||
};
|
||||
|
||||
101
package.json
@@ -1,23 +1,25 @@
|
||||
{
|
||||
"name": "TeyvatGuide",
|
||||
"version": "0.6.2",
|
||||
"name": "teyvatguide",
|
||||
"version": "0.6.8",
|
||||
"description": "Game Tool for GenshinImpact player",
|
||||
"private": true,
|
||||
"packageManager": "pnpm@10.0.0",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"build": "tauri build",
|
||||
"debug": "tauri build --debug",
|
||||
"dev": "tauri dev --exit-on-panic",
|
||||
"eslint:pre": "pnpx @eslint/config-inspector@latest",
|
||||
"lint": "concurrently \"pnpm:lint:*(!fix)\"",
|
||||
"lint:fix": "concurrently \"pnpm:lint:*:fix\"",
|
||||
"lint:code": "eslint .",
|
||||
"lint:code:fix": "eslint . --fix",
|
||||
"lint:style": "stylelint \"src/**/*.{vue,css}\"",
|
||||
"lint:style": "stylelint \"src/**/*.{vue,css,scss}\" -f verbose",
|
||||
"lint:style:fix": "pnpm lint:style --fix",
|
||||
"lint:rust:fix": "cd src-tauri && cargo fmt",
|
||||
"prettier": "prettier . --write",
|
||||
"upv": "tsx scripts/update-version.ts",
|
||||
"tauri": "tauri",
|
||||
"tauri:icon": "tauri icon ./public/icon.png",
|
||||
"vite:dev": "vite dev",
|
||||
"vite:build": "vite build",
|
||||
"prepare": "husky"
|
||||
@@ -66,73 +68,76 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@mdi/font": "7.4.47",
|
||||
"@tauri-apps/api": "^2.0.3",
|
||||
"@tauri-apps/plugin-deep-link": "^2.0.0",
|
||||
"@tauri-apps/plugin-dialog": "^2.0.1",
|
||||
"@tauri-apps/plugin-fs": "^2.0.1",
|
||||
"@tauri-apps/plugin-http": "^2.0.1",
|
||||
"@tauri-apps/plugin-log": "^2.0.0",
|
||||
"@tauri-apps/plugin-os": "^2.0.0",
|
||||
"@tauri-apps/plugin-process": "^2.0.0",
|
||||
"@tauri-apps/plugin-shell": "^2.0.1",
|
||||
"@tauri-apps/plugin-sql": "^2.0.0",
|
||||
"@tauri-apps/api": "^2.2.0",
|
||||
"@tauri-apps/plugin-deep-link": "^2.2.0",
|
||||
"@tauri-apps/plugin-dialog": "^2.2.0",
|
||||
"@tauri-apps/plugin-fs": "^2.2.0",
|
||||
"@tauri-apps/plugin-http": "^2.2.0",
|
||||
"@tauri-apps/plugin-log": "^2.2.0",
|
||||
"@tauri-apps/plugin-os": "^2.2.0",
|
||||
"@tauri-apps/plugin-process": "^2.2.0",
|
||||
"@tauri-apps/plugin-shell": "^2.2.0",
|
||||
"@tauri-apps/plugin-sql": "^2.2.0",
|
||||
"ajv": "^8.17.1",
|
||||
"artplayer": "^5.2.0",
|
||||
"artplayer": "^5.2.2",
|
||||
"clipboard": "^2.0.11",
|
||||
"color-convert": "^2.0.1",
|
||||
"echarts": "^5.5.1",
|
||||
"echarts": "^5.6.0",
|
||||
"html2canvas": "^1.4.1",
|
||||
"js-md5": "^0.8.3",
|
||||
"jsencrypt": "^3.3.2",
|
||||
"pinia": "^2.2.4",
|
||||
"pinia-plugin-persistedstate": "^4.1.1",
|
||||
"uuid": "^10.0.0",
|
||||
"vue": "^3.5.12",
|
||||
"pinia": "^2.3.1",
|
||||
"pinia-plugin-persistedstate": "^4.2.0",
|
||||
"qrcode.vue": "^3.6.0",
|
||||
"sass": "^1.83.4",
|
||||
"sass-loader": "^16.0.4",
|
||||
"uuid": "^11.0.5",
|
||||
"vue": "^3.5.13",
|
||||
"vue-echarts": "^7.0.3",
|
||||
"vue-json-viewer": "^3.0.4",
|
||||
"vue-router": "^4.4.5",
|
||||
"vuetify": "^3.7.3",
|
||||
"vue-router": "^4.5.0",
|
||||
"vuetify": "^3.7.7",
|
||||
"wcag-color": "^1.1.1",
|
||||
"xml-js": "^1.6.11"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@eslint/eslintrc": "^3.1.0",
|
||||
"@eslint/js": "^9.13.0",
|
||||
"@tauri-apps/cli": "2.0.4",
|
||||
"@eslint/eslintrc": "^3.2.0",
|
||||
"@eslint/js": "^9.18.0",
|
||||
"@tauri-apps/cli": "2.2.5",
|
||||
"@types/color-convert": "^2.0.4",
|
||||
"@types/fs-extra": "^11.0.4",
|
||||
"@types/js-md5": "^0.7.2",
|
||||
"@types/node": "^22.7.9",
|
||||
"@types/node": "^22.10.7",
|
||||
"@types/uuid": "^10.0.0",
|
||||
"@typescript-eslint/parser": "^8.11.0",
|
||||
"@vitejs/plugin-vue": "^5.1.4",
|
||||
"concurrently": "^9.0.1",
|
||||
"eslint": "^9.13.0",
|
||||
"eslint-config-love": "^89.0.1",
|
||||
"eslint-config-prettier": "^9.1.0",
|
||||
"@typescript-eslint/parser": "^8.21.0",
|
||||
"@vitejs/plugin-vue": "^5.2.1",
|
||||
"concurrently": "^9.1.2",
|
||||
"eslint": "^9.18.0",
|
||||
"eslint-plugin-import": "^2.31.0",
|
||||
"eslint-plugin-jsonc": "^2.16.0",
|
||||
"eslint-plugin-n": "^17.11.1",
|
||||
"eslint-plugin-prettier": "^5.2.1",
|
||||
"eslint-plugin-promise": "^7.1.0",
|
||||
"eslint-plugin-vue": "^9.29.1",
|
||||
"eslint-plugin-yml": "^1.14.0",
|
||||
"globals": "^15.11.0",
|
||||
"husky": "^9.1.6",
|
||||
"eslint-plugin-jsonc": "^2.18.2",
|
||||
"eslint-plugin-prettier": "^5.2.3",
|
||||
"eslint-plugin-vue": "^9.32.0",
|
||||
"eslint-plugin-yml": "^1.16.0",
|
||||
"fs-extra": "^11.3.0",
|
||||
"globals": "^15.14.0",
|
||||
"husky": "^9.1.7",
|
||||
"jsonc-eslint-parser": "^2.4.0",
|
||||
"lint-staged": "^15.2.10",
|
||||
"oxlint": "^0.10.2",
|
||||
"prettier": "3.3.3",
|
||||
"stylelint": "^16.10.0",
|
||||
"lint-staged": "^15.4.1",
|
||||
"oxlint": "^0.15.7",
|
||||
"prettier": "3.4.2",
|
||||
"stylelint": "^16.13.2",
|
||||
"stylelint-config-idiomatic-order": "^10.0.0",
|
||||
"stylelint-config-standard-vue": "^1.0.0",
|
||||
"stylelint-declaration-block-no-ignored-properties": "^2.8.0",
|
||||
"stylelint-high-performance-animation": "^1.10.0",
|
||||
"stylelint-order": "^6.0.4",
|
||||
"stylelint-prettier": "^5.0.2",
|
||||
"typescript": "^5.6.3",
|
||||
"typescript-eslint": "^8.11.0",
|
||||
"vite": "^5.4.10",
|
||||
"vite-plugin-vue-devtools": "^7.5.3",
|
||||
"stylelint-scss": "^6.10.1",
|
||||
"tsx": "^4.19.2",
|
||||
"typescript": "^5.7.3",
|
||||
"typescript-eslint": "^8.21.0",
|
||||
"vite": "^6.0.11",
|
||||
"vite-plugin-vue-devtools": "^7.7.0",
|
||||
"vite-plugin-vuetify": "^2.0.4",
|
||||
"vue-eslint-parser": "^9.4.3",
|
||||
"yaml-eslint-parser": "^1.2.3"
|
||||
|
||||
4896
pnpm-lock.yaml
generated
BIN
public/WIKI/character/10000104.webp
Normal file
|
After Width: | Height: | Size: 18 KiB |
BIN
public/WIKI/character/10000105.webp
Normal file
|
After Width: | Height: | Size: 18 KiB |
BIN
public/WIKI/character/10000106.webp
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
public/WIKI/character/10000107.webp
Normal file
|
After Width: | Height: | Size: 18 KiB |
BIN
public/WIKI/character/10000108.webp
Normal file
|
After Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 29 KiB |
|
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 23 KiB |
|
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 37 KiB After Width: | Height: | Size: 37 KiB |
|
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 27 KiB |
|
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 37 KiB After Width: | Height: | Size: 37 KiB |
|
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 41 KiB After Width: | Height: | Size: 41 KiB |
|
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 322 B After Width: | Height: | Size: 322 B |
|
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 29 KiB |
|
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 32 KiB After Width: | Height: | Size: 32 KiB |
|
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 27 KiB |
|
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 29 KiB |
|
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 27 KiB |
|
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 29 KiB |
|
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 29 KiB |
|
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 27 KiB |
|
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 23 KiB |
|
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 27 KiB |
|
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 33 KiB After Width: | Height: | Size: 33 KiB |
|
Before Width: | Height: | Size: 36 KiB After Width: | Height: | Size: 36 KiB |
|
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 23 KiB |
|
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 23 KiB |
|
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 24 KiB |
BIN
public/WIKI/nameCard/bg/恰斯卡·全弹.webp
Normal file
|
After Width: | Height: | Size: 32 KiB |
|
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 29 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 29 KiB |
BIN
public/WIKI/nameCard/bg/成就·乐集.webp
Normal file
|
After Width: | Height: | Size: 27 KiB |
|
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 32 KiB After Width: | Height: | Size: 32 KiB |
|
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 23 KiB |
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 19 KiB |
BIN
public/WIKI/nameCard/bg/成就·战意.webp
Normal file
|
After Width: | Height: | Size: 33 KiB |
|
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 23 KiB |
|
Before Width: | Height: | Size: 53 KiB After Width: | Height: | Size: 53 KiB |
|
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 29 KiB |
|
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 26 KiB |