Files
2026-06-01 12:46:52 +02:00

46 lines
1.8 KiB
C++

#pragma once
#include "BattleArena.h"
// 대기열에 의해 운영되는 아레나
class BattleArenaWithWaitQueue : public BattleArena
{
public:
typedef std::pair< StructPlayer*, AR_TIME > PlayerWaitInfo;
public:
BattleArenaWithWaitQueue( const BattleArenaBaseServer* pArenaBase, ThreadSafeIntMap* pPartyToArenaMap );
virtual ~BattleArenaWithWaitQueue();
// { csArena를 걸고 호출해야 하는 함수들
// 대기열에 유저가 추가되면 RESULT_PENDING을, 최근에 시작된 경기에 바로 진입되었을 경우에는 RESULT_SUCCESS을 각각 리턴함
virtual unsigned short _joinWaitQueue( StructPlayer* pPlayer, _BATTLE_GRADE eGrade );
virtual unsigned short _leaveWaitQueue( StructPlayer* pPlayer, _ARENA_LEAVE_TYPE eLeaveType );
virtual unsigned short _leaveWaitQueue( PlayerUID nPlayerUID, _ARENA_LEAVE_TYPE eLeaveType );
virtual unsigned char _tryStartNewBattle();
virtual unsigned short _createNewBattle( _BATTLE_GRADE eGrade, unsigned char nNewInstanceNo );
AR_TIME _getWaitStartTime( _BATTLE_GRADE eGrade ) const;
std::vector< PlayerWaitInfo >* _getWaitQueue( _BATTLE_GRADE eGrade );
const std::vector< PlayerWaitInfo >* _getWaitQueue( _BATTLE_GRADE eGrade ) const;
// } csArena를 걸고 호출해야 하는 함수들
private:
_BATTLE_GRADE GetPlayableLongestWaitingGrade() const;
private:
// 대기열은 자료구조상 std::deque이 가장 적절하지만 방이 생성되어 앞에서부터 대기열에 있던 n명의 유저가 빠져나갈 때
// n명 뒤로 대기열에 남아야 할 유저가 많이 있을 경우가 거의 없다고 예상되며,
// 대기열의 순회에 있어서는 vector가 훨씬 유리하기 때문에 std::deque 대신 std::vector를 사용함.
std::vector< PlayerWaitInfo > m_vWaitQueue[ MAX_BATTLE_GRADE ];
};