Files
Sun1602/Server/GameServer/MissionRewardManager.h
T
2022-10-26 12:25:11 +08:00

136 lines
4.4 KiB
C++

#pragma once
#include <Singleton.h>
#include "Protocol_CG.h"
#include "PacketStruct_CG.h"
#include <MissionRewardParser.h>
#include "RewardManager.h"
//
#define REWARD_MSG_CREATOR_SPECIFIC_TYPE_ALLOCATOR(name) \
name* GetHeaderPointer_##name() { \
DWORD idx = HEADINFO_LASTINDEX-(sizeof(name)-sizeof(INVENTORY_TOTAL_INFO)); \
return new (&m_HeadInfo[idx]) name; \
}
struct REWARD_MSG_CREATOR
{
enum { MAX_HEADINFO_SIZE=64, HEADINFO_LASTINDEX=MAX_HEADINFO_SIZE-1 };
BYTE m_HeadInfo[MAX_HEADINFO_SIZE];
INVENTORY_TOTAL_INFO m_Inventory;
REWARD_MSG_CREATOR_SPECIFIC_TYPE_ALLOCATOR(MSG_CG_TRIGGER_REWARD_ACK);
#define GetRewardMSG_HeaderPtr(name) GetHeaderPointer_##name
};
struct MissionRewardArgs
{
// 아래 필드들은 내부적으로 사용되는 참조정보들
__PROPERTY( Player*, Player );
__PROPERTY( MissionManager*, MissionManager );
// 다음은 GetMissionRewardInfoNClassCode() 이후 내부적으로 설정된다.
// 이 값을 사용해 다른 RewardXXX를 빠르게 사용할 수 있다.
__PROPERTY( MissionRewardInfo::sCLASS*, MissionRewardInfoClassCode );
__PROPERTY( WORD, MissionPoint );
// 아래 필드들은 클라로부터 입력된 정보들
__PROPERTY( BYTE, Num ); //< 보상스크립트의 번호
__PROPERTY( BYTE, Type ); //< 0 or 1
__PROPERTY( BYTE, SelectedItem ); //< 선택한 아이템들
};
class MissionRewardManager : public util::Singleton<MissionRewardManager>
{
public:
MissionRewardManager() {}
~MissionRewardManager() {}
VOID Init()
{
memset(&m_MissionRewardArgs, 0, sizeof(MissionRewardArgs));
//memset(&m_sExtraInfo, 0, sizeof(m_sExtraInfo));
//memset(rewardItemCode, 0, sizeof(rewardItemCode) );
//memset(rewardItemNum, 0, sizeof(rewardItemNum) );
//rewardItemDivine.ClearAll();
}
inline MissionRewardArgs& GetMissionRewardArgs() { return m_MissionRewardArgs; }
inline VOID SetMissionRewardArgs( MissionRewardArgs& IN rMRI ) { m_MissionRewardArgs = rMRI; }
// <REMARK>
// m_MissionRewardInfo 정보에 의거 계산된다.
// <Description>
// MissionManager::MissionPoint 값을 입력했을 때,
// 스크립트에 저장된 n 개의 정보 중 어떤 것을 제공해 줄지 그 인덱스를 얻을 수 있다.
//
// <범위> 060414 현재
// max(n)=3, n={0,1,2}
// <반환값>
// TRUE: 스크립트상 인덱스
// FALSE: MissionRewardInfo::MISSION_REWARD_MAX_SIZE
BYTE GetTypeOfMissionPoint( );
// <REMARK>
// m_MissionRewardInfo 정보에 의거 계산된다.
// <Arguments>
// bPreUpdate : BOOL (미리 증가치를 감안한 계산여부)
// 완료되는 시점의 처리상 MissionPoint를 업데이트 먼저 했는지 안했는지의 차이에 따라 처리가 달라질 수 있다.
// 예, 처음 미션을 완료했을 경우, 업데이트 이전에 완료 회수(MissionPoint)는 0이며, 1을 감안한 보상 코드를 찾아야 할 것이다.
// <반환값>
// TRUE: 스크립트상 보상코드
// FALSE: RC::RC_REWARD_FAILED;
WORD GetRewardCode( BOOL bPreUpdate );
// <REMARK>
// m_MissionRewardInfo 정보에 의거 계산된다.
// <반환값>
// 내부적으로 MissionRewardArgs의 필드값인
// MissionRewardInfo::sCLASS* Get(Set)MissionRewardInfoClassCode()
// 에 값을 할당해준다.
MissionRewardInfo* GetMissionRewardInfoNClassCode();
// <REMARK>
// m_MissionRewardInfo 정보에 의거 계산된다.
RC::eREWARD_RESULT RewardExp( EXPTYPE* OUT pExp );
// <REMARK>
// m_MissionRewardInfo 정보에 의거 계산된다.
RC::eREWARD_RESULT RewardExp( const MissionRewardInfo::sCLASS* IN pMRIclass, EXPTYPE* OUT pExp );
// <REMARK>
// m_MissionRewardInfo 정보에 의거 계산된다.
RC::eREWARD_RESULT RewardHime( MONEY* OUT pMoney );
// <REMARK>
// m_MissionRewardInfo 정보에 의거 계산된다.
RC::eREWARD_RESULT RewardHime( const MissionRewardInfo::sCLASS* IN pMRIclass, MONEY* OUT pMoney );
// <REMARK>
// m_MissionRewardInfo 정보에 의거 계산된다.
RC::eREWARD_RESULT RewardItem( INVENTORY_TOTAL_INFO& OUT rInvenInfo );
// <REMARK>
// m_MissionRewardInfo 정보에 의거 계산된다.
RC::eREWARD_RESULT RewardItem( const MissionRewardInfo::sCLASS* IN pMRIclass, INVENTORY_TOTAL_INFO& OUT rInvenInfo );
//_NA_008679_20160202_REWORK_BATTLEGROUND
BOOL RewardBattlegroundMember(Player* const player, const ZONEKEY& zone_key,
const MAPCODE& battleground_mapcode,
const eBATTLEGROUND_RESULT& result_type);
private:
private:
MissionRewardArgs m_MissionRewardArgs;
struct MRI_ExtraInfo
{
POSTYPE totalCount;
POSTYPE divineCount;
} m_sExtraInfo;
//
static SLOTCODE rewardItemCode[MAX_INVENTORY_SLOT_NUM];
static POSTYPE rewardItemNum[MAX_INVENTORY_SLOT_NUM];
};