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>
214 lines
4.7 KiB
C++
214 lines
4.7 KiB
C++
// NPCList.h: interface for the CNPCList class.
|
|
//
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
#if !defined(AFX_NPCLIST_H__E20011A2_96E4_44B4_AB08_826651FF4122__INCLUDED_)
|
|
#define AFX_NPCLIST_H__E20011A2_96E4_44B4_AB08_826651FF4122__INCLUDED_
|
|
|
|
#if _MSC_VER > 1000
|
|
#pragma once
|
|
#endif // _MSC_VER > 1000
|
|
|
|
#include <windows.h>
|
|
#include <vector>
|
|
|
|
#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 EVENT_DISAPPEAR 0
|
|
#define EVENT_GET 1
|
|
#define EVENT_SPAWN 2
|
|
#define EVENT_MONSTERDROP 3
|
|
#define EVENT_DROP 4
|
|
#define EVENT_AWARD 5
|
|
#define EVENT_MSGBOX 6
|
|
#define EVENT_PHASE 7
|
|
|
|
using namespace std;
|
|
|
|
typedef struct ITEMNode
|
|
{
|
|
unsigned short m_wKindItem;
|
|
unsigned short m_wSkill;
|
|
unsigned short m_wSkillLevel;
|
|
unsigned short m_wTabPage;
|
|
unsigned long m_dwIndexPosition;
|
|
} ITEMNode, *LPITEMNode;
|
|
|
|
typedef struct DialogNode
|
|
{
|
|
unsigned short m_wKindWord;
|
|
unsigned short m_wDialogFlag;
|
|
unsigned long m_dwFlag;
|
|
char *m_strWord;
|
|
} DialogNode, *LPDialogNode;
|
|
|
|
typedef struct WarpNode
|
|
{
|
|
unsigned short m_wNumber;
|
|
unsigned short m_wZoneNumber;
|
|
float m_fPosX;
|
|
float m_fPosY;
|
|
float m_fPosZ;
|
|
} WarpNode, *LPWarpNode;
|
|
|
|
typedef struct EventNode
|
|
{
|
|
unsigned long m_dwEventKind;
|
|
unsigned long m_dwEventNumber;
|
|
unsigned long m_dwEventAmount;
|
|
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;
|
|
float m_fPosX;
|
|
float m_fPosY;
|
|
float m_fPosZ;
|
|
float m_fDistance;
|
|
vector<LPEventNode> m_lstEvent;
|
|
} TriggerNode, *LPTriggerNode;
|
|
|
|
typedef struct PhaseNode
|
|
{
|
|
unsigned long m_dwPhaseNumber;
|
|
char *m_strPhaseDesc;
|
|
vector<LPTriggerNode> m_lstTrigger;
|
|
} PhaseNode, *LPPhaseNode;
|
|
|
|
typedef struct QuestNode
|
|
{
|
|
unsigned short m_wQuestID;
|
|
unsigned short m_wMaxPhase;
|
|
unsigned short m_wMinLevel;
|
|
unsigned short m_wMaxLevel;
|
|
unsigned long m_dwClass;
|
|
unsigned long m_dwCompletedQuest;
|
|
char *m_strQuestTitle;
|
|
vector<LPPhaseNode> m_lstPhase;
|
|
} QuestNode, *LPQuestNode;
|
|
|
|
typedef struct NPCNode
|
|
{
|
|
unsigned long m_dwUID;
|
|
unsigned long m_dwJob;
|
|
float m_fDirection;
|
|
float m_fPosX, m_fPosY, m_fPosZ;
|
|
char *m_strNpcSkin;
|
|
char *m_strNpcName;
|
|
|
|
vector<LPITEMNode> m_lstItem;
|
|
vector<LPDialogNode> m_lstScript;
|
|
vector<LPWarpNode> m_lstWarpZone;
|
|
vector<LPQuestNode> m_lstQuest;
|
|
|
|
LPITEMNode GetITEMNode(unsigned short wKindItem)
|
|
{
|
|
vector<LPITEMNode>::iterator it;
|
|
for(it = m_lstItem.begin(); it != m_lstItem.end(); it++)
|
|
{
|
|
if((*it)->m_wKindItem == wKindItem) return (*it);
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
LPDialogNode GetScript(unsigned short wPage)
|
|
{
|
|
vector<LPDialogNode>::iterator it;
|
|
for(it = m_lstScript.begin(); it != m_lstScript.end(); it++)
|
|
{
|
|
if((*it)->m_wKindWord == wPage) return (*it);
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
LPWarpNode GetWarpNode(unsigned short wNumber)
|
|
{
|
|
vector<LPWarpNode>::iterator it;
|
|
for(it = m_lstWarpZone.begin(); it != m_lstWarpZone.end(); it++)
|
|
{
|
|
if((*it)->m_wNumber == wNumber) return (*it);
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
LPQuestNode GetQuestforID(unsigned short wQuestID)
|
|
{
|
|
vector<LPQuestNode>::iterator it;
|
|
for(it = m_lstQuest.begin(); it != m_lstQuest.end(); it++)
|
|
{
|
|
if((*it)->m_wQuestID == wQuestID) return (*it);
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
LPQuestNode GetQuestforNumber(unsigned short wNumber)
|
|
{
|
|
if(m_lstQuest.size() > wNumber)
|
|
{
|
|
return m_lstQuest[wNumber];
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
const char *GetGreeting(void)
|
|
{
|
|
vector<LPDialogNode>::iterator it;
|
|
for(it = m_lstScript.begin(); it != m_lstScript.end(); it++)
|
|
{
|
|
if((*it)->m_wKindWord == 0) return (*it)->m_strWord;
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
void SearchQuestList(unsigned long m_dwLevel, unsigned long m_dwClass, unsigned short *m_lstCompleted, unsigned short m_wNumCompleted, unsigned short *m_lstQuestList);
|
|
|
|
} NPCNode, *LPNPCNode;
|
|
|
|
class CNPCList
|
|
{
|
|
protected:
|
|
vector<LPNPCNode> m_lstNpcNode;
|
|
unsigned long m_dwZone;
|
|
|
|
public:
|
|
LPQuestNode m_lpQuestNode;
|
|
LPPhaseNode m_lpPhaseNode;
|
|
LPTriggerNode m_lpTriggerNode;
|
|
|
|
const char *GetGreeting(unsigned long dwUID);
|
|
void DestroyNPCList(void);
|
|
LPITEMNode GetITEMNode(unsigned short wKindItem);
|
|
LPNPCNode GetNPCNode(unsigned long dwUID);
|
|
LPNPCNode GetNPCNodeByOrder(unsigned long dwOrder) { return m_lstNpcNode[dwOrder]; }
|
|
void AddNpc(LPNPCNode lpNewNode);
|
|
BOOL IsExistNpc(unsigned long dwUID);
|
|
CNPCList();
|
|
~CNPCList();
|
|
|
|
BOOL Load(const char *strScriptFile, const char *strQuestFile, unsigned long dwZone = 1);
|
|
void Create(void);
|
|
unsigned long GetNpcNum(void) { return m_lstNpcNode.size(); }
|
|
unsigned long GetZone(void) { return m_dwZone; }
|
|
};
|
|
|
|
extern CNPCList g_NPCList;
|
|
|
|
#endif // !defined(AFX_NPCLIST_H__E20011A2_96E4_44B4_AB08_826651FF4122__INCLUDED_)
|