装备:淬火
This commit is contained in:
@@ -10,13 +10,14 @@ import Role from "../../../db/Role";
|
||||
import { calPlayerCeAndSave } from "../../../services/playerCeService";
|
||||
import { getGoodById, gameData } from "../../../pubUtils/data";
|
||||
import { EQUIP } from "../../../pubUtils/dicParam";
|
||||
import { ITID, SPEICAL_ITEM, QUALITY_TYPE, equipTypeToSortAttr, IT_TYPE } from "../../../consts/constModules/itemConst";
|
||||
import { changeEquip, dressEquip, checkMaterialEnough, takeOffEquipAndCalPlayerCe, checkEquipCanPut } from "../../../services/equipService";
|
||||
import { ITID, SPEICAL_ITEM, QUALITY_TYPE, equipTypeToSortAttr, IT_TYPE, QUENCH_TYPE } from "../../../consts";
|
||||
import { changeEquip, dressEquip, checkMaterialEnough, takeOffEquipAndCalPlayerCe, checkEquipCanPut, quenchOnce, checkQuenchMaxByQualityAndGrade } from "../../../services/equipService";
|
||||
|
||||
import { findIndex } from 'underscore';
|
||||
import { pushEquipRefineSucMsg, pushNormalEquipMsg, pushNormalItemMsg } from "../../../services/chatService";
|
||||
import { checkTaskWithHero, checkTaskWithEquip, checkTask, checkTaskWithArgs, checkTaskConditionEquipSuitJewelStage, checkActivityTask } from "../../../services/taskService";
|
||||
import { Attribute } from "../../../domain/roleField/attribute";
|
||||
import { QuenchLogParam } from "../../../domain/roleField/equip";
|
||||
|
||||
export default function (app: Application) {
|
||||
new HandlerService(app, {});
|
||||
@@ -459,6 +460,58 @@ export class EquipHandler {
|
||||
|
||||
}
|
||||
|
||||
|
||||
// 淬火
|
||||
public async quench(msg: { eid: number, type: QUENCH_TYPE }, session: BackendSession) {
|
||||
let roleId: string = session.get('roleId');
|
||||
// let roleName: string = session.get('roleName');
|
||||
let sid: string = session.get('sid');
|
||||
let funcs: number[] = session.get('funcs');
|
||||
|
||||
let { eid, type } = msg;
|
||||
let equip = await EquipModel.findbySeqId(eid);
|
||||
if (!equip) return resResult(STATUS.EQUIP_NOT_FIND);
|
||||
|
||||
let { id, randMain, grade, hid, ePlaceId } = equip;
|
||||
|
||||
let dicGoods = gameData.goods.get(id);
|
||||
if (!dicGoods) return resResult(STATUS.DIC_DATA_NOT_FOUND);
|
||||
let dicQuench = gameData.quench.get(grade);
|
||||
if (!dicQuench) return resResult(STATUS.DIC_DATA_NOT_FOUND);
|
||||
|
||||
let logs: QuenchLogParam[] = [], times = 0;
|
||||
while(
|
||||
(type == QUENCH_TYPE.ONCE && times < 1 && !checkQuenchMaxByQualityAndGrade(dicGoods.quality, 0, randMain)) || // 淬火一次,保证不超出该品质上限
|
||||
(type == QUENCH_TYPE.ONE_GRADE && !checkQuenchMaxByQualityAndGrade(dicGoods.quality, grade, randMain)) // 淬火一品,在品相上限内淬火
|
||||
) {
|
||||
let result = await quenchOnce(roleId, sid, randMain, dicQuench, dicGoods);
|
||||
if(!result) break;
|
||||
result.log.setTimes(++times);
|
||||
logs.push(result.log);
|
||||
grade = result.grade;
|
||||
randMain = result.randMain;
|
||||
}
|
||||
|
||||
if (times == 0) return resResult(STATUS.EQUIP_QUENCH_ERR);
|
||||
|
||||
let equipResult = await EquipModel.updateEquipInfo(eid, { randMain, grade })
|
||||
let curEquip = {
|
||||
seqId: equipResult.seqId,
|
||||
id: equipResult.id,
|
||||
randMain: equipResult.randMain,
|
||||
grade: equipResult.grade,
|
||||
}
|
||||
|
||||
// 更新战力
|
||||
if(hid > 0) { // 装备中的时候
|
||||
const hero = await HeroModel.findByHidAndRoleWithEquip(hid, roleId);
|
||||
await calPlayerCeAndSave(HERO_SYSTEM_TYPE.EQUIP_BASE, sid, roleId, hero, { });
|
||||
}
|
||||
|
||||
return resResult(STATUS.SUCCESS, { logs, curEquip });
|
||||
|
||||
}
|
||||
|
||||
//分解装备
|
||||
public async decomposeEquip(msg: { originalEquip: Array<number> }, session: BackendSession) {
|
||||
let { originalEquip } = msg;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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) {
|
||||
|
||||
|
||||
Reference in New Issue
Block a user