Miao-Yunzai/plugins/genshin/model/calculator.js

201 lines
5.3 KiB
JavaScript
Raw Normal View History

2023-03-04 14:30:13 +08:00
import base from './base.js'
import MysInfo from './mys/mysInfo.js'
import MysApi from './mys/mysApi.js'
import lodash from 'lodash'
import gsCfg from './gsCfg.js'
export default class Calculator extends base {
constructor (e) {
super(e)
this.model = 'calculator'
this.checkMsg = '设置角色、武器、技能等级有误\n指令#刻晴养成\n示例#刻晴养成81 90 9 9 9\n参数为角色、武器、技能等级'
}
async get (role) {
this.role = role
/** 获取绑定uid */
let uid = await MysInfo.getUid(this.e)
if (!uid) return false
/** 判断是否绑定了ck */
let ck = await MysInfo.checkUidBing(uid)
if (!ck) {
await this.e.reply(MysInfo.tips)
return false
}
this.mysApi = new MysApi(uid, ck.ck, { log: true })
/** 获取角色数据 */
let character = await this.mysApi.getData('character')
if (!character || character.retcode !== 0) return false
character = character.data
/** 获取设置参数 */
await this.getSet()
/** 获取计算角色 */
this.dataCharacter = character.avatars.find((item) => item.id == role.roleId)
/** 获取计算参数 */
let body = await this.getBody()
if (!body) return false
/** 计算 */
let computes = await this.computes(body)
if (!computes) return false
return {
saveId: uid,
uid,
dataCharacter: this.dataCharacter,
setSkill: this.setSkill,
skillList: this.skillList,
computes,
...this.screenData
}
}
async getSet () {
let defSetSkill = '90,90,10,10,10'.split(',')
let set = this.e.msg.replace(/#||养成|计算/g, '').trim()
set = set.replace(/| /g, ',')
set = set.replace(this.role.alias, '')
let setSkill = []
if (set) {
setSkill = set.split(',')
setSkill = lodash.compact(setSkill)
for (let i = 0; i <= 4; i++) {
if (!setSkill[i]) setSkill[i] = defSetSkill[i]
}
} else {
setSkill = defSetSkill
}
if (setSkill.length != 5) {
let reMsg = this.checkMsg.replace(/刻晴/g, this.role.alias)
await this.e.reply(reMsg)
return false
}
/** 检查参数 */
let check = [90, 90, 10, 10, 10]
for (const key in check) {
if (check[key] < Number(setSkill[key])) {
setSkill[key] = check[key]
}
}
this.setSkill = setSkill
}
async getBody () {
// 技能
let skillList = []
if (this.dataCharacter) {
/** 角色存在获取技能数据 */
let detail = await this.mysApi.getData('detail', { avatar_id: this.role.roleId })
if (!detail || detail.retcode !== 0) return false
skillList = detail.data.skill_list
} else {
/** 尚未拥有的角色 */
skillList = await this.getSkillId(this.role.roleId)
if (!skillList) {
this.e.reply('暂无角色数据,请稍后再试')
return false
}
let four = gsCfg.getdefSet('role', 'other').four
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
}
}
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])
},
{
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
}
body.weapon = {
id: Number(this.dataCharacter.weapon.id),
level_current: Number(this.dataCharacter.weapon.level),
level_target: Number(this.setSkill[1])
}
}
this.skillList = skillList
return body
}
async getSkillId (roleId) {
let avatarSkill = await this.mysApi.getData('avatarSkill', { avatar_id: roleId })
if (!avatarSkill || avatarSkill.retcode !== 0) return false
avatarSkill = avatarSkill.data
avatarSkill.list.forEach((item) => {
item.level_current = 1
})
return avatarSkill.list
}
async computes (body) {
let computes = await this.mysApi.getData('compute', body)
if (!computes || computes.retcode !== 0) return false
computes = computes.data
let formart = (num) => {
return num > 10000 ? (num / 10000).toFixed(1) + ' w' : num
}
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('「')) {
computes[i][j].isTalent = true
}
}
}
return computes
}
}