装备:强化
This commit is contained in:
@@ -11,7 +11,7 @@ import { calPlayerCeAndSave } from "../../../services/playerCeService";
|
||||
import { getGoodById, gameData, getEquipByJobClassAndEPlace } from "../../../pubUtils/data";
|
||||
import { BAG, EQUIP } from "../../../pubUtils/dicParam";
|
||||
import { ITID, QUALITY_TYPE, equipTypeToSortAttr, IT_TYPE, QUENCH_TYPE, REFINE_TYPE } from "../../../consts";
|
||||
import { checkMaterialEnough, checkEquipCanPut, quenchOnce, checkQuenchMaxByQualityAndGrade, getRandSeResult, refineOnce, checkRefineReachNextLv, calEquipCe } from "../../../services/equipService";
|
||||
import { checkMaterialEnough, checkEquipCanPut, quenchOnce, checkQuenchMaxByQualityAndGrade, getRandSeResult, refineOnce, checkRefineReachNextLv, calEquipCe, updateEplace, updateEplaces } from "../../../services/equipService";
|
||||
|
||||
import { findIndex, isNumber, pick } from 'underscore';
|
||||
import { pushEquipRefineSucMsg, pushNormalEquipMsg, pushNormalItemMsg } from "../../../services/chatService";
|
||||
@@ -61,178 +61,101 @@ export class EquipHandler {
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
// // 装备栏强化
|
||||
// public async strengthen(msg: { hid: number, ePlaceId: number, type: number }, session: BackendSession) {
|
||||
// let roleId: string = session.get('roleId');
|
||||
// // let roleName: string = session.get('roleName');
|
||||
// const serverId = session.get('serverId');
|
||||
// let sid: string = session.get('sid');
|
||||
// 装备栏强化
|
||||
public async strengthen(msg: { hid: number, eplaceId: number, isOneClick: boolean }, session: BackendSession) {
|
||||
let roleId: string = session.get('roleId');
|
||||
// let roleName: string = session.get('roleName');
|
||||
const serverId = session.get('serverId');
|
||||
let sid: string = session.get('sid');
|
||||
|
||||
|
||||
// let { hid, ePlaceId, type } = msg;
|
||||
// let hero = await HeroModel.findByHidAndRoleWithEquip(hid, roleId);
|
||||
// if (!hero) return resResult(STATUS.HERO_NOT_FIND);
|
||||
let { hid, eplaceId, isOneClick } = msg;
|
||||
let hero = await HeroModel.findByHidAndRole(hid, roleId);
|
||||
if (!hero) return resResult(STATUS.HERO_NOT_FIND);
|
||||
|
||||
let curEquip = hero.ePlace?.find(cur => cur.id == eplaceId);
|
||||
if(!curEquip) return resResult(STATUS.EQUIP_NOT_FIND);
|
||||
if(curEquip.lv >= hero.lv) return resResult(STATUS.ROLE_EQUIP_REACH_MAX);
|
||||
let fromLv = curEquip.lv;
|
||||
let toLv = isOneClick? hero.lv: fromLv + 1;
|
||||
let newLv = fromLv;
|
||||
|
||||
let check = new CheckMeterial(roleId);
|
||||
for (let lv = fromLv + 1; lv <= toLv; lv++) {
|
||||
let dicCost = gameData.equipStrengthenCost.get(lv);
|
||||
let isEnough = await check.decrease(dicCost.consume);
|
||||
if(!isEnough) break; // 消耗不足
|
||||
newLv = lv;
|
||||
}
|
||||
if(newLv == fromLv) return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH);
|
||||
let consumes = check.getConsume();
|
||||
let result = await handleCost(roleId, sid, consumes, ITEM_CHANGE_REASON.EQUIP_STRENTHEN);
|
||||
if (!result) return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH);
|
||||
|
||||
let { newEplace, updatedEplace } = updateEplace(hero.ePlace, eplaceId, { lv: newLv });
|
||||
|
||||
hero = await calPlayerCeAndSave(HERO_SYSTEM_TYPE.EQUIP_STRENGTH, sid, roleId, hero, { ePlace: newEplace }, [eplaceId]);
|
||||
|
||||
// TODO 任务
|
||||
|
||||
const curHero = {
|
||||
hid,
|
||||
ePlace: updatedEplace
|
||||
}
|
||||
return resResult(STATUS.SUCCESS, { curHero });
|
||||
|
||||
}
|
||||
|
||||
|
||||
// let changeData = [];//变化的等级数据
|
||||
// let { ePlace, lv: playerLv } = hero; // 装备栏
|
||||
// let oldLvs = ePlace.map(cur => cur.lv);
|
||||
// let strengthenArr = new Array<EPlace>();
|
||||
// if (type == EQUIP_STRENGTHEN_TYPE.SINGLE || type == EQUIP_STRENGTHEN_TYPE.SINGLE_QUICK) { // 单装备强化
|
||||
// strengthenArr = ePlace.filter(cur => cur.id == ePlaceId && cur.equip);
|
||||
// } else if (type == EQUIP_STRENGTHEN_TYPE.ALL_QUICK) { // 全六件(装备中)的强化
|
||||
// strengthenArr = ePlace.filter(cur => cur.equip);
|
||||
// }
|
||||
// if (strengthenArr.length <= 0) {
|
||||
// return resResult(STATUS.ROLE_EQUIP_PLACE_NOT_ENOUGH);
|
||||
// }
|
||||
// let minLv = strengthenArr[0].lv; // 从最低装备的等级开始
|
||||
// for (let { lv, id } of strengthenArr) {
|
||||
// changeData.push({
|
||||
// hid: hid,
|
||||
// id: id,
|
||||
// oldLv: lv,
|
||||
// lv: lv,
|
||||
// })
|
||||
// if (lv < minLv) minLv = lv;
|
||||
// }
|
||||
// 装备栏一键强化至相应等级
|
||||
public async strengthenAll(msg: { hid: number, lv: number }, session: BackendSession) {
|
||||
let roleId: string = session.get('roleId');
|
||||
// let roleName: string = session.get('roleName');
|
||||
let sid: string = session.get('sid');
|
||||
|
||||
// let { coin } = await Role.findByRoleId(roleId);
|
||||
// let maxLv = type == EQUIP_STRENGTHEN_TYPE.SINGLE ? minLv + 1 : playerLv;
|
||||
// if (maxLv > playerLv) maxLv = playerLv;
|
||||
// if (minLv >= maxLv) {
|
||||
// return resResult(STATUS.ROLE_EQUIP_REACH_MAX);
|
||||
// }
|
||||
// let costCoin = 0; // 消耗铜币
|
||||
// let flag = false; // 铜币不足
|
||||
// for (let i = minLv; i < maxLv; i++) {
|
||||
// for (let s of strengthenArr) {
|
||||
// if (s.lv == i) {
|
||||
// let cost = gameData.strengthenCost.get(i + 1);
|
||||
// if (!cost) { flag = true; break; }
|
||||
// if (coin < costCoin + cost) { flag = true; break; }
|
||||
// costCoin += cost;
|
||||
// s.lv++;
|
||||
// {//记录等级变化
|
||||
// let index = changeData.findIndex(obj => { return obj && obj.id == s.id })
|
||||
// if (index != -1) {
|
||||
// changeData[index].lv = s.lv;
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// if (flag) break;
|
||||
// }
|
||||
let { hid, lv } = msg; // lv: 升到哪一级
|
||||
let hero = await HeroModel.findByHidAndRole(hid, roleId);
|
||||
if (!hero) return resResult(STATUS.HERO_NOT_FIND);
|
||||
|
||||
// if (costCoin <= 0) { // 连一级都不够升
|
||||
// return resResult(STATUS.ROLE_COIN_NOT_ENOUGH);
|
||||
// }
|
||||
let { ePlace, lv: playerLv } = hero; // 装备栏
|
||||
let fromLv = Math.min(...ePlace.map(cur => cur.lv)); // 最小的等级
|
||||
let toLv = lv < playerLv? lv: playerLv;
|
||||
|
||||
// let result = await handleCost(roleId, sid, [{
|
||||
// id: CURRENCY_BY_TYPE.get(CURRENCY_TYPE.COIN),
|
||||
// count: costCoin
|
||||
// }], ITEM_CHANGE_REASON.EQUIP_STRENTHEN);
|
||||
// if (!result) return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH);
|
||||
let eplaceIds = new Map<number, { lv: number }>(); // 更新了的装备栏id
|
||||
let check = new CheckMeterial(roleId);
|
||||
for(let lv = fromLv + 1; lv <= toLv; lv++) {
|
||||
let isBreak = false;
|
||||
for(let equip of ePlace) {
|
||||
if(equip.lv >= lv) continue;
|
||||
let dicCost = gameData.equipStrengthenCost.get(lv);
|
||||
let isEnough = await check.decrease(dicCost.consume);
|
||||
if(!isEnough) { isBreak = true; break; } // 消耗不足
|
||||
|
||||
// hero.ePlace = ePlace;
|
||||
eplaceIds.set(equip.id, { lv });
|
||||
}
|
||||
if(isBreak) break;
|
||||
}
|
||||
|
||||
// await calPlayerCeAndSave(HERO_SYSTEM_TYPE.EQUIP_BASE, sid, roleId, hero, { ePlace });
|
||||
if(eplaceIds.size <= 0) return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH);
|
||||
let consumes = check.getConsume();
|
||||
let result = await handleCost(roleId, sid, consumes, ITEM_CHANGE_REASON.EQUIP_STRENTHEN);
|
||||
if (!result) return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH);
|
||||
|
||||
// // 任务
|
||||
// await checkTaskWithHero(roleId, sid, TASK_TYPE.EQUIP_STRENGTHEN, hero, oldLvs);
|
||||
// //成长任务
|
||||
// await checkActivityTask(serverId, sid, roleId, TASK_TYPE.EQUIP_STRENGTHEN, 1, changeData)
|
||||
let { newEplace, updatedEplace } = updateEplaces(hero.ePlace, eplaceIds);
|
||||
|
||||
// const curHero = {
|
||||
// hid,
|
||||
// ePlace: strengthenArr
|
||||
// }
|
||||
// return resResult(STATUS.SUCCESS, { curHero });
|
||||
await calPlayerCeAndSave(HERO_SYSTEM_TYPE.EQUIP_STRENGTH, sid, roleId, hero, { ePlace: newEplace }, [...eplaceIds.keys()]);
|
||||
|
||||
// }
|
||||
// TODO 任务
|
||||
|
||||
// // 装备栏一键强化至相应等级
|
||||
// public async strengthenAll(msg: { hid: number, lv: number }, session: BackendSession) {
|
||||
// let roleId: string = session.get('roleId');
|
||||
// // let roleName: string = session.get('roleName');
|
||||
// let sid: string = session.get('sid');
|
||||
|
||||
// const serverId = session.get('serverId');
|
||||
const curHero = {
|
||||
hid,
|
||||
ePlace: updatedEplace
|
||||
}
|
||||
return resResult(STATUS.SUCCESS, { curHero });
|
||||
|
||||
// let changeData = [];//变化的等级数据
|
||||
// let { hid, lv: maxLv } = msg; // lv: 升到哪一级
|
||||
// let hero = await HeroModel.findByHidAndRoleWithEquip(hid, roleId);
|
||||
// if (!hero) return resResult(STATUS.HERO_NOT_FIND);
|
||||
}
|
||||
|
||||
// let { ePlace, lv: playerLv } = hero; // 装备栏
|
||||
// let oldLvs = ePlace.map(cur => cur.lv);
|
||||
// let strengthenArr = ePlace.filter(cur => cur.equip);
|
||||
|
||||
// if (strengthenArr.length <= 0) {
|
||||
// return resResult(STATUS.ROLE_EQUIP_PLACE_NOT_ENOUGH);
|
||||
// }
|
||||
// let minLv = strengthenArr[0].lv; // 从最低装备的等级开始
|
||||
// for (let { lv, id } of strengthenArr) {
|
||||
// changeData.push({
|
||||
// hid: hid,
|
||||
// id: id,
|
||||
// oldLv: lv,
|
||||
// lv: lv,
|
||||
// })
|
||||
// if (lv < minLv) minLv = lv;
|
||||
|
||||
// }
|
||||
|
||||
// let { coin } = await Role.findByRoleId(roleId);
|
||||
|
||||
// if (maxLv > playerLv) {
|
||||
// return resResult(STATUS.ROLE_EQUIP_REACH_MAX);
|
||||
// }
|
||||
// let costCoin = 0; // 消耗铜币
|
||||
// for (let i = minLv; i < maxLv; i++) {
|
||||
// for (let s of strengthenArr) {
|
||||
// if (s.lv == i) {
|
||||
// let cost = gameData.strengthenCost.get(i + 1);
|
||||
// costCoin += cost;
|
||||
|
||||
// s.lv++;
|
||||
// {//记录等级变化
|
||||
// let index = changeData.findIndex(obj => { return obj && obj.id == s.id })
|
||||
// if (index != -1) {
|
||||
// changeData[index].lv = s.lv;
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
// if (costCoin > coin) {
|
||||
// return resResult(STATUS.ROLE_COIN_NOT_ENOUGH);
|
||||
// }
|
||||
|
||||
// let result = await handleCost(roleId, sid, [{
|
||||
// id: CURRENCY_BY_TYPE.get(CURRENCY_TYPE.COIN),
|
||||
// count: costCoin
|
||||
// }], ITEM_CHANGE_REASON.EQUIP_STRENTHEN);
|
||||
// if (!result) return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH);
|
||||
|
||||
// hero.ePlace = ePlace;
|
||||
|
||||
// await calPlayerCeAndSave(HERO_SYSTEM_TYPE.EQUIP_BASE, sid, roleId, hero, { ePlace });
|
||||
|
||||
// // 任务
|
||||
// await checkTaskWithHero(roleId, sid, TASK_TYPE.EQUIP_STRENGTHEN, hero, oldLvs);
|
||||
// //成长任务
|
||||
// await checkActivityTask(serverId, sid, roleId, TASK_TYPE.EQUIP_STRENGTHEN, 1, changeData)
|
||||
|
||||
// const curHero = {
|
||||
// hid,
|
||||
// ePlace: strengthenArr
|
||||
// }
|
||||
// return resResult(STATUS.SUCCESS, { curHero });
|
||||
|
||||
// }
|
||||
// // 装备栏精炼
|
||||
// public async refine(msg: { hid: number, ePlaceId: number, type: REFINE_TYPE }, session: BackendSession) {
|
||||
// let roleId: string = session.get('roleId');
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { mergeSameGoods, getRandEelm, getRandValueByMinMax } from '../pubUtils/util';
|
||||
import { EquipModel, RandMain, RandSe } from "../db/Equip";
|
||||
import { HeroModel, HeroType } from "../db/Hero";
|
||||
import { EPlace, HeroModel, HeroType } from "../db/Hero";
|
||||
import { getGoodById, gameData, getQuenchGradeByValue, getQuenchConsume, getQuenchByQualityAndGrade } from "../pubUtils/data";
|
||||
import { calPlayerCeAndSave } from "./playerCeService";
|
||||
import { CONSUME_TYPE, HERO_SYSTEM_TYPE, ITID, TASK_TYPE } from "../consts";
|
||||
@@ -197,4 +197,32 @@ export function calEquipCe(goodsAbility: Map<number, number>, randMain: RandMain
|
||||
ce += Math.floor(valueBase * valueRand * ratio / 100);
|
||||
}
|
||||
return ce
|
||||
}
|
||||
|
||||
export function updateEplace(eplace: EPlace[], eplaceId: number, update: Partial<EPlace>) {
|
||||
let newEplace: EPlace[] = [];
|
||||
let updatedEplace: Partial<EPlace>[] = [];
|
||||
for(let equip of eplace) {
|
||||
if(equip.id == eplaceId) {
|
||||
newEplace.push({ ...equip, ...update });
|
||||
updatedEplace.push({ id: equip.id, equipId: equip.equipId, ...update });
|
||||
} else {
|
||||
newEplace.push(equip);
|
||||
}
|
||||
}
|
||||
return {newEplace, updatedEplace};
|
||||
}
|
||||
|
||||
export function updateEplaces(eplace: EPlace[], update: Map<number, Partial<EPlace>>) {
|
||||
let newEplace: EPlace[] = [];
|
||||
let updatedEplace: Partial<EPlace>[] = [];
|
||||
for(let equip of eplace) {
|
||||
if(update.has(equip.id)) {
|
||||
newEplace.push({ ...equip, ...update.get(equip.id) });
|
||||
updatedEplace.push({ id: equip.id, equipId: equip.equipId, ...update.get(equip.id) });
|
||||
} else {
|
||||
newEplace.push(equip);
|
||||
}
|
||||
}
|
||||
return {newEplace, updatedEplace};
|
||||
}
|
||||
@@ -11,10 +11,10 @@ module.exports = {
|
||||
"required string from": 3,
|
||||
"required string target": 4
|
||||
},
|
||||
// "role.equipHandler.composeEquip": {
|
||||
// "required uInt32 hid": 1,
|
||||
// "repeated uInt32 eplaceId": 2
|
||||
// },
|
||||
"role.equipHandler.composeEquip": {
|
||||
"required uInt32 hid": 1,
|
||||
"required uInt32 eplaceId": 2
|
||||
},
|
||||
"role.equipHandler.decomposeEquip": {
|
||||
"repeated uInt32 originalEquip": 1
|
||||
},
|
||||
@@ -23,11 +23,6 @@ module.exports = {
|
||||
"required uInt32 hid": 2,
|
||||
"required uInt32 type": 3
|
||||
},
|
||||
"role.equipHandler.strengthen": {
|
||||
"required uInt32 hid": 1,
|
||||
"required uInt32 ePlaceId": 2,
|
||||
"required uInt32 type": 3
|
||||
},
|
||||
"role.equipHandler.strengthenAll": {
|
||||
"required uInt32 hid": 1,
|
||||
"required uInt32 lv": 2
|
||||
|
||||
Reference in New Issue
Block a user