装备:强化

This commit is contained in:
luying
2022-02-15 18:46:56 +08:00
parent 465cc15e43
commit f25d44e391
18 changed files with 12919 additions and 187 deletions
@@ -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');
+29 -1
View File
@@ -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};
}
+4 -9
View File
@@ -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