diff --git a/game-server/app/servers/role/handler/equipHandler.ts b/game-server/app/servers/role/handler/equipHandler.ts index bc2f7a51e..286b37c40 100644 --- a/game-server/app/servers/role/handler/equipHandler.ts +++ b/game-server/app/servers/role/handler/equipHandler.ts @@ -11,7 +11,7 @@ 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, QUENCH_TYPE } from "../../../consts"; -import { changeEquip, dressEquip, checkMaterialEnough, takeOffEquipAndCalPlayerCe, checkEquipCanPut, quenchOnce, checkQuenchMaxByQualityAndGrade } from "../../../services/equipService"; +import { changeEquip, dressEquip, checkMaterialEnough, takeOffEquipAndCalPlayerCe, checkEquipCanPut, quenchOnce, checkQuenchMaxByQualityAndGrade, getRandSeResult } from "../../../services/equipService"; import { findIndex } from 'underscore'; import { pushEquipRefineSucMsg, pushNormalEquipMsg, pushNormalItemMsg } from "../../../services/chatService"; @@ -384,6 +384,26 @@ export class EquipHandler { } + // 装备洗炼预览 + public async previewStrengthen(msg: { eid: number }, session: BackendSession) { + + let { eid } = msg; + let equip = await EquipModel.findbySeqId(eid); + if (!equip) return resResult(STATUS.EQUIP_NOT_FIND); + + let { id, randSe } = equip; + if (!randSe || randSe.length <= 0) { + return resResult(STATUS.ROLE_EQUIP_HAVE_NO_RANDSE); + } + let previewRandSe = getRandSeResult(id, randSe); + if(!previewRandSe) return resResult(STATUS.DIC_DATA_NOT_FOUND); + + await EquipModel.updateEquipInfo(eid, { previewRandSe }); + + return resResult(STATUS.SUCCESS, { randSe: previewRandSe }); + + } + // 装备洗炼 public async reStrengthen(msg: { eid: number }, session: BackendSession) { let roleId: string = session.get('roleId'); @@ -392,39 +412,27 @@ export class EquipHandler { let funcs: number[] = session.get('funcs'); let { eid } = msg; - let equip = await EquipModel.findbySeqId(eid); + let equip = await EquipModel.findbySeqId(eid, '+previewRandSe'); if (!equip) return resResult(STATUS.EQUIP_NOT_FIND); - let { id, randSe, hid, ePlaceId } = equip; + let { id, randSe, hid, ePlaceId, previewRandSe } = equip; if (!randSe || randSe.length <= 0) { return resResult(STATUS.ROLE_EQUIP_HAVE_NO_RANDSE); } - let dicGoods = gameData.goods.get(id); - if (!dicGoods) return resResult(STATUS.DIC_DATA_NOT_FOUND); - - let { randomEffect } = dicGoods; - let chosen = randSe.map(cur => cur.seid); // 上一轮随机出来的 - let randomResult: number[] = getRandEelm(randomEffect.filter(cur => !chosen.includes(cur)), randSe.length); - - let lockNum = 0; - let removeSeidList = new Array(); // 原装备上的seid [seid, rand, ...] - - for (let i = 0; i < randSe.length; i++) { - removeSeidList.push(randSe[i].seid, randSe[i].rand); - - if (!randSe[i].locked) { - let random = gameData.randomEffectPool.get(randomResult[i]); - if (!random) break; - let rand = 0; - if (random.id > 0) rand = getRandValueByMinMax(random.Min, random.Max, 0); - randSe[i].seid = random.id; - randSe[i].rand = rand; - } else { - lockNum++; - } + if(previewRandSe) { // 预览过 + randSe = previewRandSe; + } else { // 没有预览数值,直接洗练 + let randResult = getRandSeResult(id, randSe); + if(!randResult) return resResult(STATUS.DIC_DATA_NOT_FOUND); + randSe = randResult; } + let { lockNum, removeSeidList } = randSe.reduce((pre, cur) => { + return { lockNum: cur.locked?pre.lockNum+1: pre.lockNum, removeSeidList: [...pre.removeSeidList, cur.seid] } + }, { lockNum: 0, removeSeidList: new Array() }); + console.log('##########', lockNum, removeSeidList); + if (lockNum >= randSe.length) { return resResult(STATUS.ROLE_EQUIP_CANNOT_RESTRENGTHEN); } @@ -444,7 +452,7 @@ export class EquipHandler { let result = await handleCost(roleId, sid, consumes); if (!result) return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH); - let equipResult = await EquipModel.updateEquipInfo(eid, { randSe }) + let equipResult = await EquipModel.updateEquipInfo(eid, { randSe, previewRandSe: [] }) let curEquip = { seqId: equipResult.seqId, id: equipResult.id, @@ -452,15 +460,16 @@ export class EquipHandler { } // 更新战力 - const hero = await HeroModel.findByHidAndRoleWithEquip(hid, roleId); - await calPlayerCeAndSave(HERO_SYSTEM_TYPE.RESTRENGTHEN, sid, roleId, hero, {}, [ePlaceId, ...removeSeidList]); + if(hid > 0) { + const hero = await HeroModel.findByHidAndRoleWithEquip(hid, roleId); + await calPlayerCeAndSave(HERO_SYSTEM_TYPE.RESTRENGTHEN, sid, roleId, hero, {}, [ePlaceId, ...removeSeidList]); + } await checkTask(roleId, sid, funcs, TASK_TYPE.EQUIP_RESTRENGTHEN, 1, true, {}); return resResult(STATUS.SUCCESS, { curEquip }); } - // 淬火 public async quench(msg: { eid: number, type: QUENCH_TYPE }, session: BackendSession) { let roleId: string = session.get('roleId'); diff --git a/game-server/app/services/equipService.ts b/game-server/app/services/equipService.ts index d38377c66..9c89fd730 100644 --- a/game-server/app/services/equipService.ts +++ b/game-server/app/services/equipService.ts @@ -1,5 +1,5 @@ -import { mergeSameGoods, getRandEelm } from '../pubUtils/util'; -import { EquipModel, RandMain } from "../db/Equip"; +import { mergeSameGoods, getRandEelm, getRandValueByMinMax } from '../pubUtils/util'; +import { EquipModel, RandMain, RandSe } from "../db/Equip"; import { HeroModel, HeroType } from "../db/Hero"; import { getGoodById, gameData, getJewelById, getQuenchGradeByValue, getQuenchConsume, getQuenchByQualityAndGrade } from "../pubUtils/data"; import { calPlayerCeAndSave } from "./playerCeService"; @@ -219,4 +219,25 @@ export function checkQuenchMaxByQualityAndGrade(quality: number, grade: number, if(rand < dic.max) isMax = false; } return isMax; +} + +export function getRandSeResult(id: number, randSe: RandSe[]) { + let dicGoods = gameData.goods.get(id); + if (!dicGoods) return false; + + let { randomEffect } = dicGoods; // 配置的可随机seid + let chosen = randSe.map(cur => cur.seid); // 上一轮随机出来的 + let randomResult: number[] = getRandEelm(randomEffect.filter(cur => !chosen.includes(cur)), randSe.length); // 随机出的结果 + + for (let i = 0; i < randSe.length; i++) { + if (!randSe[i].locked) { + let random = gameData.randomEffectPool.get(randomResult[i]); + if (!random) break; + let rand = 0; + if (random.id > 0) rand = getRandValueByMinMax(random.Min, random.Max, 0); + randSe[i].seid = random.id; + randSe[i].rand = rand; + } + } + return randSe } \ No newline at end of file diff --git a/shared/db/Equip.ts b/shared/db/Equip.ts index a9a3e1cf6..2e7e7b395 100644 --- a/shared/db/Equip.ts +++ b/shared/db/Equip.ts @@ -69,14 +69,17 @@ export default class Equip extends BaseModel { randSe: RandSe[]; // 强化随机属性 @prop({ required: true, type: Holes, default: [], _id: false }) holes: Holes[]; + @prop({ required: false, type: RandSe, default: [], _id: false, select: false }) + previewRandSe: RandSe[]; // 强化随机属性预览 + public static async findbyRole(roleId: string, lean = true) { const equips: EquipType[] = await EquipModel.find({ roleId }).lean(lean); return equips; } - public static async findbySeqId(seqId: number, lean = true) { - const equip: EquipType = await EquipModel.findOne({ seqId }).lean(lean); + public static async findbySeqId(seqId: number, select?: string ) { + const equip: EquipType = await EquipModel.findOne({ seqId }).select(select).lean(); return equip; }