⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dungeon.h

📁 国内著名网络游戏dragon的服务端完整源码 内附完整数据库结构
💻 H
📖 第 1 页 / 共 2 页
字号:
#ifndef __DUNGEON_H__
#define __DUNGEON_H__
//////////////////////////////////////////////////////////
// template <class T1> class TKeinList
//class CDungeonHistory		// 皋矫瘤 贸府甫 困秦 

// 阿 带傈 甘 辑滚俊辑 贸府
//class CDungeonObject		// 带傈俊 乐绰 坷宏璃飘 努贰胶
//class CDungeonMap			// 甘窜困( 2俺狼 摸捞 粮犁茄促. )
//class CDungeonMapMgr		// 2俺狼 摸阑 包府

// 包府辑滚
//class CDungeonBasic		// 带傈 ( 4俺狼 摸捞 粮犁茄促. )
//class CDungeonMgr			// 4俺狼 带傈阑 包府


////////////////////////////////////////////////////////////////////////

#define SEND_ALL		-100

// SCENARIO_ITEM_NUMBER
#define SIN_TRAP_KEY_3	10210	
#define SIN_TRAP_KEY_5	10211
#define SIN_TRAP_KEY_7	10212


#define SMT_CREATE_DRAGON		7
#define SMT_CREATE_BOSS			8
#define SMT_DRAGONROAD_MESSAGE1	10		// 盖贸澜 靛贰帮 肺靛甫 父车阑锭 
#define SMT_DRAGONROAD_MESSAGE2	11		// 葛滴 蛮己沁阑锭
#define SMT_DRAGONROAD_MESSAGE3	12		// 葛滴 馆措 沁阑锭
#define SMT_DRAGONROAD_MESSAGE4	13		// 搬捧 矫累
#define SMT_DRAGONROAD_MESSAGE5	14		// 搬捧啊 20盒捞 救瘤唱档 救场朝锭
#define SMT_DRAGONROAD_MESSAGE6	15		// 靛贰帮 肺靛狼 菩硅
#define SMT_LAYER_POTAL_MESSAGE	16		// 
#define SMT_START_LAYER			17		// 割锅 摸捞 劝己拳 灯促.
#define SMT_KILL_BOSS			18		// 焊胶 阁胶磐甫 磷看促.





