Files
Sun1602/Server/GameServer/World/SSQ/GameSSQControlManagerImpl.hxx
2022-10-26 12:25:11 +08:00

148 lines
4.9 KiB
C++

#pragma once
#include "./SSQHandlerInGame.h"
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// <SSQControlFlag>
struct sPOLICY_SSQ : public util::BitSetOperation<32>
{
typedef util::BIT_OFFSET< 0 > FLAG_BATTLE_SERVER;
typedef util::BIT_OFFSET< 1 > FLAG_FIELD_SERVER;
static const DWORD FLAG_MAX_SIZE = 32;
static const DWORD FLAG_DISABLE_ALL = 0;
typedef util::BIT_MASK<
FLAG_BATTLE_SERVER
> FGROUP_BATTLE_SERVER_FUNCTION;
typedef util::BIT_MASK<
FLAG_FIELD_SERVER
> FGROUP_FIELD_SERVER_FUNCTION;
//enum eFLAG {
// PSC_DISABLE_ALL = 0,
// PSC_BATTLE_SERVER ,
// PSC_FIELD_SERVER ,
// PSC_MAX_SIZE = 32,
//};
//enum eGROUP {
// PSG_BATTLE_SERVER_FUNCTION =
// ( (1<<PSC_BATTLE_SERVER)
// ),
// PSG_FIELD_SERVER_FUNCTION =
// ( (1<<PSC_FIELD_SERVER)
// ),
//};
//─────────────────────────────────────────
// <METHODs>
sPOLICY_SSQ() {}
inline VOID RegisterBattleServerFunction()
{
DWORD flags = FGROUP_BATTLE_SERVER_FUNCTION::value;
Serialize( this->SAVE, flags, 0 );
}
inline VOID RegisterFieldServerFunction()
{
DWORD flags = FGROUP_FIELD_SERVER_FUNCTION::value;
Serialize( this->SAVE, flags, 0 );
}
inline BOOL IsCheckedBattleServer() { return (*this)[FLAG_BATTLE_SERVER::value]; }
inline BOOL IsCheckedFieldServer() { return (*this)[FLAG_FIELD_SERVER::value]; }
};
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// <GameSSQControlManagerImpl>
//
struct GameSSQControlManagerImpl
{
friend class GameWarControlManager;
friend class GameSSQUpdateCtrl;
friend struct OpSSQInfoController;
private: ITimerBase ScheduleUpdateTimer;
SSQ_UPDATERS UpdateList;
private: sPOLICY_SSQ Control;
public: GameSSQControlManagerImpl();
~GameSSQControlManagerImpl();
private: SSQ_UPDATERS_IT _FindCodeOfSSQ( const SSQCODE CodeOfSSQ );
SSQ_UPDATERS_IT _FindZoneKeyofSSQ( const KEYTYPE KeyOfSSQ );
VOID _RegisterUpdateCtrl( const SSQCODE CodeOfSSQ, GameSSQUpdateCtrl* const pCtrl );
VOID _ReleaseUpdateCtrl();
VOID _InitializeUpdateCtrl();
VOID _ChangeUpdater( const SSQ_UPDATER_NODE& rNode );
VOID _OnDead( GameSSQUpdateCtrl* const pUpdateCtrl, Character* const pTarget, Character* const pKiller );
BOOLEAN _OnEnterEvent( GameSSQUpdateCtrl* const pUpdateCtrl, Character* const pCharacter );
BOOLEAN _OnLeaveEvent( GameSSQUpdateCtrl* const pUpdateCtrl, Character* const pCharacter );
BOOLEAN GM_Command_Process( const GameSSQCtrlCmd::GMCmd& rInfo, Player* const pGmPlayer );
public: BOOLEAN ProcessGamble(
GameSSQUpdateCtrl* const pUpdateCtrl
, GameField* const pGameField
, const DWORD prize_winner
, MSGSUB_SSQ_S2S_GAMBLE_RESULT& msg
);
// <description>
// - 정산 처리
// <returns>
// - total point
public: DWORD SettleAccounts(
GameSSQUpdateCtrl* const pUpdateCtrl
, Player* const pPlayer
, const SSQHandlerInGame::eOrder order = SSQHandlerInGame::eOrder_None // 순위가 결정되었을 때 사용할 것.
);
VOID UpdateToRankingAndExtra(
GameSSQUpdateCtrl* const pUpdateCtrl
, Player* const pPlayer
);
BOOLEAN RewardForWinner(
GameSSQUpdateCtrl* const pUpdateCtrl
, Player* const pPlayer
, const SSQHandlerInGame::eOrder order // 1,2,3등
);
BOOLEAN RewardInBattle(
GameSSQUpdateCtrl* const pUpdateCtrl
, Player* const pPlayer
);
#ifdef _NA000000_100427_SSQ_DEFAULT_REWARD_
// (NOTE) default reward process for all joined players
BOOLEAN RewardDefault(GameSSQUpdateCtrl* const update_ctrl,
Player* const player);
#endif
//─────────────────────────────────────────
// <>
private:
enum eRewardSelect {
eReward_Default = 0x01, // NOTE: f110602.3L, f100427.x, added
eReward_InBattle = 0x02,
eReward_ForWinner = 0x04,
};
private: BOOLEAN _RewardProcess(
const eRewardSelect reward_selector
, GameSSQUpdateCtrl* const pUpdateCtrl
, Player* const pPlayer
, const SSQInfo::REWARD_NODE& rRewardNode
, const SSQHandlerInGame::eOrder order
);
private: //─────────────────────────────────────────
// <PACKET HANDLERs>
#define SSQ_PACKET_HANDLER_AG_DECL( c, p ) \
VOID GameSSQControlManagerImpl::OnRecv_##p ( const MSG_##p* pRecvMsg, const WORD wSize, ServerSession* const pSession )
private: SSQ_PACKET_HANDLER_AG_DECL( AG_ZONE, AG_ZONE_SSQ_JOIN_INFO_SYN );
SSQ_PACKET_HANDLER_AG_DECL( AG_ZONE, AG_ZONE_SSQ_JOIN_SYN );
SSQ_PACKET_HANDLER_AG_DECL( AG_ZONE, AG_ZONE_SSQ_ROOM_CTRL_CMD );
WAVERIX_TEST_BLOCK_IN_CLASS(GameSSQControlManagerImpl);
};