Files
ZYZ/game-server/app/servers/role/handler/heroHandler.ts
2020-12-09 17:23:15 +08:00

158 lines
5.8 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import {Application, BackendSession, createTcpMailBox, ChannelService} from 'pinus';
import { handleCost } from '../../../services/rewardService';
import { calPlayerCeAndSave } from '../../../services/playerCeService';
import { resResult } from '../../../pubUtils/util';
import { STATUS } from '../../../consts/statusCode';
import {HeroModel} from '../../../db/Hero';
import { getJobInfoById, getMaxGradeByjobClass, getHeroInfoById, getGoodById } from '../../../pubUtils/gamedata';
import { ITID, CONSUME_TYPE } from '../../../consts/consts';
export default function(app: Application) {
return new HeroHandler(app);
}
export class HeroHandler {
constructor(private app: Application) {
}
private channelService: ChannelService = this.app.get('channelService');
public async test(msg: { id: number, count: number}, session: BackendSession) {
let roleId: string = session.get('roleId');
let roleName: string = session.get('roleName');
let sid: string = session.get('sid');
let {id, count} = msg;
let result = await handleCost(roleId, sid, [{id, count}] );
if(!result) {
return resResult(STATUS.BATTLE_CONSUMES_NOT_ENOUGH);
}
return resResult(STATUS.SUCCESS);
}
// 武将碎片合成
public async combine(msg: { hid: number}, session: BackendSession) {
let roleId: string = session.get('roleId');
let roleName: string = session.get('roleName');
let sid: string = session.get('sid');
let {hid} = msg;
// 检查是否存在武将
let hasHero = await HeroModel.findByHidAndRole(hid, roleId);
if(hasHero) return resResult(STATUS.ROLE_HERO_EXISTS);
// 根据dic_hero 获得 1. 碎片id 2. 碎片数量 3. 初始武将星级 4. 初始品质
let dicHero = getHeroInfoById(hid);
if(!dicHero) return resResult(STATUS.ROLE_INFO_NOT_FOUND);
let {pieceId, quality, initialStars: star, pieceCount, jobid: job, name: hName} = dicHero;
// 碎片数量是否足够
let costResult = await handleCost(roleId, sid, [{id: pieceId, count: pieceCount}]);
if(!costResult) return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH);
// createHero
let curHero = await HeroModel.createHero({
roleId, roleName, hid, hName, star, quality, job
});
await calPlayerCeAndSave(sid, roleId, [curHero]);
return resResult(STATUS.SUCCESS, {curHero});
}
// 武将升级
public async lvUp(msg: { hid: number, type: number, material: Array<{id: number, count: number}>}, session: BackendSession) {
let roleId: string = session.get('roleId');
let roleName: string = session.get('roleName');
let sid: string = session.get('sid');
let { hid, type, material } = msg;
// 根据dic_goods 计算得材料可转换的经验
let allExp = 0;
for(let {id, count} of material) {
let dicGoods = getGoodById(id);
if(!dicGoods) return resResult(STATUS.ROLE_INFO_NOT_FOUND);
let dicItid = ITID.get(dicGoods.itid);
if(!dicItid || dicItid.type != CONSUME_TYPE.EXP) {
return resResult(STATUS.ROLE_METERIAL_ERROR);
}
}
// 根据dic_zyz_charexp 计算武将可以升的级数
// 检查材料是否满足升级需求
// 检查是否超出主公等级
// 进行升级,溢出经验保留
// handleCost
}
// 武将升星
public async starUp(msg: { hid: number, star: number, starStage: number}, session: BackendSession) {
// 根据dic_hero 获得 碎片id
// 根据dic_zyz_hero_star 计算需要花的碎片并检查碎片数量
// 检查当前星级和星阶和客户端传参是否符合
// 升星阶满6自动升星。最高6星
// handleCost
}
// 武将觉醒
public async wakeUp(msg: { hid: number, colorStar: number, fireStage: number}, session: BackendSession) {
// 根据dic_hero 获得 碎片id
// 根据dic_zyz_hero_wake 获得需要花费的碎片和材料
// 特殊处理初次觉醒fireStage传0保存为 colorStar = 1, fireStage = 0花费的材料取的0星的
// 检查品质是否是橙色
// 升星阶满6自动升星
// handleCost
}
// 武将升品
public async qualityUp(msg: { hid: number, quality: number }, session: BackendSession) {
// 根据dic_hero 获得 碎片id
// 根据dic_zyz_hero_quality_up 获得需要的材料
// 检查是否达到6星
// 升品满品3级
// handleCost
}
//训练 TODO
async heroJobTrain (msg: {hid:number}, session: BackendSession) {
let roleId = session.get('roleId');
let { hid } = msg;
let hero = await HeroModel.findByHidAndRole(hid, roleId);
if (!hero)
return resResult(STATUS.WRONG_PARMS);
let heroJob = getJobInfoById(hero.job);
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
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() {
}
//激活羁绊 TODO
async heroConectionActivate() {
}
//赠送包括一键赠送TODO
async heroGiveFavor() {
}
//购买时装
async buyHeroSkin() {
}
//穿带时装
async heroWearSkin() {
}
}