diff --git a/plugins/genshin/apps/abbrSet.js b/plugins/genshin/apps/abbrSet.js index 3063eb2..ca56b5a 100644 --- a/plugins/genshin/apps/abbrSet.js +++ b/plugins/genshin/apps/abbrSet.js @@ -5,7 +5,7 @@ import YAML from 'yaml' import lodash from 'lodash' export class abbrSet extends plugin { - constructor (e) { + constructor(e) { super({ name: '别名设置', dsc: '角色别名设置', @@ -13,24 +13,24 @@ export class abbrSet extends plugin { priority: 600, rule: [ { - reg: '^#(设置|配置)(.*)(别名|昵称)$', + reg: '^#(星铁)?(设置|配置)(.*)(别名|昵称)$', fnc: 'abbr' }, { - reg: '^#删除(别名|昵称)(.*)$', + reg: '^#(星铁)?删除(别名|昵称)(.*)$', fnc: 'delAbbr' }, { - reg: '^#(.*)(别名|昵称)$', + reg: '^#(星铁)?(.*)(别名|昵称)$', fnc: 'abbrList' } ] }) - + this.isSr = false this.file = './plugins/genshin/config/role.name.yaml' } - async init () { + async init() { if (!fs.existsSync(this.file)) { fs.writeFileSync(this.file, `神里绫华: - 龟龟 @@ -38,17 +38,18 @@ export class abbrSet extends plugin { } } - async abbr () { + async abbr() { if (!await this.checkAuth()) return - let role = gsCfg.getRole(this.e.msg, '#|设置|配置|别名|昵称') + let role = gsCfg.getRole(this.e.msg, '#|星铁|设置|配置|别名|昵称', this.e.isSr) if (!role) return false this.e.role = role + this.isSr = this.e.isSr this.setContext('setAbbr') await this.reply(`请发送${role.alias}别名,多个用空格隔开`) } - async checkAuth () { + async checkAuth() { if (!this.e.isGroup && !this.e.isMaster) { await this.reply('禁止私聊设置角色别名') return false @@ -76,7 +77,7 @@ export class abbrSet extends plugin { return true } - async setAbbr () { + async setAbbr() { if (!this.e.msg || this.e.at || this.e.img) { await this.reply('设置错误:请发送正确内容') return @@ -96,10 +97,10 @@ export class abbrSet extends plugin { let ret = [] for (let name of setName) { - name = name.replace(/#|设置|配置|别名|昵称/g, '') + name = name.replace(/#|星铁|设置|配置|别名|昵称/g, '') if (!name) continue /** 重复添加 */ - if (nameArr[role.name].includes(name) || gsCfg.roleNameToID(name)) { + if (nameArr[role.name].includes(name) || gsCfg.roleNameToID(name, this.isSr)) { continue } @@ -113,18 +114,18 @@ export class abbrSet extends plugin { this.save(nameArr) - gsCfg.nameID = false + gsCfg[this.isSr ? 'sr_nameID' : 'nameID'] = false await this.reply(`设置别名成功:${ret.join('、')}`) } - save (data) { + save(data) { data = YAML.stringify(data) fs.writeFileSync(this.file, data) } - async delAbbr () { - let role = gsCfg.getRole(this.e.msg, '#|删除|别名|昵称') + async delAbbr() { + let role = gsCfg.getRole(this.e.msg, '#|星铁|删除|别名|昵称', this.e.isSr) if (!role) return false @@ -145,12 +146,12 @@ export class abbrSet extends plugin { await this.reply(`设置${role.name}别名成功:${role.alias}`) } - async abbrList () { - let role = gsCfg.getRole(this.e.msg, '#|别名|昵称') + async abbrList() { + let role = gsCfg.getRole(this.e.msg, '#|星铁|别名|昵称', this.e.isSr) if (!role) return false - let name = gsCfg.getdefSet('role', 'name')[role.roleId] + let name = gsCfg.getdefSet('role', this.e.isSr ? 'sr_name' : 'name')[role.roleId] let nameUser = gsCfg.getConfig('role', 'name')[role.name] ?? [] let list = lodash.uniq([...name, ...nameUser]) @@ -168,7 +169,7 @@ export class abbrSet extends plugin { await this.e.reply(msg) } - async makeForwardMsg (qq, title, msg) { + async makeForwardMsg(qq, title, msg) { let nickname = this.e.bot.nickname if (this.e.isGroup) { let info = await this.e.bot.getGroupMemberInfo(this.e.group_id, qq) diff --git a/plugins/genshin/apps/calculator.js b/plugins/genshin/apps/calculator.js index 75e6614..9766fee 100644 --- a/plugins/genshin/apps/calculator.js +++ b/plugins/genshin/apps/calculator.js @@ -5,7 +5,7 @@ import puppeteer from '../../../lib/puppeteer/puppeteer.js' import gsCfg from '../model/gsCfg.js' export class calculator extends plugin { - constructor () { + constructor() { super({ name: '养成计算', dsc: '角色养成材料计算器', @@ -13,47 +13,48 @@ export class calculator extends plugin { priority: 700, rule: [ { - reg: '^#*(.*)(养成|计算)([0-9]|,|,| )*$', + reg: '^#*(星铁)?(.*)(养成|计算)([0-9]|,|,| )*$', fnc: 'Calculator' }, { - reg: '^#*角色(养成|计算|养成计算)$', + reg: '^#*(星铁)?角色(养成|计算|养成计算)$', fnc: 'calculatorHelp' }, - { - reg: '^#*尘歌壶模数(养成|计算|养成计算)$', - fnc: 'blueprintHelp' - }, - { - reg: '^#*尘歌壶(模数|养成|养成计算)(\\d{10,15})$', - fnc: 'Blueprint' - }, + { + reg: '^#*尘歌壶模数(养成|计算|养成计算)$', + fnc: 'blueprintHelp' + }, + { + reg: '^#*尘歌壶(模数|养成|养成计算)(\\d{10,15})$', + fnc: 'Blueprint' + }, ] }) + this._path = process.cwd().replace(/\\/g, '/') } - async blueprintHelp (e) { + async blueprintHelp(e) { let msg = '#尘歌壶模数\n指令:#尘歌壶模数\n示例:#尘歌壶模数123456\n参数为模数id(10-15位数字)' await e.reply(msg) return true } - - async calculatorHelp (e) { - let msg = '#角色养成计算\n指令:#刻晴养成\n示例:#刻晴养成81 90 9 9 9\n参数为角色、武器、技能等级' + + async calculatorHelp(e) { + let msg = `角色养成计算\n指令:${e.isSr ? '*克拉拉养成\n示例:*克拉拉养成75 80 6 9 9 9\n参数为角色、武器、普攻、战技、终结技、天赋' : '#刻晴养成\n示例:#刻晴养成81 90 9 9 9\n参数为角色、武器、技能等级'}` await e.reply(msg) return true } - async Blueprint(){ - let role = this.e.msg.replace(/#/,'').match(/\d+/g); - let data = await new Blueprint(this.e).get(role) - if (!data) return - - /** 生成图片 */ - let img = await puppeteer.screenshot('Blueprint', data) - if (img) await this.reply(img) + async Blueprint() { + let role = this.e.msg.replace(/#/, '').match(/\d+/g); + let data = await new Blueprint(this.e).get(role) + if (!data) return + + /** 生成图片 */ + let img = await puppeteer.screenshot('Blueprint', data) + if (img) await this.reply(img) } /** #刻晴养成 */ - async Calculator () { - let role = gsCfg.getRole(this.e.msg, '#|#|养成|计算|[0-9]|,|,| ') + async Calculator() { + let role = gsCfg.getRole(this.e.msg, '#|#|星铁|养成|计算|[0-9]|,|,| ', this.e.isSr) if (!role) return false if ([10000005, 10000007, 20000000].includes(Number(role.roleId))) { @@ -65,7 +66,18 @@ export class calculator extends plugin { if (!data) return /** 生成图片 */ - let img = await puppeteer.screenshot('Calculator', data) + let url = this.srHead('calculator', data) + let img = await puppeteer.screenshot(url, data) if (img) await this.reply(img) } + srHead = (url, data) => { + let name = url + if (this.e.isSr) { + name = `StarRail/${url}` + data.pluResPath = `${this._path}/plugins/genshin/resources/StarRail/` + data.tplFile = `./plugins/genshin/resources/StarRail/html/${url}/${url}.html` + data.headStyle = `` + } + return name + } } diff --git a/plugins/genshin/defSet/role/sr_name.yaml b/plugins/genshin/defSet/role/sr_name.yaml new file mode 100644 index 0000000..7c2f0fd --- /dev/null +++ b/plugins/genshin/defSet/role/sr_name.yaml @@ -0,0 +1,149 @@ +1001: + - 三月七 + - 三月 + - 看板娘 + - 三七 + - 三祁 + - 纠缠之缘 + - March7th + - 37 +1002: + - 单恒 + - 单垣 + - 丹垣 + - 丹桁 + - 冷面小青龙 + - DanHeng + - 丹恒 +1003: + - 姬子 + - 机子 + - 寄子 + - Himeko +1004: + - 瓦尔特 + - 杨叔 + - 老杨 + - Welt +1005: + - 卡芙卡 +1006: + - 银狼 + - 音浪 + - 银浪 + - 隐狼 + - 淫狼 + - 骇兔 + - 鸭子 + - 小鸭 + - 小鸭鸭 + - yinlang + - YinLang +1008: + - 阿兰 + - 阿兰 + - Alan + - 阿郎 + - 阿蓝 + - Arlan +1009: + - 艾丝妲 + - 爱思达 + - 爱丝妲 + - 爱思妲 + - 爱丝达 + - 艾思达 + - 艾思妲 + - 艾丝达 + - 富婆 + - Asta +1013: + - 黑塔 + - 人偶 + - 转圈圈 + - Herta +1101: + - 布洛妮娅 + - 布诺妮亚 + - 布洛妮亚 + - 布诺妮娅 + - 布洛尼亚 + - 鸭鸭 + - 大鸭鸭 + - Bronya +1102: + - 希儿 + - 希尔 + - Seele +1103: + - 希露瓦 + - 希录瓦 + - Serval +1104: + - 杰帕德 + - 杰哥 + - Gepard +1105: + - 娜塔莎 + - 那塔莎 + - 那塔沙 + - 娜塔沙 + - Natasha + - 渡鸦 +1106: + - 佩拉 + - 配拉 + - 佩啦 + - 冰砂糖 + - Pela +1107: + - 克拉拉 + - 可拉拉 + - 史瓦罗 + - Clara +1108: + - 桑博 + - Sampo +1109: + - 虎克 + - 胡克 + - Hook +1201: + - 青雀 + - 青却 + - 卿雀 + - Qingque +1202: + - 停云 + - 停运 + - 听云 + - Tingyun +1203: + - 罗刹 +1204: + - 景元 + - JingYuan +1205: + - 刃 +1206: + - 素裳 + - 李素裳 + - Sushang +1207: + - 驭空 +1209: + - 彦卿 + - 言情 + - 彦情 + - 彦青 + - 言卿 + - 燕青 + - Yanqing +1211: + - 白露 + - 龙女 + - 小龙女 + - 白鹭 + - 白鹿 + - 白麓 + - Bailu \ No newline at end of file diff --git a/plugins/genshin/model/calculator.js b/plugins/genshin/model/calculator.js index ea5a1dc..fdf4c87 100644 --- a/plugins/genshin/model/calculator.js +++ b/plugins/genshin/model/calculator.js @@ -5,13 +5,13 @@ import lodash from 'lodash' import gsCfg from './gsCfg.js' export default class Calculator extends base { - constructor (e) { + constructor(e) { super(e) this.model = 'calculator' - this.checkMsg = '设置角色、武器、技能等级有误\n指令:#刻晴养成\n示例:#刻晴养成81 90 9 9 9\n参数为角色、武器、技能等级' + this.checkMsg = `设置角色、武器、技能等级有误\n指令:${e.isSr ? '*克拉拉养成\n示例:*克拉拉养成75 80 6 9 9 9\n参数为角色、武器、普攻、战技、终结技、天赋' : '#刻晴养成\n示例:#刻晴养成81 90 9 9 9\n参数为角色、武器、技能等级'}` } - async get (role) { + async get(role) { this.role = role /** 获取绑定uid */ let uid = await MysInfo.getUid(this.e) @@ -26,8 +26,18 @@ export default class Calculator extends base { this.mysApi = new MysApi(uid, ck.ck, { log: true }) + let seed_id = lodash.sample('abcdefghijklmnopqrstuvwxyz0123456789', 16).replace(/,/g, '') + let device_fp = await MysInfo.get(this.e, 'getFp', { + seed_id + }) + this.headers = { + 'x-rpc-device_fp': device_fp?.data?.device_fp + } + /** 获取角色数据 */ - let character = await this.mysApi.getData('character') + let character = await MysInfo.get(this.e, this.e.isSr ? 'avatarInfo' : 'character', { + headers: this.headers, + }) if (!character || character.retcode !== 0) return false character = character.data @@ -35,7 +45,7 @@ export default class Calculator extends base { await this.getSet() /** 获取计算角色 */ - this.dataCharacter = character.avatars.find((item) => item.id == role.roleId) + this.dataCharacter = character[this.e.isSr ? 'avatar_list' : 'avatars'].find((item) => item.id == role.roleId) /** 获取计算参数 */ let body = await this.getBody() @@ -56,34 +66,35 @@ export default class Calculator extends base { } } - async getSet () { - let defSetSkill = '90,90,10,10,10'.split(',') + async getSet() { + let defSetSkill = this.e.isSr ? '80,80,6,10,10,10'.split(',') : '90,90,10,10,10'.split(',') - let set = this.e.msg.replace(/#|#|养成|计算/g, '').trim() + let set = this.e.msg.replace(/#|#|星铁|养成|计算/g, '').trim() set = set.replace(/,| /g, ',') set = set.replace(this.role.alias, '') let setSkill = [] + let length = this.e.isSr ? 6 : 5 if (set) { setSkill = set.split(',') setSkill = lodash.compact(setSkill) - for (let i = 0; i <= 4; i++) { + for (let i = 0; i < length; i++) { if (!setSkill[i]) setSkill[i] = defSetSkill[i] } } else { setSkill = defSetSkill } - if (setSkill.length != 5) { - let reMsg = this.checkMsg.replace(/刻晴/g, this.role.alias) + if (setSkill.length != length) { + let reMsg = this.checkMsg.replace(/刻晴|克拉拉/g, this.role.alias) await this.e.reply(reMsg) return false } /** 检查参数 */ - let check = [90, 90, 10, 10, 10] + let check = this.e.isSr ? [80, 80, 6, 10, 10, 10] : [90, 90, 10, 10, 10] for (const key in check) { if (check[key] < Number(setSkill[key])) { setSkill[key] = check[key] @@ -93,21 +104,37 @@ export default class Calculator extends base { this.setSkill = setSkill } - async getBody () { + async getBody() { // 技能 let skillList = [] if (this.dataCharacter) { /** 角色存在获取技能数据 */ - let detail = await this.mysApi.getData('detail', { avatar_id: this.role.roleId }) + let data = this.e.isSr ? { avatar_id: this.role.roleId, tab_from: 'TabOwned' } : { avatar_id: this.role.roleId } + let detail = await MysInfo.get(this.e, 'detail', { + headers: this.headers, + ...data + }) if (!detail || detail.retcode !== 0) return false - skillList = detail.data.skill_list + skillList = detail.data.skill_list || detail.data.skills } else { /** 尚未拥有的角色 */ - skillList = await this.getSkillId(this.role.roleId) + if (this.e.isSr) { + let detail = await MysInfo.get(this.e, 'detail', { + headers: this.headers, + avatar_id: this.role.roleId, + tab_from: 'TabAll' + }) + if (!detail || detail.retcode !== 0) return false + + this.avatar = detail.data.avatar + skillList = detail.data.skills + } else { + skillList = await this.getSkillId(this.role.roleId) + } if (!skillList) { - this.e.reply('暂无角色数据,请稍后再试') + this.e.reply('暂无角色数据,请稍后再试\n星铁角色养成请使用*开头') return false } @@ -116,57 +143,96 @@ export default class Calculator extends base { this.dataCharacter = { level: 1, name: this.role.name, - icon: `${this.screenData.pluResPath}img/role/${this.role.name}.png`, - rarity: four.includes(Number(this.role.roleId)) ? 4 : 5 + icon: this.e.isSr ? this.avatar.icon_url : `${this.screenData.pluResPath}img/role/${this.role.name}.png`, + rarity: this.e.isSr ? this.avatar.rarity : four.includes(Number(this.role.roleId)) ? 4 : 5 } } - skillList = skillList.filter((item) => item.max_level != 1) - /** 拼接计算参数 */ - let body = { - avatar_id: Number(this.role.roleId), - avatar_level_current: Number(this.dataCharacter.level), - avatar_level_target: Number(this.setSkill[0]), - skill_list: [ - { - id: Number(skillList[0].group_id), - level_current: Number(skillList[0].level_current), - level_target: Number(this.setSkill[2]) + let body + if (this.e.isSr) { + body = { + game: 'hkrpg', + avatar: { + item_id: Number(this.role.roleId), + cur_level: Number(this.dataCharacter.level), + target_level: Number(this.setSkill[0]), }, - { - id: Number(skillList[1].group_id), - level_current: Number(skillList[1].level_current), - level_target: Number(this.setSkill[3]) - }, - { - id: Number(skillList[2].group_id), - level_current: Number(skillList[2].level_current), - level_target: Number(this.setSkill[4]) + skill_list: [] + } + for (let data of skillList) { + let skill = { + item_id: data.point_id, + cur_level: data.cur_level, + target_level: data.target_level } - ] + if (Number(this.setSkill[0]) >= data.min_level_limit) body.skill_list.push(skill) + } + + } else { + skillList = skillList.filter((item) => item.max_level != 1) + + body = { + avatar_id: Number(this.role.roleId), + avatar_level_current: Number(this.dataCharacter.level), + avatar_level_target: Number(this.setSkill[0]), + skill_list: [ + { + id: Number(skillList[0].group_id), + level_current: Number(skillList[0].level_current), + level_target: Number(this.setSkill[2]) + }, + { + id: Number(skillList[1].group_id), + level_current: Number(skillList[1].level_current), + level_target: Number(this.setSkill[3]) + }, + { + id: Number(skillList[2].group_id), + level_current: Number(skillList[2].level_current), + level_target: Number(this.setSkill[4]) + } + ] + } } if (this.mysApi.getServer().startsWith('os')) { body.lang = "zh-cn" } - if (this.dataCharacter.weapon) { - if (Number(this.dataCharacter.weapon.rarity) < 3) { - this.setSkill[1] = 70 + if (this.e.isSr) { + if (this.dataCharacter.equip) { + body.equipment = { + item_id: Number(this.dataCharacter.equip.id), + cur_level: Number(this.dataCharacter.equip.level), + target_level: Number(this.setSkill[1]) + } } - body.weapon = { - id: Number(this.dataCharacter.weapon.id), - level_current: Number(this.dataCharacter.weapon.level), - level_target: Number(this.setSkill[1]) + } else { + if (this.dataCharacter.weapon) { + if (Number(this.dataCharacter.weapon.rarity) < 3) { + this.setSkill[1] = 70 + } + + body.weapon = { + id: Number(this.dataCharacter.weapon.id), + level_current: Number(this.dataCharacter.weapon.level), + level_target: Number(this.setSkill[1]) + } + } } + + skillList = skillList.filter((item) => item.max_level != 1) this.skillList = skillList return body } - async getSkillId (roleId) { - let avatarSkill = await this.mysApi.getData('avatarSkill', { avatar_id: roleId }) + async getSkillId(roleId) { + let avatarSkill = await MysInfo.get(this.e, 'avatarSkill', { + headers: this.headers, + avatar_id: roleId + }) if (!avatarSkill || avatarSkill.retcode !== 0) return false avatarSkill = avatarSkill.data avatarSkill.list.forEach((item) => { @@ -176,20 +242,20 @@ export default class Calculator extends base { return avatarSkill.list } - async computes (body) { - let computes = await this.mysApi.getData('compute', body) + async computes(body) { + let computes = await MysInfo.get(this.e, 'compute', body) if (!computes || computes.retcode !== 0) return false computes = computes.data let formart = (num) => { return num > 10000 ? (num / 10000).toFixed(1) + ' w' : num } - + if (this.e.isSr) delete computes.coin_id for (let i in computes) { for (let j in computes[i]) { computes[i][j].num = formart(computes[i][j].num) - if (computes[i][j].name.includes('「')) { + if (computes[i][j][this.e.isSr ? 'item_name' : 'name'].includes('「')) { computes[i][j].isTalent = true } } diff --git a/plugins/genshin/model/gsCfg.js b/plugins/genshin/model/gsCfg.js index 36d70c8..facd6d7 100644 --- a/plugins/genshin/model/gsCfg.js +++ b/plugins/genshin/model/gsCfg.js @@ -9,7 +9,8 @@ import MysUser from './mys/MysUser.js' /** 配置文件 */ class GsCfg { - constructor () { + constructor() { + this.isSr = false /** 默认设置 */ this.defSetPath = './plugins/genshin/defSet/' this.defSet = {} @@ -24,7 +25,7 @@ class GsCfg { this.ignore = ['mys.pubCk', 'gacha.set', 'bot.help', 'role.name'] } - get element () { + get element() { return { ...this.getdefSet('element', 'role'), ...this.getdefSet('element', 'weapon') } } @@ -32,12 +33,12 @@ class GsCfg { * @param app 功能 * @param name 配置文件名称 */ - getdefSet (app, name) { + getdefSet(app, name) { return this.getYaml(app, name, 'defSet') } /** 用户配置 */ - getConfig (app, name) { + getConfig(app, name) { if (this.ignore.includes(`${app}.${name}`)) { return this.getYaml(app, name, 'config') } @@ -51,7 +52,7 @@ class GsCfg { * @param name 名称 * @param type 默认跑配置-defSet,用户配置-config */ - getYaml (app, name, type) { + getYaml(app, name, type) { let file = this.getFilePath(app, name, type) let key = `${app}.${name}` @@ -71,13 +72,13 @@ class GsCfg { return this[type][key] } - getFilePath (app, name, type) { + getFilePath(app, name, type) { if (type == 'defSet') return `${this.defSetPath}${app}/${name}.yaml` else return `${this.configPath}${app}.${name}.yaml` } /** 监听配置文件 */ - watch (file, app, name, type = 'defSet') { + watch(file, app, name, type = 'defSet') { let key = `${app}.${name}` if (this.watcher[type][key]) return @@ -95,7 +96,7 @@ class GsCfg { } /** 读取所有用户绑定的ck */ - async getBingCk (game = 'gs') { + async getBingCk(game = 'gs') { let ck = {} let ckQQ = {} let noteCk = {} @@ -121,20 +122,20 @@ class GsCfg { } /** 获取qq号绑定ck */ - getBingCkSingle (userId) { + getBingCkSingle(userId) { console.log('gsCfg.getBingCkSingle() 即将废弃') return {} } - saveBingCk (userId, data) { + saveBingCk(userId, data) { console.log('gsCfg.saveBingCk() 即将废弃') } /** * 原神角色id转换角色名字 */ - roleIdToName (id) { - let name = this.getdefSet('role', 'name') + roleIdToName(id) { + let name = this.getdefSet('role', this.isSr ? 'sr_name' : 'name') if (name[id]) { return name[id][0] } @@ -145,7 +146,7 @@ class GsCfg { /** * 原神武器id转换成武器名字 */ - getWeaponDataByWeaponHash (hash) { + getWeaponDataByWeaponHash(hash) { let data = this.getdefSet('weapon', 'data') let weaponData = {} weaponData.name = data.Name[hash] @@ -155,20 +156,22 @@ class GsCfg { } /** 原神角色别名转id */ - roleNameToID (keyword) { + roleNameToID(keyword, isSr) { + if (isSr) this.isSr = isSr if (!isNaN(keyword)) keyword = Number(keyword) this.getAbbr() - let roelId = this.nameID.get(String(keyword)) + let roelId = this[this.isSr ? 'sr_nameID' : 'nameID'].get(String(keyword)) return roelId || false } /** 获取角色别名 */ - getAbbr () { - if (this.nameID) return + getAbbr() { + if (this[this.isSr ? 'sr_nameID' : 'nameID']) return this.nameID = new Map() - + this.sr_nameID = new Map() let nameArr = this.getdefSet('role', 'name') + let sr_nameArr = this.getdefSet('role', 'sr_name') let nameArrUser = this.getConfig('role', 'name') let nameID = {} @@ -180,6 +183,13 @@ class GsCfg { } } + for (let i in sr_nameArr) { + nameID[sr_nameArr[i][0]] = i + for (let abbr of sr_nameArr[i]) { + this.sr_nameID.set(String(abbr), i) + } + } + for (let i in nameArrUser) { for (let abbr of nameArrUser[i]) { this.nameID.set(String(abbr), nameID[i]) @@ -188,8 +198,8 @@ class GsCfg { } /** 返回所有别名,包括用户自定义的 */ - getAllAbbr () { - let nameArr = this.getdefSet('role', 'name') + getAllAbbr() { + let nameArr = this.getdefSet('role', this.isSr ? 'sr_name' : 'name') let nameArrUser = this.getConfig('role', 'name') for (let i in nameArrUser) { @@ -205,7 +215,7 @@ class GsCfg { * @param name 名称 * @param isWeapon 是否武器 */ - shortName (name, isWeapon = false) { + shortName(name, isWeapon = false) { let other = {} if (isWeapon) { other = this.getdefSet('weapon', 'other') @@ -216,12 +226,12 @@ class GsCfg { } /** 公共配置ck文件修改hook */ - async change_myspubCk () { + async change_myspubCk() { await MysInfo.initCache() await MysInfo.initPubCk() } - getGachaSet (groupId = '') { + getGachaSet(groupId = '') { let config = this.getYaml('gacha', 'set', 'config') let def = config.default if (config[groupId]) { @@ -230,7 +240,7 @@ class GsCfg { return def } - getMsgUid (msg) { + getMsgUid(msg) { let ret = /[1|2|5-9][0-9]{8}/g.exec(msg) if (!ret) return false return ret[0] @@ -245,12 +255,13 @@ class GsCfg { * @return alias 当前别名 * @return uid 游戏uid */ - getRole (msg, filterMsg = '') { + getRole(msg, filterMsg = '', isSr = false) { let alias = msg.replace(/#|老婆|老公|[1|2|5-9][0-9]{8}/g, '').trim() if (filterMsg) { alias = alias.replace(new RegExp(filterMsg, 'g'), '').trim() } + this.isSr = isSr /** 判断是否命中别名 */ let roleId = this.roleNameToID(alias) if (!roleId) return false @@ -265,7 +276,7 @@ class GsCfg { } } - cpCfg (app, name) { + cpCfg(app, name) { if (!fs.existsSync('./plugins/genshin/config')) { fs.mkdirSync('./plugins/genshin/config') } @@ -279,7 +290,7 @@ class GsCfg { /** * 根据角色名获取对应的元素类型 */ - getElementByRoleName (roleName) { + getElementByRoleName(roleName) { let element = this.getdefSet('element', 'role') if (element[roleName]) { return element[roleName] @@ -289,7 +300,7 @@ class GsCfg { /** * 根据技能id获取对应的技能数据,角色名用于命座加成的技能等级 */ - getSkillDataByskillId (skillId, roleName) { + getSkillDataByskillId(skillId, roleName) { let skillMap = this.getdefSet('skill', 'data') let skillData = {} if (skillMap.Name[skillId]) { @@ -304,7 +315,7 @@ class GsCfg { return skillData } - fightPropIdToName (propId) { + fightPropIdToName(propId) { let propMap = this.getdefSet('prop', 'prop') if (propMap[propId]) { return propMap[propId] @@ -312,7 +323,7 @@ class GsCfg { return '' } - getRoleTalentByTalentId (talentId) { + getRoleTalentByTalentId(talentId) { let talentMap = this.getdefSet('role', 'talent') let talent = {} if (talentMap.Name[talentId]) { diff --git a/plugins/genshin/model/mys/apiTool.js b/plugins/genshin/model/mys/apiTool.js index 9150d5f..036e770 100644 --- a/plugins/genshin/model/mys/apiTool.js +++ b/plugins/genshin/model/mys/apiTool.js @@ -173,6 +173,17 @@ export default class apiTool { dailyNote: { url: `${hostRecord}game_record/app/hkrpg/api/note`, query: `role_id=${this.uid}&server=${this.server}` + }, + /** 养成计算器 */ + compute: { + url: `${host}event/rpgcalc/compute?`, + query:`game=hkrpg`, + body: data + }, + /** 详情 */ + detail: { + url: `${host}event/rpgcalc/avatar/detail`, + query: `game=hkrpg&lang=zh-cn&item_id=${data.avatar_id}&tab_from=${data.tab_from}&change_target_level=0&uid=${this.uid}®ion=${this.server}` } } } diff --git a/plugins/genshin/model/mys/mysInfo.js b/plugins/genshin/model/mys/mysInfo.js index 36a909e..fe3bb79 100644 --- a/plugins/genshin/model/mys/mysInfo.js +++ b/plugins/genshin/model/mys/mysInfo.js @@ -25,7 +25,7 @@ export default class MysInfo { } // ck对应MysUser对象 this.ckUser = null - this.auth = ['dailyNote', 'bbs_sign_info', 'bbs_sign_home', 'bbs_sign', 'ys_ledger', 'compute', 'avatarSkill', 'detail', 'blueprint', 'UserGame', 'getFp', 'deckList', 'avatar_cardList', 'action_cardList'] + this.auth = ['dailyNote', 'bbs_sign_info', 'bbs_sign_home', 'bbs_sign', 'ys_ledger', 'compute', 'avatarSkill', 'detail', 'blueprint', 'UserGame', 'deckList', 'avatar_cardList', 'action_cardList', 'avatarInfo'] } static async init(e, api) { diff --git a/plugins/genshin/resources/StarRail/html/calculator/calculator.css b/plugins/genshin/resources/StarRail/html/calculator/calculator.css new file mode 100644 index 0000000..d1ae9f9 --- /dev/null +++ b/plugins/genshin/resources/StarRail/html/calculator/calculator.css @@ -0,0 +1,450 @@ +@font-face { + font-family: "tttgbnumber"; + src: url("../../../../../../resources/font/tttgbnumber.ttf"); + font-weight: normal; + font-style: normal; +} + +* { + margin: 0; + padding: 0; + box-sizing: border-box; + user-select: none; +} + +body { + transform: scale(1.48); + transform-origin: 0 0; +} + +.container { + width: 550px; + padding: 10px 15px 15px 15px; + background-color: #fff; + position: relative; +} + +.info_box { + position: relative; + height: 40px; + margin-top: 10px; + margin-bottom: 15px; +} + +.head_box { + /* padding: 10px; */ + /* border-radius: 15px; */ + font-family: tttgbnumber; + /* box-shadow: 0 5px 10px 0 rgb(0 0 0 / 15%); */ +} + +.data_box { + padding: 5px 10px 5px 10px; + margin-top: 10px; + /* box-shadow: 0 5px 10px 0 rgb(0 0 0 / 15%); */ + border-radius: 5px; + font-family: tttgbnumber; + background-color: #f2eee6; + border: 1px solid #d9d3c7; +} + +.uidRight { + position: absolute; + top: 5px; + right: 0px; + font-size: 20px; + text-align: center; + color: #fff; + padding: 3px 6px; + border-radius: 7px; + font-family: "tttgbnumber"; + background-color: #a57f72; + box-shadow: 0 3px 6px 0 rgb(132 93 90 / 40%); +} + +.topLeft { + position: absolute; + top: 5px; + left: 0px; + z-index: 9; + font-size: 20px; + text-align: center; + color: #fff; + padding: 3px 6px; + border-radius: 7px; + font-family: "tttgbnumber"; + background-color: #a57f72; + box-shadow: 0 3px 6px 0 rgb(132 93 90 / 40%); +} + +.item { + margin: 10px 0px 10px 0px; + border-radius: 5px; + background: #e9e5dc; + display: flex; + /* box-shadow: 0 5px 10px 0 rgb(0 0 0 / 15%); */ + border: 1px solid #d9d3c7; +} + +.role_box { + margin: 10px 0px 10px 10px; + height: 112px; + width: 95px; + background: #e9e5dc; + border-radius: 7px; + overflow: hidden; + position: relative; +} + +.role_img { + width: 100%; + height: 100%; +} + +.role_name { + margin-top: 20px; + margin-left: 10px; + width: 125px; + color: #91837a; + font-weight: bold; + font-size: 24px; + line-height: 30px; + letter-spacing: 1px; + white-space: nowrap; +} + +.role_LV { + margin-top: 10px; + width: 120px; + height: 40px; + line-height: 30px; + white-space: nowrap; + font-size: 16px; +} + +.weapon_box { + margin: 10px 0px 10px 20px; + height: 95px; + width: 95px; + background: #e9e5dc; + border-radius: 7px; + overflow: hidden; +} + +.weapon_img { + width: 100%; + height: 100%; +} + +.weapon_name { + margin-top: 20px; + margin-left: 10px; + width: 120px; + color: #91837a; + font-weight: bold; + font-size: 24px; + line-height: 30px; + letter-spacing: 1px; + white-space: nowrap; +} + +.weapon_LV { + margin-top: 10px; + width: 120px; + height: 40px; + font-size: 16px; + line-height: 30px; + white-space: nowrap; +} + +.weapon_bg5 { + background-image: url(../../../img/other/bg5.png); + width: 100%; + height: 95px; + background-size: 100%; + background-repeat: no-repeat; +} + +.weapon_bg4 { + width: 100%; + height: 95px; + background-image: url(../../../img/other/bg4.png); + background-size: 100%; + background-repeat: no-repeat; +} + +.weapon_bg3 { + width: 100%; + height: 95px; + background-image: url(../../../img/other/bg3.png); + background-size: 100%; + background-repeat: no-repeat; +} + +.weapon_bg2 { + width: 100%; + height: 95px; + background-image: url(../../../img/other/bg3.png); + background-size: 100%; + background-repeat: no-repeat; +} + +.weapon_bg1 { + width: 100%; + height: 95px; + background-image: url(../../../img/other/bg3.png); + background-size: 100%; + background-repeat: no-repeat; +} + +.bg105 { + background-image: url(../../../img/other/bg105.png); + width: 100%; + height: 95px; + background-size: 100%; + background-repeat: no-repeat; +} + +.bg5 { + background-image: url(../../../img/other/bg5.png); + width: 100%; + height: 112px; + /*filter: brightness(1.1);*/ + background-size: 100%; + background-repeat: no-repeat; +} + +.bg4 { + width: 100%; + height: 112px; + background-image: url(../../../img/other/bg4.png); + background-size: 100%; + background-repeat: no-repeat; +} + +.skill { + margin: 5px 0px 0px 0px; + background: #f1eee5; + display: flex; + border-radius: 7px; + padding: 1px 0 1px 0; + /* box-shadow: 0 5px 10px 0 rgb(0 0 0 / 15%); */ + padding-left: 20px; + background: url(data:image/png;base64,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) no-repeat; + background-size: 102% 107%; + background-repeat: no-repeat; + background-attachment: fixed; + /*关键*/ + background-position: center; + overflow: hidden; + border: 1px solid #d9d3c7; +} + +.skillimg { + margin: 5px; + width: 60px; + height: 60px; + background-image: url(skillbg.png); + background-size: 100%; +} + +.skillimgC { + width: 55px; + height: 55px; + margin: 2px 0px 0px 2px; +} + +.skillname { + margin: 10px; + width: 250px; + height: 20px; + line-height: 20px; + color: #91837a; + font-weight: bold; + letter-spacing: 1px; + font-size: 18px; +} + +.skillLv { + margin-top: 8px; + width: 250px; + height: 20px; + line-height: 20px; +} + +.skillRight { + margin-top: 20px; + width: 140px; + height: 40px; + line-height: 40px; + display: flex; +} + +.skillJt { + line-height: 32px; + font-weight: bold; + color: #91837a; +} + +.skillNow { + border-style: solid; + border-width: 1px; + border-color: #d9d3c7; + border-radius: 7px; + width: 50px; + height: 30px; + line-height: 30px; + text-align: center; + color: #91837a; + font-weight: bold; + font-size: 20px; + background-color: #f7f5f0; +} + +.role_top { + margin: 10px 0 20px 0; + padding: 10px; + /* box-shadow: 0 5px 10px 0 rgb(0 0 0 / 10%); */ + border-radius: 3px; + font-family: tttgbnumber; + background: linear-gradient(1turn, hsla(25, 23%, 67%, 0.4), hsla(25, 23%, 67%, 0.2)); + display: flex; + color: #8c7770; + font-weight: bold; + font-size: 20px; + letter-spacing: 1px; +} + +.role_top .role_top_name { + width: 50%; +} + +.role_top .role_top_LV { + width: 50%; + text-align: right; +} + +.role_separate_line { + text-align: center; + color: #bfa399; + height: 24px; + line-height: 24px; + font-size: 18px; + margin: 10px 0 20px 0; + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAmYAAAAMCAYAAADI3HGfAAAAAXNSR0IArs4c6QAAB1RJREFUeF7tnb+TFFUQx7v7zexyHBQBBSQmmGhmAOZQxY/EIgDNKQ34mwi0zBUCMAEJLpcLzDSRxAQoAwrOY3fmvba+3e/NLooaUMXO3by5H7PvZ3d/35uez+7t3THVoypQFdioAruP7n4GB85duv7DRh2pxietQN2Hk17+GvyIFOAR+VJdqQpMUoHdB3e+NzC7euPzSQpQgx6FAnUfjmIZqhNVAapgVjdBVWCDCvz06M6HnOgXuNBq+9EnV6892aA71fREFfj5wb2zHXe/InwV+vjTSzd+m6gUNeyqwMYVqGC28SWoDkxVgce3b7d09tRDIr3gGvAOPXl+5fytW91UNalxv38F6j58/5pXi1WB/1KgglndH1WBDSjgr5Tx1ysoK07wjop+VV+x2MCiTNBk3YcTXPQa8ugVMDBTVZyZ6DumnVO8e/w4n3j2TH7fesrz+TbP/tjidjbjZvaCQzvn0LT8an8hYa/lV82fHJqGQ2hZQuCw/9rOi74XkYYlLPj1IvD2duDFUlikYxbhPiZhFuauYxE89DqaEXEvHEs72ri3dpwwppeeJar01oRv0abyQ5hi5JR8fhuC9tIhMpOk3M5MLJwic2O90C/XYXxKuWyVTIxxbiUlFZS9YM3MlOxs35UkpcTkDcM8hAmIOamaxykPRg+y6XyMKuY3Q2Yl2JQaiKl9265KKdsgZXJnmdS+uZeq4tO7j8UvQn91exYhCtaO/WDjbD5VEtTZFKosRGzTuyFWIqFkJSvjkceBM9pV3C1iSms2YMIdEK/2cW7LfcNjzG+xZB/MP7VGs2l6+UDvQ9wQa/J+cAl6Yp+XuV0f2DY98njUue9ZQ9Ycg8c/fGU/TZ/sn7etbOCnk+ev3NheXy97g7XqTVW6hvZ/yRAdM90j5m/rLwSMPoceSAffdR8+fnhnj4jwyq7iDuKXgG1+XHO4Mr0eH9Zn+EICxGWHRq/HB+rwmJGCLOlYHY7BBtII2jHUxrEoaS/ugNvP461sPvgc3scSgPmHOdTSlvsPZwR1nr7h2jCWBGULBn4hvVhGKfF5GrEMafN72RIrEhAS6xAHsrzNVfQZ/EOf7L/F52W3gQBExVzmZOeiz6Cx2xAxHf55KHVMHCMSXZ7PdIZebkBJsi3rY73ge7LQBVKXw/0SEQiS0OIS5j4+FIqqCG4X5r6Vs4zeATGJJFLrokGD9qgO6OZ11o6IQ7GN+qCNFZO3BzR6fz8F1SbhU1Pg1CT0TmqDEjo0+Zw0BLGOtCRq8DjhM6m2rY1Z1bU6nyXd24t6ZB41xbmm1Ou8aVKKUePWEbVz7DT2vR7rj2rc7vTY1jzFvtPYLbRfntBuudTlyX1dLPb0g/0z+uL06XTu5UulC8+V6Iuyh5Uf379/tA8vmqY9w6F5ZdAV9hren3ci+/scQsP7IfBxO79meQ3YEl72UUSWLBKYDbgCc+h4CQAyyIoiXQYqgyv0AYj13ImwxORgBRgCD82EdZk0NBTQNxpYMeZZQZXBVWSKDkZORZGjCO7CHDMnOUD5eOMeJ57cu8COyqraYcXAIWVYAij4vdlgZsCrdRBIgJ5yA3dwK5CGPVPADcNDIPic7WTQwWibegU0mM/r7Ib/loNbTRQIpJbnMzBQwjU0gKNBguUPBxMHPZQ984D6CpA7tyF3GaCs4MgzlI9n5C1M5yAyABSyWwHRv8GUS5PBBf5pVmQN3Cz9FrArYKXEAm+tzbWwtAdtcv8Cec6eBkPIvQWcMAx51qFpHbwGuPJYLI5Bn3XwyrE6fRpYOqtBDwdAb8o2M7gWcCvAeO7ydQDdcNgNMepN5f8BM6V7FCqYHUjqOQBOv+s+3P3xrgFUAaIBvAAeDk0GJg5IXjZeo3yjN7BZAVABNAMFY4zcXuCtgB3SV4EmuyztyZe9vuBwqEjbZrvAlF+qDoDI8A5k9qxOU7JnjCuwM3CzzPEGeDkU+fgS3wCWGfIM/pC9DTTdhsfhviGLMZ5b+rPdDK25T+7vz3sdCpH4ILLhjn1aKnN9ssYDeDptrflnVKUUga8UifStb48wLaTY8PUwnzNImV5mC5DECrIDZBXwwusamesMvHLI9ggZ/w1QLmyVIU+cDBMgEPZW0OYG3C8Gfa24zEK3hhW45UIQ1Z5Ug8GXkxzAkOzhGrwZcHl7EAG+aewpFgbxoSGDnaTWQK1xYAPg4QyAaxvMYzA3Q31sNaWoOkNV1JRmOmtCSjFpOtLrVjyiLyPOALhe09aWbi3aFLd7NXjrj2nfPdUmnujrjzIPQBKtLh4+BfzN1stviDi/v6zEqDutzr6svwRw+NZ8jBHVfTjGVak+TV2BCmZT3wE1/o0p4G+6PvlwBWe6c649eZkvXuw35lQ1PDkF6j6c3JLXgEeuQAWzkS9Qde9wK7D+Zwrqn8s43Gs95ujqPhzz6lTfpqZABbOprXiNd3QK1D/sObolmaRDdR9Octlr0CNUoILZCBelujQtBeq/wpnWeo812roPx7oy1a+pKfAXslPKlPWYHUYAAAAASUVORK5CYII=) no-repeat; + background-position: 50%; + background-size: 100% auto; + font-weight: bold; +} + +.cailiao_box { + display: flex; + flex-direction: row; + justify-content: space-between; + flex-wrap: wrap; + color: #91837a; + font-weight: bold; + margin-bottom: 20px; + padding: 0px 10px; + width: 100%; +} + +.cailiao_item { + width: 230px; + display: flex; + align-items: center; + margin-bottom: 10px; +} + +.long { + width: 100%; +} + +.isTalent { + margin-left: -10px; +} + +.cailiao_img { + width: 50px; + height: 50px; + margin-right: 10px; + background-position: 50%; + background-repeat: no-repeat; + background-size: contain; + text-align: center; + border-radius: 3px; + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACwAAAAsCAYAAAAehFoBAAAEXElEQVRYhc2ZO2tUQRTHz5l73WQlGhHETlDEQhALG20kxEJLW2trv4SIYCOCHyTYWSh2CmIR7CwsbK1CFNxsdufIvM887mN3bx4Lm53XPfObM/8zM3eCRAQ7r5/fQIRXALANAOeBfxABEXUBogAUJi+wMmkhQrmodL5SZbq8AqwECNtGVJVpq8sqWya0PfessiPQtAeBAIQTOZvuTg8mz+48evwN3715cVPK+WcA2IT0k8JqwyXYkPewFkAIC2fLXVpY8GAjDEzZAnTgqMGJ4N9kf2+rlnL+UsEqT8v5PGOOnA3KUF4aF4eMbm+LeML4AFlzZtQ5yKbrMyO4fPU6bFy4OB6Nz74VAPBA1bXBKoN6pBiXmhnwGDks+p5NiX4EGTiyQVl7ttyBz2eH8PvXTwO/vn67BoCNlT0a/fA892iDV5E9FT0TepgdHupfgWKt7g/LO+sCLUM0grJRIfARBue4AWTAQ+i0FdQCpaCQeDW0iXlq13Dp6W8LqAIEZF5sAuXtQ32tlg4oBtTx6rQRNHFizdfats5z0DLEMjqN+sNyPQGpP1C7hfm06DSVmZcYOQ/7bTQHLRkI/Q+h0x6g7oeMl2uzHeLAOl0woDLQMBj3hIJVu3Ht9vFBdMoHF4H302kJ1Nsk0t8a3WnpSHTK46I0/YnEsrbIeK2HReLhok47Dig56HI6zWYtihXS39od606DTtvsaw9LaYNOnVHZA+2gbBY6QRbTaWafQZPTsDtQe2snqNOyHG29lCBN0FVew8et08ZBFRwltYel2em0LE6BTtvqwa8SzMNdOiqDDqfTNkcQSSBp12H9UsmmIvdqt04jkF46XcwRClZB1wpWBd7R6LRnQDWChjbew14SS+u0axnsr9Oo/0Re5IPO3RVg26iXCSju1VUDFqwk7Drsd7pEe5kOC4aG1GnpiOtPa14SaknTV0iFhl3T3wjK2/bXabO8jIcBpNk4BNvpVtLpoueOzlljNsjudMK9cZwCnRZB7R8ZDj/JxnGCOs37YAmS9gBvrzjT6Y81PbBOi6CFAfnmbONA/xK6nE7bd8hkMD2nP662qwRI+05n72QXDpjeO+CCoOns2aReJXzQIQ+64QOKWW3VaQk0rBJOEv6dbnWdpoelHDQfXGjeAGo/5iUUnCQaAi41dsQ6LYG6MgoeRnv4aZv+49FpBJvUU7SsRReCK+q0CArMIYuB+pyJOethFC2gw+i0EzTpJ+3beNhcaE9B4KgejWCu/pfQufAH2OL0FwMqzjfpNM+yVtrDtC9ms9muKr505RrUozXmoeBJjLTs/nNk23gAHrgIoRqbYdE5JQwpOIoNQAgXdB/w+6f398bnNj+iwLGfSgrDInK/tlCSvUmUfjF3917qcKLLeZ6X6XR41qeVbVWnuyrUmavWPSC6K25tPfwy+bu/PZtOvxLJg0ZYfRx1sKoDc9cVwdntMwXVg/KwKh2AFKgftH4ug/1DQDsK9v6Tpz/+A+D9r7rzum/YAAAAAElFTkSuQmCC); +} + +.cailiao_item_img { + width: 50px; + height: 50px; + /* margin-right: 10px; */ +} + +.cailiao_item_title { + line-height: 30px; + font-size: 18px; + vertical-align: middle; + white-space: nowrap; +} + +.biye { + text-align: center; + font-family: "tttgbnumber"; + line-height: 30px; + color: #91837a; +} + +.logo { + font-size: 14px; + font-family: "tttgbnumber"; + text-align: center; + color: #7994a7; +} + +.jt { + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACwAAAAQCAYAAABtPJ3XAAAC4klEQVRIS9VWTWsTURS9b4oiBPozIiKI1l2hBanUNHThokip0NJUKJrRHxBoOxGSmoL/IaWxKUnrvuDGzLiTbtWI0K0TN4Uijc27R+Yj85FMmml3zSabnHfPPffccyPomn2ExfeXric7Ix3l9vij71fhr+9tJ0f4hjK+sHAl/MdiMclEylwuNxQvmkZjDUCeWQoAtTOlrY5NpltxiRvVD2sMmWfJgphriiR1MpOJjT8oba7BxQviGkRbfZbbHIgXzS+NE5Y8CmYCmJhhCoJ6d2q6Hoe0Ua2cMPMoW3j7DZgA1KnlF7Hw+1uFE0iMgiWBQQw2BUid33gbibcUhl0MTsFA4Xqng+xY+mK19WoFIZz7BgH1f0o7m868uVDtg1LBqe+QdThIJgLX2+fIZjbDaoum8RnMcNXxCVuPEMhksPpgZnagWvruDgD4jYabNiWgzqy+GojfLxVgkbUU7uMBNsGkLhbeefhIhT2V3UYYKI99PVoRmsa9NtGrO55CtiUChLuKAVRO/f4TiQ8p3LWl7J04yse3EiuaprFPuOfHXdLdrkkg9XD26WEUYYekMyW/WfZHzExCiNTMy9d9+D7ClpcDE+u+pwCpxdL7wxBhT5HwWB1PDSRsedgfZz9hyy4yBmG3aWvxAwp3RWAglQkRthPC3fSQUiAilO+nj1aEiLJE9NLZiWMXBhFQfnIJS3gku3wI5eObvZboSQl3c1sgZIctnTOZgCX8t1oClJ0eunRuSnjR6IjHzC0CZUNL98No2LHk57CXp/FibUBKxI21YEoEow2Mevuco2KtccrMCT+HYbKEem863uHQq5VTMCfCh6OjTi2vxjocB6XiKbNMBMiaDKk+3yhEH46fRmNdMudthYlqZ3/P1GHHIpgUxm5lncF5O7eJa8r55U7z/lZxHdKqLwmEmhh2mq3i3/RPSev7zsTjZpxz3Bdt29s2fmJp6Ur4vaJm4+dz2lC8/W/tOn3+A23CzD4pjl20AAAAAElFTkSuQmCC) 50% / cover no-repeat; + width: 20px; + height: 8px; + display: inline-block; + margin: 0 5px 2px 5px; +} + +.role_box .life { + position: absolute; + top: 0px; + right: 0px; + z-index: 9; + font-size: 16px; + text-align: center; + color: #fff; + border-radius: 2px; + padding: 1px 5px; + border-radius: 3px; + font-family: "tttgbnumber"; +} + +.life1 { + background-color: #62a8ea; +} + +.life2 { + background-color: #62a8ea; +} + +.life3 { + background-color: #45b97c; +} + +.life4 { + background-color: #45b97c; +} + +.life5 { + background-color: #ff5722; +} + +.life6 { + background-color: #ff5722; +} \ No newline at end of file diff --git a/plugins/genshin/resources/StarRail/html/calculator/calculator.html b/plugins/genshin/resources/StarRail/html/calculator/calculator.html new file mode 100644 index 0000000..aefc4ce --- /dev/null +++ b/plugins/genshin/resources/StarRail/html/calculator/calculator.html @@ -0,0 +1,135 @@ + + + + + + + + + + +
+
+
+ UID : {{uid}} +
+
+ 角色养成计算 +
+
+
+
+
+ {{ if dataCharacter.rank>0}} + + {{dataCharacter.rank}}命 + {{/if}} +
+ +
+ +
+
+ {{dataCharacter.name}} +
Lv.{{dataCharacter.level}} Lv.{{setSkill[0]}}
+
+ {{ if dataCharacter.equip}} +
+
+ +
+ +
+
+ {{dataCharacter.equip.name}} +
Lv.{{dataCharacter.equip.level}} + Lv.{{setSkill[1]}} +
+
+ {{/if}} +
+ + {{each skillList skill i}} +
+
+ +
+
+ {{ if skill.anchor=="Point01"}}普通攻击{{else if skill.anchor=="Point02"}}战技{{else if skill.anchor=="Point03"}}终结技{{else}}天赋{{/if}} +
Lv.{{skill.max_level}}
+
+
+
{{skill.cur_level}}
+
+
{{setSkill[i+2]}}
+
+
+ {{/each}} + +
+ {{if computes.avatar_consume.length + computes.skill_consume.length + computes.equipment_consume.length > 0}} +
+ {{if computes.avatar_consume.length > 0}} +
+
{{dataCharacter.name}}
+
Lv.{{dataCharacter.level}} Lv.{{setSkill[0]}}
+
+
角色消耗
+
+ {{each computes.avatar_consume avatar_consume}} +
+
+ +
+
{{avatar_consume.item_name}} x {{avatar_consume.num}}
+
+ {{/each}} +
+ {{/if}} + + {{if computes.skill_consume.length > 0}} +
行迹消耗
+
+ {{each computes.skill_consume skill_consume}} +
+
+ +
+
+ {{skill_consume.item_name}} x {{skill_consume.num}}
+
+ {{/each}} +
+ {{/if}} + + {{if computes.equipment_consume.length > 0}} +
+
{{dataCharacter.equip.name}}
+
Lv.{{dataCharacter.equip.level}} + Lv.{{setSkill[1]}}
+
+
+
+ {{each computes.equipment_consume equipment_consume}} +
+
+ +
+
{{equipment_consume.item_name}} x {{equipment_consume.num}}
+
+ {{/each}} +
+ {{/if}} + +
+ {{else}} +
+
毕业了,下一位 !
+
+ {{/if}} +
+ + + + \ No newline at end of file diff --git a/plugins/genshin/resources/StarRail/html/calculator/skillbg.png b/plugins/genshin/resources/StarRail/html/calculator/skillbg.png new file mode 100644 index 0000000..06523c2 Binary files /dev/null and b/plugins/genshin/resources/StarRail/html/calculator/skillbg.png differ