513 lines
20 KiB
TypeScript
513 lines
20 KiB
TypeScript
import { STATUS } from '../../../consts/statusCode';
|
||
import { RoleModel } from './../../../db/Role';
|
||
import { HeroModel } from '../../../db/Hero';
|
||
import { resResult, decodeIdCntArrayStr, parseGoodStr } from '../../../pubUtils/util';
|
||
import {Application, BackendSession, pinus} from 'pinus';
|
||
import { handleCost } from '../../../services/rewardService';
|
||
import { getTitle, getTeraph, gameData, getScollByStar, getFriendLvByExp } from '../../../pubUtils/data';
|
||
import { SCHOOL, SCROLL, EXTERIOR } from '../../../pubUtils/dicParam';
|
||
import { getAtrrNameById } from '../../../consts/constModules/abilityConst'
|
||
import { findIndex } from 'underscore';
|
||
import { SclResultInter, SclPosInter } from '../../../pubUtils/interface';
|
||
import { SchoolModel } from '../../../db/School';
|
||
import { checkTeraphMaterialEnough } from '../../../services/roleService'
|
||
import { calPlayerCeAndSave, calAllHeroCe } from '../../../services/playerCeService';
|
||
import { HERO_SYSTEM_TYPE, LINEUP_NUM, ROLE_SELECT } from '../../../consts';
|
||
import { checkBattleHeroesByHid } from '../../../services/normalBattleService';
|
||
|
||
export default function(app: Application) {
|
||
return new RoleHandler(app);
|
||
}
|
||
|
||
export class RoleHandler {
|
||
constructor(private app: Application) {
|
||
}
|
||
|
||
async initEquips(roleId: string, roleName: string) {
|
||
// const seqId = await CounterModel.getNewCounter(COUNTER.EID);
|
||
// const equipInfo = {
|
||
// roleId,
|
||
// roleName,
|
||
// id: 1,
|
||
// name: '倚天剑',
|
||
// seqId,
|
||
// type: 1
|
||
// }
|
||
// const equip = await EquipModel.createEquip(equipInfo);
|
||
// await HeroModel.addEquip(roleId, 12, 1, equip._id);
|
||
}
|
||
|
||
async initHeros(roleId: string, roleName: string) {
|
||
|
||
const heroInfo = {
|
||
roleId,
|
||
roleName,
|
||
hid: 1,
|
||
hName: '曹操',
|
||
quality: 1,
|
||
job: 1,
|
||
star: 0,
|
||
serverId: 1,
|
||
skins:[{id: 41001, enable: true}]
|
||
}
|
||
await HeroModel.createHero(heroInfo);
|
||
}
|
||
|
||
async initRole(msg: {content: string , target: string}, session: BackendSession) {
|
||
let roleId = session.get('roleId');
|
||
let roleName = session.get('roleName');
|
||
console.log('role in initRole: ', roleId, roleName);
|
||
|
||
let heros = await HeroModel.findByRole(roleId);
|
||
if (!heros || heros.length === 0) {
|
||
await this.initHeros(roleId, roleName);
|
||
}
|
||
|
||
// let equips = await EquipModel.findbyRole(roleId);
|
||
// if (!equips || equips.length === 0) {
|
||
await this.initEquips(roleId, roleName);
|
||
// }
|
||
|
||
console.log('initRole finish');
|
||
}
|
||
|
||
async getRoleInfo(msg: {targetRoleId: string}, session: BackendSession) {
|
||
let { targetRoleId } = msg;
|
||
let { roleId, roleName, head = EXTERIOR.EXTERIOR_FACE, frame = EXTERIOR.EXTERIOR_FACECASE, spine = EXTERIOR.EXTERIOR_APPEARANCE, ce = 0, topLineup, topLineupCe = 0 } = await RoleModel.findByRoleId(targetRoleId);
|
||
return resResult(STATUS.SUCCESS, { roleId, roleName, head, frame, spine, ce, topLineup, topLineupCe });
|
||
}
|
||
|
||
//爵位
|
||
async roleTitleLevelUp(msg: {}, session: BackendSession){
|
||
let roleId = session.get('roleId');
|
||
let sid: string = session.get('sid');
|
||
|
||
let role = await RoleModel.findByRoleId(roleId);
|
||
|
||
let { title } = role;
|
||
let titleInfo = getTitle(title + 1);
|
||
if (!titleInfo)
|
||
return resResult(STATUS.DIC_DATA_NOT_FOUND)
|
||
if (titleInfo.lvLimited > role.lv)
|
||
return resResult(STATUS.COM_BATTLE_LV_NOT_ENOUGH)
|
||
let consumes = titleInfo.material;
|
||
let result = await handleCost(roleId, sid, consumes);
|
||
if (!result)
|
||
return resResult(STATUS.BATTLE_CONSUMES_NOT_ENOUGH);
|
||
|
||
let update = { title: title + 1 }
|
||
role = await calAllHeroCe(HERO_SYSTEM_TYPE.TITLE, sid, roleId, update);
|
||
return resResult(STATUS.SUCCESS, { roleId, title: role.title });
|
||
}
|
||
|
||
//神像强化
|
||
async roleTeraphStrengthen(msg: {id: number, count: number}, session: BackendSession){
|
||
let {id, count} = msg;
|
||
let roleId = session.get('roleId');
|
||
let sid: string = session.get('sid');
|
||
|
||
let role = await RoleModel.findByRoleId(roleId);
|
||
let teraphs = role.teraphs;
|
||
let index = findIndex(teraphs, {id});
|
||
if (index < 0)
|
||
return resResult(STATUS.WRONG_PARMS);
|
||
let teraph = teraphs[index];
|
||
let dicTeraph = getTeraph(id, teraph.grade);
|
||
if (!dicTeraph)
|
||
return resResult(STATUS.DIC_DATA_NOT_FOUND);
|
||
|
||
let attrs = new Array<number>(); // 可以强化的属性
|
||
dicTeraph.mainAttrMax.forEach(( max, id) => {
|
||
let attrName = getAtrrNameById(id);
|
||
if (teraph[attrName] < max) {
|
||
attrs.push(id);
|
||
}
|
||
});
|
||
|
||
if (!attrs.length)
|
||
return resResult(STATUS.ROLE_TERAPH_NOT_STRENGTHEN);
|
||
|
||
// 随机神像中的一条属性并检查道具是否足够,以及更新teraph
|
||
let { consumes} = checkTeraphMaterialEnough(count, attrs, dicTeraph, teraph);
|
||
|
||
let result = await handleCost(roleId, sid, consumes);
|
||
if (!result)
|
||
return resResult(STATUS.BATTLE_CONSUMES_NOT_ENOUGH);
|
||
|
||
role = await calAllHeroCe(HERO_SYSTEM_TYPE.TERAPH, sid, roleId, { teraphs }, [id]);
|
||
return resResult(STATUS.SUCCESS, { roleId, teraphs: role.teraphs });
|
||
}
|
||
|
||
//神像进阶
|
||
async roleTeraphQualityUp(msg: {id: number}, session: BackendSession){
|
||
let {id} = msg;
|
||
let roleId = session.get('roleId');
|
||
let sid: string = session.get('sid');
|
||
|
||
let role = await RoleModel.findByRoleId(roleId);
|
||
let teraphs = role.teraphs;
|
||
let index = findIndex(teraphs, {id});
|
||
if (index < 0)
|
||
return resResult(STATUS.WRONG_PARMS);
|
||
let teraph = teraphs[index];
|
||
let teraphInfo = getTeraph(id, teraph.grade);
|
||
if (!teraphInfo)
|
||
return resResult(STATUS.DIC_DATA_NOT_FOUND)
|
||
|
||
for(let [attrId, val] of teraph.attr) {
|
||
if (val < teraphInfo.mainAttrMax.get(attrId))
|
||
return resResult(STATUS.ROLE_TERAPH_NOT_QUILITY);
|
||
|
||
teraph.attr.set(attrId, 0);
|
||
}
|
||
teraph.grade ++;
|
||
|
||
|
||
let nextTeraphInfo = getTeraph(id, teraph.grade)
|
||
if (!nextTeraphInfo)
|
||
return resResult(STATUS.DIC_DATA_NOT_FOUND);
|
||
|
||
let consumes = teraphInfo.upGradeMaterial;
|
||
let result = await handleCost(roleId, sid, consumes);
|
||
if (!result)
|
||
return resResult(STATUS.BATTLE_CONSUMES_NOT_ENOUGH);
|
||
|
||
role = await calAllHeroCe(HERO_SYSTEM_TYPE.TERAPH_UP, sid, roleId, { teraphs }, [id]);
|
||
return resResult(STATUS.SUCCESS, { roleId, teraphs: role.teraphs });
|
||
}
|
||
|
||
// 获得百家学宫
|
||
async getSchoolList(msg: {}, session: BackendSession) {
|
||
let roleId = session.get('roleId');
|
||
|
||
const dicPosition = decodeIdCntArrayStr(SCHOOL.SCHOOL_POSITION, 1); // id=>isOpen
|
||
|
||
const userSchoolList = await SchoolModel.findByRoleId(roleId);
|
||
|
||
let school = new Array<SclResultInter>();
|
||
gameData.school.forEach((dicSchool) => {
|
||
let position = new Array<SclPosInter>();
|
||
dicPosition.forEach((isOpen, id) => {
|
||
id = parseInt(id);
|
||
|
||
let userSchool = userSchoolList.find(cur => cur.schoolId == dicSchool.id && cur.positionId == id);
|
||
if (userSchool) {
|
||
position.push({
|
||
id,
|
||
hid: userSchool.hid,
|
||
isOpen: userSchool.isOpen
|
||
});
|
||
} else {
|
||
position.push({
|
||
id,
|
||
hid: 0,
|
||
isOpen: !!isOpen
|
||
});
|
||
}
|
||
});
|
||
|
||
school.push({
|
||
id: dicSchool.id,
|
||
position
|
||
});
|
||
});
|
||
|
||
return resResult(STATUS.SUCCESS, { school });
|
||
|
||
}
|
||
|
||
// 摆放/替换/卸下武将
|
||
async changeSchoolHero(msg: { schoolId: number, positionId: number, hid: number }, session: BackendSession) {
|
||
let roleId = session.get('roleId');
|
||
let sid = session.get('sid');
|
||
|
||
let { schoolId, positionId, hid } = msg;
|
||
if (!gameData.school.has(schoolId)) {
|
||
return resResult(STATUS.DIC_DATA_NOT_FOUND);
|
||
}
|
||
const dicPosition = decodeIdCntArrayStr(SCHOOL.SCHOOL_POSITION, 1); // id(str) => isOpen
|
||
if (!dicPosition.has(positionId.toString())) {
|
||
return resResult(STATUS.DIC_DATA_NOT_FOUND);
|
||
}
|
||
let isOpen = !!dicPosition.get(positionId.toString()); // 该位置是否解锁
|
||
|
||
if(hid > 0) {
|
||
let findHero = await SchoolModel.findByHid(roleId, hid);
|
||
if (!!findHero) {
|
||
return resResult(STATUS.ROLE_SCHOOL_HERO_USED);
|
||
}
|
||
|
||
let curHero = await HeroModel.findByHidAndRole(hid, roleId);
|
||
if (!curHero) return resResult(STATUS.HERO_NOT_FIND);
|
||
}
|
||
|
||
let curSchool = await SchoolModel.findBySclAndPos(roleId, schoolId, positionId);
|
||
let preHid = 0; // 原先在该位置上的武将
|
||
if (curSchool) {
|
||
isOpen = curSchool.isOpen;
|
||
preHid = curSchool.hid;
|
||
}
|
||
|
||
|
||
if (!isOpen) {
|
||
return resResult(STATUS.ROLE_SCHOOL_POSITION_LOCKED);
|
||
}
|
||
|
||
await SchoolModel.updateBySclAndPos(roleId, schoolId, positionId, { hid, isOpen })
|
||
await calAllHeroCe(HERO_SYSTEM_TYPE.SCHOOL, sid, roleId, {}, [schoolId, hid, preHid]);
|
||
|
||
return resResult(STATUS.SUCCESS, {
|
||
schoolId, positionId, hid, preHid, isOpen
|
||
});
|
||
|
||
}
|
||
|
||
// 解锁位置
|
||
async unlockSchoolPosition(msg: { schoolId: number, positionId: number }, session: BackendSession) {
|
||
let roleId = session.get('roleId');
|
||
let sid = session.get('sid');
|
||
|
||
let { schoolId, positionId } = msg;
|
||
if (!gameData.school.has(schoolId)) {
|
||
return resResult(STATUS.DIC_DATA_NOT_FOUND);
|
||
}
|
||
const dicPosition = decodeIdCntArrayStr(SCHOOL.SCHOOL_POSITION, 1); // id(str) => isOpen
|
||
if (!dicPosition.has(positionId.toString())) {
|
||
return resResult(STATUS.DIC_DATA_NOT_FOUND);
|
||
}
|
||
let isOpen = !!dicPosition.get(positionId.toString()); // 该位置是否解锁
|
||
if (isOpen) {
|
||
return resResult(STATUS.ROLE_SCHOOL_POSITION_UNLOCK_NOT_NEED);
|
||
}
|
||
let curSchool = await SchoolModel.findBySclAndPos(roleId, schoolId, positionId);
|
||
if (curSchool && curSchool.isOpen) {
|
||
return resResult(STATUS.ROLE_SCHOOL_POSITION_UNLOCK_NOT_NEED);
|
||
}
|
||
|
||
const cost = parseGoodStr(SCHOOL.SCHOOL_UNLOCK_COIN);
|
||
const costResult = await handleCost(roleId, sid, cost);
|
||
if (!costResult) return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH);
|
||
|
||
curSchool = await SchoolModel.updateBySclAndPos(roleId, schoolId, positionId, { isOpen: true })
|
||
|
||
return resResult(STATUS.SUCCESS, {
|
||
schoolId, positionId, hid: curSchool.hid, isOpen: curSchool.isOpen
|
||
});
|
||
}
|
||
|
||
// 激活/升级名将谱
|
||
async activeHeroScroll(msg: { hid: number }, session: BackendSession) {
|
||
let roleId = session.get('roleId');
|
||
let sid = session.get('sid');
|
||
|
||
let { hid } = msg;
|
||
|
||
let curHero = await HeroModel.findByHidAndRole(hid, roleId, 'hid star colorStar quality scrollId scrollActive scrollStar scrollColorStar scrollQuality favour favourLv connections attr ce');
|
||
if (!curHero) return resResult(STATUS.HERO_NOT_FIND);
|
||
|
||
let dicHero = gameData.hero.get(hid);
|
||
if (!dicHero) return resResult(STATUS.DIC_DATA_NOT_FOUND);
|
||
|
||
let { star, colorStar, quality, scrollId, scrollActive, scrollStar, scrollColorStar, scrollQuality, favour, favourLv } = curHero;
|
||
|
||
let update = {
|
||
scrollActive, scrollId, scrollStar, scrollColorStar, scrollQuality, favour, favourLv
|
||
};
|
||
if (!scrollActive) { // 初次激活
|
||
update.scrollActive = true;
|
||
update.scrollStar = dicHero.initialStars;
|
||
update.scrollQuality = dicHero.quality;
|
||
update.scrollColorStar = 0;
|
||
|
||
// 获取一定好感度
|
||
let maxLv = gameData.maxFriendShipLv;
|
||
if (maxLv > favourLv) {
|
||
|
||
update.favour += SCROLL.SCROLL_ACTIVE_FAVOUR;
|
||
update.favourLv = getFriendLvByExp(update.favour);
|
||
}
|
||
} else {
|
||
if (star > scrollStar) { // 可以升星
|
||
update.scrollStar++;
|
||
} else if (quality > scrollQuality ) { // 可以升品
|
||
update.scrollQuality++;
|
||
} else if (colorStar > scrollColorStar) { // 可以升彩星
|
||
update.scrollColorStar++;
|
||
} else {
|
||
return resResult(STATUS.ROLE_SCROLL_REACH_MAX);
|
||
}
|
||
|
||
}
|
||
|
||
let dicHeroScroll = getScollByStar(dicHero.quality, update.scrollStar, update.scrollQuality, update.scrollColorStar);
|
||
update.scrollId = dicHeroScroll?dicHeroScroll.id: 0;
|
||
|
||
let hero = await calPlayerCeAndSave(HERO_SYSTEM_TYPE.SCROLL, sid, roleId, curHero, update); // 更新单个武将战力
|
||
calAllHeroCe(HERO_SYSTEM_TYPE.SCROLL, sid, roleId, {}, [hid]); // 全局增加战力
|
||
|
||
return resResult(STATUS.SUCCESS, {
|
||
curHero: {
|
||
hid: hero.hid,
|
||
scrollActive: hero.scrollActive,
|
||
scrollId: hero.scrollId,
|
||
scrollStar: hero.scrollStar,
|
||
scrollColorStar: hero.scrollColorStar,
|
||
scrollQuality: hero.scrollQuality,
|
||
favour: hero.favour,
|
||
favourLv: hero.favourLv,
|
||
}
|
||
});
|
||
}
|
||
|
||
// 防沉迷调试用,推送窗口
|
||
async debugPlayerTime(msg: { type: number }, session: BackendSession) {
|
||
let { type } = msg;
|
||
let roleId = session.get('roleId');
|
||
let sid = session.get('sid');
|
||
|
||
if(type == 1) {
|
||
pinus.app.channelService.pushMessageByUids('onPlayTime', resResult(STATUS.SUCCESS, {
|
||
isGuest: true,
|
||
guestTime: 60 * 60, // 游客已体验时间
|
||
hasAuthenticated: false, // 是否进行过实名认证
|
||
isAdult: false, // 是否已成年
|
||
todayPlayTime: 60 * 60, // 今天已游戏时长
|
||
type: 1
|
||
} ), [{uid: roleId, sid: sid}]);
|
||
} else if (type == 2) {
|
||
pinus.app.channelService.pushMessageByUids('onPlayTime', resResult(STATUS.SUCCESS, {
|
||
isGuest: false,
|
||
guestTime: 0, // 游客已体验时间
|
||
hasAuthenticated: true, // 是否进行过实名认证
|
||
isAdult: false, // 是否已成年
|
||
todayPlayTime: 60 * 60, // 今天已游戏时长
|
||
type: 2
|
||
} ), [{uid: roleId, sid: sid}]);
|
||
} else if (type == 3) {
|
||
pinus.app.channelService.pushMessageByUids('onPlayTime', resResult(STATUS.SUCCESS, {
|
||
isGuest: false,
|
||
guestTime: 0, // 游客已体验时间
|
||
hasAuthenticated: true, // 是否进行过实名认证
|
||
isAdult: false, // 是否已成年
|
||
todayPlayTime: 3 * 60 * 60, // 今天已游戏时长
|
||
type: 3
|
||
} ), [{uid: roleId, sid: sid}]);
|
||
} else if (type == 4) {
|
||
pinus.app.channelService.pushMessageByUids('onPlayTime', resResult(STATUS.SUCCESS, {
|
||
isGuest: false,
|
||
guestTime: 0, // 游客已体验时间
|
||
hasAuthenticated: true, // 是否进行过实名认证
|
||
isAdult: false, // 是否已成年
|
||
todayPlayTime: 1.5 * 60 * 60, // 今天已游戏时长
|
||
type: 4
|
||
} ), [{uid: roleId, sid: sid}]);
|
||
}
|
||
|
||
return resResult(STATUS.SUCCESS);
|
||
}
|
||
|
||
// 保存展示阵容
|
||
async saveShowLineup(msg: { showLineup: number[] }, session: BackendSession) {
|
||
let { showLineup } = msg;
|
||
let roleId = session.get('roleId');
|
||
|
||
let checkHeroes = await checkBattleHeroesByHid(roleId, showLineup);
|
||
if(showLineup.length > 0 && !checkHeroes) return resResult(STATUS.BATTLE_HERO_NOT_FOUND);
|
||
|
||
if(showLineup.length > LINEUP_NUM) {
|
||
return resResult(STATUS.LINEUP_MAX);
|
||
}
|
||
|
||
let role = await RoleModel.updateRoleInfo(roleId, { showLineup });
|
||
|
||
return resResult(STATUS.SUCCESS, { showLineup: role.showLineup });
|
||
}
|
||
|
||
// 更换头像
|
||
async setHead(msg: { id: number }, session: BackendSession) {
|
||
let { id } = msg;
|
||
let roleId = session.get('roleId');
|
||
let role = await RoleModel.findByRoleId(roleId, ROLE_SELECT.GET_HEADS);
|
||
if(!role) return resResult(STATUS.ROLE_NOT_FOUND);
|
||
|
||
let { heads } = role;
|
||
let curHead = heads.find(cur => cur.id == id);
|
||
if(!curHead) return resResult(STATUS.HEAD_NOT_FOUND);
|
||
if(curHead.enable) return resResult(STATUS.HEAD_IS_WEARING);
|
||
if(!curHead.status) return resResult(STATUS.HEAD_IS_LOCKED);
|
||
|
||
let oldHead = heads.find(cur => cur.enable); // 穿戴中的头像
|
||
if(oldHead) {
|
||
oldHead.enable = false;
|
||
}
|
||
curHead.enable = true;
|
||
|
||
role = await RoleModel.updateRoleInfo(roleId, { heads });
|
||
|
||
return resResult(STATUS.SUCCESS, { heads: role.heads, head: role.head });
|
||
}
|
||
|
||
// 更换相框
|
||
async setFrame(msg: { id: number }, session: BackendSession) {
|
||
let { id } = msg;
|
||
let roleId = session.get('roleId');
|
||
let role = await RoleModel.findByRoleId(roleId, ROLE_SELECT.GET_HEADS);
|
||
if(!role) return resResult(STATUS.ROLE_NOT_FOUND);
|
||
|
||
let { frames } = role;
|
||
let curFrame = frames.find(cur => cur.id == id);
|
||
if(!curFrame) return resResult(STATUS.FRAME_NOT_FOUND);
|
||
if(curFrame.enable) return resResult(STATUS.FRAME_IS_WEARING);
|
||
if(!curFrame.status) return resResult(STATUS.FRAME_IS_LOCKED);
|
||
|
||
let oldHead = frames.find(cur => cur.enable); // 穿戴中的头像
|
||
if(oldHead) {
|
||
oldHead.enable = false;
|
||
}
|
||
curFrame.enable = true;
|
||
|
||
role = await RoleModel.updateRoleInfo(roleId, { frames });
|
||
|
||
return resResult(STATUS.SUCCESS, { frames: role.frames, frame: role.frame });
|
||
}
|
||
|
||
// 更换形象
|
||
async setSpine(msg: { id: number }, session: BackendSession) {
|
||
let { id } = msg;
|
||
let roleId = session.get('roleId');
|
||
let role = await RoleModel.findByRoleId(roleId, ROLE_SELECT.GET_HEADS);
|
||
if(!role) return resResult(STATUS.ROLE_NOT_FOUND);
|
||
|
||
let { spines } = role;
|
||
let curSpine = spines.find(cur => cur.id == id);
|
||
if(!curSpine) return resResult(STATUS.SPINE_NOT_FOUND);
|
||
if(curSpine.enable) return resResult(STATUS.SPINE_IS_WEARING);
|
||
if(!curSpine.status) return resResult(STATUS.SPINE_IS_LOCKED);
|
||
|
||
let oldHead = spines.find(cur => cur.enable); // 穿戴中的头像
|
||
if(oldHead) {
|
||
oldHead.enable = false;
|
||
}
|
||
curSpine.enable = true;
|
||
|
||
role = await RoleModel.updateRoleInfo(roleId, { spines });
|
||
|
||
return resResult(STATUS.SUCCESS, { spines: role.spines, spine: role.spine });
|
||
}
|
||
|
||
// 改名
|
||
async rename(msg: { roleName: string }, session: BackendSession) {
|
||
let { roleName } = msg;
|
||
let roleId = session.get('roleId');
|
||
let serverId = session.get('serverId');
|
||
|
||
let checkName = await RoleModel.checkName(roleName, serverId);
|
||
if(checkName) return resResult(STATUS.NAME_HAS_USED);
|
||
|
||
let role = await RoleModel.updateRoleInfo(roleId, { roleName });
|
||
|
||
return resResult(STATUS.SUCCESS, { roleName: role.roleName });
|
||
}
|
||
|
||
}
|