Files
CardServer/GameManager.ts

165 lines
4.8 KiB
TypeScript
Raw Permalink Normal View History

2025-10-11 14:45:08 +08:00
import { ALL_PLAYER_NUM } from "./GameDefine";
import { Player } from "./Player";
export class GameManager
{
mRound:number = 0;
mGameFightPlayer:Map<string, Player>= new Map<string, Player>;
mAlivePlayerCount:number = ALL_PLAYER_NUM;
mCharacterNames:string[]= ["飞鸟仓介", "雾岛林汐", "飞鸟千寻", "小林琉璃", "小林莲夜"]
clearGameRoundPlayer()
{
this.mGameFightPlayer.clear();
}
isGameRoundPrepared():boolean
{
if(this.mGameFightPlayer.size != this.mAlivePlayerCount)
{
return false;
}
return true;
}
//返回值:是否所有人准备完毕
setGameRoundInfo(aPlayerID:string, aPlayer:Player):boolean
{
if(aPlayer.mHp <= 0)
{
return false;
}
this.mGameFightPlayer.set(aPlayerID, aPlayer);
let result = this.isGameRoundPrepared();
if(result)
{
this.calcuteGameFightResult();
}
return result;
}
claculatePlayerHp(aAttack:Player, aDefender:Player)
{
2025-10-17 17:23:45 +08:00
let realDefender = Math.floor(aDefender.mDefener * (1 - 0.1 * aAttack.mAgile));
if(aAttack.mAttack > realDefender)
2025-10-11 14:45:08 +08:00
{
2025-10-17 17:23:45 +08:00
aDefender.mHp -= aAttack.mAttack - realDefender;
2025-10-11 14:45:08 +08:00
}
}
claculateRanking(aPlayers:Map<string, Player>)
{
let sortPlayers:Player[] = [];
for(const player of aPlayers.values())
{
if(player.mHp<=0)
{
sortPlayers.push(player);
this.mAlivePlayerCount--;
}
}
if(sortPlayers.length > 0)
{
sortPlayers.sort((a,b)=>a.mAgile - b.mAgile);
let playerNum = aPlayers.size;
for(let i=0; i<sortPlayers.length;++i)
{
sortPlayers[i].mRank = playerNum - i;
if(sortPlayers[i].mCharacterName != "")
{
continue;
}
let characterName = this.mCharacterNames.pop() ?? "";
2025-10-11 14:45:08 +08:00
sortPlayers[i].mCharacterName = characterName;
if(characterName == "飞鸟千寻")
{
let player = aPlayers.get(sortPlayers[i].mCurrentEnemy);
if(player)
{
player.mCharacterName = "高桥林佑";
}
2025-10-11 14:45:08 +08:00
}
}
}
//计算最后一个存活玩家的排名
if(this.mAlivePlayerCount == 1)
{
for(const player of aPlayers.values())
{
if(player.mHp > 0)
{
player.mRank = 1;
if(this.mCharacterNames.length > 0)
{
player.mCharacterName = this.mCharacterNames.pop() ?? "";
2025-10-11 14:45:08 +08:00
}
return;
}
}
}
}
calcuteGameFightResult()
{
let temp = new Map<string, Player>(this.mGameFightPlayer);
let restRound:[Player,Player] | null = null;
while (temp.size > 0)
{
const iterator = temp.keys();
const playerID = iterator.next().value ?? "";
2025-10-11 14:45:08 +08:00
let player = temp.get(playerID);
if(!player)
{
return;
}
if(player.mIsResting)
{
let enemy = this.mGameFightPlayer.get(player.mCurrentEnemy);
if(!enemy)
{
return;
}
restRound = [player, enemy],
2025-10-11 14:45:08 +08:00
temp.delete(playerID);
continue;
}
else
{
let enemy = temp.get(player.mCurrentEnemy);
if(!enemy)
{
return;
}
2025-10-11 14:45:08 +08:00
if(player.mAgile >= enemy.mAgile)//palyer 敏捷高
{
this.claculatePlayerHp(player, enemy);
if(enemy.mHp > 0)
{
this.claculatePlayerHp(enemy, player);
}
}
else//enemy敏捷高
{
this.claculatePlayerHp(enemy, player);
if(player.mHp > 0)
{
this.claculatePlayerHp(player, enemy);
}
}
temp.delete(playerID);
temp.delete(player.mCurrentEnemy);
continue;
}
}
if(restRound != null)
{
let restPlayer = restRound[0];
let enemy = restRound[1];
if(enemy.mHp > 0)
{
this.claculatePlayerHp(enemy, restPlayer);
}
}
this.claculateRanking(this.mGameFightPlayer);
}
};