// kein sub
//021030 YGI
template <class T1> class TKeinList
{
	T1	*m_pData;
	TKeinList<T1> *m_pPrev;
	TKeinList<T1> *m_pNext;
	TKeinList<T1> *m_pFind;
	
public :
	TKeinList() { Set(); }
	~TKeinList() { SAFE_DELETE(m_pData); SAFE_DELETE(GetNext()); }
	TKeinList<T1> *&GetNext(){ return m_pNext; }
	TKeinList<T1> *&GetPrev(){ return m_pPrev; }
	
	TKeinList<T1> *GetEndNode()
	{ 
		for( TKeinList<T1> *temp = this; temp->GetNext(); temp = temp->GetNext() );
		return temp;
	}
	void Set() { m_pData = 0; GetNext() = 0; GetPrev() = 0; }
	void clear()
	{
		SAFE_DELETE(m_pData);
		Set();
	}
	void SetFind()
	{
		m_pFind = this;
	}
	TKeinList<T1> *FindNext()
	{
		m_pFind = m_pFind->GetNext();
		return m_pFind;
	}
	T1 GetFind()
	{
		return *m_pFind->GetData();
	}
	bool AddNode( T1 data )
	{
		TKeinList<T1> *pEnd = GetEndNode();
		TKeinList<T1> *pAddData = new TKeinList<T1>;
		pAddData->m_pData = new T1;
		*pAddData->m_pData = data;
		pEnd->GetNext() = pAddData;
		pAddData->GetPrev() = pEnd;
		return true;
	}
	bool AddNode( T1 *pData )
	{
		TKeinList<T1> *pEnd = GetEndNode();
		TKeinList<T1> *pAddData = new TKeinList<T1>;
		pAddData->m_pData = pData;
		pEnd->GetNext() = pAddData;
		pAddData->GetPrev() = pEnd;
		return true;
	}
	bool DeleteNode( T1 data )
	{
		TKeinList<T1> *temp = this;
		while( temp=temp->FindNode(data) )
		{
			temp->GetPrev()->GetNext() = temp->GetNext();
			if( temp->GetNext() ) 
				temp->GetNext()->GetPrev() = temp->GetPrev();
			
			TKeinList<T1> *temp2;
			temp2 = temp->GetPrev();
			temp->GetNext() = 0;
			SAFE_DELETE(temp);
			temp = temp2;
		}
		return true;
	}
	TKeinList<T1> * FindNode( T1 data )
	{
		for( TKeinList<T1> *temp = GetNext(); temp; temp = temp->GetNext() ) 
		{
			if( *temp->m_pData == data )
			{
				return temp;
			}
		}
		return NULL;
	}
	bool DeleteFirst()
	{
		TKeinList<T1> *temp = GetNext();
		if( !temp ) return 0;
		TKeinList<T1> *next = temp->GetNext();
		GetNext() = next;
		
		if( next )
			next->GetPrev() = this;
		
		temp->GetNext() = 0;
		SAFE_DELETE(temp);
		return true;
	}
	bool DeleteEnd()
	{
		TKeinList<T1> *pEnd = GetEndNode();
		if( pEnd == this ) return 0;
		pEnd->GetPrev()->GetNext() = 0;
		SAFE_DELETE(pEnd);
		return 1;
	}
	int GetCount()
	{
		int count = 0;
		for( TKeinList<T1> *temp = this; temp->GetNext(); temp = temp->GetNext() ) count++;
		return count;
	}
	int AddNodeLimit( T1 *pData, int max, int delete_first = 1 )
	{
		AddNode( pData );
		if( GetCount() > max )
		{
			if( delete_first ) DeleteFirst();
		}
		return 1;
	}
	T1* GetData(int nIndex)
	{
		TKeinList<T1> *temp = GetNext();
		for( int i=0; i<nIndex; i++ )
		{
			if( !temp ) return NULL;
			temp = temp->GetNext();
		}
		return temp?temp->m_pData:NULL;
	}
	T1 *GetData()
	{
		return m_pData;
	}
};

///////////////////////////////////////////////////////////////////////////////

class CDungeonHistory
{
public :
	enum eDungeonHistoryType
	{
		NORMAL_TRAP_OPEN	= 1,		// 焊烹狼 飘乏
		NORMAL_TRAP_CLOSE	= 2,			
		MIDDLE_BOSS_OPEN	= 3,			// 吝埃 焊胶肺 啊绰 器呕
		MIDDLE_BOSS_CLOSE	= 4,			
		LAYER_POTAL_OPEN	= 5,			// 促澜 摸栏肺 啊绰 器呕
		LAYER_POTAL_CLOSE	= 6,			
		DUNGEON_POTAL_OPEN	= 7,			// 观栏肺 唱啊绰 器呕
		DUNGEON_POTAL_CLOSE	= 8,
		DUNGEON_OPEN		= 9,				// 矫唱府坷俊 狼秦辑 带傈捞 坷锹登绊 救登绊
		DUNGEON_CLOSE		= 10,
		DUNGEON_WHEN_OPEN_CLOSE_NOTICE = 11,//矫唱府坷啊 攫力 凯府绰瘤
	};
	
public :
	int m_nType;			// 傍瘤 鸥涝
	int m_nMonth;			// 矫埃
	int m_nDay;
	int m_nHour;
	int m_nMin;
	int m_nLayer;
	char m_szDungeon[20];
	char m_szName[20];
	
public :
	CDungeonHistory()
	{
		m_nType = 0;
		m_nMonth = 0;
		m_nDay = 0;
		m_nHour = 0;
		m_szDungeon[0] = 0;
		m_szName[0] = 0;
		m_nLayer = 0;
	}
	int SetData( int type, int layer, char *name, const char *mapname = NULL );
	CDungeonHistory & operator = ( const CDungeonHistory &data ) 
	{
		m_nType		= data.m_nType  ;
		m_nType		= data.m_nType	;	
		m_nMonth	= data.m_nMonth	;
		m_nDay		= data.m_nDay	;	
		m_nHour		= data.m_nHour	;
		m_nMin		= data.m_nMin ;
		strcpy( m_szDungeon, data.m_szDungeon );
		strcpy( m_szName, data.m_szName );
		return *this;
	}
};

