修改游戏结果的消息

This commit is contained in:
zhl 2021-01-18 15:58:29 +08:00
parent e1928f2658
commit 21ffbcfd30

View File

@ -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<CardGameState, {}> {
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<Player, GameResult> = 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<StateTypeEnum, [string, number]> = new Map();
let scoreMap: Map<Player, number> = 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<CardGameState, {}> {
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<CardGameState, {}> {
pet.extSkills.length = 0;
}
/**
* info-svr上报游戏结果
* @param {number} winner
*/
reportGameResult(winner: number) {
let data: any = {
roomid: this.room.roomId,