Files
Sun1602/Client/GameClient/Interface/uiQuestMan/uiQuestMan.h
T
2022-10-26 12:25:11 +08:00

416 lines
13 KiB
Objective-C

#ifndef _UI_QUEST_MAN
#define _UI_QUEST_MAN
//------------------------------------------------------------------------------
/**
@class uiQuestMan
@todo
- 모든 정보는 메니저에 등록하자
- 각각의 다이얼로그 창에서는 정보 표시나 제어에 도움을 주기만 해야한다.
@remark
- 수락 방법.
1. 자동 수락 퀘스트
1.1 생성시 기본으로 수락 되어 있는 퀘스트.
1.2 레벨업에 따른 자동 수락.
2. NPC Code 를 통한 퀘스트 수락
3. 퀘스트 아이템 사용에 의한 수락
4. 수락 NPC 가 없고(NPCID = 0) 자동 수락 퀘스트가 아닌 퀘스트가 수락 가능할때 수락 요청.
(C) 2006 y2jinc
*/
#include "uiBase_def.h"
#include "uiQuestMan_def.h"
#include "QuestDefine.h"
#include "QuestManager_Concrete.h"
class SolarDialog;
class uiQuestCommonForward;
class uiQuestReward;
class uiQuestListDlg;
#ifdef _NA_004644_20110506_QUEST_NAVIGATION
class uiQuestList;
#endif//_NA_004644_20110506_QUEST_NAVIGATION
class uiTimeQuest;
class uiQuestListMission;
class uiQuestTimeInfo;
class uiQuestAutoAcceptAlram;
class QUEST_CONDITION_ITEM;
class QUEST_CONDITION_KILLMONSTER;
class QUEST_CONDITION_QUEST;
class NPC;
enum eQUEST_GAIN_STATE
{
QUEST_NONE = 0,
QUEST_ACCEPT, // 수락
QUEST_PROGRESS, // 진행(수락 받아서 진행중)
QUEST_REWARD, // 완료(보상가능)
QUEST_INPERFECT_REWARD, // 미완료(보상불가)
QUEST_AUTO_ACCEPT, // 자동수락
QUEST_ACCEPT_NONE_DISPLAY, // 수락 가능 상태이지만 상태 표시하지 않는다.
QUEST_CANT_ACCEPT_LV, // 레벨때문에 수락이 안되는 상황(다른 Accept Condition은 전부 TRUE지만 LV만 FALSE인 상황)
QUEST_CANT_ACCEPT_DAILYQUEST, // 완료된 일일퀘스트(상태초기화 시점까지 받을 수 없음)
QUEST_GAIN_MAX
};
enum eQUEST_CATEGORY
{
QUEST_CATEGORY_MISSION = 0,
QUEST_CATEGORY_QUEST,
QUEST_CATEGORY_SIZE,
};
enum eQUEST_LIST_TYPE
{
QUEST_LIST_MISSION = 0,
QUEST_LIST_CONTENT,
};
enum eQUEST_WINDOW_TYPE
{
QUEST_WINDOW_PLAYER = 0,
QUEST_WINDOW_NPC,
};
enum
{
// 미리보기 우선순위 : 퀘스트타입에 따라 퀘스트완료, 몬스터처치, 아이템수집, 지역탐색 순서
ORDER_CONDITION_DEFAULT = 0,
ORDER_CONDITION_AREA = 1,
ORDER_CONDITION_ITEM = 2,
ORDER_CONDITION_MONSTER = 3,
ORDER_CONDITION_QUEST = 4,
};
struct KILL_MON_QUEST_INFO_4_NAVI
{
DWORD dwQuestCode;
DWORD dwMonCode[QUEST_CONDITION_KILLMONSTER_INFO::_MAX_CHECK_NUM];
POINT ptMonPos[QUEST_CONDITION_KILLMONSTER_INFO::_MAX_CHECK_NUM];
KILL_MON_QUEST_INFO_4_NAVI()
{
dwQuestCode = 0;
for(int i = 0; i < QUEST_CONDITION_KILLMONSTER_INFO::_MAX_CHECK_NUM; ++i)
{
dwMonCode[i] = 0;
ptMonPos[i].x = 0;
ptMonPos[i].y = 0;
}
}
};
#include "uiBaseMan.h"
class uiQuestMan : public uiBaseMan
{
public:
uiQuestMan(InterfaceManager * pUIMan);
//--------------------------------------------------------------------------
// init/release
//
public:
virtual void OnInitialize();
virtual void OnRelease();
virtual void Process(DWORD dwTick);
virtual void InitPKBooleans();
virtual void PreRenderInterface( DWORD dwTick );
private:
BOOL _LoadUI();
//--------------------------------------------------------------------------
// functions
//
public:
// open
SolarDialog * OpenForwardWindow(MAPID MapID, FIELDID FieldID, CODETYPE NpcCode, DWORD dwNPCKey = 0);
SolarDialog * OpenRewardWindow( QuestInfo * pQuestInfo, eQUEST_GAIN_STATE eGainState );
SolarDialog * OpenRewardWindowForAutoAlram( Quest * pQuest );
BOOL IsOpenQuestList();
BOOL IsOpenQuestNPC();
void CloseQuestList();
void CloseQuestNPC();
void OpenQuestList();
void OpenForceQuestList();
void OpenForceMissionList();
void UpdateQuestAlram(BOOL bFlag );
// update
void UpdateQuestInfo();
void UpdateMissionInfo();
void UpdateQuestTime();
void SetNaviQuest(Quest* pQ);
void EventItem();
// pending info
// 자동 수락 요청 / 완료 보상 시에만 사용.
void SetNPCCode(CODETYPE NPCCode) { m_OpenNPCCode = NPCCode; }
void InitPendingNPCKey() { m_dwPendingOpenNPCKey = 0; }
DWORD GetPendingNPCKey() const { return m_dwPendingOpenNPCKey; }
CODETYPE GetNPCCode() const { return this->m_OpenNPCCode; }
MAPID GetMapID() const { return this->m_MapID; }
FIELDID GetFieldID() const { return this->m_FieldID; }
void SetPendingAbandonQuestCode(QCODE QuestCode)
{ m_PendingQuestCode[ePKBOOL_QUEST_ABANDON] = QuestCode; }
QCODE GetPendingAbandonQuestCode() const
{ return m_PendingQuestCode[ePKBOOL_QUEST_ABANDON]; }
// window pos
void SetPlayerWindowPos(const POINT& pt);
const POINT& GetPlayerWindowPos() const ;
void SetNPCWindowPos(const POINT& pt);
const POINT& GetNPCWindowPos() const;
BOOL IsPlayerWindowPosActivated() const;
BOOL IsNPCWindowPosActivated() const;
void DeactivatedPlayerWindowPos();
void DeactivatedNPCWindowPos();
eQUEST_GAIN_STATE GetQuestGainState( QCODE QuestCode, CODETYPE NPCCode, NPC * pNPC = NULL );
void RefreshNPCState();
// Quest List
const QUEST_LIST & GetCompleteList() const { return m_CompleteQuestList; }
const QUEST_LIST & GetInperfectCompleteList() const { return m_InperfectCompleteQuestList; }
const QUEST_LIST & GetProgressList() const { return m_ProgressQuestList; }
const QUEST_LIST & GetCanAcceptList() const { return m_CanAcceptQuestList; }
#ifdef _NA_003027_20111013_HONOR_SYSTEM
const QUEST_LIST& GetCompleteDailyQuestList() const { return m_CompleteDailyQuestList; }
#endif //_NA_003027_20111013_HONOR_SYSTEM
//--------------------------------------------------------------------------
// net
void NET_SEND_CG_QUEST_ACCEPT_SYN(QCODE QuestCode, BOOL IsItemAccept = 0, POSTYPE Atpos = 0);
void NET_SEND_CG_QUEST_COMPLETE_SYN(QCODE QuestCode);
void NET_SEND_CG_QUEST_REWARD_SYN(QCODE QuestCode, BYTE bSelectedItem );
void NET_SEND_CG_QUEST_FAILED_SYN(QCODE QuestCode);
void NET_SEND_CG_QUEST_ABANDON_SYN(QCODE QuestCode,BOOL bForce=FALSE);
void NET_SEND_CG_QUEST_EVENT_AREA_SYN(QCODE QuestCode, DWORD AreaID);
void SEND_CG_COLLECT_ALLCOLLECTIVE_SYN();
#ifdef _NA_003027_20111013_HONOR_SYSTEM
void RECV_QUEST_DAILYQUEST_PACKET(MSG_BASE* recv_packet);
void RECV_QUEST_DAILYQUEST_INFO_PACKET(MSG_CG_QUEST_DAILYQUEST_PACKET* recv_packet);
#endif //_NA_003027_20111013_HONOR_SYSTEM
protected:
BOOL getQuestListsMeetNPC();
void clearQuestList();
public:
BOOL AddQuestForProgress( QCODE QuestCode );
void DelQuestForProgress( QCODE QuestCode );
void ClearQuestInfos();
void SetQuestViewProgressRect();
void clearViewQuestForProgressContents();
void clearViewQuestForProgress();
void updateViewQuestForProgress();
protected:
sQuestPreview * allocQuestPreview();
void freeQuestPreview( sQuestPreview * pInfo );
BOOL isExistQuestForProgress( QCODE QuestCode );
void renderViewQuestForProgress( DWORD dwTick );
void insertQuestNameForProgContents( Quest * pQuest);
void QuestCompletCheck();
void RefreshConditionItemForProgContents(QCODE quest_code);
void insertConditionItemForProgContents(QUEST_CONDITION_ITEM * pConditionItem);
void insertConditionMonForProgContents(QUEST_CONDITION_KILLMONSTER * pConditionKillMon);
void insertConditionQuestForProgContents(QUEST_CONDITION_QUEST * pConditionQuest);
void insertConditionAreaQuestForProgContents(QUEST_CONDITION_AREA* pConditionArea, QuestInfo * pQuestInfo);
#ifdef _NA_006607_20130402_ADD_QUESTTYPE
void insertConditionMissionClearForProgContents(QUEST_CONDITION_MISSION_CLEAR* pConditionMission, QuestInfo * pQuestInfo);
#endif // _NA_006607_20130402_ADD_QUESTTYPE
public:
eQUEST_GAIN_STATE GetStateInQuestListForForward(QCODE QuestCode);
#ifdef _NA_000000_20120416_COLLECT_OBTAIN_QUESTCODE
bool ConditionItemCompleteCheck(QCODE quest_code, SLOTCODE item_code); // 특정 아이템이 아이템 수집 조건을 완료하였는지
#endif //_NA_000000_20120416_COLLECT_OBTAIN_QUESTCODE
public:
// Auto Aceept Quest
void addAcceptAutoQuest(Quest * pQuest);
void ClearAcceptAuto();
Quest * GetAcceptAutoQuest();
WORD GetAcceptAutoQuestCount();
void RefreshFTextRender();
//--------------------------------------------------------------------------
// procedure
//
public:
virtual void NetworkProc( MSG_BASE * pMsg );
//--------------------------------------------------------------------------
// member vars
//
void ShowTimeQuest(BOOL bFlag);
void updateTimeQuest();
void renderQuestTime();
void QuestMessage(int iStringCode);
void ClearPendingQuestCompletePacket();
bool SetPendingQuestCompletePacket(QCODE qcode);
bool IsPendingQuestCompletePacket(QCODE qcode);
void DelPendingQuestCompletePacket(QCODE qcode);
void RemoveQuestItem(QCODE QuestCode);
void AddQuestItem(QUEST_CONDITION_ITEM* pConditionItem);
bool FindQuestItem(CODETYPE ItemCode);
void DeleteQuestItem(QUEST_CONDITION_ITEM* pConditionItem);
void UpdateQuestItem(QCODE QuestCode);
std::vector<sQuestPreview*> get_quest_prog_content_map(){ return m_QuestViewProgContentMap; }
private:
// UI
uiQuestCommonForward * m_pUIQuestCommonForward;
uiQuestReward * m_pUIQuestReward;
uiQuestListDlg * m_pUIQuestListDlg;
#ifdef _NA_004644_20110506_QUEST_NAVIGATION
uiQuestList* ui_quest_list_ptr_;
#endif//_NA_004644_20110506_QUEST_NAVIGATION
uiQuestListMission* m_puiQuestListMission;
uiQuestTimeInfo* m_pUITimeInfo;
uiQuestAutoAcceptAlram* m_pUIAutoAcceptAlram;
uiTimeQuest* m_pUITimeQuest;
std::vector<KILL_MON_QUEST_INFO_4_NAVI*> m_vecKillMonQuest4Navi;
void SetKillMonQuest4Navi(DWORD QCode, DWORD MonCode, POINT MonPos);
void RemoveKillMonQuest4Navi(DWORD quest_code);
public:
void ClearKillMonQuest4Navi();
int GetKillMonQuest4NaviCnt(){return m_vecKillMonQuest4Navi.size();}
KILL_MON_QUEST_INFO_4_NAVI* GetKillMonQuest4Navi(int idx)
{
if(static_cast<size_t>(idx) >= m_vecKillMonQuest4Navi.size())
{
assert(!"idx >= m_vecKillMonQuest4Navi.size()");
return NULL;
}
return m_vecKillMonQuest4Navi[idx];
}
private:
// pending variable
// npc quest window
DWORD m_dwPendingOpenNPCKey;
CODETYPE m_OpenNPCCode;
MAPID m_MapID;
FIELDID m_FieldID;
Quest * m_pPendingQuest;
__PROPERTY(BOOL, CheckTime);
TYPEDEF_MAP(QUEST_VIEW_PROGRESS, QCODE, Quest *);
enum { MAX_QUEST_PREVIEW_COUNT = 5 };
__PROPERTY(BOOL, QuestViewProgress);
QUEST_VIEW_PROGRESS_MAP m_QuestViewProgressMap;
std::vector<sQuestPreview *> m_QuestViewProgContentMap;
POINT m_PtQuestViewProgress; // 표시할 위치.(표시할 부분의 우측 위치)
// 표시할 위치에서의 오프셋 Size(우측에서 시작한다.)
// ( m_PtQuestViewProgress.x - m_QuestViewProgressSize.cx)
// ( m_PtQuestViewProgress.y + m_QuestViewProgressSize.cy)
SIZE m_QuestViewProgressSize;
util::CMemoryPoolFactory<sQuestPreview> * m_pQuestPreviewPool;
// player quest window
__PROPERTY(eQUEST_CATEGORY, QuestCategory);
__PROPERTY(eQUEST_LIST_TYPE, QuestListType);
__PROPERTY(int, CurSelectQuestIndex);
__PROPERTY(int, CurSelectMissionIndex);
__PROPERTY(int, CurSelectMissionSubIndex);
__PROPERTY(QCODE, CurSelectQuestCode);
__PROPERTY(BOOL, ForwardAutoAlram);
__PROPERTY(int, CurBeginDrawProgressList);
__PROPERTY(int, CurPosProgressListVscr);
// common
QCODE m_PendingQuestCode[ePKBOOL_QUEST_MAX];
CODETYPE m_PendingArea;
// auto accept
std::list<QCODE> m_PendingAutoQuestList;
uiQuestWindowPosition m_CurPlayerWindowPoint;
uiQuestWindowPosition m_CurNPCWindowPoint;
QUEST_LIST m_CompleteQuestList;
QUEST_LIST m_InperfectCompleteQuestList;
QUEST_LIST m_ProgressQuestList;
QUEST_LIST m_CanAcceptQuestList;
#ifdef _NA_003027_20111013_HONOR_SYSTEM
QUEST_LIST m_CompleteDailyQuestList;
#endif //_NA_003027_20111013_HONOR_SYSTEM
std::multiset<CODETYPE> m_Activated_Quest_Item;
TCHAR m_szMessage[INTERFACE_STRING_LENGTH];
TCHAR m_szResult[INTERFACE_STRING_LENGTH];
TCHAR m_szText[INTERFACE_STRING_LENGTH];
std::vector<QCODE> m_vecSendCompletPacket;
#ifdef _SCJ_120104_SORT_QUEST_VIEW_PROGRESS
typedef STLX_VECTOR<QuestCondition*> QUEST_CONDITION_VECTOR;
QUEST_CONDITION_VECTOR quest_condition_vector;
#endif //_SCJ_120104_SORT_QUEST_VIEW_PROGRESS
#ifdef _NA_008302_20150601_QUEST_COMPLET_SYN_RECAST
private:
void SetRefreshQuestCheckTimer() { refresh_quest_check_timer_->SetTimer(1000); }
util::Timer* refresh_quest_check_timer_;
bool refresh_quest_check_pending_; //완료 재요청 중복 방지(무한루프 대비)
#endif //_NA_008302_20150601_QUEST_COMPLET_SYN_RECAST
};
extern void RefreshNPCStateForQuest();
extern BOOL UpdateAutoAcceptRequest();
extern BOOL UpdateAutoRewardRequest();
#endif //_UI_QUEST_MAN