增加#心海图鉴功能,可查看突破材料及常用武器

This commit is contained in:
yoimiya-kokomi 2022-09-05 05:03:23 +08:00
parent fee0c25e7d
commit 5b3a47aed2
97 changed files with 1715 additions and 128 deletions

View File

@ -1,6 +1,16 @@
# 1.10.3
# 1.10.4
* 角色面板支持旅行者,暂未支持伤害计算
* 增加`#心海图鉴`功能,可查看突破材料及常用武器
* 功能尚未完全稳定,信息还在继续补全中
* 如无需使用master可通过`#喵喵设置图鉴关闭`关闭,防止覆盖图鉴插件等图鉴功能
# 1.10.1~1.10.3
* `#刻晴面板`、`#芭芭拉圣遗物`支持展示角色时装
* 如果角色装备了时装,面板的角色图会展示时装立绘
* 需要重新`#更新面板`以获取时装数据
* 增加赛诺、妮露、坎蒂丝的角色信息,可以通过`#妮露天赋`、`#妮露命座`查看角色信息了
* 角色面板支持旅行者,暂未支持伤害计算及圣遗物评分
* 需要重新更新旅行者的面板数据
* `#雷主天赋`、`#草主命座`功能升级
* 页面样式微调,内部处理逻辑升级
@ -8,13 +18,6 @@
* 框架底层角色相关逻辑重构角色图像资源迁移为webp格式
* 若遇到图像资源无法正常展示,可联系喵喵反馈
# 1.10.1
* `#刻晴面板`、`#芭芭拉圣遗物`支持展示角色时装
* 如果角色装备了时装,面板的角色图会展示时装立绘
* 需要重新`#更新面板`以获取时装数据
* 增加赛诺、妮露、坎蒂丝的角色信息,可以通过`#妮露天赋`、`#妮露命座`查看角色信息了
# 1.10.0
* 新增`#面板练度统计`功能

View File

