diff --git a/game-server/app/servers/role/handler/heroHandler.ts b/game-server/app/servers/role/handler/heroHandler.ts index 94514a0cd..b37a073a3 100644 --- a/game-server/app/servers/role/handler/heroHandler.ts +++ b/game-server/app/servers/role/handler/heroHandler.ts @@ -6,7 +6,7 @@ import { HeroModel, Connect, HeroSkin, HeroUpdate, EPlace, Talent } from '../../ import { CURRENCY_BY_TYPE, CURRENCY_TYPE, CONSUME_TYPE, HERO_GROW_MAX, HERO_SYSTEM_TYPE, ABI_STAGE, DEBUG_MAGIC_WORD, HERO_INITIAL_QUALITY, REDIS_KEY, TASK_TYPE, ITEM_CHANGE_REASON } from '../../../consts'; import { RoleModel } from '../../../db/Role'; import { ItemModel } from '../../../db/Item'; -import { gameData, getHeroExpByLv, getHeroStarByQuality, getHeroWakeByQuality, getHeroLvByExp, getMaxGradeByjobClass, getJobByGradeAndClass, getConnectLvByExp, getEquipByJobClassAndEPlace, getScollByStar, getExpByLv, hasCurConnect } from '../../../pubUtils/data'; +import { gameData, getHeroExpByLv, getHeroStarByQuality, getHeroWakeByQuality, getHeroLvByExp, getMaxGradeByjobClass, getJobByGradeAndClass, getConnectLvByExp, getEquipByJobClassAndEPlace, getScollByStar, getExpByLv, hasCurConnect, getConnectMaxLv, getFriendShipByIdAndLv } from '../../../pubUtils/data'; import { ItemInter, RewardInter } from '../../../pubUtils/interface'; import { getDropItems, FIGURE_UNLOCK_CONDITION, ITID } from '../../../consts/constModules/itemConst' import { pushComposeOrangeHero, pushHeroQualityUpMsg, pushHeroStarMax, pushHeroWakeUp } from '../../../services/chatService'; @@ -409,12 +409,12 @@ export class HeroHandler { } //赠送(包括一键赠送) - async heroGiveFavor(msg: { hid: number, shipId: number, items: [{id: number, count: number}] }, session: BackendSession) { + async heroGiveFavor(msg: { hid: number, shipId: number, type: number }, session: BackendSession) { let roleId: string = session.get('roleId'); let sid: string = session.get('sid'); let serverId: number = session.get('serverId'); - let { hid, shipId, items } = msg; + let { hid, shipId, type } = msg; if(!hasCurConnect(hid, shipId)) return resResult(STATUS.WRONG_PARMS); let hero = await HeroModel.findByHidAndRole(hid, roleId); @@ -422,40 +422,63 @@ export class HeroHandler { let { connections } = hero; let curConnect = connections.find(cur => cur.shipId == shipId); - let { level = 0, exp = 0 } = curConnect||{}; + let { level: oldLv = 0, exp: oldExp = 0 } = curConnect||{}; - let newLevel = level; - // 计算得材料可转换的经验 - let check = new CheckMeterial(roleId); - for (let { id, count } of items) { - let dicGoods = gameData.goods.get(id); - if (!dicGoods) return resResult(STATUS.DIC_DATA_NOT_FOUND); - let dicItid = ITID.get(dicGoods.itid); - if (!dicItid) return resResult(STATUS.DIC_DATA_NOT_FOUND); - if(dicItid.type != CONSUME_TYPE.FAVOUR) return resResult(STATUS.ROLE_WRONG_ITEM); - - let isEnough = await check.decrease([{ id, count }]); - if(!isEnough) return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH); - - exp += dicGoods.value * count; - let { newLv, maxLv } = getConnectLvByExp(hid, shipId, exp); - if(newLevel > maxLv) return resResult(STATUS.HERO_CONECTION_IS_MAX_LEVEL); - newLevel = newLv; + let addLv = 0; + if (type == 1) { + addLv = 1; + } else if (type == 5) { + addLv = 5; + } else { + return resResult(STATUS.WRONG_PARMS); } - let material = check.getConsume(); - let result = await handleCost(roleId, sid, items, ITEM_CHANGE_REASON.HERO_GIVE_FAVOR); + let maxLv = getConnectMaxLv(hid, shipId); // 好感度最大等级 + if (maxLv <= oldLv) + return resResult(STATUS.HERO_FAVOUR_LEVEL_REACH_MAXT); + + // 计算武将可以升的级数 + if (oldLv + addLv > maxLv) addLv = maxLv - oldLv; + + console.log('#####maxLv', oldLv + addLv) + let nextObj = getFriendShipByIdAndLv(hid, shipId, oldLv + addLv); + if (!nextObj) return resResult(STATUS.HERO_FAVOUR_LEVEL_REACH_MAXT); + let nextExp = nextObj.shipExp; + let needExp = nextExp - oldExp; + let newExp = oldExp; + + // 计算得材料可转换的经验 + let originalConsumes = await ItemModel.findByRoleAndType(roleId, CONSUME_TYPE.FAVOUR); + let material = new Array(); + for (let { id, count } of originalConsumes) { + let dicGoods = gameData.goods.get(id); + if (!dicGoods) return resResult(STATUS.DIC_DATA_NOT_FOUND); + let needCount = Math.ceil(needExp / dicGoods.value); + if(needCount <= 0) break; + if(needCount > count) needCount = count; + material.push({ id, count: needCount }); + newExp += dicGoods.value * needCount; + needExp -= dicGoods.value * count; + } + + if (newExp == oldExp) { + return resResult(STATUS.BATTLE_CONSUMES_NOT_ENOUGH); + } + + let newLevel = getConnectLvByExp(hid, shipId, newExp); + + let result = await handleCost(roleId, sid, material, ITEM_CHANGE_REASON.HERO_GIVE_FAVOR); if (!result) { return resResult(STATUS.BATTLE_CONSUMES_NOT_ENOUGH); } let updateConsume = addConsumeToHero(hero.consumes, material); let update = { - connections: addConnect(connections, { shipId, level: newLevel, exp }), + connections: addConnect(connections, { shipId, level: newLevel, exp: newExp }), consumes: updateConsume } - let isLv = level != newLevel; + let isLv = oldLv != newLevel; let { curHero } = await calculateCeWithHero(HERO_SYSTEM_TYPE.CONNECT, roleId, serverId, sid, hero.hid, update); if(isLv) { // await unlockFigure(sid, roleId, [{ type: FIGURE_UNLOCK_CONDITION.HERO_FAVOR, paramHid: curHero.hid, paramFavourLv: curHero.favourLv }]); diff --git a/shared/pubUtils/data.ts b/shared/pubUtils/data.ts index 07c895a81..a9f44d2fb 100644 --- a/shared/pubUtils/data.ts +++ b/shared/pubUtils/data.ts @@ -15,7 +15,7 @@ import { dicWar, dicWarPvp, dicDailyWarByType, loadWar, dicHeroIdByWar } from ". import { dicWarJson, loadWarJson } from "./dictionary/DicWarJson"; import { AUCTION_TIME } from "../consts"; import { dicFashions, dicFashionsByHeroId, loadFashions } from "./dictionary/DicFashions"; -import { friendShips, friendShipsByLv, loadFriendShip } from "./dictionary/DicFriendShip"; +import { friendShips, friendShipsByLv, friendShipsMax, loadFriendShip } from "./dictionary/DicFriendShip"; import { dicHeroQualityUp, loadHeroQualityUp } from "./dictionary/DicHeroQualityUp"; import { dicHeroStar, loadHeroStar } from "./dictionary/DicHeroStar"; import { dicHeroWake, loadHeroWake } from "./dictionary/DicHeroWake"; @@ -139,6 +139,7 @@ export const gameData = { fashionBySkinId: dicFashionsByHeroId, friendShips: friendShips, friendShipsByLv: friendShipsByLv, + friendShipsMax: friendShipsMax, randomEffectPool: dicRandomEffectPool, randomEffectPoolByGroupAndLv: dicRandomEffectPoolByGroupAndLv, title: dicTitle, @@ -322,6 +323,10 @@ export function hasCurConnect(actorId: number, shipId: number) { return gameData.friendShips.has(`${actorId}_${shipId}`); } +export function getConnectMaxLv(actorId: number, shipId: number) { + return gameData.friendShipsMax.get(`${actorId}_${shipId}`)||0; +} + /** * 根据武将当前好感获得好感等级 * @param exp 累积经验 @@ -329,12 +334,11 @@ export function hasCurConnect(actorId: number, shipId: number) { export function getConnectLvByExp(actorId: number, shipId: number, newExp: number) { let exps = gameData.friendShips.get(`${actorId}_${shipId}`)||[]; exps.sort((a, b) => a.level - b.level); - let newLv = 0, maxLv = 0; + let newLv = 0; for(let { level, shipExp } of exps) { if(newExp >= shipExp) newLv = level; - if(maxLv < level) maxLv = level } - return { newLv, maxLv } + return newLv } export function getBossHpByWarId(warId: number) { diff --git a/shared/pubUtils/dictionary/DicFriendShip.ts b/shared/pubUtils/dictionary/DicFriendShip.ts index e715eda21..d33b3bbb7 100644 --- a/shared/pubUtils/dictionary/DicFriendShip.ts +++ b/shared/pubUtils/dictionary/DicFriendShip.ts @@ -23,6 +23,7 @@ export interface DicFriendShip { export const friendShips = new Map(); export const friendShipsByLv = new Map(); +export const friendShipsMax = new Map(); export function loadFriendShip() { friendShips.clear(); let arr = readFileAndParse(FILENAME.DIC_FRIEND_SHIP); @@ -39,6 +40,10 @@ export function loadFriendShip() { shipSumValue += o.shipExp; friendShips.get(key1).push({ level: o.level, shipExp: shipSumValue }); + if(!friendShipsMax.has(key1) || friendShipsMax.get(key1) < o.level) { + friendShipsMax.set(key1, o.level); + } + let key2 = `${o.actorId}_${o.shipId}_${o.level}`; friendShipsByLv.set(key2, o); });