import { Socket } from "socket.io"; import { Player } from "./Player"; import { Json } from "sequelize/types/utils"; import { Matchmaker, createMatchmaker, PairingResult } from "./MatchMaker"; import { ALL_PLAYER_NUM } from "./GameDefine"; import { GameManager } from "./GameManager"; import { getLocalTime } from "./GetLocalTime"; type RoomPlayerInfo = { playerName: string; playerPrepared: boolean; }; interface GameInfo { playerId: string; opponentId: string; socketID: string; rank: number; character: string; hp: number; }; class Room { mPlayers:Map = new Map mStatus:number = 0;//0:房间开启;1:所有人准备,进入fight;2:fight结束 mMatchMaker:Matchmaker = createMatchmaker(this.mPlayers); mGameManager:GameManager = new GameManager(); mCreatedTime:Date = getLocalTime(); isRoomPrepared():boolean { if(this.mPlayers.size != ALL_PLAYER_NUM) { return false; } for(const value of this.mPlayers.values()) { if(value.mPrepared == false) { return false; } } return true; } setRoomPrepared() { this.generatePairings(); this.mStatus = 1; } generatePairings():PairingResult[] { let tempPlayers:Map = new Map; for(const key of this.mPlayers.keys()) { if(this.mPlayers.get(key)!.mHp > 0) { tempPlayers.set(key, this.mPlayers.get(key)!); } } this.mMatchMaker.updatePlayers(tempPlayers); let result = this.mMatchMaker.generatePairings(); for(let i=0; i; join(aRoomID:string, aName:string, aSocket:Socket):[boolean, string, number | null, Player | null] { if(!this.mRooms.has(aRoomID)) { return [false, "No room Id", null, null]; } let room = this.mRooms.get(aRoomID)!; if(room.mPlayers.has(aName)) { let player = room.mPlayers.get(aName); player!.setPlayerSocketId(aSocket.id); aSocket.join(aRoomID); return [true, "", room.mStatus, player!]; } if(room.mPlayers.size < ALL_PLAYER_NUM) { let player = new Player(aName, aSocket.id); aSocket.join(aRoomID); room.mPlayers.set(aName, player); return [true,"", 0, null]; } return [false, "room full", null, null]; } setPlayerInfo(roomId:string, playerId:string, strength:number, stamina:number, agile:number, cards:number[]) : boolean //返回值是是否所有玩家都准备完毕 { let room = this.mRooms.get(roomId); if(!room) { return false; } let player = room.mPlayers.get(playerId); if(!player) { return false; } player.setPlayerInfo(strength, stamina, agile, cards); if(room.isRoomPrepared() == true ) { room.setRoomPrepared(); return true; } return false; } createRoom(aRoomID:string) { this.mRooms.set(aRoomID, new Room()); } getPlayersByRoomID(aRoomID:string):RoomPlayerInfo[] { let room = this.mRooms.get(aRoomID); let result:RoomPlayerInfo[] = []; if(room?.mPlayers) { for(const value of room.mPlayers.values()) { result.push({playerName:value.mPlayerName,playerPrepared:value.mPrepared}); } } return result; } getGameInfos(aRoomID:string):GameInfo[] { let room = this.mRooms.get(aRoomID); if(room) { return room.getGameInfos(); } return []; } getGameInfo(aRoomID:string, aPlayerID:string):GameInfo|null { let room = this.mRooms.get(aRoomID); if(room) { return room.getGameInfo(aPlayerID); } return null; } getGameRoundInfos(aRoomID:string, aPlayerID:string):GameInfo[] { let room = this.mRooms.get(aRoomID); if(room) { return room.getGameRoundInfos(); } return []; } //返回值是否所有人都准备完毕 setGameFight(aRoomID:string, aPlayerID:string, aAttack:number, aDefender:number):boolean { let room = this.mRooms.get(aRoomID); if(!room) { return false; } let result = room.setGameFight(aPlayerID, aAttack, aDefender); if(result) { room.generatePairings(); } return result; } clearGameRoundPlayer(aRoomID:string) { let room = this.mRooms.get(aRoomID); if(!room) { return; } room.mGameManager.clearGameRoundPlayer(); } isRoomExist(aRoomID:string):boolean { return this.mRooms.has(aRoomID); } }