@ -87,7 +87,7 @@ let rule = {
describe: '【#角色】 #深渊组队'
},
wiki: {
reg: '^(#|喵喵)?.*(天赋|技能|命座|命之座|资料|照片|写真|图片|图像)$',
reg: '^(#|喵喵)?.*(天赋|技能|命座|命之座|资料|图鉴|照片|写真|图片|图像)$',
describe: '【#资料】 #神里天赋 #夜兰命座'
},
help: {

View File

@ -7,19 +7,18 @@
import fetch from 'node-fetch'
import { Data } from '../../components/index.js'
const host = 'http://49.232.91.210:88/miaoPlugin/hutaoApi'
const host = 'http://miaoapi.cn/api/hutao'
function getApi (api) {
return `${host}?api=${api}`
}
let HutaoApi = {
async req (url, param = {}) {
async req (url, param = {}, EX = 3600) {
let cacheData = await Data.getCacheJSON(`hutao:${url}`)
if (cacheData && param.method !== 'POST') {
if (cacheData && cacheData.data && param.method !== 'POST') {
return cacheData
}
let response = await fetch(getApi(`${url}`), {
...param,
method: param.method || 'GET'
@ -28,7 +27,7 @@ let HutaoApi = {
if (retData && retData.data && param.method !== 'POST') {
let d = new Date()
retData.lastUpdate = `${d.toLocaleDateString()} ${d.toTimeString().substr(0, 5)}`
await Data.setCacheJSON(`hutao:${url}`, retData, 3600)
await Data.setCacheJSON(`hutao:${url}`, retData, EX)
}
return retData
},
@ -54,6 +53,14 @@ let HutaoApi = {
return await HutaoApi.req('/Statistics/Overview')
},
async getWeaponUsage () {
return await HutaoApi.req('/Statistics/AvatarWeaponUsage')
},
async getArtisUsage () {
return await HutaoApi.req('/Statistics/AvatarReliquaryUsage')
},
async upload (data) {
let body = JSON.stringify(data)
return await HutaoApi.req('/Record/Upload', {

View File

@ -2,7 +2,8 @@ import { segment } from 'oicq'
import lodash from 'lodash'
import Calendar from './wiki/calendar.js'
import { Format, Cfg, Common } from '../components/index.js'
import { Character } from '../models/index.js'
import { Character, Weapon } from '../models/index.js'
import HutaoApi from './stat/HutaoApi.js'
// eslint-disable-next-line no-unused-vars
let action = {
@ -16,7 +17,7 @@ export async function wiki (e) {
return false
}
let reg = /#?(.+)(命座|命之座|天赋|技能|资料|照片|写真|图片|图像)$/
let reg = /#?(.+)(命座|命之座|天赋|技能|资料|图鉴|照片|写真|图片|图像)$/
let msg = e.msg
let ret = reg.exec(msg)
@ -27,12 +28,14 @@ export async function wiki (e) {
let mode = 'talent'
if (/命/.test(ret[2])) {
mode = 'cons'
} else if (/(图鉴|资料)/.test(ret[2])) {
mode = 'wiki'
} else if (/图|画|写真|照片/.test(ret[2])) {
mode = 'pic'
}
if ((mode === 'pic' && Common.isDisable(e, 'wiki.pic')) ||
(mode !== 'pic' && Common.isDisable('wiki.wiki'))) {
(mode !== 'pic' && Common.isDisable(e, 'wiki.wiki'))) {
return
}
@ -50,7 +53,6 @@ export async function wiki (e) {
}
return true
}
if (char.isCustom) {
e.reply('暂不支持自定义角色')
return true
@ -59,18 +61,47 @@ export async function wiki (e) {
for (let i = 1; i <= 15; i++) {
lvs.push('Lv' + i)
}
return await Common.render('wiki/character', {
save_id: '天赋' + char.name,
if (mode === 'wiki') {
return await renderWiki({ e, char })
}
return await Common.render('wiki/character-talent', {
saveId: `${mode}-${char.id}-${char.elem}`,
...char.getData(),
detail: char.getDetail(),
imgs: char.getImgs(),
mode,
lvs,
line: getLineData(char),
_char: `/meta/character/${char.name}/`
line: getLineData(char)
}, { e, scale: 1.1 })
}
async function renderWiki ({ e, char }) {
let data = char.getData()
lodash.extend(data, char.getData('weaponType,elemName'))
let wu = (await HutaoApi.getWeaponUsage()).data || {}
let weapons = []
if (wu[char.id]) {
lodash.forEach(wu[char.id], (ds) => {
let weapon = Weapon.get(ds.name) || {}
weapons.push({
name: ds.name,
star: weapon.star || 4,
value: Format.percent(ds.value, 1)
})
})
}
return await Common.render('wiki/character-wiki', {
saveId: `info-${char.id}`,
data,
attr: char.getAttrList(),
detail: char.getDetail(),
imgs: char.getImgs(),
weapons,
materials: char.getMaterials(),
elem: char.elem
}, { e, scale: 1.4 })
}
const getLineData = function (char) {
let ret = []
const attrMap = {
@ -84,7 +115,6 @@ const getLineData = function (char) {
heal: '治疗',
dmg: char.elemName + '伤',
phy: '物伤'
}
lodash.forEach({ hp: '基础生命', atk: '基础攻击', def: '基础防御' }, (label, key) => {
ret.push({

View File

@ -201,8 +201,17 @@ let Data = {
fn(str.trim ? str.trim() : str, idx)
}
})
}
},
regRet (reg, txt, idx) {
if (reg && txt) {
let ret = reg.exec(txt)
if (ret && ret[idx]) {
return ret[idx]
}
}
return false
}
}
export default Data

View File

@ -70,7 +70,7 @@ export const characters = {
// 3.0
10000069: ['提纳里', 'Tighnari', '提那里', '小提', '驴'],
10000067: ['柯莱', 'Collei', '柯来', '科莱', '科来', '小天使', '须弥安柏', '安柏', '须弥飞行冠军'],
10000067: ['柯莱', 'Collei', '柯来', '科莱', '科来', '小天使', '须弥安柏', '安柏', '须弥飞行冠军'],
10000068: ['多莉', 'Dori', '多利', '多力'],
10000070: ['妮露', 'nilou', '尼露', '妮璐', '舞娘', '红牛'],
10000071: ['赛诺', 'cyno', '塞诺', '胡狼'],

View File

@ -19,7 +19,14 @@ export default class Base {
return Data.getVal(this, key, defaultValue)
}
_expire (time = 10 * 60) {
_getCache (uuid = '', time = 10 * 60) {
if (uuid && cacheMap[uuid]) {
return cacheMap[uuid]._setCache(time)
}
this._uuid = uuid
}
_setCache (time = 10 * 60) {
let id = this._uuid
if (id) {
reFn[id] && clearTimeout(reFn[id])
@ -35,7 +42,5 @@ export default class Base {
}
}
Base.get = (id, time = 10 * 60) => {
if (cacheMap[id]) {
return cacheMap[id]._expire(time)
}
}

View File

@ -4,39 +4,35 @@ import { Data } from '../components/index.js'
import CharImg from './character-lib/CharImg.js'
import CharTalent from './character-lib/CharTalent.js'
import CharId from './character-lib/CharId.js'
import CharMeta from './character-lib/CharMeta.js'
const _path = process.cwd()
let { abbrMap, wifeMap, idSort } = CharId
class Character extends Base {
constructor ({ id, name = '', elem = '' }) {
super()
let uuid = CharId.isTraveler(id) ? `character:${id}:${elem || 'anemo'}` : `character:${id}`
// 检查缓存
let cacheObj = Base.get(uuid)
let cacheObj = this._getCache(CharId.isTraveler(id) ? `character:${id}:${elem || 'anemo'}` : `character:${id}`)
if (cacheObj) {
return cacheObj
}
// 设置数据
this.id = id
this.name = name
this._uuid = uuid
if (!this.isCustom) {
let meta = getMeta(name)
this.meta = meta
for (let key of this._dataKey.split(',')) {
if (key === 'elem') {
this.elem = CharId.getElem(elem || meta.elem) || 'anemo'
} else {
this[key] = meta[key]
}
for (let key of 'abbr,title,star,allegiance,weapon,astro,cncv,jpcv,ver,desc,talentCons'.split(',')) {
this[key] = meta[key]
}
this.elem = CharId.getElem(elem || meta.elem) || 'anemo'
} else {
this.meta = {}
}
return this._expire()
return this._setCache()
}
// 默认获取的数据
_dataKey = 'id,name,abbr,title,star,elem,allegiance,weapon,birthday,astro,cncv,jpcv,ver,desc,talentCons'
// 是否为自定义角色
@ -82,6 +78,15 @@ class Character extends Base {
return this.getDetail()
}
getAttrList () {
let meta = this.meta
return CharMeta.getAttrList(meta.baseAttr, meta.growAttr, this.elemName)
}
getMaterials () {
return CharMeta.getMaterials(this)
}
// 获取基础数据
get baseAttr () {
return this.meta.baseAttr
@ -92,6 +97,15 @@ class Character extends Base {
return this.meta.growAttr
}
get birthday () {
let birth = this.meta.birth
if (!birth) {
return ''
}
birth = birth.split('-')
return `${birth[0]}${birth[1]}`
}
// 获取角色character-img图片
getCardImg (se = false, def = true) {
if (this.name === '旅行者') {

89
models/Material.js Normal file
View File

@ -0,0 +1,89 @@
import lodash from 'lodash'
import Base from './Base.js'
import { Data } from '../components/index.js'
import MaterialMeta from './material-lib/MaterialMeta.js'
let data = Data.readJSON('resources/meta/material/data.json')
let mMap = {}
let getItem = (ds) => {
mMap[ds.name] = {
type: ds.type,
name: ds.name,
star: ds.star
}
return mMap[ds.name]
}
lodash.forEach(data, (ds) => {
let ret = getItem(ds)
if (ds.items) {
let items = {}
lodash.forEach(ds.items, (item) => {
getItem(item)
items[item.star] = item.title
})
ret.items = items
}
})
class Material extends Base {
constructor (name) {
super(name)
let meta = mMap[name]
if (!meta) {
return false
}
let cache = this._getCache(`material:${name}`)
if (cache) {
return cache
}
this.name = meta.name
this.meta = meta
this.type = meta.type
this.star = meta.star
return this._setCache()
}
get abbr () {
if (this.type === 'talent') {
return Data.regRet(/「(.+)」/, this.name, 1) || this.name
}
return this.name
}
get title () {
return this.name
}
get label () {
let abbr = this.abbr
if (this.type === 'talent') {
return MaterialMeta.getTalentLabel(abbr)
}
return abbr
}
get img () {
return `meta/material/${this.type}/${this.name}.webp`
}
get icon () {
return this.img
}
getSource () {
if (this.type === 'talent') {
return MaterialMeta.getTalentWeek(this.name)
}
return ''
}
}
Material.get = function (name) {
if (mMap[name]) {
return new Material(name)
}
return false
}
export default Material

View File

@ -25,13 +25,12 @@ export default class ProfileDmg extends Base {
let talentData = profile.talent || {}
lodash.forEach(['a', 'e', 'q'], (key) => {
let level = lodash.isNumber(talentData[key]) ? talentData[key] : (talentData[key].level || 1)
let map = {}
lodash.forEach(char.detail.talent[key].tables, (tr) => {
let val = tr.values[level - 1]
// eslint-disable-next-line no-control-regex
val = val.replace(/[^\x00-\xff]/g, '').trim()
val = val.replace(/[a-zA-Z]/g, '').trim()
let valArr = []
let valArr2 = []
lodash.forEach(val.split('/'), (v, idx) => {

53
models/Weapon.js Normal file
View File

@ -0,0 +1,53 @@
import lodash from 'lodash'
import Base from './Base.js'
import { Data } from '../components/index.js'
let data = Data.readJSON('resources/meta/weapons/data.json')
let wData = {}
lodash.forEach(data, (ds) => {
wData[ds.name] = ds
})
class Weapon extends Base {
constructor (name) {
super(name)
let meta = wData[name]
if (!meta) {
return false
}
let cache = this._getCache(`weapon:${name}`)
if (cache) {
return cache
}
this.name = meta.name
this.meta = meta
this.type = meta.type
this.star = meta.star
return this._setCache()
}
get abbr () {
return this.name
}
get title () {
return this.name
}
get img () {
return `meta/weapons/icons/${this.name}.webp`
}
get icon () {
return this.img
}
}
Weapon.get = function (name) {
if (wData[name]) {
return new Weapon(name)
}
return false
}
export default Weapon

View File

@ -1,3 +1,7 @@
import lodash from 'lodash'
import { Material } from '../index.js'
import { Format, Data } from '../../components/index.js'
// 角色排序
export const charPosIdx = {
1: '宵宫,雷神,胡桃,甘雨,优菈,一斗,公子,绫人,魈,可莉,迪卢克,凝光,刻晴,辛焱,烟绯,雷泽',
@ -16,3 +20,77 @@ export const elemAlias = {
hydro: '水,枫丹',
cryo: '冰,至冬'
}
export const baseAttrName = {
hp: '基础生命',
atk: '基础攻击',
def: '基础防御'
}
export const growAttrName = {
atkPct: '大攻击',
hpPct: '大生命',
defPct: '大防御',
cpct: '暴击',
cdmg: '爆伤',
recharge: '充能',
mastery: '精通',
heal: '治疗',
phy: '物伤'
}
const mKeys = [{
key: 'gem',
num: '1/9/6/6'
}, {
key: 'boss',
num: '46',
check: (char) => !char.isTraveler
}, {
key: 'normal',
num: '18/30/36'
}, {
key: 'specialty',
num: '168'
}, {
key: 'talent'
}, {
key: 'weekly',
star: 5
}]
const CharMeta = {
getAttrList (base, grow, elem = '') {
let ret = []
lodash.forEach(base, (v, k) => {
ret.push({
title: baseAttrName[k],
value: Format.comma(v, 1)
})
})
ret.push({
title: '成长·' + (grow.key === 'dmg' ? `${elem}` : growAttrName[grow.key]),
value: grow.value
})
return ret
},
getMaterials (char) {
let ds = char.meta.materials
let ret = []
lodash.forEach(mKeys, (cfg) => {
let title = ds[cfg.key]
let mat = Material.get(title)
if (!mat) {
return
}
if (cfg.check && !cfg.check(char)) {
return
}
ret.push({
...mat.getData('label,star,icon,type'),
num: cfg.num || mat.getSource() || ''
})
})
return ret
}
}
export default CharMeta

View File

@ -1,6 +1,7 @@
import lodash from 'lodash';
import lodash from 'lodash'
const CharTalent = {
// 处理获取天赋数据
getAvatarTalent (id, talent, cons, mode, consTalent = {}) {
let ret = {}
lodash.forEach(['a', 'e', 'q'], (key) => {
@ -8,37 +9,34 @@ const CharTalent = {
if (!ds) {
ds = 1
}
let value
let level
let original
let aPlus = id === 10000033
if (lodash.isNumber(ds)) {
level = ds
} else {
level = mode === 'level' ? ds.level || ds.level_current || ds.original || ds.level_original : ds.original || ds.level_original || ds.level || ds.level_current
value = ds
}
if (mode === 'level') {
// 基于level计算original
ret[key] = {
level,
original: (key !== 'a' && cons >= consTalent[key]) ? (level - 3) : level
value = value || ds.level || ds.level_current || ds.original || ds.level_original
level = value
if (key === 'a') {
original = aPlus ? value - 1 : value
} else {
original = cons >= consTalent[key] ? (value - 3) : value
}
} else {
// 基于original计算level
ret[key] = {
original: level,
level: (key !== 'a' && cons >= consTalent[key]) ? (level + 3) : level
value = value || ds.original || ds.level_original || ds.level || ds.level_current
original = value
if (key === 'a') {
level = aPlus ? value + 1 : value
} else {
level = cons >= consTalent[key] ? (value + 3) : value
}
}
ret[key] = { level, original }
})
if (this.id * 1 !== 10000033) {
let a = ret.a || {}
if (a.level > 10) {
a.level = 10
a.original = 10
}
}
if (this.id * 1 === 10000033) {
let a = ret.a || {}
a.original = a.level - 1
}
return ret
},

View File

@ -8,5 +8,20 @@ import ProfileReq from './ProfileReq.js'
import ProfileData from './ProfileData.js'
import ProfileArtis from './ProfileArtis.js'
import ProfileDmg from './ProfileDmg.js'
import Material from './Material.js'
import Weapon from './Weapon.js'
export { Base, Abyss, Character, Artifact, Avatars, ProfileServ, ProfileReq, ProfileData, ProfileArtis, ProfileDmg }
export {
Base,
Abyss,
Character,
Artifact,
Avatars,
ProfileServ,
ProfileReq,
ProfileData,
ProfileArtis,
ProfileDmg,
Material,
Weapon
}

View File

@ -0,0 +1,52 @@
import lodash from 'lodash'
import { Data } from '../../components/index.js'
const talentMeta = {
自由: { week: 1, city: '蒙德' },
繁荣: { week: 1, city: '璃月' },
浮世: { week: 1, city: '稻妻' },
诤言: { week: 1, city: '须弥' },
抗争: { week: 2, city: '蒙德' },
勤劳: { week: 2, city: '璃月' },
风雅: { week: 2, city: '稻妻' },
巧思: { week: 2, city: '须弥' },
诗文: { week: 3, city: '蒙德' },
黄金: { week: 3, city: '璃月' },
天光: { week: 3, city: '稻妻' },
笃行: { week: 3, city: '须弥' },
}
const talentReg = new RegExp(`(${lodash.keys(talentMeta).join('|')})`)
let MaterialMeta = {
getTalentData (talent) {
talent = MaterialMeta.getTalentKey(talent)
return talentMeta[talent]
},
getTalentKey (name) {
return Data.regRet(talentReg, name, 1) || name
},
getTalentLabel (t) {
let key = MaterialMeta.getTalentKey(t)
let tm = MaterialMeta.getTalentData(key)
if (!tm) {
return t
}
return `${tm.city}·${key}`
},
getTalentWeek (t) {
let tm = MaterialMeta.getTalentData(t)
switch (tm.week) {
case 1:
return '周一/周四'
case 2:
return '周二/周五'
case 3:
return '周三/周六'
}
return ''
}
}
export default MaterialMeta

View File

@ -383,16 +383,64 @@ ul.cont-msg li strong,
.item-icon.star1 {
background-image: url("../common/item/bg1.png");
}
.item-icon.opacity-bg.star1 {
background-image: url("../common/item/bg1-o.png");
}
.item-icon.star2 {
background-image: url("../common/item/bg2.png");
}
.item-icon.opacity-bg.star2 {
background-image: url("../common/item/bg2-o.png");
}
.item-icon.star3 {
background-image: url("../common/item/bg3.png");
}
.item-icon.opacity-bg.star3 {
background-image: url("../common/item/bg3-o.png");
}
.item-icon.star4 {
background-image: url("../common/item/bg4.png");
}
.item-icon.opacity-bg.star4 {
background-image: url("../common/item/bg4-o.png");
}
.item-icon.star5 {
background-image: url("../common/item/bg5.png");
}
.item-icon.opacity-bg.star5 {
background-image: url("../common/item/bg5-o.png");
}
.item-list {
display: flex;
}
.item-list .item-card {
width: 70px;
background: #e7e5d9;
}
.item-list .item-icon {
border-bottom-left-radius: 0;
border-bottom-right-radius: 12px;
}
.item-list .item-title {
color: #222;
font-size: 13px;
text-align: center;
padding: 2px;
white-space: nowrap;
overflow: hidden;
}
.item-list .item-icon {
height: initial;
}
.item-list .item-badge {
position: absolute;
display: block;
left: -1px;
top: -1px;
background: rgba(0, 0, 0, 0.7);
font-size: 12px;
color: #fff;
padding: 4px 5px 3px;
border-radius: 4px 0 4px 0;
}
/*# sourceMappingURL=common.css.map */

View File

@ -330,5 +330,47 @@ ul.cont-msg, .cont-footer ul {
&.star@{value} {
background-image: url("../common/item/bg@{value}.png");
}
&.opacity-bg.star@{value} {
background-image: url("../common/item/bg@{value}-o.png");
}
})
}
.item-list {
display: flex;
.item-card {
width: 70px;
background: #e7e5d9;
}
.item-icon {
border-bottom-left-radius: 0;
border-bottom-right-radius: 12px;
}
.item-title {
color: #222;
font-size: 13px;
text-align: center;
padding: 2px;
white-space: nowrap;
overflow: hidden;
}
.item-icon {
height: initial;
}
.item-badge {
position: absolute;
display: block;
left: -1px;
top: -1px;
background: rgba(0, 0, 0, 0.7);
font-size: 12px;
color: #fff;
padding: 4px 5px 3px;
border-radius: 4px 0 4px 0;
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

View File

@ -7,7 +7,7 @@
"elem": "cryo",
"allegiance": "不卜庐",
"weapon": "sword",
"britydah": "3-3",
"birth": "3-3",
"astro": "三清铃座",
"desc": "药庐「不卜庐」的采药姑娘兼学徒,面色苍白如纸的不死之人。话很少,也没有什么表情。",
"cncv": "宴宁",

View File

@ -7,7 +7,7 @@
"elem": "electro",
"allegiance": "西风骑士团",
"weapon": "catalyst",
"britydah": "6-9",
"birth": "6-9",
"astro": "沙漏座",
"desc": "慵懒而博学的图书管理员,须弥教令院「两百年一见」的天才毕业生。",
"cncv": "钟可",

View File

@ -7,7 +7,7 @@
"elem": "electro",
"allegiance": "荒泷派",
"weapon": "sword",
"britydah": "7-27",
"birth": "7-27",
"astro": "烦恼刈座",
"desc": "干练可靠的「荒泷派」的副手——特别注明:干练可靠形容的不是「荒泷派」而是副手。",
"cncv": "杨凝",

View File

@ -7,7 +7,7 @@
"elem": "electro",
"allegiance": "天领奉行",
"weapon": "bow",
"britydah": "7-14",
"birth": "7-14",
"astro": "羽团扇座",
"desc": "「天领奉行」的大将,杀伐果断,骁勇善战。",
"cncv": "杨梦露",

View File

@ -7,7 +7,7 @@
"elem": "geo",
"allegiance": "云翰社",
"weapon": "polearm",
"britydah": "5-21",
"birth": "5-21",
"astro": "虹章座",
"desc": "集剧作与演唱能力于一身的璃月戏曲名角。风格自成一派,雅致柔美,恰如其人。",
"cncv": "贺文潇&杨扬",

View File

@ -7,7 +7,7 @@
"elem": "geo",
"allegiance": "海祇岛",
"weapon": "bow",
"britydah": "5-18",
"birth": "5-18",
"astro": "柴犬座",
"desc": "海祇岛军的大将,深受部下信赖。",
"cncv": "杨昕燃",

View File

@ -7,7 +7,7 @@
"elem": "cryo",
"allegiance": "西风骑士团",
"weapon": "claymore",
"britydah": "10-25",
"birth": "10-25",
"astro": "浪沫座",
"desc": "古老家族出身的「浪花骑士」,西风骑士团游击小队队长。身为旧贵族后裔却加入了堪称死对头的西风骑士团,该事件至今仍是蒙德一大谜团。",
"cncv": "子音",

View File

@ -7,7 +7,7 @@
"elem": "electro",
"allegiance": "鸣神大社",
"weapon": "catalyst",
"britydah": "6-27",
"birth": "6-27",
"astro": "仙狐座",
"desc": "鸣神大社的宫司大人,兼任「八重堂」总编。艳丽动人的外表下藏着令人意想不到的聪慧与狡黠。",
"cncv": "杜冥鸦",

View File

@ -7,7 +7,7 @@
"elem": "geo",
"allegiance": "璃月七星",
"weapon": "catalyst",
"britydah": "8-26",
"birth": "8-26",
"astro": "玑衡仪座",
"desc": "「璃月七星」中的「天权」,其名下财富之多,全大陆鲜有人能望其项背。",
"cncv": "杜冥鸦",

View File

@ -7,7 +7,7 @@
"elem": "cryo",
"allegiance": "西风骑士团",
"weapon": "sword",
"britydah": "11-30",
"birth": "11-30",
"astro": "孔雀羽座",
"desc": "异国面容的剑斗士,西风骑士团的头脑派人物。",
"cncv": "孙晔",

View File

@ -7,7 +7,7 @@
"elem": "electro",
"allegiance": "璃月七星",
"weapon": "sword",
"britydah": "11-20",
"birth": "11-20",
"astro": "金紫定垂座",
"desc": "璃月七星之一,玉衡星。对「帝君一言而决的璃月」颇有微词——但实际上,神挺欣赏她这样的人。",
"cncv": "谢莹",

View File

@ -7,7 +7,7 @@
"elem": "electro",
"allegiance": "南十字船队",
"weapon": "claymore",
"britydah": "2-14",
"birth": "2-14",
"astro": "南天海山座",
"desc": "武装船队「南十字」的首领,豪快的大姐头。",
"cncv": "唐雅菁",

View File

@ -7,7 +7,7 @@
"elem": "pyro",
"allegiance": "西风骑士团",
"weapon": "catalyst",
"britydah": "7-27",
"birth": "7-27",
"astro": "四叶草座",
"desc": "西风骑士团禁闭室的常客,蒙德的爆破大师。人称「逃跑的太阳」。",
"cncv": "花玲",

Binary file not shown.

Before

Width:  |  Height:  |  Size: 396 KiB

After

Width:  |  Height:  |  Size: 403 KiB

View File

@ -7,7 +7,7 @@
"elem": "hydro",
"allegiance": "",
"weapon": "polearm",
"britydah": "1-1",
"birth": "1-1",
"astro": "箭盾座",
"desc": "有着琥珀色左眼的赤王后裔,阿如村的守护者。",
"cncv": "",

View File

@ -7,7 +7,7 @@
"elem": "cryo",
"allegiance": "游侠",
"weapon": "bow",
"britydah": "4-4",
"birth": "4-4",
"astro": "诺拉勇者座",
"desc": "曾经是流放者,如今则是无比机敏的猎手。随时准备着为了正当之事而挽弓放箭。",
"cncv": "沐霏",

View File

@ -7,7 +7,7 @@
"elem": "electro",
"allegiance": "艾尔卡萨扎莱宫",
"weapon": "claymore",
"britydah": "12-21",
"birth": "12-21",
"astro": "神灯座",
"desc": "神出鬼没的旅行百货商人,最喜欢亮闪闪的摩拉。",
"cncv": "王晓彤",

View File

@ -7,7 +7,7 @@
"elem": "hydro",
"allegiance": "岩上茶室",
"weapon": "bow",
"britydah": "4-20",
"birth": "4-20",
"astro": "幽客座",
"desc": "自称供职于总务司的神秘人士,却又是总务司名录里的「不存在之人」。",
"cncv": "徐慧",

View File

@ -7,7 +7,7 @@
"elem": "hydro",
"allegiance": "",
"weapon": "sword",
"britydah": "1-1",
"birth": "1-1",
"astro": "睡莲座",
"desc": "测试角色",
"cncv": "",

View File

@ -7,7 +7,7 @@
"elem": "pyro",
"allegiance": "西风骑士团",
"weapon": "bow",
"britydah": "8-10",
"birth": "8-10",
"astro": "小兔座",
"desc": "永远充满活力的女孩,骑士团最优秀,同时也是最后的侦察骑士。",
"cncv": "蔡书瑾",

Binary file not shown.

Before

Width:  |  Height:  |  Size: 223 KiB

After

Width:  |  Height:  |  Size: 516 KiB

View File

@ -7,7 +7,7 @@
"elem": "pyro",
"allegiance": "长野原烟花店",
"weapon": "bow",
"britydah": "6-21",
"birth": "6-21",
"astro": "琉金座",
"desc": "「长野原烟花店」店长,「夏祭的女王」,将人们的愿望寄托于烟花中的能工巧匠。",
"cncv": "金娜",

View File

@ -7,7 +7,7 @@
"elem": "pyro",
"allegiance": "社奉行",
"weapon": "polearm",
"britydah": "1-9",
"birth": "1-9",
"astro": "赤楯座",
"desc": "神里家的家政官,活跃在稻妻的「地头蛇」。",
"cncv": "张沛",

View File

@ -7,7 +7,7 @@
"elem": "dendro",
"allegiance": "化城郭",
"weapon": "bow",
"britydah": "12-29",
"birth": "12-29",
"astro": "郭狐座",
"desc": "精通植物学的少年学者,现于道成林任巡林官一职。直率热忱,擅长教导脑瓜糊涂的人。",
"cncv": "莫然",

View File

@ -7,7 +7,7 @@
"elem": "multi",
"allegiance": "——",
"weapon": "sword",
"britydah": "-",
"birth": "-",
"astro": "旅人座",
"desc": "从世界之外漂流而来的旅行者,被神带走血亲,自此踏上寻找七神之路。",
"cncv": "多多poi",

View File

@ -7,7 +7,7 @@
"elem": "anemo",
"allegiance": "终末番",
"weapon": "claymore",
"britydah": "10-19",
"birth": "10-19",
"astro": "小貉座",
"desc": "隶属于「终末番」的忍者。身形小巧,总像没睡饱一样。",
"cncv": "Sakula小舞",

View File

@ -7,7 +7,7 @@
"elem": "anemo",
"allegiance": "南十字船队",
"weapon": "sword",
"britydah": "10-29",
"birth": "10-29",
"astro": "枫红座",
"desc": "来自稻妻的浪人武士,如今栖身于璃月船队「南十字」中。性情温和而洒脱,心中埋藏着许多往事。",
"cncv": "斑马",

View File

@ -7,7 +7,7 @@
"elem": "dendro",
"allegiance": "化城郭",
"weapon": "bow",
"britydah": "5-8",
"birth": "5-8",
"astro": "薮猫座",
"desc": "活跃于道成林的见习巡林员,热情的言行背后是一颗依旧稍显内向的心。",
"cncv": "秦文静",

View File

@ -7,7 +7,7 @@
"elem": "anemo",
"allegiance": "蒙德城",
"weapon": "bow",
"britydah": "6-16",
"birth": "6-16",
"astro": "歌仙座歌仙座",
"desc": "蒙德城诸多吟游诗人中的一位,自由自在地穿行在街头巷尾。",
"cncv": "喵酱",

View File

@ -7,7 +7,7 @@
"elem": "pyro",
"allegiance": "烟绯律法咨询事务所",
"weapon": "catalyst",
"britydah": "7-28",
"birth": "7-28",
"astro": "法兽座",
"desc": "活跃在璃月港的知名律法咨询师,混有仙兽血脉的精明少女。",
"cncv": "苏子芜",

View File

@ -7,7 +7,7 @@
"elem": "hydro",
"allegiance": "海祇岛",
"weapon": "catalyst",
"britydah": "2-22",
"birth": "2-22",
"astro": "眠龙座",
"desc": "海祇岛的「现人神巫女」,统管海祇岛各项事宜的少女。",
"cncv": "龟娘",

View File

@ -7,7 +7,7 @@
"elem": "pyro",
"allegiance": "冒险家协会",
"weapon": "sword",
"britydah": "2-29",
"birth": "2-29",
"astro": "险路座",
"desc": "蒙德的冒险家少年,拥有与他的善良毫不相称的霉运。",
"cncv": "穆雪婷",

View File

@ -7,7 +7,7 @@
"elem": "anemo",
"allegiance": "西风骑士团",
"weapon": "sword",
"britydah": "3-14",
"birth": "3-14",
"astro": "幼狮座",
"desc": "正直严谨的蒲公英骑士,蒙德西风骑士团的代理团长。",
"cncv": "林簌",

View File

@ -7,7 +7,7 @@
"elem": "cryo",
"allegiance": "月海亭",
"weapon": "bow",
"britydah": "12-2",
"birth": "12-2",
"astro": "仙麟座",
"desc": "月海亭的秘书,体内流淌着仙兽「麒麟」的血脉。",
"cncv": "林簌",

View File

@ -7,7 +7,7 @@
"elem": "cryo",
"allegiance": "留云借风真君洞天",
"weapon": "polearm",
"britydah": "3-10",
"birth": "3-10",
"astro": "愁疏座",
"desc": "气质出尘的仙家子弟。隐修在璃月群山之间,个性也如仙人般淡漠疏离。",
"cncv": "秦紫翼",

View File

@ -7,7 +7,7 @@
"elem": "anemo",
"allegiance": "西风骑士团",
"weapon": "catalyst",
"britydah": "11-26",
"birth": "11-26",
"astro": "烧瓶座",
"desc": "对万物充满好奇的炼金术士,「生物炼金」学派的研究者。",
"cncv": "小敢",

View File

@ -7,7 +7,7 @@
"elem": "hydro",
"allegiance": "社奉行",
"weapon": "sword",
"britydah": "3-26",
"birth": "3-26",
"astro": "神守柏座",
"desc": "社奉行神里家年轻有为的现任家主,为人温雅有礼,处事颇有手段。",
"cncv": "赵路",

View File

@ -7,7 +7,7 @@
"elem": "cryo",
"allegiance": "社奉行",
"weapon": "sword",
"britydah": "9-28",
"birth": "9-28",
"astro": "雪鹤座",
"desc": "稻妻「社奉行」神里家的大小姐。端庄而文雅,聪慧又坚韧。",
"cncv": "小N",

View File

@ -7,7 +7,7 @@
"elem": "multi",
"allegiance": "——",
"weapon": "sword",
"britydah": "-",
"birth": "-",
"astro": "旅人座",
"desc": "从世界之外漂流而来的旅行者,被神带走血亲,自此踏上寻找七神之路。",
"cncv": "鹿喑",

View File

@ -7,7 +7,7 @@
"elem": "cryo",
"allegiance": "西风教会",
"weapon": "polearm",
"britydah": "1-24",
"birth": "1-24",
"astro": "荆冠座",
"desc": "除了打扮哪里都不像神职人员的修女。冷淡的言行中透着锐利。总是单独行动。",
"cncv": "张安琪",

View File

@ -7,7 +7,7 @@
"elem": "pyro",
"allegiance": "往生堂",
"weapon": "polearm",
"britydah": "7-15",
"birth": "7-15",
"astro": "引蝶座",
"desc": "「往生堂」七十七代堂主,年纪轻轻就已主掌璃月的葬仪事务。",
"cncv": "陶典",

View File

@ -7,7 +7,7 @@
"elem": "hydro",
"allegiance": "西风教会",
"weapon": "catalyst",
"britydah": "7-5",
"birth": "7-5",
"astro": "金杯座",
"desc": "蒙德城的大家都喜欢芭芭拉。「偶像」这个词是她从一本杂志里看到的。",
"cncv": "宋媛媛",

View File

@ -7,7 +7,7 @@
"elem": "geo",
"allegiance": "荒泷派",
"weapon": "claymore",
"britydah": "6-1",
"birth": "6-1",
"astro": "天牛座",
"desc": "活跃在稻妻城花见坂的「荒泷派」初代目头领。什么,从没听说过荒泷派?你是想找茬吗?",
"cncv": "刘照坤",

View File

@ -7,7 +7,7 @@
"elem": "multi",
"allegiance": "——",
"weapon": "sword",
"britydah": "-",
"birth": "-",
"astro": "旅人座",
"desc": "从世界之外漂流而来的旅行者,被神带走血亲,自此踏上寻找七神之路。",
"cncv": "多多poi",

View File

@ -7,7 +7,7 @@
"elem": "hydro",
"allegiance": "蒙德城",
"weapon": "catalyst",
"britydah": "8-31",
"birth": "8-31",
"astro": "映天座",
"desc": "神秘的少女占星术士,声称自己是「伟大的占星术士莫娜」,拥有与名号相符的不俗实力,博学而高傲。",
"cncv": "陈婷婷",

View File

@ -7,7 +7,7 @@
"elem": "electro",
"allegiance": "冒险家协会",
"weapon": "bow",
"britydah": "5-27",
"birth": "5-27",
"astro": "幻鸦座",
"desc": "自称「断罪之皇女」,与名为奥兹的漆黑夜鸦同行的神秘少女。",
"cncv": "Mace&赵悦程",

View File

@ -7,7 +7,7 @@
"elem": "hydro",
"allegiance": "飞云商会",
"weapon": "sword",
"britydah": "10-9",
"birth": "10-9",
"astro": "锦织座",
"desc": "经常能在书摊看到的少年人。手执长剑,胸中常怀侠义之心。",
"cncv": "唐雅菁",

View File

@ -7,7 +7,7 @@
"elem": "geo",
"allegiance": "西风骑士团",
"weapon": "claymore",
"britydah": "3-21",
"birth": "3-21",
"astro": "心护座",
"desc": "「西风骑士团」的可靠女仆,梦想有一天能成为正式的骑士。",
"cncv": "宴宁",

View File

@ -7,7 +7,7 @@
"elem": "electro",
"allegiance": "",
"weapon": "polearm",
"britydah": "1-1",
"birth": "1-1",
"astro": "金狼座",
"desc": "测试角色",
"cncv": "",

View File

@ -7,7 +7,7 @@
"elem": "pyro",
"allegiance": "「红弦」",
"weapon": "claymore",
"britydah": "10-16",
"birth": "10-16",
"astro": "红檀四弦座",
"desc": "璃月港唯一的摇滚乐手,以音乐和热情歌颂着对「成见」的反抗。",
"cncv": "王雅欣",

View File

@ -7,7 +7,7 @@
"elem": "hydro",
"allegiance": "愚人众",
"weapon": "bow",
"britydah": "7-20",
"birth": "7-20",
"astro": "鲸天座",
"desc": "愚人众执行官第十一位,「公子」,其战绩威名远扬。",
"cncv": "鱼冻",

View File

@ -7,7 +7,7 @@
"elem": "pyro",
"allegiance": "晨曦酒庄",
"weapon": "claymore",
"britydah": "4-30",
"birth": "4-30",
"astro": "夜枭座",
"desc": "坐拥蒙德大半酒业的贵公子,财力、人望、能力都令人无法小觑。",
"cncv": "马洋",

View File

@ -7,7 +7,7 @@
"elem": "cryo",
"allegiance": "猫尾酒馆",
"weapon": "bow",
"britydah": "1-18",
"birth": "1-18",
"astro": "小猫座",
"desc": "遗传了稀薄的「非人」血统的少女,「猫尾酒馆」的超人气调酒师。",
"cncv": "诺亚",

View File

@ -7,7 +7,7 @@
"elem": "cryo",
"allegiance": "天衡方士",
"weapon": "claymore",
"britydah": "9-7",
"birth": "9-7",
"astro": "乾坤锋座",
"desc": "驱邪世家的年轻方士,为压制自身的「纯阳之体」费尽心机。",
"cncv": "kinsen",

View File

@ -7,7 +7,7 @@
"elem": "geo",
"allegiance": "璃月港",
"weapon": "polearm",
"britydah": "12-31",
"birth": "12-31",
"astro": "???岩王帝君座",
"desc": "被「往生堂」请来的神秘客人,知识渊博,对各种事物都颇有见地。",
"cncv": "彭博",

View File

@ -7,7 +7,7 @@
"elem": "geo",
"allegiance": "西风骑士团",
"weapon": "sword",
"britydah": "9-13",
"birth": "9-13",
"astro": "白垩之子座",
"desc": "西风骑士团首席炼金术士兼调查小队队长,被称做「白垩之子」的天才。",
"cncv": "Mace",

View File

@ -7,7 +7,7 @@
"elem": "electro",
"allegiance": "奔狼领",
"weapon": "claymore",
"britydah": "9-9",
"birth": "9-9",
"astro": "小狼座",
"desc": "住在蒙德地区奔狼领,远离城市与人群,和狼一同生活的少年。直觉锐利,身姿迅捷。",
"cncv": "周帅",

View File

@ -7,7 +7,7 @@
"elem": "electro",
"allegiance": "稻妻城",
"weapon": "polearm",
"britydah": "6-26",
"birth": "6-26",
"astro": "天下人座天下人座",
"desc": "其身为御建鸣神主尊大御所大人,许稻妻人民以亘古不变之「永恒」。",
"cncv": "菊花花",

View File

@ -7,7 +7,7 @@
"elem": "pyro",
"allegiance": "万民堂",
"weapon": "polearm",
"britydah": "11-2",
"birth": "11-2",
"astro": "长杓座",
"desc": "来自璃月,名声在外的少女厨师,对料理之道极具热情,拿手麻辣菜肴堪称一绝。",
"cncv": "小N",

View File

@ -7,7 +7,7 @@
"elem": "anemo",
"allegiance": "璃月仙人",
"weapon": "polearm",
"britydah": "4-17",
"birth": "4-17",
"astro": "金翅鹏王座",
"desc": "守护璃月的仙人,「夜叉」。美号「降魔大圣」,妙称「护法夜叉大将」。",
"cncv": "kinsen",

View File

@ -7,7 +7,7 @@
"elem": "anemo",
"allegiance": "天领奉行",
"weapon": "catalyst",
"britydah": "7-24",
"birth": "7-24",
"astro": "幼鹿座",
"desc": "天领奉行的天才少年侦探,直觉敏锐,心思玲珑。",
"cncv": "林景",

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 35 KiB

View File

@ -0,0 +1,757 @@
{
"无锋剑": {
"name": "无锋剑",
"star": 1,
"type": "sword"
},
"银剑": {
"name": "银剑",
"star": 2,
"type": "sword"
},
"冷刃": {
"name": "冷刃",
"star": 3,
"type": "sword"
},
"黎明神剑": {
"name": "黎明神剑",
"star": 3,
"type": "sword"
},
"旅行剑": {
"name": "旅行剑",
"star": 3,
"type": "sword"
},
"暗铁剑": {
"name": "暗铁剑",
"star": 3,
"type": "sword"
},
"吃虎鱼刀": {
"name": "吃虎鱼刀",
"star": 3,
"type": "sword"
},
"飞天御剑": {
"name": "飞天御剑",
"star": 3,
"type": "sword"
},
"西风剑": {
"name": "西风剑",
"star": 4,
"type": "sword"
},
"笛剑": {
"name": "笛剑",
"star": 4,
"type": "sword"
},
"祭礼剑": {
"name": "祭礼剑",
"star": 4,
"type": "sword"
},
"宗室长剑": {
"name": "宗室长剑",
"star": 4,
"type": "sword"
},
"匣里龙吟": {
"name": "匣里龙吟",
"star": 4,
"type": "sword"
},
"试作斩岩": {
"name": "试作斩岩",
"star": 4,
"type": "sword"
},
"铁蜂刺": {
"name": "铁蜂刺",
"star": 4,
"type": "sword"
},
"黑岩长剑": {
"name": "黑岩长剑",
"star": 4,
"type": "sword"
},
"黑剑": {
"name": "黑剑",
"star": 4,
"type": "sword"
},
"暗巷闪光": {
"name": "暗巷闪光",
"star": 4,
"type": "sword"
},
"降临之剑": {
"name": "降临之剑",
"star": 4,
"type": "sword"
},
"腐殖之剑": {
"name": "腐殖之剑",
"star": 4,
"type": "sword"
},
"天目影打刀": {
"name": "天目影打刀",
"star": 4,
"type": "sword"
},
"辰砂之纺锤": {
"name": "辰砂之纺锤",
"star": 4,
"type": "sword"
},
"笼钓瓶一心": {
"name": "笼钓瓶一心",
"star": 4,
"type": "sword"
},
"原木刀": {
"name": "原木刀",
"star": 4,
"type": "sword"
},
"西福斯的月光": {
"name": "西福斯的月光",
"star": 4,
"type": "sword"
},
"「一心传」名刀": {
"name": "「一心传」名刀",
"star": 4,
"type": "sword"
},
"风鹰剑": {
"name": "风鹰剑",
"star": 5,
"type": "sword"
},
"天空之刃": {
"name": "天空之刃",
"star": 5,
"type": "sword"
},
"苍古自由之誓": {
"name": "苍古自由之誓",
"star": 5,
"type": "sword"
},
"斫峰之刃": {
"name": "斫峰之刃",
"star": 5,
"type": "sword"
},
"磐岩结绿": {
"name": "磐岩结绿",
"star": 5,
"type": "sword"
},
"雾切之回光": {
"name": "雾切之回光",
"star": 5,
"type": "sword"
},
"波乱月白经津": {
"name": "波乱月白经津",
"star": 5,
"type": "sword"
},
"圣显之钥": {
"name": "圣显之钥",
"star": 5,
"type": "sword"
},
"训练大剑": {
"name": "训练大剑",
"star": 1,
"type": "claymore"
},
"佣兵重剑": {
"name": "佣兵重剑",
"star": 2,
"type": "claymore"
},
"铁影阔剑": {
"name": "铁影阔剑",
"star": 3,
"type": "claymore"
},
"沐浴龙血的剑": {
"name": "沐浴龙血的剑",
"star": 3,
"type": "claymore"
},
"白铁大剑": {
"name": "白铁大剑",
"star": 3,
"type": "claymore"
},
"石英大剑": {
"name": "石英大剑",
"star": 3,
"type": "claymore"
},
"以理服人": {
"name": "以理服人",
"star": 3,
"type": "claymore"
},
"飞天大御剑": {
"name": "飞天大御剑",
"star": 3,
"type": "claymore"
},
"西风大剑": {
"name": "西风大剑",
"star": 4,
"type": "claymore"
},
"钟剑": {
"name": "钟剑",
"star": 4,
"type": "claymore"
},
"祭礼大剑": {
"name": "祭礼大剑",
"star": 4,
"type": "claymore"
},
"宗室大剑": {
"name": "宗室大剑",
"star": 4,
"type": "claymore"
},
"雨裁": {
"name": "雨裁",
"star": 4,
"type": "claymore"
},
"试作古华": {
"name": "试作古华",
"star": 4,
"type": "claymore"
},
"白影剑": {
"name": "白影剑",
"star": 4,
"type": "claymore"
},
"黑岩斩刀": {
"name": "黑岩斩刀",
"star": 4,
"type": "claymore"
},
"螭骨剑": {
"name": "螭骨剑",
"star": 4,
"type": "claymore"
},
"千岩古剑": {
"name": "千岩古剑",
"star": 4,
"type": "claymore"
},
"雪葬的星银": {
"name": "雪葬的星银",
"star": 4,
"type": "claymore"
},
"衔珠海皇": {
"name": "衔珠海皇",
"star": 4,
"type": "claymore"
},
"桂木斩长正": {
"name": "桂木斩长正",
"star": 4,
"type": "claymore"
},
"玛海菈的水色": {
"name": "玛海菈的水色",
"star": 4,
"type": "claymore"
},
"恶王丸": {
"name": "恶王丸",
"star": 4,
"type": "claymore"
},
"森林王器": {
"name": "森林王器",
"star": 4,
"type": "claymore"
},
"天空之傲": {
"name": "天空之傲",
"star": 5,
"type": "claymore"
},
"狼的末路": {
"name": "狼的末路",
"star": 5,
"type": "claymore"
},
"松籁响起之时": {
"name": "松籁响起之时",
"star": 5,
"type": "claymore"
},
"无工之剑": {
"name": "无工之剑",
"star": 5,
"type": "claymore"
},
"赤角石溃杵": {
"name": "赤角石溃杵",
"star": 5,
"type": "claymore"
},
"新手长枪": {
"name": "新手长枪",
"star": 1,
"type": "polearm"
},
"铁尖枪": {
"name": "铁尖枪",
"star": 2,
"type": "polearm"
},
"白缨枪": {
"name": "白缨枪",
"star": 3,
"type": "polearm"
},
"钺矛": {
"name": "钺矛",
"star": 3,
"type": "polearm"
},
"黑缨枪": {
"name": "黑缨枪",
"star": 3,
"type": "polearm"
},
"匣里灭辰": {
"name": "匣里灭辰",
"star": 4,
"type": "polearm"
},
"试作星镰": {
"name": "试作星镰",
"star": 4,
"type": "polearm"
},
"流月针": {
"name": "流月针",
"star": 4,
"type": "polearm"
},
"黑岩刺枪": {
"name": "黑岩刺枪",
"star": 4,
"type": "polearm"
},
"决斗之枪": {
"name": "决斗之枪",
"star": 4,
"type": "polearm"
},
"千岩长枪": {
"name": "千岩长枪",
"star": 4,
"type": "polearm"
},
"西风长枪": {
"name": "西风长枪",
"star": 4,
"type": "polearm"
},
"宗室猎枪": {
"name": "宗室猎枪",
"star": 4,
"type": "polearm"
},
"龙脊长枪": {
"name": "龙脊长枪",
"star": 4,
"type": "polearm"
},
"喜多院十文字": {
"name": "喜多院十文字",
"star": 4,
"type": "polearm"
},
"「渔获」": {
"name": "「渔获」",
"star": 4,
"type": "polearm"
},
"断浪长鳍": {
"name": "断浪长鳍",
"star": 4,
"type": "polearm"
},
"贯月矢": {
"name": "贯月矢",
"star": 4,
"type": "polearm"
},
"风信之锋": {
"name": "风信之锋",
"star": 4,
"type": "polearm"
},
"护摩之杖": {
"name": "护摩之杖",
"star": 5,
"type": "polearm"
},
"天空之脊": {
"name": "天空之脊",
"star": 5,
"type": "polearm"
},
"贯虹之槊": {
"name": "贯虹之槊",
"star": 5,
"type": "polearm"
},
"和璞鸢": {
"name": "和璞鸢",
"star": 5,
"type": "polearm"
},
"息灾": {
"name": "息灾",
"star": 5,
"type": "polearm"
},
"薙草之稻光": {
"name": "薙草之稻光",
"star": 5,
"type": "polearm"
},
"赤沙之杖": {
"name": "赤沙之杖",
"star": 5,
"type": "polearm"
},
"猎弓": {
"name": "猎弓",
"star": 1,
"type": "bow"
},
"历练的猎弓": {
"name": "历练的猎弓",
"star": 2,
"type": "bow"
},
"鸦羽弓": {
"name": "鸦羽弓",
"star": 3,
"type": "bow"
},
"神射手之誓": {
"name": "神射手之誓",
"star": 3,
"type": "bow"
},
"反曲弓": {
"name": "反曲弓",
"star": 3,
"type": "bow"
},
"弹弓": {
"name": "弹弓",
"star": 3,
"type": "bow"
},
"信使": {
"name": "信使",
"star": 3,
"type": "bow"
},
"黑檀弓": {
"name": "黑檀弓",
"star": 3,
"type": "bow"
},
"西风猎弓": {
"name": "西风猎弓",
"star": 4,
"type": "bow"
},
"绝弦": {
"name": "绝弦",
"star": 4,
"type": "bow"
},
"祭礼弓": {
"name": "祭礼弓",
"star": 4,
"type": "bow"
},
"宗室长弓": {
"name": "宗室长弓",
"star": 4,
"type": "bow"
},
"弓藏": {
"name": "弓藏",
"star": 4,
"type": "bow"
},
"试作澹月": {
"name": "试作澹月",
"star": 4,
"type": "bow"
},
"钢轮弓": {
"name": "钢轮弓",
"star": 4,
"type": "bow"
},
"黑岩战弓": {
"name": "黑岩战弓",
"star": 4,
"type": "bow"
},
"苍翠猎弓": {
"name": "苍翠猎弓",
"star": 4,
"type": "bow"
},
"暗巷猎手": {
"name": "暗巷猎手",
"star": 4,
"type": "bow"
},
"落霞": {
"name": "落霞",
"star": 4,
"type": "bow"
},
"幽夜华尔兹": {
"name": "幽夜华尔兹",
"star": 4,
"type": "bow"
},
"风花之颂": {
"name": "风花之颂",
"star": 4,
"type": "bow"
},
"破魔之弓": {
"name": "破魔之弓",
"star": 4,
"type": "bow"
},
"掠食者": {
"name": "掠食者",
"star": 4,
"type": "bow"
},
"曚云之月": {
"name": "曚云之月",
"star": 4,
"type": "bow"
},
"王下近侍": {
"name": "王下近侍",
"star": 4,
"type": "bow"
},
"竭泽": {
"name": "竭泽",
"star": 4,
"type": "bow"
},
"天空之翼": {
"name": "天空之翼",
"star": 5,
"type": "bow"
},
"阿莫斯之弓": {
"name": "阿莫斯之弓",
"star": 5,
"type": "bow"
},
"终末嗟叹之诗": {
"name": "终末嗟叹之诗",
"star": 5,
"type": "bow"
},
"冬极白星": {
"name": "冬极白星",
"star": 5,
"type": "bow"
},
"若水": {
"name": "若水",
"star": 5,
"type": "bow"
},
"飞雷之弦振": {
"name": "飞雷之弦振",
"star": 5,
"type": "bow"
},
"猎人之径": {
"name": "猎人之径",
"star": 5,
"type": "bow"
},
"学徒笔记": {
"name": "学徒笔记",
"star": 1,
"type": "catalyst"
},
"口袋魔导书": {
"name": "口袋魔导书",
"star": 2,
"type": "catalyst"
},
"魔导绪论": {
"name": "魔导绪论",
"star": 3,
"type": "catalyst"
},
"讨龙英杰谭": {
"name": "讨龙英杰谭",
"star": 3,
"type": "catalyst"
},
"异世界行记": {
"name": "异世界行记",
"star": 3,
"type": "catalyst"
},
"翡玉法球": {
"name": "翡玉法球",
"star": 3,
"type": "catalyst"
},
"甲级宝珏": {
"name": "甲级宝珏",
"star": 3,
"type": "catalyst"
},
"琥珀玥": {
"name": "琥珀玥",
"star": 3,
"type": "catalyst"
},
"西风秘典": {
"name": "西风秘典",
"star": 4,
"type": "catalyst"
},
"流浪乐章": {
"name": "流浪乐章",
"star": 4,
"type": "catalyst"
},
"祭礼残章": {
"name": "祭礼残章",
"star": 4,
"type": "catalyst"
},
"宗室秘法录": {
"name": "宗室秘法录",
"star": 4,
"type": "catalyst"
},
"匣里日月": {
"name": "匣里日月",
"star": 4,
"type": "catalyst"
},
"试作金珀": {
"name": "试作金珀",
"star": 4,
"type": "catalyst"
},
"万国诸海图谱": {
"name": "万国诸海图谱",
"star": 4,
"type": "catalyst"
},
"黑岩绯玉": {
"name": "黑岩绯玉",
"star": 4,
"type": "catalyst"
},
"昭心": {
"name": "昭心",
"star": 4,
"type": "catalyst"
},
"暗巷的酒与诗": {
"name": "暗巷的酒与诗",
"star": 4,
"type": "catalyst"
},
"忍冬之果": {
"name": "忍冬之果",
"star": 4,
"type": "catalyst"
},
"嘟嘟可故事集": {
"name": "嘟嘟可故事集",
"star": 4,
"type": "catalyst"
},
"白辰之环": {
"name": "白辰之环",
"star": 4,
"type": "catalyst"
},
"证誓之明瞳": {
"name": "证誓之明瞳",
"star": 4,
"type": "catalyst"
},
"流浪的晚星": {
"name": "流浪的晚星",
"star": 4,
"type": "catalyst"
},
"盈满之实": {
"name": "盈满之实",
"star": 4,
"type": "catalyst"
},
"天空之卷": {
"name": "天空之卷",
"star": 5,
"type": "catalyst"
},
"四风原典": {
"name": "四风原典",
"star": 5,
"type": "catalyst"
},
"尘世之锁": {
"name": "尘世之锁",
"star": 5,
"type": "catalyst"
},
"不灭月华": {
"name": "不灭月华",
"star": 5,
"type": "catalyst"
},
"神乐之真意": {
"name": "神乐之真意",
"star": 5,
"type": "catalyst"
}
}

View File

@ -188,4 +188,4 @@
.char-list .cons-bg > div:last-child {
border-radius: 0 3px 3px 0;
}
/*# sourceMappingURL=character.css.map */
/*# sourceMappingURL=character-talent.css.map */

View File

@ -332,4 +332,4 @@ body {
color: #7994a7;
margin: 20px 0 10px 0;
}
/*# sourceMappingURL=character.css.map */
/*# sourceMappingURL=character-talent.css.map */

View File

@ -1,7 +1,7 @@
{{extend elemLayout}}
{{block 'css'}}
<link rel="stylesheet" type="text/css" href="{{_res_path}}/wiki/character.css"/>
<link rel="stylesheet" type="text/css" href="{{_res_path}}/wiki/character-talent.css"/>
{{/block}}
{{block 'main'}}

View File

@ -0,0 +1,117 @@
.font-YS {
font-family: Number, "汉仪文黑-65W", YS, PingFangSC-Medium, "PingFang SC", sans-serif;
}
.font-NZBZ {
font-family: Number, "印品南征北战NZBZ体", NZBZ, "汉仪文黑-65W", YS, PingFangSC-Medium, "PingFang SC", sans-serif;
}
body {
width: 600px;
}
.container {
width: 600px;
padding: 0;
background-size: cover;
overflow: hidden;
}
.char-title {
height: 100px;
padding-right: 10px;
}
.char-title .char-name {
font-size: 40px;
}
.char-title .char-name span {
font-size: 28px;
padding-right: 10px;
}
.basic {
height: 500px;
}
.char-desc {
padding-left: 240px;
font-size: 14px;
}
.char-meta {
padding-left: 370px;
}
.detail {
right: 18px;
}
.detail .cont {
margin-right: 0;
}
.detail ul.char-attr li {
width: 250px;
padding-left: 20px;
}
.detail ul.char-attr li strong {
position: initial;
color: #d3bc8e;
}
.detail ul.char-attr li span {
color: #fff;
right: 20px;
text-align: right;
width: 150px;
}
.material-list {
display: flex;
padding: 5px;
position: absolute;
left: 10px;
bottom: 6px;
z-index: 5;
}
.material-list .num {
font-size: 12px;
text-align: center;
color: #fff;
text-shadow: 0 0 1px #000, 0 0 1px #000, 0 0 3px rgba(0, 0, 0, 0.8);
display: block;
height: 14px;
margin-left: -10px;
margin-right: -10px;
width: calc(100% + 20px);
}
.material-list .item-card {
width: 47px;
margin: 2px;
overflow: hidden;
}
.material-list .item-card .item-icon {
background-size: cover;
padding: 6px 4px 17px;
}
.material-list .item-card .item-bg {
background-size: contain;
background-position: center;
}
.material-list .item-card .item-title {
display: block;
font-size: 12px;
position: absolute;
color: #fff;
bottom: 0;
left: 0;
white-space: nowrap;
background: rgba(0, 0, 0, 0.5);
padding: 4px 0;
width: 68px;
text-align: center;
transform-origin: left bottom;
transform: scale(0.7);
text-shadow: 0 0 2px #000;
}
.talent-cont {
text-align: center;
}
.talent-cont strong {
color: #d3bc8e;
}
.weapon-list {
padding: 3px;
}
.weapon-list .item {
margin: 3px;
}
/*# sourceMappingURL=character-wiki.css.map */

View File

@ -0,0 +1,76 @@
{{extend elemLayout}}
{{block 'css'}}
<link rel="stylesheet" type="text/css" href="{{_res_path}}/common/tpl.css"/>
<link rel="stylesheet" type="text/css" href="{{_res_path}}/character/profile-detail.css"/>
<link rel="stylesheet" type="text/css" href="{{_res_path}}/wiki/character-wiki.css"/>
{{/block}}
{{set weapon = data.weapon}}
{{set dataSource = data.dataSource}}
{{block 'main'}}
<div class="basic">
<div class="main-pic"
style="background-image:url({{_res_path}}{{imgs.splash}})"></div>
<div class="detail">
<div class="char-title">
<div class="char-name"><span>{{data.title}} · </span>{{data.name}}</div>
<div class="char-lv char-desc">{{data.desc}}</div>
</div>
<div class="char-meta">
<div class="cont">
<ul class="attr char-attr">
<li><strong>武器类型</strong> <span>{{data.weaponType}}</span></li>
<li><strong>命之座</strong> <span>{{data.astro}}</span></li>
<li><strong>生日</strong> <span>{{data.birthday}}</span></li>
<li><strong>归属</strong> <span>{{data.allegiance}}</span></li>
<li><strong>中文CV</strong> <span>{{data.cncv}}</span></li>
<li><strong>日文CV</strong> <span>{{data.jpcv}}</span></li>
</ul>
</div>
<div class="cont">
<div class="cont-title">90级基础属性</div>
<ul class="attr char-attr">
{{each attr ds}}
<li><strong>{{ds.title}}</strong> <span>{{ds.value}}</span></li>
{{/each}}
</ul>
</div>
</div>
</div>
<div class="material-list">
{{each materials ds}}
<div class="material-{{ds.type}}">
<div class="num">{{ds.num}}</div>
<div class="item-card material-card">
<div class="item-icon star{{ds.star}} opacity-bg">
<div class="item-bg" style="background-image:url({{_res_path}}{{ds.icon}})"></div>
</div>
<div class="item-title">{{ds.label}}</div>
</div>
</div>
{{/each}}
</div>
</div>
<div class="cont talent-cont">
<div class="cont-footer">输入<strong>#{{data.abbr}}天赋、#{{data.abbr}}命座</strong>可查看详细天赋/命座信息</div>
</div>
{{if weapons.length >0}}
<div class="cont">
<div class="cont-title">常用武器<span>武器统计来自胡桃Api</span></div>
<div class="item-list weapon-list">
{{each weapons weapon}}
<div class="item item-card">
<div class="item-icon star{{weapon.star}}">
<div class="item-bg" style="background-image:url({{_res_path}}/meta/weapons/icon/{{weapon.name}}.png)"></div>
<div class="item-badge">{{weapon.value}}</div>
</div>
<div class="item-title">{{weapon.name}}</div>
</div>
{{/each}}
</div>
</div>
{{/if}}
{{/block}}

View File

@ -0,0 +1,151 @@
@import "../common/base.less";
body {
width: 600px;
}
.container {
width: 600px;
padding: 0;
background-size: cover;
overflow: hidden;
& > .cont {
}
}
.char-title {
height: 100px;
padding-right: 10px;
.char-name {
font-size: 40px;
span {
font-size: 28px;
padding-right: 10px;
}
}
}
.basic {
height: 500px;
&:after {
}
}
.char-desc {
padding-left: 240px;
font-size: 14px;
}
.char-meta {
padding-left: 370px;
.title {
}
}
.detail {
right: 18px;
.cont {
margin-right: 0;
}
ul.char-attr {
li {
width: 250px;
padding-left: 20px;
strong {
position: initial;
color: #d3bc8e;
}
span {
color: #fff;
right: 20px;
text-align: right;
width: 150px;
}
}
}
}
.material-list {
display: flex;
padding: 5px;
position: absolute;
left: 10px;
bottom: 6px;
z-index: 5;
.num {
font-size: 12px;
text-align: center;
color: #fff;
text-shadow: 0 0 1px #000, 0 0 1px #000, 0 0 3px rgba(0, 0, 0, 0.8);
display: block;
height: 14px;
margin-left: -10px;
margin-right: -10px;
width: calc(100% + 20px)
}
.item-card {
width: 47px;
margin: 2px;
overflow: hidden;
.item-icon {
background-size: cover;
padding: 6px 4px 17px;
}
.item-bg {
background-size: contain;
background-position: center;
}
.item-title {
display: block;
font-size: 12px;
position: absolute;
color: #fff;
bottom: 0;
left: 0;
white-space: nowrap;
background: rgba(0, 0, 0, 0.5);
padding: 4px 0;
width: 68px;
text-align: center;
transform-origin: left bottom;
transform: scale(.7);
text-shadow: 0 0 2px #000;
}
}
}
.talent-cont {
text-align: center;
strong {
color: #d3bc8e;
}
}
.weapon-list {
padding: 3px;
.item {
margin: 3px;
}
}

View File

@ -42,7 +42,7 @@ const CharData = {
ret.elem = title('Element').toLowerCase()
ret.allegiance = title('Occupation')
ret.weapon = title('Weapon').toLowerCase()
ret.britydah = title('Month of Birth') + '-' + title('Day of Birth')
ret.birthday = title('Month of Birth') + '-' + title('Day of Birth')
ret.astro = title('Constellation')
ret.desc = title('Description')
ret.cncv = fix.cncv || title('Chinese')

View File

@ -0,0 +1,44 @@
import fetch from 'node-fetch';
import cheerio from 'cheerio';
import lodash from 'lodash'
import { Data } from '../components/index.js'
let ret = Data.readJSON('resources/meta/weapons/data.json')
let getWeaponData = async function (type) {
let url = `https://genshin.honeyhunterworld.com/fam_${type}/?lang=CHS`
console.log('req: ' + url)
let req = await fetch(url, {
method: 'GET',
headers: {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36 Edg/105.0.1343.20',
referer: 'https://genshin.honeyhunterworld.com/fam_chars/?lang=CHS',
'sec-ch-ua': '"Microsoft Edge";v = "105", " Not;A Brand";v = "99", "Chromium";v = "105"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': 'Windows',
'sec-fetch-dest': 'document',
'sec-fetch-mode': 'navigate',
'sec-fetch-site': 'none',
'sec-fetch-user': '?1',
'upgrade-insecure-requests': 1
}
})
let txt = await req.text()
let sTxt = /sortable_data.push\((.*)\)/.exec(txt)
if (sTxt && sTxt[1]) {
let tmp = eval(sTxt[1])
lodash.forEach(tmp, (ds) => {
let name = cheerio.load(ds[1])('a').text()
let star = cheerio.load(ds[2])('img').length
ret[name] = {
name,
star,
type
}
})
}
}
for (let type of ['sword', 'claymore', 'polearm', 'bow', 'catalyst']) {
await getWeaponData(type)
}
Data.writeJSON('resources/meta/weapons/data.json', ret)