diff --git a/src/rooms/commands/GameResultCommand.ts b/src/rooms/commands/GameResultCommand.ts index 765c085..fb1a35d 100644 --- a/src/rooms/commands/GameResultCommand.ts +++ b/src/rooms/commands/GameResultCommand.ts @@ -10,8 +10,28 @@ import {Card} from "../schema/Card"; import {MapSchema, SetSchema} from "@colyseus/schema"; import {StateTypeEnum} from "../enums/StateTypeEnum"; import {reportGameResult} from "../../common/WebApi"; +import {BaseConst} from "../../constants/BaseConst"; +import {Player} from "../schema/Player"; +class GameResult{ + public id: string + public team: number + public hp: number + public alive: boolean + public ap: number + public mvpScore: number + public scoreChange: number + public scoreOld: number + constructor(player: Player) { + this.id = player.id; + this.team = player.team; + this.hp = player.hp; + this.alive = player.state != PlayerStateConst.PLAYER_DEAD; + this.ap = gameUtil.calcTotalAp(player); + this.scoreOld = player.score; + } +} /** * 游戏结束 */ @@ -19,67 +39,80 @@ export class GameResultCommand extends Command { async execute() { // 计算最终结果 - let hp0 = 0; - let hp1 = 0; - let ap0 = 0; - let ap1 = 0; - let petAp0 = 0; - let petAp1 = 0; - let resultArr = []; + let hp: number[] = [0, 0]; + let ap: number[] = [0, 0]; + let petAp: number[] = [0, 0]; + let score: number[] = [0, 0]; + let results: Map = new Map(); + const fc = global.$cfg.get(BaseConst.FORMULA); for (let [, player] of this.state.players) { - let data = { - id: player.id, - team: player.team, - hp: player.hp, - alive: player.state != PlayerStateConst.PLAYER_DEAD, - ap: gameUtil.calcTotalAp(player) - }; - resultArr.push(data); - if (player.team == 0) { - hp0 += player.hp; - if (player.state != PlayerStateConst.PLAYER_DEAD) { - ap0 += data.ap; - for (let [,pet] of player.pets) { - petAp0 += (pet.ap + pet.extAp); - } - } - } - if (player.team == 1) { - hp1 += player.hp; - if (player.state != PlayerStateConst.PLAYER_DEAD) { - ap1 += data.ap; - for (let [,pet] of player.pets) { - petAp1 += (pet.ap + pet.extAp); - } + let data = new GameResult(player); + results.set(player, data); + score[player.team] += player.score; + hp[player.team] += player.hp; + if (player.state != PlayerStateConst.PLAYER_DEAD) { + ap[player.team] += data.ap; + for (let [,pet] of player.pets) { + petAp[player.team] += (pet.ap + pet.extAp); } } } - let winner = -1; // 平局 - if (hp0 > hp1) { + /** + * 判断哪队是赢家 + * @type {number} + */ + let winner = 0; + if (hp[0] > hp[1]) { winner = 0; - } else if (hp0 < hp1) { + } else if (hp[0] < hp[1]) { winner = 1; } else { - if (ap0 > ap1) { + if (ap[0] > ap[1]) { winner = 0; - } else if (ap0 < ap1){ + } else if (ap[0] < ap[1]){ winner = 1; } else { - if (petAp0 > petAp1) { + if (petAp[0] >= petAp[1]) { winner = 0; - } else if (petAp0 < petAp1) { + } else if (petAp[0] < petAp[1]) { winner = 1; } } } - let resultData: any = { - winner: winner, - results: resultArr - }; + const scores = [ + fc.get(70043).number, + fc.get(70046).number, + fc.get(70044).number, + fc.get(70045).number, + fc.get(70047).number, + fc.get(70048).number + ]; let resultMap: Map = new Map(); + let scoreMap: Map = new Map(); for (let [, player] of this.state.players) { + let otherTeam = 1 - player.team; + let result = results.get(player); + if (winner == player.team) { + if (score[player.team] >= score[otherTeam]) { + result.scoreChange = 100/(1+Math.pow(10, ((score[player.team]-score[otherTeam])/2500))); + } else { + result.scoreChange = 100-100/(1+Math.pow(10, ((score[otherTeam]-score[player.team])/2500))); + } + } else { + if (score[player.team] >= score[otherTeam]) { + result.scoreChange = -(80-80/(1+Math.pow(10, ((score[player.team]-score[otherTeam])/2500)))); + } else { + result.scoreChange = -(80/(1+Math.pow(10, ((score[otherTeam]-score[player.team])/2500)))); + } + } + let s = 0; for (let [type, val] of player.statData) { + if (type >= scores.length) { + continue; + } + val = val * scores[type]; + s += val; if (resultMap.has(type)) { let current = resultMap.get(type); if (current[1] < val) { @@ -89,16 +122,31 @@ export class GameResultCommand extends Command { resultMap.set(type, [player.id, val]); } } + scoreMap.set(player, s); } let statics: any = []; + for (let [type, val] of resultMap) { - statics.push({ - type, - player: val[0], - val: val[1] - }) + if (type < scores.length) { + statics.push({ + type, + player: val[0], + val: val[1] + }) + } + } - resultData['statics'] = statics; + for (let [p, val] of scoreMap) { + let mvpRate = p.team == winner ? fc.get(70051).number : fc.get(70052).number; + let data = results.get(p); + data.mvpScore = val * mvpRate; // mvp分 + } + let resultData: any = { + winner: winner, + results: [...results.values()], + statics: statics + }; + let self = this; this.room.bGameResult(resultData); this.state.updateGameState(GameStateConst.STATE_GAME_OVER); @@ -179,6 +227,10 @@ export class GameResultCommand extends Command { pet.extSkills.length = 0; } + /** + * 向info-svr上报游戏结果 + * @param {number} winner + */ reportGameResult(winner: number) { let data: any = { roomid: this.room.roomId,