寻宝战斗内状态同步接口;

修改寻宝组队bug
This commit is contained in:
liangtongchuan
2020-11-19 20:24:16 +08:00
parent c3a3314bb8
commit 77fc465809
3 changed files with 214 additions and 59 deletions

View File

@@ -29,11 +29,12 @@ class ComTeam {
capId: string; capId: string;
// 战力限制 // 战力限制
ceLimit: number; ceLimit: number;
// boss 血量
bossHp: number;
} }
export class ComBattleHandler { export class ComBattleHandler {
constructor(private app: Application) { constructor(private app: Application) {
} }
private bossHp: number = 10000;
private teamMap: Map<string, ComTeam> = new Map(); private teamMap: Map<string, ComTeam> = new Map();
async createTeam(msg: {blueprtId: number, heroes: [ number ], pub: boolean, ceLimit: number}, session: BackendSession) { async createTeam(msg: {blueprtId: number, heroes: [ number ], pub: boolean, ceLimit: number}, session: BackendSession) {
@@ -55,7 +56,7 @@ export class ComBattleHandler {
// 检查是否有已创建未结束的寻宝,预先占用一张藏宝图 // 检查是否有已创建未结束的寻宝,预先占用一张藏宝图
let teams = await ComBattleTeamModel.findTeamByCapAndStatus(roleId, COM_TEAM_STATUS.FIGHTING); let teams = await ComBattleTeamModel.findTeamByCapAndStatus(roleId, COM_TEAM_STATUS.FIGHTING);
if (teams && blueprt.count <= teams.length) return resResult(STATUS.COM_BATTLE_BLUEPRT_NOT_ENOUGH); if (teams && blueprt.count <= teams.length) return resResult(STATUS.COM_BATTLE_BLUEPRT_NOT_ENOUGH);
//TODO: 检查武将是否拥有 // TODO: 检查武将是否拥有
// 创建队伍数据结构 // 创建队伍数据结构
let comTeam = new ComTeam(); let comTeam = new ComTeam();
@@ -66,6 +67,8 @@ export class ComBattleHandler {
comTeam.roleIds = [roleId]; comTeam.roleIds = [roleId];
comTeam.status = COM_TEAM_STATUS.DEFAULT; comTeam.status = COM_TEAM_STATUS.DEFAULT;
comTeam.ceLimit = ceLimit; comTeam.ceLimit = ceLimit;
// TODO: boss 血量读表
comTeam.bossHp = 10000;
let roleStatus = new RoleStatus(); let roleStatus = new RoleStatus();
roleStatus.heroes = heroes; roleStatus.heroes = heroes;
@@ -73,6 +76,8 @@ export class ComBattleHandler {
roleStatus.headHid = headHid; roleStatus.headHid = headHid;
roleStatus.topFiveCe = topFiveCe; roleStatus.topFiveCe = topFiveCe;
roleStatus.roleId = roleId; roleStatus.roleId = roleId;
roleStatus.isReady = true;
roleStatus.totalDmg = 0;
comTeam.roleStatus = [roleStatus]; comTeam.roleStatus = [roleStatus];
this.teamMap.set(teamCode, comTeam); this.teamMap.set(teamCode, comTeam);
@@ -94,11 +99,10 @@ export class ComBattleHandler {
let roleId = session.get('roleId'); let roleId = session.get('roleId');
let roleName = session.get('roleName'); let roleName = session.get('roleName');
let sid = session.get('sid'); let sid = session.get('sid');
console.log('role in joinTeam: ', roleId, roleName, msg, this.app.rpc);
console.log('teamMap:' + JSON.stringify(this.teamMap)); console.log('teamMap:' + JSON.stringify(this.teamMap));
let { teamCode, isFrd } = msg; let { teamCode, isFrd } = msg;
let teamStatus = this.teamMap.get(teamCode); let teamStatus = this.teamMap.get(teamCode);
if (teamStatus.status !== 0 || teamStatus.roleIds.length === 3) return resResult(STATUS.COM_BATTLE_MEMBER_LIMIT); if (!teamStatus || teamStatus.status !== 0 || teamStatus.roleIds.length === 3) return resResult(STATUS.COM_BATTLE_MEMBER_LIMIT);
if (teamStatus.roleIds.indexOf(roleId) !== -1) return resResult(STATUS.COM_BATTLE_DUP_ENTER); if (teamStatus.roleIds.indexOf(roleId) !== -1) return resResult(STATUS.COM_BATTLE_DUP_ENTER);
// TODO:助战等级限制,等表 // TODO:助战等级限制,等表
let { lv, headHid, topFiveCe } = await Role.findByRoleId(roleId); let { lv, headHid, topFiveCe } = await Role.findByRoleId(roleId);
@@ -115,6 +119,8 @@ export class ComBattleHandler {
roleStatus.topFiveCe = topFiveCe || 0; roleStatus.topFiveCe = topFiveCe || 0;
roleStatus.roleId = roleId; roleStatus.roleId = roleId;
roleStatus.isFrd = isFrd; roleStatus.isFrd = isFrd;
roleStatus.isReady = false;
roleStatus.totalDmg = 0;
const team = await ComBattleTeamModel.addRole(teamCode, roleStatus); const team = await ComBattleTeamModel.addRole(teamCode, roleStatus);
if (!team) { if (!team) {
return resResult(STATUS.COM_BATTLE_CREATE_ERR); return resResult(STATUS.COM_BATTLE_CREATE_ERR);
@@ -144,72 +150,180 @@ export class ComBattleHandler {
return resResult(STATUS.SUCCESS, { teamInfos: teams}); return resResult(STATUS.SUCCESS, { teamInfos: teams});
} }
async startBattle(msg: {}, session: BackendSession) { async teammateReady(msg: {teamCode: string, heroes: Array<number>}, session: BackendSession) {
let roleId = session.get('roleId'); let roleId = session.get('roleId');
let roleName = session.get('roleName'); let { teamCode, heroes } = msg;
let sid = session.get('sid'); let teamStatus = this.teamMap.get(teamCode);
let teamCode = session.get('teamCode'); if (!teamStatus || !teamStatus.roleIds || teamStatus.roleIds.indexOf(roleId) === -1) return resResult(STATUS.COM_BATTLE_TEAM_INVALID);
console.log('role in startBattle: ', roleId, roleName, teamCode);
let team = await ComBattleTeamModel.updateHeroes(teamCode, roleId, heroes);
if (!team) return resResult(STATUS.COM_BATTLE_UPDATE_HEROES_ERR);
teamStatus.roleStatus.forEach(st => {
if (st && st.roleId === roleId) {
st.heroes = heroes;
st.isReady = true;
}
});
let channelService = this.app.get('channelService'); let channelService = this.app.get('channelService');
let channel = channelService.getChannel(teamCode, true); let channel = channelService.getChannel(teamCode, false);
let users = channel.getMembers(); channel.pushMessage('onTeammateReady', {teamCode, roleId, heroes});
if (users.indexOf(roleId) === -1) { return resResult(STATUS.SUCCESS);
channel.add(roleId, sid);
}
users = channel.getMembers();
channel.pushMessage('onAdd', {users});
let tsid = channel.getMember(roleId)['sid'];
channelService.pushMessageByUids('bossHp', {data: 'datadata'}, [{
uid: roleId,
sid: tsid
}]);
return resResult(STATUS.SUCCESS, { users, teamCode });
} }
/** async startBattle(msg: {teamCode: string}, session: BackendSession) {
* Send messages to users
*
* @param {Object} msg message from client
* @param {Object} session
*
*/
async enterBattle(msg: {battleId: string , target: string}, session: BackendSession) {
let roleId = session.get('roleId'); let roleId = session.get('roleId');
let roleName = session.get('roleName'); let { teamCode } = msg;
let sid = session.get('sid'); let teamStatus = this.teamMap.get(teamCode);
console.log('role in enterBattle: ', roleId, roleName, msg, this.app.rpc); if (!teamStatus || !teamStatus.roleIds || teamStatus.roleIds.indexOf(roleId) === -1) return resResult(STATUS.COM_BATTLE_TEAM_INVALID);
if (teamStatus.capId !== roleId) return resResult(STATUS.COM_BATTLE_CAP_ONLY);
if (teamStatus.status !== COM_TEAM_STATUS.DEFAULT) return resResult(STATUS.COM_BATTLE_ALREADY_START);
for (let roleSt of teamStatus.roleStatus) {
if (!roleSt.isReady) {
return resResult(STATUS.COM_BATTLE_TEAM_NO_READY);
}
}
teamStatus.status = COM_TEAM_STATUS.FIGHTING;
let channelService = this.app.get('channelService'); let channelService = this.app.get('channelService');
let channel = channelService.getChannel(msg.battleId, false); let channel = channelService.getChannel(teamCode, false);
let users = channel.getMembers(); channel.pushMessage('onComBtlStart', {teamCode, roleStatus: teamStatus.roleStatus});
if (users.indexOf(roleId) === -1) { return resResult(STATUS.SUCCESS);
channel.add(roleId, sid);
} else {
return resResult(STATUS.COM_BATTLE_DUP_ENTER);
}
channel.pushMessage('onAddBattle', {users});
return resResult(STATUS.SUCCESS, { users });
} }
async hurtHp(msg: {battleId: string, bossHurt: number, actorHurt: [{ actorId: number, actorHurt: number}]}, session: BackendSession) { async action(msg: {teamCode: string, heroes: Array<{hid: number, hurtHp: number}>, killed: Array<number>}, session: BackendSession) {
let roleId = session.get('roleId'); let roleId = session.get('roleId');
let roleName = session.get('roleName'); let { teamCode, heroes, killed } = msg;
console.log('role in enterBattle: ', roleId, roleName, msg); let teamStatus = this.teamMap.get(teamCode);
if (!teamStatus || !teamStatus.roleIds || teamStatus.roleIds.indexOf(roleId) === -1) return resResult(STATUS.COM_BATTLE_TEAM_INVALID);
if (teamStatus.status !== COM_TEAM_STATUS.FIGHTING) return resResult(STATUS.COM_BATTLE_NOT_START);
let totalHurtHp = 0;
if (heroes && heroes.length) {
heroes.forEach(hero => {
if (hero.hurtHp > 0) {
totalHurtHp += hero.hurtHp;
}
});
}
let curRoleSt = null;
teamStatus.roleStatus.forEach(roleSt => {
if (roleSt.roleId === roleId) {
if (killed && killed.length) {
killed.forEach(killedHid => {
if (roleSt.killed.indexOf(killedHid) === -1) {
roleSt.killed.push(killedHid);
}
});
}
roleSt.totalDmg += totalHurtHp;
curRoleSt = roleSt;
teamStatus.bossHp -= totalHurtHp;
}
});
let channelService = this.app.get('channelService');
let channel = channelService.getChannel(teamCode, false);
channel.pushMessage('onTeammateAct', {teamCode, bossHp: teamStatus.bossHp, roleStatus: {roleId, totalDmg: curRoleSt.totalDmg, killed}});
return resResult(STATUS.SUCCESS);
}
async battleEnd(msg: {teamCode: string, isSuccess: boolean}, session: BackendSession) {
let roleId = session.get('roleId');
let { teamCode, isSuccess } = msg;
let teamStatus = this.teamMap.get(teamCode);
if (!teamStatus || !teamStatus.roleIds || teamStatus.roleIds.indexOf(roleId) === -1) return resResult(STATUS.COM_BATTLE_TEAM_INVALID);
let channelService = this.app.get('channelService'); let channelService = this.app.get('channelService');
let channel = channelService.getChannel(msg.battleId, false); let channel = channelService.getChannel(teamCode, false);
if (isSuccess && teamStatus.bossHp <= 0) {
this.bossHp -= msg.bossHurt; let team = await ComBattleTeamModel.updateResult(teamCode, roleId, isSuccess);
if (this.bossHp < 0) { if (!team) return resResult(STATUS.COM_BATTLE_RESULT_ERR);
this.bossHp = 0; // TODO: 根据策划结论考虑是否在推送中添加掉落
channel.pushMessage('bossHp', {data: 'boss 挂啦!!!!!'}, undefined); // TODO: 用户总伤害等的持久化
channel.pushMessage('onTeamComplete', {teamCode, result: isSuccess});
} else if (!isSuccess) {
let team = await ComBattleTeamModel.updateResult(teamCode, roleId, isSuccess);
if (!team) return resResult(STATUS.COM_BATTLE_RESULT_ERR);
if (team.status === COM_TEAM_STATUS.LOOSE) {
channel.pushMessage('onTeamComplete', {teamCode, result: isSuccess});
} else {
channel.pushMessage('onTeammateAct', {teamCode, bossHp: teamStatus.bossHp, roleStatus: {roleId, battleStatus: 2}});
}
} }
channel.pushMessage('bossHp', {bossHp: this.bossHp}, undefined); return resResult(STATUS.SUCCESS, { bossHp: teamStatus.bossHp });
return resResult(STATUS.SUCCESS, { bossHp: this.bossHp});
} }
// async startBattle(msg: {}, session: BackendSession) {
// let roleId = session.get('roleId');
// let roleName = session.get('roleName');
// let sid = session.get('sid');
// let teamCode = session.get('teamCode');
// console.log('role in startBattle: ', roleId, roleName, teamCode);
// let channelService = this.app.get('channelService');
// let channel = channelService.getChannel(teamCode, true);
// let users = channel.getMembers();
// if (users.indexOf(roleId) === -1) {
// channel.add(roleId, sid);
// }
// users = channel.getMembers();
// channel.pushMessage('onAdd', {users});
// let tsid = channel.getMember(roleId)['sid'];
// channelService.pushMessageByUids('bossHp', {data: 'datadata'}, [{
// uid: roleId,
// sid: tsid
// }]);
// return resResult(STATUS.SUCCESS, { users, teamCode });
// }
// /**
// * Send messages to users
// *
// * @param {Object} msg message from client
// * @param {Object} session
// *
// */
// async enterBattle(msg: {battleId: string , target: string}, session: BackendSession) {
// let roleId = session.get('roleId');
// let roleName = session.get('roleName');
// let sid = session.get('sid');
// console.log('role in enterBattle: ', roleId, roleName, msg, this.app.rpc);
// let channelService = this.app.get('channelService');
// let channel = channelService.getChannel(msg.battleId, false);
// let users = channel.getMembers();
// if (users.indexOf(roleId) === -1) {
// channel.add(roleId, sid);
// } else {
// return resResult(STATUS.COM_BATTLE_DUP_ENTER);
// }
// channel.pushMessage('onAddBattle', {users});
// return resResult(STATUS.SUCCESS, { users });
// }
// async hurtHp(msg: {battleId: string, bossHurt: number, actorHurt: [{ actorId: number, actorHurt: number}]}, session: BackendSession) {
// let roleId = session.get('roleId');
// let roleName = session.get('roleName');
// console.log('role in enterBattle: ', roleId, roleName, msg);
// let channelService = this.app.get('channelService');
// let channel = channelService.getChannel(msg.battleId, false);
// this.bossHp -= msg.bossHurt;
// if (this.bossHp < 0) {
// this.bossHp = 0;
// channel.pushMessage('bossHp', {data: 'boss 挂啦!!!!!'}, undefined);
// }
// channel.pushMessage('bossHp', {bossHp: this.bossHp}, undefined);
// return resResult(STATUS.SUCCESS, { bossHp: this.bossHp});
// }
} }

View File

@@ -80,6 +80,13 @@ export const STATUS = {
COM_BATTLE_CE_LIMIT: { code: 20608, simStr: '战力不足' }, COM_BATTLE_CE_LIMIT: { code: 20608, simStr: '战力不足' },
COM_BATTLE_JOIN_ERR: { code: 20609, simStr: '加入队伍失败' }, COM_BATTLE_JOIN_ERR: { code: 20609, simStr: '加入队伍失败' },
COM_BATTLE_NO_VALID_TEAM: { code: 20610, simStr: '没有合适的队伍' }, COM_BATTLE_NO_VALID_TEAM: { code: 20610, simStr: '没有合适的队伍' },
COM_BATTLE_TEAM_INVALID: { code: 20611, simStr: '队伍异常' },
COM_BATTLE_UPDATE_HEROES_ERR: { code: 20612, simStr: '更新阵容失败' },
COM_BATTLE_CAP_ONLY: { code: 20613, simStr: '只有队长可以操作' },
COM_BATTLE_TEAM_NO_READY: { code: 20614, simStr: '队友未准备好' },
COM_BATTLE_RESULT_ERR: { code: 20615, simStr: '结算信息更新失败' },
COM_BATTLE_NOT_START: { code: 20616, simStr: '寻宝未开始' },
COM_BATTLE_ALREADY_START: { code: 20616, simStr: '寻宝已开始' },
// 秘境 20700 - 20799 // 秘境 20700 - 20799
DUNGEON_REFRESH_TIMES_LACK: { code: 20701, simStr: '购买次数不足' }, DUNGEON_REFRESH_TIMES_LACK: { code: 20701, simStr: '购买次数不足' },

View File

@@ -7,7 +7,7 @@ export class RoleStatus {
@prop({ required: true }) @prop({ required: true })
isCap: boolean; isCap: boolean;
@prop({ required: true, default: 0 }) @prop({ required: true, default: 0 })
damageNum: number; totalDmg: number;
// 战斗状态 0-挑战中 1-挑战成功 2-挑战失败 // 战斗状态 0-挑战中 1-挑战成功 2-挑战失败
@prop({ required: true, default: 0 }) @prop({ required: true, default: 0 })
battleStatus: number; battleStatus: number;
@@ -29,6 +29,9 @@ export class RoleStatus {
// 前五战力 // 前五战力
@prop({ required: true, default: 0 }) @prop({ required: true, default: 0 })
topFiveCe: number; topFiveCe: number;
// 是否准备
@prop({ required: true, default: false })
isReady: boolean;
} }
@index({ teamCode: 1 }) @index({ teamCode: 1 })
@@ -51,7 +54,7 @@ export default class ComBattleTeam extends BaseModel {
@prop({ required: true }) @prop({ required: true })
blueprtId: number; blueprtId: number;
// 战斗状态 0未开始1已开始2胜利3失败 // 战斗状态 0未开始1已开始2胜利3失败4已领奖
@prop({ required: true, default: 0 }) @prop({ required: true, default: 0 })
status: number; status: number;
@@ -76,6 +79,37 @@ export default class ComBattleTeam extends BaseModel {
return team; return team;
} }
public static async updateHeroes(teamCode: string, roleId: string, heroes: Array<number>, lean = true) {
const team = await ComBattleTeamModel.findOneAndUpdate({ teamCode, 'roleStatus.roleId': roleId}, {$set: {'roleStatus.$.heroes': heroes}}, {new: true}).lean(lean);
return team;
}
public static async updateResult(teamCode: string, roleId: string, isSuccess: boolean, lean = true) {
let team = await ComBattleTeamModel.findOne({teamCode}).select('status roleStatus');
if (isSuccess === true) {
team.status = 2;
team.roleStatus.forEach(st => {
if (st.battleStatus !== 2) {
st.battleStatus = 1;
}
})
} else if (isSuccess === false) {
let loseCnt = 1;
team.roleStatus.forEach(st => {
if (st.battleStatus === 2 && st.roleId !== roleId) {
loseCnt += 1;
} else if (st.roleId === roleId && !st.battleStatus) {
st.battleStatus = 2;
}
});
if (loseCnt === team.roleStatus.length) {
team.status = 3;
}
}
await team.save();
return team;
}
public static async findTeamByCapAndStatus(roleId: string, status: number, lean = true) { public static async findTeamByCapAndStatus(roleId: string, status: number, lean = true) {
const teams = await ComBattleTeamModel.find({capId: roleId, status}).lean(lean); const teams = await ComBattleTeamModel.find({capId: roleId, status}).lean(lean);
return teams; return teams;