//////////////////////////////////////////////////////////////
class CScenarioBoss
{
public :
	enum
	{
		NT_NONE = 0,
			NT_NORMAL_DRAGON = 1,
			NT_DRAGON_LOAD = 2,
			NT_DRAGON_HEART = 3,
			NT_NORMAL_BOSS = 4,
			NT_FOLLOWER = 5,		// 凉捍
	};
	enum
	{
		BT_NORMAL = 0,
			BT_LAYER_BOSS = 1,
			BT_DARAGON_HEART = 2,
			BT_DARAGON = 3,
	};
public :
	int m_nNpcType;
	int m_nSprNum;		// 胶橇扼捞飘 逞滚
	int m_nNpcIndex;	// NPCLIST 俊辑 荤侩窍绰 牢郸胶
	int m_nBossType;		// 弊 摸狼 焊胶衬?
	
public :
	CScenarioBoss()
	{
		Clear();
	}
	void Clear()
	{
		m_nNpcType = 0;
		m_nSprNum = 0;
		m_nNpcIndex = 0;
		m_nBossType = 0;
	}
	~CScenarioBoss() { DeleteBoss(); }
	int GetBossType() { return m_nBossType; }
	int DeleteBoss();
	bool IsDragonLoad() { return (m_nNpcType==NT_DRAGON_LOAD)?true:false; }
	int CreateBoss( int npc_type, int npc_num = 0, int x=0, int y=0 );
	
};

//////////////////////////////////////////////////////////////
class CDungeonObject
{
public : 
	void *m_pMother;
public:
	enum 
	{
		TILE_NOT = 0,
			TILE_DONT = 1,
			TILE_EVENT = 2,
	};
	enum	// m_nNeedType		// 咀萍宏 登绰 炼扒
	{
		ONT_NEED_ITEM	= 1,		// 咀萍宏 瞪锭 酒捞袍捞 鞘夸
			ONT_NEED_TRAP	= 2,		// 咀萍宏矫 促弗 飘乏捞 鞘夸 ( OET_NORMAL_TRAP 捞 傈何 咀萍宏 登具 茄促. )
			ONT_NEED_TRAP2	= 3,		// 咀萍宏矫 促弗 飘乏捞 鞘夸 ( 官肺傈 牢郸胶狼 蔼捞 咀萍宏 登具 茄促. )
			ONT_NEED_QUBE	= 4,		// 酒酒袍栏肺 锅龋甫 嘎苗具 茄促.
			ONT_NEED_QUBE2	= 5,		// 钮宏啊 促 咀萍宏 瞪锭 咀萍宏 等促.
			ONT_NEED_DRAGON	= 6,		// 靛贰帮捞 唱鸥朝锭 咀萍宏 ( 靛贰帮 肺靛啊 唱鸥唱搁 close )
			ONT_NEED_MONSTER = 7,		// 阁胶磐啊 磷阑锭 咀萍宏 等促.
	};
	enum	// m_nExecuteType	// 咀萍宏矫 秦具 且 青悼
	{
		OET_NORMAL_TRAP			= 1,
			OET_POTAL_BOSS			= 2,
			OET_POTAL_OUT_LAYER		= 3,
			OET_POTAL_OUT_DUNGEON	= 4,
			OET_POTAL_DRAGON		= 5,		// 靛贰帮栏肺 啊绰 器呕
			
