修改游戏结果的消息
This commit is contained in:
parent
e1928f2658
commit
21ffbcfd30
@ -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;
|
||||
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) {
|
||||
ap0 += data.ap;
|
||||
ap[player.team] += data.ap;
|
||||
for (let [,pet] of player.pets) {
|
||||
petAp0 += (pet.ap + pet.extAp);
|
||||
petAp[player.team] += (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 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) {
|
||||
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,
|
||||
|
Loading…
x
Reference in New Issue
Block a user