You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
210 lines
5.8 KiB
210 lines
5.8 KiB
import { strengthen_rates } from '@/config'; |
|
|
|
export const strengthenValue = (value, strengthenLv) => { |
|
if (strengthenLv <= 0) { |
|
return value; |
|
} |
|
const factor = 1.055 ** (strengthenLv ** 1.1); |
|
return Math.round(factor * value); |
|
}; |
|
|
|
/** |
|
* 计算角色最终属性 |
|
* @param playerAttribute 装备属性 |
|
* @param rA 转生属性 |
|
*/ |
|
export const callPlayerAttribute = (playerAttribute: any, rA: any) => { |
|
const equips = [playerAttribute.weapon, playerAttribute.armor, playerAttribute.neck, playerAttribute.ring]; |
|
const curHp = playerAttribute.attribute.curHp, |
|
hp = playerAttribute.attribute.hp; |
|
const hpP = hp > 0 ? curHp / hp : 1; |
|
|
|
const attribute = { |
|
curHp: 0, |
|
hp: 200 + rA.hp, |
|
hpPercent: 0, |
|
atk: rA.atk, |
|
atkPercent: 0, |
|
def: rA.def, |
|
defPercent: 0, |
|
reducPercent: 0, |
|
bloc: rA.bloc, |
|
blocPercent: 0, |
|
eva: 0, |
|
crit: rA.crit, |
|
critDmg: 150 + rA.critDmg, // 初始暴击伤害150% |
|
dps: 0, |
|
}; |
|
const entry = new Array(); |
|
equips.forEach((equip) => { |
|
equip && Array.prototype.push.apply(entry, equip.extraEntry); |
|
equip && Array.prototype.push.apply(entry, strengthenEntry(equip)); |
|
}); |
|
|
|
entry.forEach((item) => { |
|
const key = item.type; |
|
attribute[key] += item.value; |
|
}); |
|
// 暴击率最多100% |
|
if (attribute.crit > 100) { |
|
attribute.crit = 100; |
|
} |
|
//计算最终属性 |
|
attribute.hp = Math.ceil(attribute.hp * (1 + attribute.hpPercent / 100)); |
|
attribute.curHp = Math.ceil(attribute.hp * hpP); |
|
attribute.atk = Math.ceil(attribute.atk * (1 + attribute.atkPercent / 100)); |
|
attribute.def = Math.ceil(attribute.def * (1 + attribute.defPercent / 100)); |
|
attribute.bloc = Math.ceil(attribute.bloc * (1 + attribute.blocPercent / 100)); |
|
const arr = ['hp', 'curHp', 'atk', 'def', 'bloc', 'eva']; |
|
arr.forEach((key) => { |
|
attribute[key] = Math.round(attribute[key]); |
|
}); |
|
//计算秒伤 |
|
const atk = attribute.atk, |
|
crit = attribute.crit / 100, |
|
critdmg = attribute.critDmg / 100; |
|
attribute.dps = Math.ceil((1 - crit + crit * critdmg) * atk); |
|
//计算减伤比例 |
|
// attribute.def = 500; |
|
attribute.reducPercent = attribute.def / (200 + 1.1 * attribute.def) + (0.09 * attribute.def) / (attribute.def + 200); |
|
// attribute.reducPercent = (0.5 * attribute.def) / (200 + 0.502 * attribute.def); |
|
return attribute; |
|
}; |
|
|
|
const strengthenEntry = (equip) => { |
|
const temp = deepCopy(equip.base.entry); |
|
temp.forEach((item) => { |
|
item.value = strengthenValue(item.value, equip.strengthenLv); |
|
}); |
|
return temp; |
|
}; |
|
|
|
export const deepCopy = (src) => { |
|
if (!src) { |
|
return null; |
|
} |
|
return JSON.parse(JSON.stringify(src)); |
|
}; |
|
|
|
/** |
|
* 计算装备购买价格 |
|
* @param equip 装备 |
|
* @returns |
|
*/ |
|
export const conisOfBuy = (equip) => { |
|
if (!equip) { |
|
return 0; |
|
} |
|
return Math.round(equip.lv * equip.quality.qualityCoefficient * (250 + 20 * equip.lv)); |
|
}; |
|
|
|
/** |
|
* 计算装备出售价格 |
|
* @param equip 装备 |
|
* @returns |
|
*/ |
|
export const conisOfsell = (equip) => { |
|
if (!equip) { |
|
return 0; |
|
} |
|
return Math.round(equip.lv * equip.quality.qualityCoefficient * 30); |
|
}; |
|
|
|
export const getPointsOfReborn = (playerAttribute) => { |
|
const lv = playerAttribute.lv; |
|
let points = lv >= 20 ? Math.floor((lv - 20) ** 1.1 / 2.1) : 0; |
|
|
|
const euqips = [playerAttribute.weapon, playerAttribute.armor, playerAttribute.neck, playerAttribute.ring]; |
|
euqips.forEach((equip) => { |
|
if (!equip) { |
|
return; |
|
} |
|
const wlv = equip.lv; |
|
const elv = equip.enchantlvl || 0; |
|
const q = equip.quality.qualityCoefficient; |
|
if (wlv >= 20) { |
|
points += Math.floor((((wlv - 20) / 10) ** 1.1 * (0.1 * elv ** 1.5 + 1) * q) / 3.5); |
|
} |
|
}); |
|
|
|
return Math.round(points * 1.2); |
|
}; |
|
|
|
export const callBattleResult = (player, monster) => { |
|
const tmp = player.curHp, |
|
crit = player.crit / 100, |
|
critdmg = player.critDmg / 100, |
|
atk = player.atk; |
|
let monsterDmg = Math.ceil(monster.atk * (1 - player.reducPercent) - player.bloc); |
|
monsterDmg < 1 && (monsterDmg = 1); |
|
let curHp = player.curHp, |
|
mHp = monster.hp; |
|
const bouts: any = []; |
|
while (true) { |
|
const bout: any = {}; |
|
bouts.push(bout); |
|
if (Math.random() < crit) { |
|
bout.crit = true; |
|
bout.dmg = Math.ceil(atk * critdmg); |
|
} else { |
|
bout.dmg = atk; |
|
} |
|
mHp -= bout.dmg; |
|
if (mHp < 0) break; |
|
bout.takeDmg = monsterDmg; |
|
curHp -= monsterDmg; |
|
if (curHp < 0) break; |
|
} |
|
return { win: curHp > 0, bouts: bouts, takeDmg: tmp - curHp }; |
|
}; |
|
|
|
export const callEuqipTipsLocation = (e, mobile) => { |
|
const x = e.pageX, |
|
y = e.pageY, |
|
maxH = window.innerHeight, |
|
maxW = window.innerWidth, |
|
tipsStyle: any = {}, |
|
tipsStyle2: any = {}; |
|
if (mobile) { |
|
tipsStyle.left = '0.3rem'; |
|
tipsStyle2.left = '13.9rem'; |
|
const num = 10; |
|
if (y < maxH / 2) { |
|
tipsStyle.top = y + num + 'px'; |
|
tipsStyle2.top = y + num + 'px'; |
|
} else { |
|
tipsStyle.bottom = maxH - y - num + 'px'; |
|
tipsStyle2.bottom = maxH - y - num + 'px'; |
|
} |
|
} else { |
|
if (x < maxW / 2) { |
|
tipsStyle.left = x + 'px'; |
|
tipsStyle2.left = 'calc(' + x + 'px + 21rem)'; |
|
} else { |
|
tipsStyle.right = maxW - x + 'px'; |
|
tipsStyle.right2 = 'calc(' + tipsStyle.righ + ' - 21rem)'; |
|
} |
|
if (y < maxH / 2) { |
|
tipsStyle.top = y + 'px'; |
|
tipsStyle2.top = y + 'px'; |
|
} else { |
|
tipsStyle.bottom = maxH - y + 'px'; |
|
tipsStyle2.bottom = maxH - y + 'px'; |
|
} |
|
} |
|
return [tipsStyle, tipsStyle2]; |
|
}; |
|
|
|
export const strengthenCoins = (lv, strengthenLv) => { |
|
return Math.round((lv + 1) * 1.1 ** (strengthenLv ** 1.1) * (10 + lv / 5) + 100); |
|
}; |
|
|
|
export const strengthenAvgCoins = (lv, strengthenLv) => { |
|
let sum = 0; |
|
const len = strengthen_rates.length; |
|
for (let i = 0; i < strengthenLv; i++) { |
|
const rate = i < len ? strengthen_rates[i] : strengthen_rates[len - 1]; |
|
sum += strengthenCoins(lv, i) / rate + (sum * (1 - rate)) / rate; |
|
} |
|
return Math.round(sum); |
|
};
|
|
|