			//OET_OTHER_ACTIVE_TRAP	= 5,	// 磊扁啊 咀萍宏 瞪锭 促弗 仇档 咀萍宏 矫难霖促.
	};
	
public:
	int m_Index;					// 飘乏 锅龋 0锅篮 荤侩窍瘤 臼绰促.
	int m_nLayer;					// 秦寸 摸
	int m_nCloseObjectImage;		// 农肺令 灯阑锭 嘛阑 捞固瘤 锅龋
	int m_nActiveObjectImage;		// 咀萍宏 灯阑锭 嘛阑 捞固瘤 锅龋
	int m_nActiveObjectType;		// 努扼捞攫飘俊辑 嘛绰 规过
	int m_nInputX;
	int m_nInputY;
	int m_nOutputX;
	int m_nOutputY;
	int m_nTime;					// 檬
	int m_nNeedType;					// active 登绰 炼扒( 1:酒捞袍, 2:m_nType2狼 蔼捞 1牢 傈何 咀萍宏 灯阑锭 咀萍宏 等促. )
	int m_nExecuteType;					// active 灯阑锭 窍绰 青悼( 1: m_nType1 狼 蔼捞 2牢 坷宏璃飘甫 坷锹 矫难扼, 2:器呕扁瓷
	bool m_bActive;					// 凯啡绰啊 救 凯啡绰啊		// active 客 鞍篮 俺充
	DWORD m_dwOpenTime;
	int m_ObjectId;					// 积己矫挪 坷宏璃飘 锅龋	// -1篮 绝澜
	int m_nActiveItemNo;			// 累悼矫虐绰 酒捞袍
	char m_szOutputMap[20];
	
	// 鸥老俊 包访等
	// close 侩
	int m_eTileType1;		// 0捞搁 绝促.	enum 荤侩
	int m_nRange1;			// 加己阑 磨 裹困
	int m_nEventNo1;		// 光酒具 窍绰 捞亥飘 锅龋
	
	// active侩
	int m_eTileType2;		// 0捞搁 绝促.	enum 荤侩
	int m_nRange2;			// 加己阑 磨 裹困
	int m_nEventNo2;		// 光酒具 窍绰 捞亥飘 锅龋
	
	// 焊胶 积己
	CScenarioBoss	*m_pBoss;			// 焊胶
	int				m_nBossCount;		// 侩老 版快 2俺捞促.
	CScenarioBoss	*m_pFollower;		// 绿捍
	int m_nBoss;				// 积己矫懦 吝埃焊胶
	int m_nBossX;
	int m_nBossY;
	int m_nBossItem;
	int m_nResenTime;
	
	int m_nFollower;			// 林函俊 鞍捞 唱坷绰 绿捍
	int m_nFollowerCount;		// 绿捍 荐
	
	
public:
	CDungeonObject()
	{
		m_Index = 0;
		m_bActive = 0;
		m_ObjectId = -1;
		m_nCloseObjectImage = 0;
		m_nActiveObjectImage = 0;
		m_eTileType1 = TILE_NOT;
		m_eTileType2 = TILE_NOT;
		m_pMother = 0;
		m_pBoss = 0;
		m_pFollower = 0;
		m_nBoss = 0;
		m_nBossX = 0;
		m_nBossY = 0;
		m_nBossItem = 0;
		m_nFollower = 0;
		m_nFollowerCount = 0;
		m_nResenTime = -1;
		m_nBossCount = 0;
	}
	~CDungeonObject();
	
	bool IsThisLayerActive();
	bool IsNormalTrap() { return ( m_nExecuteType == OET_NORMAL_TRAP )?true:false; }
	void SetMotherPointer( void *pointer ) { m_pMother = pointer; }
	int CheckCloseTime();
	int IsActive() { return m_bActive; }
	void CloseObject( int npc_create_type = 1 );
	int CreateNormalBoss();		// 吝埃 焊胶 积己
	void ActiveObject();
	int Execute( short int cn );
	bool TryActive( CHARLIST *ch );
	bool SetActive( CHARLIST *ch );
	int DeleteObjectImage();
	int Start();
	int CreateScenarioBoss( int boss_type = CScenarioBoss::NT_NORMAL_BOSS);
	int KillBoss( CHARLIST *user, CHARLIST *boss );		// npc啊 磷菌阑锭 弊 npc啊 矫唱府坷 焊胶老版快 贸府
	int DeletBoss();									// 碍力肺 焊胶甫 绝举 版快
	bool IsDragonLoad();
	void SendObjectTileAttr( short int cn );
};

//#define _KEIN_TEST_
const int MESSAGE_COUNT = 2;
class CDungeonMap		// 甘窜困
{
public : 
	enum	// m_nDungeonType 
	{
		DT_NONE = 1,
			DT_PASSWORD = 2,
	};
public:
	TKeinList<CDungeonHistory> m_History;
	
