装备:淬火

This commit is contained in:
luying
2021-07-29 14:21:51 +08:00
parent dc832da60a
commit 972abb7d07
19 changed files with 805 additions and 68 deletions
+86 -5
View File
@@ -1,13 +1,18 @@
import { mergeSameGoods, deepCopy } from '../pubUtils/util';
import { EquipModel } from "../db/Equip";
import { HeroModel, EPlace, HeroType } from "../db/Hero";
import { getHeroJob, getGoodById, gameData, getJewelById } from "../pubUtils/data";
import { mergeSameGoods, getRandEelm } from '../pubUtils/util';
import { EquipModel, RandMain } from "../db/Equip";
import { HeroModel, HeroType } from "../db/Hero";
import { getGoodById, gameData, getJewelById, getQuenchGradeByValue, getQuenchConsume, getQuenchByQualityAndGrade } from "../pubUtils/data";
import { calPlayerCeAndSave } from "./playerCeService";
import { HERO_SYSTEM_TYPE, TASK_TYPE } from "../consts";
import { EquipType } from "../db/Equip";
import { calEquipSeids } from '../pubUtils/playerCe';
import { indexOf, findIndex } from 'underscore';
import { checkTask, checkTaskWithHero, checkTaskWithEquip, checkActivityTask } from './taskService';
import { DicQuench } from '../pubUtils/dictionary/DicQuench';
import { handleCost } from './rewardService';
import { DicGoods } from '../pubUtils/dictionary/DicGoods';
import { QuenchLogParam } from '../domain/roleField/equip';
import { QUENCH } from '../pubUtils/dicParam';
/**
* 校验前端传入的消耗数量是否准确,并返回消耗的道具并加上特殊材料needConsumes
* @param consumes
@@ -138,4 +143,80 @@ export function checkEquipCanPut(hid: number, id: number) {
if(dicGood.jobLimited != 0 && dicGood.jobLimited != dicJob.job_class) return false;
if(dicGood.charLimited != 0 && dicGood.charLimited != hid) return false;
return true
}
/**
* 淬火一次
* @param roleId 玩家id
* @param sid 玩家sid
* @param randMain 装备上的属性随机值
* @param dicQuench 淬火表
* @param dicGoods 物品表
* @returns
*/
export async function quenchOnce(roleId: string, sid: string, randMain: RandMain[], dicQuench: DicQuench, dicGoods: DicGoods) {
let { quality, lvLimited } = dicGoods;
let canRandMain = randMain.filter(cur => { // 已升满的属性就不再淬火了
return cur.rand < dicQuench.singleRatioMax;
});
let randMainResult = getRandEelm(canRandMain);
if(randMainResult.length == 0) return false;
let add = new Map<number, number>(); // id => value,增加的数量
let isCriticle = Math.random() * 100 < dicQuench.critProbability; // 暴击
let addAttr = isCriticle? dicQuench.critEffect * QUENCH.QUENCH_UNIT_UPRATIO: QUENCH.QUENCH_UNIT_UPRATIO;
let overAttr = randMainResult[0].rand + addAttr - dicQuench.singleRatioMax; // 如果有暴击,超出当前品相上限时
if(overAttr > 0) { // 超出,转到另一条属性
let anotherRandMain = canRandMain.filter(cur => {
return cur.id != randMainResult[0].id;
});
if(anotherRandMain.length > 0) {
let anotherOverAttr = anotherRandMain[0].rand + overAttr - dicQuench.singleRatioMax;
if(anotherOverAttr > 0) {
add.set(anotherRandMain[0].id, overAttr - anotherOverAttr);
} else {
add.set(anotherRandMain[0].id, overAttr);
}
}
add.set(randMainResult[0].id, addAttr - overAttr);
} else {
add.set(randMainResult[0].id, addAttr);
}
let value = 0;
for(let r of randMain) {
if(add.has(r.id)) {
r.rand += add.get(r.id);
}
value += r.rand;
}
let grade = getQuenchGradeByValue(value/2);
// 消耗
let consumes = getQuenchConsume(lvLimited, quality);
let result = await handleCost(roleId, sid, consumes);
if(!result) return false;
let log = new QuenchLogParam(isCriticle, add);
return { randMain, grade, log };
}
/**
* 检查该品相是否到顶
* @param quality 品质
* @param grade 品相
* @param randMain 装备上的随机值
* @returns
*/
export function checkQuenchMaxByQualityAndGrade(quality: number, grade: number, randMain: RandMain[]) {
let isMax = true;
let dic = getQuenchByQualityAndGrade(quality, grade);
if(!dic) return true;
for(let { rand } of randMain) {
if(rand < dic.max) isMax = false;
}
return isMax;
}
+2 -2
View File
@@ -196,7 +196,7 @@ export async function addItems(roleId: string, roleName: string, sid: string, go
return showItems;
}
function sortItems(goods: Array<ItemInter>, bags: Array<BagInter>, skins: Array<number>, figures: Array<number>, currencysMap: any, equips: Array<EquipInter>, showItems: Array<ItemInter>) {
function sortItems(goods: Array<ItemInter>, bags: Array<BagInter>, skins: Array<number>, figures: Array<number>, currencysMap: any, equips: EquipInter[], showItems: Array<ItemInter>) {
for (let good of goods) {
let goodInfo = gameData.goods.get(good.id);
// 道具不存在时先跳过
@@ -208,7 +208,7 @@ function sortItems(goods: Array<ItemInter>, bags: Array<BagInter>, skins: Array<
let { type, table, isCurrency } = ITID.get(goodInfo.itid);
if (table == ITEM_TABLE.EQUIP) {
for (let i = 0; i < good.count; i++) {
equips.push({ id: good.id, ...goodInfo });
equips.push({ id: good.id });
}
} else if (table == ITEM_TABLE.ITEM) {