From 9ee1aa28a9c60988e96172ef6c1884af79908908 Mon Sep 17 00:00:00 2001 From: Kokomi <102026640+yoimiya-kokomi@users.noreply.github.com> Date: Wed, 17 May 2023 03:15:00 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E6=98=9F=E9=93=81?= =?UTF-8?q?=E9=9D=A2=E6=9D=BF=E5=B1=9E=E6=80=A7=EF=BC=8C=E5=B0=9A=E6=9C=AA?= =?UTF-8?q?=E5=AE=8C=E6=88=90=EF=BC=8C=E8=AF=B7=E5=8B=BF=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E8=87=B3Dev?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/common/Elem.js | 4 +++ models/AvatarArtis.js | 2 +- models/Player.js | 1 - models/ProfileArtis.js | 4 +-- models/ProfileAttr.js | 31 ++++++++++++++--------- models/ProfileData.js | 2 +- models/model-sr/CharacterSR.js | 6 ----- models/profile/ArtisMark.js | 40 ++++++++++++------------------ models/profile/AttrCalc.js | 24 ++++++++++++++++-- models/profile/DataTrans.js | 32 ++++++++++++++++++++++++ resources/meta-sr/artifact/meta.js | 35 ++++++++++++++++++++++++++ 11 files changed, 132 insertions(+), 49 deletions(-) delete mode 100644 models/model-sr/CharacterSR.js create mode 100644 models/profile/DataTrans.js create mode 100644 resources/meta-sr/artifact/meta.js diff --git a/components/common/Elem.js b/components/common/Elem.js index bda4a1b2..941f9802 100644 --- a/components/common/Elem.js +++ b/components/common/Elem.js @@ -11,6 +11,10 @@ const elemAlias = { cryo: '冰,至冬' } +const elemAliasSR = { + +} + // 元素属性映射, 名称=>elem let elemMap = {} diff --git a/models/AvatarArtis.js b/models/AvatarArtis.js index 84c5c028..f4297a4b 100644 --- a/models/AvatarArtis.js +++ b/models/AvatarArtis.js @@ -158,7 +158,7 @@ export default class AvatarArtis extends Base { level: ds.level || 1, star: ds.star || 5 } - console.log('tojson', 'isSr') + if (this.isSr) { tmp.id = ds.id tmp.mainId = ds.main?.id diff --git a/models/Player.js b/models/Player.js index eecefca7..599aa7e9 100644 --- a/models/Player.js +++ b/models/Player.js @@ -16,7 +16,6 @@ Data.createDir('/data/UserData', 'root') Data.createDir('/data/PlayerData/gs', 'root') Data.createDir('/data/PlayerData/sr', 'root') - export default class Player extends Base { constructor (uid, game = 'gs') { super() diff --git a/models/ProfileArtis.js b/models/ProfileArtis.js index 24b2efbb..b36a1260 100644 --- a/models/ProfileArtis.js +++ b/models/ProfileArtis.js @@ -94,8 +94,8 @@ export default class ProfileArtis extends AvatarArtis { _mark: mark, mark: Format.comma(mark, 1), markClass: ArtisMark.getMarkClass(mark), - main: ArtisMark.formatArti(arti.main, charCfg.attrs, true, this.elem || ''), - attrs: ArtisMark.formatArti(arti.attrs, charCfg.attrs) + main: ArtisMark.formatArti(arti.main, charCfg.attrs, true, this.game), + attrs: ArtisMark.formatArti(arti.attrs, charCfg.attrs, false, this.game) } } }) diff --git a/models/ProfileAttr.js b/models/ProfileAttr.js index a10ac468..42ad2ae8 100644 --- a/models/ProfileAttr.js +++ b/models/ProfileAttr.js @@ -1,17 +1,24 @@ import lodash from 'lodash' import Base from './Base.js' -const baseAttr = 'atk,def,hp,mastery,recharge,cpct,cdmg,dmg,phy,heal,shield'.split(',') -let attrReg = new RegExp(`^(${baseAttr.join('|')})(Base|Plus|Pct|Inc)$`) +const baseAttr = { + gs: 'atk,def,hp,mastery,recharge,cpct,cdmg,dmg,phy,heal,shield'.split(','), + sr: 'atk,def,hp,speed,recharge,cpct,cdmg,dmg,heal,stance,effPct,effDmg'.split(',') +} +let attrReg = { + gs: new RegExp(`^(${baseAttr.gs.join('|')})(Base|Plus|Pct|Inc)$`), + sr: new RegExp(`^(${baseAttr.sr.join('|')})(Base|Plus|Pct|Inc)$`) +} class ProfileAttr extends Base { - constructor (data = null) { + constructor (data = null, game = 'gs') { super() + this.game = game this.init(data) } - static create (data = null) { - return new ProfileAttr(data) + static create (data = null, game = 'gs') { + return new ProfileAttr(data, game) } init (data) { @@ -20,7 +27,7 @@ class ProfileAttr extends Base { this._base = {} let attr = this._attr let base = this._base - lodash.forEach(baseAttr, (key) => { + lodash.forEach(baseAttr[this.game], (key) => { attr[key] = { base: 0, plus: 0, @@ -42,12 +49,12 @@ class ProfileAttr extends Base { */ _get (key) { let attr = this._attr - if (baseAttr.includes(key)) { + if (baseAttr[this.game].includes(key)) { let a = attr[key] return a.base * (1 + a.pct / 100) + a.plus } - let testRet = attrReg.exec(key) + let testRet = attrReg[this.game].exec(key) if (testRet && testRet[1] && testRet[2]) { let key = testRet[1] let key2 = testRet[2].toLowerCase() @@ -59,13 +66,13 @@ class ProfileAttr extends Base { * 添加或追加Attr数据 * @param key * @param val - * @param base + * @param isBase * @returns {boolean} */ addAttr (key, val, isBase = false) { let attr = this._attr let base = this._base - if (baseAttr.includes(key)) { + if (baseAttr[this.game].includes(key)) { attr[key].plus += val * 1 if (isBase) { base[key] = (base[key] || 0) + val * 1 @@ -73,7 +80,7 @@ class ProfileAttr extends Base { return true } - let testRet = attrReg.exec(key) + let testRet = attrReg[this.game].exec(key) if (testRet && testRet[1] && testRet[2]) { let key = testRet[1] let key2 = testRet[2].toLowerCase() @@ -109,7 +116,7 @@ class ProfileAttr extends Base { getAttr () { let ret = {} - lodash.forEach(baseAttr, (key) => { + lodash.forEach(baseAttr[this.game], (key) => { ret[key] = this[key] if (['hp', 'atk', 'def'].includes(key)) { ret[`${key}Base`] = this[`${key}Base`] diff --git a/models/ProfileData.js b/models/ProfileData.js index eeab336c..da817540 100644 --- a/models/ProfileData.js +++ b/models/ProfileData.js @@ -76,7 +76,7 @@ export default class ProfileData extends AvatarData { } calcAttr () { - this._attr = AttrCalc.create(this, this.game) + this._attr = AttrCalc.create(this) this.attr = this._attr.calc() this.base = this._attr.getBase() } diff --git a/models/model-sr/CharacterSR.js b/models/model-sr/CharacterSR.js deleted file mode 100644 index 5660a61f..00000000 --- a/models/model-sr/CharacterSR.js +++ /dev/null @@ -1,6 +0,0 @@ -import Character from '../Character.js' - -class Character extends Character { - - -} \ No newline at end of file diff --git a/models/profile/ArtisMark.js b/models/profile/ArtisMark.js index 4f83ecac..074f07b8 100644 --- a/models/profile/ArtisMark.js +++ b/models/profile/ArtisMark.js @@ -1,37 +1,30 @@ import lodash from 'lodash' import { Format } from '#miao' -import { attrNameMap, mainAttr, subAttr, attrMap, basicNum, attrPct } from '../../resources/meta/artifact/index.js' +import { attrNameMap, mainAttr, subAttr, attrMap } from '../../resources/meta/artifact/index.js' +import { + attrMap as attrMapSR +} from '../../resources/meta-sr/artifact/meta.js' let ArtisMark = { // 根据Key获取标题 - getKeyByTitle (title, dmg = false) { + getKeyByTitle (title, dmg = false, game = 'gs') { if (/元素伤害加成/.test(title) || Format.isElem(title)) { let elem = Format.matchElem(title) return dmg ? 'dmg' : elem } else if (title === '物理伤害加成') { return 'phy' } - return attrNameMap[title] + return (game === 'gs' ? attrNameMap : attrNameMapSR)[title] }, - // 根据标题获取Key - getTitleByKey (key) { - // 检查是否是伤害字段 - let dmg = Format.elemName(key, '') - if (dmg) { - return `${dmg}伤加成` - } - return attrMap[key].title - }, - - getKeyTitleMap () { + getKeyTitleMap (game = 'gs') { let ret = {} lodash.forEach(attrMap, (ds, key) => { ret[key] = ds.title }) Format.eachElem((key, name) => { ret[key] = `${name}伤加成` - }) + }, game) return ret }, @@ -57,11 +50,11 @@ let ArtisMark = { /** * 格式化圣遗物词条 * @param ds - * @param markCfg + * @param charAttrCfg * @param isMain * @returns {{title: *, value: string}|*[]} */ - formatArti (ds, charAttrCfg = false, isMain = false, elem = '') { + formatArti (ds, charAttrCfg = false, isMain = false, game = 'gs') { // 若为attr数组 if (ds[0] && (ds[0].title || ds[0].key)) { let ret = [] @@ -71,7 +64,7 @@ let ArtisMark = { lodash.forEach(ds, (d) => { isIdAttr = !d.isCalcNum - let arti = ArtisMark.formatArti(d, charAttrCfg) + let arti = ArtisMark.formatArti(d, charAttrCfg, isMain, game) ret.push(arti) if (isIdAttr) { return true @@ -101,8 +94,6 @@ let ArtisMark = { let title = ds.title || ds[0] if (!key) { key = ArtisMark.getKeyByTitle(title) - } else if (!title) { - title = ArtisMark.getTitleByKey(key) } let isDmg = Format.isElem(key) let val = ds.value || ds[1] @@ -111,22 +102,23 @@ let ArtisMark = { if (!key || key === 'undefined') { return {} } - let arrCfg = attrMap[isDmg ? 'dmg' : key] - val = Format[arrCfg.format](val, 1) + let arrCfg = (game === 'gs' ? attrMap : attrMapSR)[isDmg ? 'dmg' : key] + console.log(key, arrCfg) + val = Format[arrCfg?.format || 'comma'](val, 1) let ret = { key, value: val, upNum: ds.upNum || 0, eff: ds.eff || 0 } - if (!isMain && !ret.upNum) { + /* if (!isMain && !ret.upNum) { let incRet = ArtisMark.getIncNum(key, value) ret.upNum = incRet.num ret.eff = incRet.eff ret.hasGt = incRet.hasGt ret.hasLt = incRet.hasLt ret.isCalcNum = true - } + }*/ if (charAttrCfg) { let mark = charAttrCfg[key]?.mark * num || 0 diff --git a/models/profile/AttrCalc.js b/models/profile/AttrCalc.js index 6998f8ee..f019f6a9 100644 --- a/models/profile/AttrCalc.js +++ b/models/profile/AttrCalc.js @@ -16,6 +16,14 @@ class AttrCalc { this.game = profile.game } + get isGs () { + return this.game === 'gs' + } + + get isSr () { + return this.game === 'sr' + } + /** * 静态调用入口 * @param profile @@ -25,6 +33,7 @@ class AttrCalc { return new AttrCalc(profile) } + // 只有原神才需要 static calcPromote (lv) { if (lv === 20) { return 1 @@ -48,11 +57,13 @@ class AttrCalc { * @returns {{}} */ calc () { - this.attr = ProfileAttr.create({}) - if (this.profile.isGs) { + this.attr = ProfileAttr.create({}, this.game) + if (this.isGs) { this.addAttr('recharge', 100, true) this.addAttr('cpct', 5, true) this.addAttr('cdmg', 50, true) + } else { + } this.setCharAttr() this.setWeaponAttr() @@ -74,6 +85,9 @@ class AttrCalc { * @param affix */ setCharAttr (affix = '') { + if (this.isGs) { + return + } let { char, level, promote } = this.profile let metaAttr = char.detail?.attr || {} let { keys = {}, details = {} } = metaAttr @@ -125,6 +139,9 @@ class AttrCalc { * 计算武器属性 */ setWeaponAttr () { + if (this.isGs) { + return + } let wData = this.profile?.weapon || {} let weapon = Weapon.get(wData?.name || wData?.id, this.game) let wCalcRet = weapon.calcAttr(wData.level, wData.promote) @@ -155,6 +172,9 @@ class AttrCalc { * 计算圣遗物属性 */ setArtisAttr () { + if (this.isGs) { + return + } let artis = this.profile?.artis // 计算圣遗物词条 artis.forEach((arti) => { diff --git a/models/profile/DataTrans.js b/models/profile/DataTrans.js new file mode 100644 index 00000000..a85da198 --- /dev/null +++ b/models/profile/DataTrans.js @@ -0,0 +1,32 @@ +/** + * 旧面板数据迁移 + * 去除旧格式,控制逻辑复杂度 + */ +import fs from 'node:fs' +import lodash from 'lodash' +import { Data } from '#miao' + +const DataTrans = { + trans () { + const srcPath = './data/UserData' + let uids = fs.readdirSync(srcPath) + uids = uids.filter((uid) => /\.json/i.test(uid)) + lodash.forEach(uids, (uid) => { + let data = Data.readJSON(`/data/UserData/${uid}`) + DataTrans.doTrans(data) + }) + }, + doTrans (data) { + lodash.forEach(data.avatars, (ds, id) => { + data.avatars[id] = DataTrans.getAvatar(ds) + }) + }, + getAvatar (data) { + let artisSet = {} + lodash.forEach(data.artis, (ds, idx) => { + + }) + + } +} +export default DataTrans \ No newline at end of file diff --git a/resources/meta-sr/artifact/meta.js b/resources/meta-sr/artifact/meta.js new file mode 100644 index 00000000..e1ea00bf --- /dev/null +++ b/resources/meta-sr/artifact/meta.js @@ -0,0 +1,35 @@ +export const mainAttr = { + 3: 'atk,def,hp,cpct,cdmg,heal,effPct'.split(','), + 4: 'atk,def,hp,speed'.split(','), + 5: 'atk,def,hp,dmg'.split(','), + 6: 'atk,def,hp,recharge,stance'.split(',') +} + +export const subAttr = 'atk,atkPlus,def,defPlus,hp,hpPlus,speed,cpct,cdmg,effPct,effDef,stance'.split(',') + +/** + * 圣遗物词条配置 + * @[]value 副词条单次提升值(最大档位) + * @[]valueMin 副词条单次提升最小值 + * @[]calc 伤害计算时变更的字段type + * @[]type 词条的类型 normal:普通字段 plus:小词条 + * @[]base 词条类型为小词条时,对应的大词条 + * @[]text 展示文字 + */ +export const attrMap = { + atk: { title: '大攻击', format: 'pct', calc: 'pct' }, + atkPlus: { title: '小攻击', format: 'comma' }, + def: { title: '大防御', format: 'pct', calc: 'pct' }, + defPlus: { title: '小防御', format: 'comma' }, + hp: { title: '大生命', format: 'pct', calc: 'pct' }, + hpPlus: { title: '小生命', format: 'comma' }, + speed: { title: '速度', format: 'comma' }, + cpct: { title: '暴击率', format: 'pct', calc: 'plus' }, + cdmg: { title: '暴击伤害', format: 'pct', calc: 'plus' }, + recharge: { title: '充能效率', format: 'pct', calc: 'plus' }, + dmg: { title: '伤害加成', format: 'pct' }, + heal: { title: '治疗加成', format: 'pct' }, + stance: { title: '击破特攻', format: 'pct' }, + effPct: { title: '效果命中', format: 'pct' }, + effDef: { title: '效果抵抗', format: 'pct' } +} \ No newline at end of file