	CDungeonObject *m_pObject;
	int m_nObjectCount;
	
	int m_nLayer;
	int m_nTrapCount;			// 措固泵俊辑 鞠龋肺 荤侩茄促.
	int m_nDungeonType;			// 
	
	bool m_bActive;
	int m_nMessageCount;
	int m_pKey[7];
	int m_nMessageOption;
	
	bool m_bDragonRoad;
	
	char m_szOutMap[20];
	int m_nOutX;
	int m_nOutY;
	
public :
	CDungeonMap( int flag = 1 )
	{
		m_pObject = 0;
		m_bDragonRoad = 0;
		Clear();
	}
	~CDungeonMap()
	{
		Clear();
	}
	void SetDragonRoad() { m_bDragonRoad = !m_bDragonRoad; }
	
	bool IsDragonRoad() 
	{	//< CSD-030304
		
		/*
		#ifdef _KEIN_TEST_
		return 1;
		#endif
		return m_bDragonRoad; 
		*/
		return false; // 公炼扒 饭靛 靛贰帮捞 唱坷档废 汲沥
	}	//> CSD-030304
	
	int SetTrapKey( int item_no, CHARLIST *ch );
	int Clear()
	{
		SAFE_DELETE_ARRAY(m_pObject);
		m_nObjectCount = 0;
		m_nLayer = 0;
		m_nTrapCount = 0;
		m_nDungeonType = 0;
		m_bActive = 0;
		m_nMessageCount = 0;
		m_szOutMap[0] = 0;
		m_nOutX = 0;
		m_nOutY = 0;
		
		ResetKey();
		return 1;
	}
	int Load( int layer );
	int SetDungeonObject( int count )
	{
		m_nObjectCount = count;
		m_pObject = new CDungeonObject[count];
		for( int i=0; i<count; i++ )
		{
			m_pObject[i].SetMotherPointer( this );
		}
		
		return 1;
	}
	void ResetKey()
	{
		memset( m_pKey, 0, sizeof( int )*7 );
		m_nMessageOption = 1;
	}
	int IsActive() { return m_bActive; }
	int SetActive();
	int SetClose();
	int NewJoin( short int cn );
	bool CheckObject( int cn, int event_no );
	CDungeonObject *GetObjectByEventNo( int event_no );
	int SendEventWhenAddItem( int item_index, short int cn );
	int SetInt( int *pTemp, int nMax );
	int SetHistory( CHARLIST *ch, CDungeonObject *pDO, int type ); 
	void Proc();
	int GetTrapCount( int &count, int &intctive_count , int &aactive_time);
	int KillBoss( CHARLIST *user, CHARLIST *boss );		// 焊胶啊 磷菌促.
	void OpenDragonRoadObject();
	void CloseDragonRoadObject();
	int DeleteDragon();
	int SendTileAttrToNewUser( short int cn );		// 货肺 甸绢柯 仇俊霸 捞固 父甸绢 廉 乐绰 加己阑 葛滴 焊辰促.
};

class CDungeonMapMgr
{
public :
	enum		// GET_OUT_TYPE
	{
		GOT_END_BOSS_POTAL	= 1,	// 焊胶 器呕捞 摧老锭, 焊胶 器呕 救 藕仇
			GOT_END_LAYER		= 2,	// 摸 器呕捞 摧老锭, 泼扁扁
			GOT_END_SCENARIO	= 3,	// 矫唱府坷 辆丰
			GOT_END_VOTE		= 4,	// 蛮馆 场车阑锭
			// 疵绢唱搁 GetOutDugeon() 俊 硅凯阑 疵妨具 茄促.
	};
	
public :
	int m_nCount;
	CDungeonMap* m_pData;
	TKeinList< int > *pVoteTrue;		// 蛮己
	TKeinList< int > *pVoteFalse;		// 馆措
	TKeinList< int > *pPotalList;		// 焊胶 器呕阑 芭模 荤恩 殿废
	
public :
	CDungeonMapMgr( int N )
	{
		m_pData = new CDungeonMap[N];
		m_nCount = N;
		pVoteTrue = 0;
		pVoteFalse = 0;
		pPotalList = 0;
	}
	~CDungeonMapMgr()
	{
		m_nCount = 0;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -