Files
Client/Server/AdminTool/AdminToolLibrary/ToolQuestList.h
LGram16 dd97ddec92 Restructure repository to include all source folders
Move git root from Client/ to src/ to track all source code:
- Client: Game client source (moved to Client/Client/)
- Server: Game server source
- GameTools: Development tools
- CryptoSource: Encryption utilities
- database: Database scripts
- Script: Game scripts
- rylCoder_16.02.2008_src: Legacy coder tools
- GMFont, Game: Additional resources

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-29 20:17:20 +09:00

221 lines
5.8 KiB
C++

#ifndef __TOOL_QUEST_LIST_H__
#define __TOOL_QUEST_LIST_H__
#include <windows.h>
#include <vector>
#include <map>
#define TRIGGER_START 0
#define TRIGGER_PUTON 1
#define TRIGGER_GETON 2
#define TRIGGER_TALK 3
#define TRIGGER_KILL 4
#define TRIGGER_PICK 5
#define TRIGGER_FAME 6
#define TRIGGER_LEVEL_TALK 7
#define TRIGGER_FAME_TALK 8
#define TRIGGER_ABILITY_TALK 9
#define EVENT_DISAPPEAR 0
#define EVENT_GET 1
#define EVENT_SPAWN 2
#define EVENT_MONSTERDROP 3
#define EVENT_END 4
#define EVENT_AWARD 5
#define EVENT_MSGBOX 6
#define EVENT_PHASE 7
#define EVENT_ADDQUEST 8
#define EVENT_AWARDITEM 9
#define EVENT_AWARDITEMID 10 // 이벤트 : 장비 보상
#define EVENT_AWARDITEMCLASS 11 // 이벤트 : 장비 보상
#define EVENT_MOVE 12 // 이벤트 : 존 이동
#define EVENT_THEATERMODE 13 // 이벤트 : 씨어터 모드
#define EVENT_ALARMBOX 14 // 이벤트 : 알람 메세지 박스 출력
#define NPC_QUEST 0 // NPC 가 주는 퀘스트
#define ITEM_QUEST 1 // 아이템 사용을 통한 퀘스트
#define AREA_QUEST 2 // 위치 트리거 퀘스트
#define PARTY_QUEST_BIT 0xF000 // 파티 퀘스트 비트
using namespace std;
typedef struct EventNode
{
unsigned long m_dwEventKind;
unsigned long m_dwEventNumber;
unsigned long m_dwEventAmount;
unsigned long m_dwEventAmount2;
unsigned long m_dwEventAmount3;
float m_fPosX;
float m_fPosY;
float m_fPosZ;
char *m_strWord;
} EventNode, *LPEventNode;
typedef struct TriggerNode
{
unsigned long m_dwTriggerKind;
unsigned long m_dwTriggerID;
unsigned long m_dwZoneID;
unsigned long m_dwMaxCount;
unsigned long m_dwLevel;
float m_fPosX;
float m_fPosY;
float m_fPosZ;
float m_fDistance;
std::string m_strElseMsg; // LevelTalk 에서 Level이 맞지 않을때 출력될 메세지
vector<LPEventNode> m_lstEvent;
vector<LPEventNode> m_lstFalseEvent;
vector<char *> m_lstMsgBox;
vector<char *> m_lstFalseMsgBox;
} TriggerNode, *LPTriggerNode;
typedef struct TargetPos
{
int m_iType;
unsigned long m_dwPosX;
unsigned long m_dwPosY;
} TargetPos;
typedef struct PhaseNode
{
unsigned long m_dwZoneID;
unsigned long m_dwPhaseNumber;
char *m_strPhaseDesc;
vector<LPTriggerNode> m_lstTrigger;
vector<TargetPos> m_lstTargetPos;
LPTriggerNode GetTrigger(unsigned long dwTriggerKind, unsigned long dwStartPos, unsigned long *dwTriggerPos)
{
vector<LPTriggerNode>::iterator it;
*dwTriggerPos = 0;
dwStartPos++;
for(it = m_lstTrigger.begin(); it != m_lstTrigger.end(); it++, *dwTriggerPos++)
{
if(dwStartPos <= *dwTriggerPos)
{
if((*it)->m_dwTriggerKind == dwTriggerKind) return (*it);
}
}
return NULL;
}
} PhaseNode, *LPPhaseNode;
typedef struct QuestNode
{
enum eCheckResult
{
RES_SUCCESS = 0, // 성공
RES_MISMATCH_CLASS = 1, // 클래스가 맞지 않음
RES_ALREADY_TAKEN = 2, // 이미 받은 퀘스트
RES_NOT_COMPLETE_PRIOR_QUEST = 3, // 선결 퀘스트를 완료하지 않았음
RES_HIGH_THAN_MAX_LEVEL = 4, // 수행할 수 있는 최고 레벨보다 높다.
RES_10_LOW_THAN_MIN_LEVEL = 5, // 수행할 수 있는 최저 레벨보다 10 레벨 낮다.
RES_LOW_LEVEL = 6, // 수행할 수 있는 레벨보다 조금 낮다.
RES_MISMATCH_NATION = 7, // 수행할 수 없는 국적입니다.
RES_LOW_FAME = 8, // 수행할 수 있는 명성보다 조금 낮다.
RES_HIGH_THAN_MAX_FAME = 9, // 수행할 수 있는 최고 명성 보다 높다.
};
enum eCheckNation
{
NATION_ALL = 0, // 모든 국가( 카르테란트 + 메르카디아 + 신의해적단 )
NATION_KARTERANT = 1, // 카르테란트
NATION_MERKADIA = 2, // 메르카디아
NATION_ALMIGHTY_PIRATE = 3, // 신의해적단
// 사용 예
// 12 : 카르테란트 + 메르카디아
// 13 : 카르테란트 + 신의해적단
// 23 : 메르카디아 + 신의해적단
// 123 : 카르테란트 + 메르카디아 + 신의해적단 = 0 (모든 국가)
};
unsigned short m_wQuestID;
unsigned short m_wQuestType;
unsigned short m_wMaxPhase;
unsigned short m_wMinLevel;
unsigned short m_wMaxLevel;
unsigned long m_dwMinFame;
unsigned long m_dwMaxFame;
unsigned long m_dwClass;
unsigned short m_usNation; // 퀘스트 수행 가능 국가
BOOL m_bNationDependent; // 퀘스트가 국가 종속성이라서 국적이 바뀌면 지워지는가?
unsigned short m_usBonusSkillPoint; // 퀘스트 수행 후 받는 보너스 스킬 포인트
unsigned short m_usBonusAbilityPoint; // 퀘스트 수행 후 받는 보너스 스킬 포인트
unsigned long m_dwCompletedQuest;
char *m_strQuestTitle;
char *m_strQuestDesc;
char *m_strQuestShortDesc;
char *m_strQuestLevel;
char *m_strQuestAward;
char m_strIconTexture[32];
unsigned short m_wPosX1, m_wPosY1;
unsigned short m_wPosX2, m_wPosY2;
BOOL m_bSave;
BOOL m_bInvisible; // pop up 메뉴에서 안보이는지 여부
float m_fPosX; // 위치 퀘스트의 영역 중심 위치
float m_fPosY;
float m_fPosZ;
float m_fDistance; // 중심 위치에서의 거리
unsigned long m_dwZoneID; // 위치 퀘스트를 받는 존
vector<LPPhaseNode> m_lstPhase;
LPPhaseNode GetPhase(unsigned long dwPhase)
{
vector<LPPhaseNode>::iterator it;
for(it = m_lstPhase.begin(); it != m_lstPhase.end(); it++)
{
if((*it)->m_dwPhaseNumber == dwPhase) return (*it);
}
return NULL;
}
unsigned short GetQuestType() { return (m_wQuestType & ~PARTY_QUEST_BIT); }
bool IsPartyQuest() { return (0 != (m_wQuestType & PARTY_QUEST_BIT)); }
unsigned long CheckQuest(unsigned long dwLevel, unsigned long dwFame, unsigned long dwClass, unsigned long dwNation, unsigned short *lstCompleted, unsigned short wNumCompleted, unsigned short *lstQuestList);
} QuestNode, *LPQuestNode;
typedef struct QuestInstanceNode
{
unsigned short m_wQuestID;
LPQuestNode m_lpQuest;
} QuestInstanceNode, *LPQuestInstanceNode;
class CQuestList
{
public:
LPQuestNode m_lpQuestNode;
LPPhaseNode m_lpPhaseNode;
LPTriggerNode m_lpTriggerNode;
vector<LPQuestNode> m_lstQuestNode;
CQuestList();
~CQuestList();
BOOL Load(const char *strQuestScriptFile);
LPQuestNode GetQuest(unsigned short wQuestID);
protected:
void DestroyQuestList();
};
extern CQuestList g_QuestList;
#endif // __TOOL_QUEST_LIST_H__