diff --git a/game-server/app/servers/role/handler/heroHandler.ts b/game-server/app/servers/role/handler/heroHandler.ts index 7f7ea067a..f50a84e87 100644 --- a/game-server/app/servers/role/handler/heroHandler.ts +++ b/game-server/app/servers/role/handler/heroHandler.ts @@ -1,11 +1,15 @@ import {Application, BackendSession, createTcpMailBox, ChannelService} from 'pinus'; import { handleCost } from '../../../services/rewardService'; import { calPlayerCeAndSave } from '../../../services/playerCeService'; -import { resResult } from '../../../pubUtils/util'; +import { resResult, getItems } from '../../../pubUtils/util'; import { STATUS } from '../../../consts/statusCode'; import {HeroModel} from '../../../db/Hero'; -import { getJobInfoById, getMaxGradeByjobClass, getHeroInfoById, getGoodById } from '../../../pubUtils/gamedata'; +import {CURRENCY_BY_TYPE, CURRENCY_TYPE, ITID, CONSUME_TYPE} from '../../../consts/const'; +import {getJobInfoById, getMaxGradeByjobClass , getJobByGradeAndClass, getFriendShipById, getHeroInfoById, getFriendShipLevels, getGoodById} from '../../../pubUtils/gamedata'; import { ITID, CONSUME_TYPE } from '../../../consts/consts'; + +const _ = require('underscore'); + export default function(app: Application) { return new HeroHandler(app); } @@ -109,49 +113,192 @@ export class HeroHandler { // 升品,满品3级 // handleCost } - //训练 TODO + //训练 async heroJobTrain (msg: {hid:number}, session: BackendSession) { - let roleId = session.get('roleId'); + let roleId: string = session.get('roleId'); + let sid: string = session.get('sid'); let { hid } = msg; let hero = await HeroModel.findByHidAndRole(hid, roleId); if (!hero) - return resResult(STATUS.WRONG_PARMS); + return resResult(STATUS.HERO_NOT_FIND); let heroJob = getJobInfoById(hero.job); + let nextHeroJob = getJobByGradeAndClass(heroJob.job_class, heroJob.grade + 1); + if (nextHeroJob.unlockLevel > hero.lv) + return resResult(STATUS.NOT_REACH_UNLOCK_LEVEL); if (hero.jobStage >= 6) return resResult(STATUS.HERO_JOB_STAGE_REACH_MAX_STAGE); if (hero.job >= getMaxGradeByjobClass(heroJob.job_class)) return resResult(STATUS.HERO_JOB_REACH_MAX_STAGE); - //消耗物品TODO - + let cousumeGoods = getItems(heroJob.trainingConsume); + let result = await handleCost(roleId, sid, cousumeGoods); + if(!result) { + return resResult(STATUS.BATTLE_CONSUMES_NOT_ENOUGH); + } hero.jobStage = hero.jobStage ++; //重算战力并下发 - let sid: string = session.get('sid'); let heros = await calPlayerCeAndSave(sid, roleId, [hero]); return resResult(STATUS.SUCCESS, { hid : heros[0].hid, job : heros[0].job, jobStage : heros[0].jobStage}); } - //进阶 TODO - async heroJobStageUp() { - + //进阶 + async heroJobStageUp(msg: {hid:number}, session: BackendSession) { + let roleId: string = session.get('roleId'); + let sid: string = session.get('sid'); + let { hid } = msg; + let hero = await HeroModel.findByHidAndRole(hid, roleId); + if (!hero) + return resResult(STATUS.HERO_NOT_FIND); + let heroJob = getJobInfoById(hero.job); + let nextHeroJob = getJobByGradeAndClass(heroJob.job_class, heroJob.grade + 1); + if (nextHeroJob.unlockLevel > hero.lv) + return resResult(STATUS.NOT_REACH_UNLOCK_LEVEL); + if (hero.job >= getMaxGradeByjobClass(heroJob.job_class)) + return resResult(STATUS.HERO_JOB_REACH_MAX_STAGE); + let cousumeGoods = getItems(heroJob.upGradeConsume); + let result = await handleCost(roleId, sid, cousumeGoods); + if(!result) { + return resResult(STATUS.BATTLE_CONSUMES_NOT_ENOUGH); + } + hero.job = nextHeroJob.job; + hero.jobStage = 0; + //重算战力并下发 + let heros = await calPlayerCeAndSave(sid, roleId, [hero]); + return resResult(STATUS.SUCCESS, { hid : heros[0].hid, job : heros[0].job, jobStage : heros[0].jobStage}); } - //激活羁绊 TODO - async heroConectionActivate() { - + //激活羁绊 + async heroConectionActivate(msg: {hid:number, id:number}, session: BackendSession) { + let roleId: string = session.get('roleId'); + let sid: string = session.get('sid'); + let { hid, id } = msg; + let friendShip = getFriendShipById(id); + if (friendShip.actorId != hid) + return resResult(STATUS.WRONG_PARMS); + let hero = await HeroModel.findByHidAndRole(hid, roleId); + if (!hero) + return resResult(STATUS.HERO_NOT_FIND); + if (!!_.findWhere(hero.conections, {id:id})) + return resResult(STATUS.HERO_CONECTION_IS_EXIT); + if (hero.star < friendShip.level) + return resResult(STATUS.NOT_REACH_UNLOCK_LEVEL); + let heroIds = friendShip.memberId.split('|'); + for (let heroId of heroIds) { + let member = await HeroModel.findByHidAndRole(heroId, roleId); + if(!member) + return resResult(STATUS.HERO_NOT_FIND); + if (member.star < friendShip.level) + return resResult(STATUS.NOT_REACH_UNLOCK_LEVEL); + } + let result = await handleCost(roleId, sid, [{id: CURRENCY_BY_TYPE.get(CURRENCY_TYPE.COIN), count:5000}]); + if(!result) { + return resResult(STATUS.BATTLE_CONSUMES_NOT_ENOUGH); + } + hero.conections.push({ + id : id + }); + //重算战力并下发 + let heros = await calPlayerCeAndSave(sid, roleId, [hero]); + return resResult(STATUS.SUCCESS, { hid : heros[0].hid, conections : heros[0].conections}); } - //赠送(包括一键赠送)TODO - async heroGiveFavor() { - + //赠送(包括一键赠送) + async heroGiveFavor(msg: {hid:number, items:Array<{id : number,count : number}>}, session: BackendSession) { + let roleId: string = session.get('roleId'); + let sid: string = session.get('sid'); + let { hid, items } = msg; + let hero = await HeroModel.findByHidAndRole(hid, roleId); + if (!hero) + return resResult(STATUS.HERO_NOT_FIND); + let friendShipLevels = getFriendShipLevels(); + if (friendShipLevels[friendShipLevels.lenth - 1].level <= hero.favourLv) + return resResult(STATUS.HERO_FAVOUR_LEVEL_REACH_MAXT); + //计算消耗物品转化的经验 + let exp:number = 0; + for (let item of items) { + let itemInfo = getGoodById(item.id); + if (itemInfo.itid == CONSUME_TYPE.FAVOUR) { + exp += itemInfo.value; + } else { + return resResult(STATUS.WRONG_PARMS); + } + } + hero.favour += exp; + for (let friendShipLevel of friendShipLevels) { + if (friendShipLevel.level < hero.favourLv) + continue; + if (friendShipLevel.exp > hero.favour) + break; + hero.favour -= friendShipLevel.exp; + hero.favourLv++; + } + let result = await handleCost(roleId, sid, items); + if(!result) { + return resResult(STATUS.BATTLE_CONSUMES_NOT_ENOUGH); + } + //重算战力并下发 + let heros = await calPlayerCeAndSave(sid, roleId, [hero]); + return resResult(STATUS.SUCCESS, { hid : heros[0].hid, favour : heros[0].favour, favourLv : heros[0].favourLv}); } //购买时装 - async buyHeroSkin() { - + async buyHeroSkin(msg: {id:number}, session: BackendSession) { + let roleId: string = session.get('roleId'); + let sid: string = session.get('sid'); + let { id } = msg; + let skinInfo;//TODO查询时装 + if (!skinInfo) + resResult(STATUS.HERO_SKIN_NOT_FIND); + let hid;//TODO获得时装的武将id + let hero = await HeroModel.findByHidAndRole(hid, roleId); + if (!hero) + resResult(STATUS.HERO_NOT_FIND); + if (!!_.findWhere(hero.skins, {id:id})) + resResult(STATUS.HERO_SKIN_IS_EXIST); + let items;//TODO物品消耗 + let result = await handleCost(roleId, sid, items); + if(!result) { + return resResult(STATUS.BATTLE_CONSUMES_NOT_ENOUGH); + } + hero.skins.push({ + id:id, + enable:false + }); + let heros = await HeroModel.findByRole(roleId); + for (let i = 0; i < heros.lenth; i++) { + if (heros[i].hid == hero.hid) { + heros[i] = hero; + } + } + //重算战力并下发 + await calPlayerCeAndSave(sid, roleId, heros); + return resResult(STATUS.SUCCESS, { hid : hero.hid, skins : hero.skins}); } //穿带时装 - async heroWearSkin() { - + async heroWearSkin(msg: {id:number}, session: BackendSession) { + let roleId: string = session.get('roleId'); + let sid: string = session.get('sid'); + let { id } = msg; + let skinInfo;//TODO查询时装 + if (!skinInfo) + resResult(STATUS.HERO_SKIN_NOT_FIND); + let hid; + let hero = await HeroModel.findByHidAndRole(hid, roleId); + if (!hero) + resResult(STATUS.HERO_NOT_FIND); + let result = false; + for (let skin of hero.skins) { + if (skin.id == id) { + skin.enable = true; + result = true; + } else { + skin.enable = false; + } + } + if (!result) { + resResult(STATUS.HERO_SKIN_NOT_FIND); + } + await calPlayerCeAndSave(sid, roleId, [hero]); + return resResult(STATUS.SUCCESS, { hid : hero.hid, skins : hero.skins}); } }