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

📄 guildfortress.cpp

📁 决战帝王1.5武神降临对喜爱决战的玩家共享研究用
💻 CPP
字号:
// GuildFortress.cpp: implementation of the CGuildFortress class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "server.h"
#include "USER.h"
#include "GuildFortress.h"
#include "Extern.h"


#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CGuildFortress::CGuildFortress()
{
	int i;

	m_dwRepairCost = 0;
//	m_iCityDegree = 0;
	m_sFortressID = 0;
	m_iGuildSid = 0;

	::ZeroMemory(m_strGuildName, sizeof(m_strGuildName));
	::ZeroMemory(m_strMasterName, sizeof(m_strMasterName));

	m_tTaxRate = 0;
	arStoreTax.RemoveAll();

	m_iGuildDN = 0;

	m_bHaveGuild = 0;						  // 泅犁 辨靛俊 加茄 惑痢捞促	TRUE	
	m_lUsed = 0;							  // 辨靛傈 荐青吝牢瘤 酒囱瘤 钎矫...
	m_lChangeUsed = 0;

	m_tWarType = 0;	

	m_lListUsed = 0;						  // 辨靛傈俊 曼啊窍绰 辨靛 府胶飘	
	m_lListCount = 0;

	m_dwStartTick = 0;
	m_iStandingTime = 50;

	m_iZone = 0;							  // 器呕粮
	m_iPotalX = 0;
	m_iPotalY = 0;

	m_arNpcList.RemoveAll();
	m_arWarNpcList.RemoveAll();
	m_arRepairNpcList.RemoveAll();

	for(i = 0; i < GUILDFORTRESS_ATTACK_MAX_NUM; i++)
	{
		m_arAttackGuild[i].lUsed = 0;
		m_arAttackGuild[i].lGuild = 0;
		::ZeroMemory(m_arAttackGuild[i].strGuildName, sizeof(m_arAttackGuild[i].strGuildName));
	}

	for(i = 0; i < GUILD_GUARD_MAX_NUM; i++) m_iGuardList[i] = 0;

	for(i = 0; i < FORTRESS_TARGET_MAX_NUM; i++)
	{
		m_arFortressTarget[i].lUsed = 0;
		m_arFortressTarget[i].sTargertID = 0;
	}

	for(i = 0; i < GUILD_REPAIR_MAX_NUM; i++)
	{
		m_arRepairDBList[i].sHP = 0;
		m_arRepairDBList[i].sNid = 0;
		m_arRepairDBList[i].sUid = 0;
	}

	for(i = 0; i < MAX_GUILD_USER; i++)
	{
		m_arCityRankList[i].lUsed = 0;
		m_arCityRankList[i].lCityRank = 0;
		::ZeroMemory(m_arCityRankList[i].strUserID, sizeof(m_arCityRankList[i].strUserID));
	}

	m_lViolenceUsed = 0;	
	m_dwViolenceTick = 0;
	m_arViolenceNpcList.RemoveAll();

	InitMsgTime();
}

CGuildFortress::~CGuildFortress()
{

}

///////////////////////////////////////////////////////////////////////////////
//	 俊 Buffer 狼 郴侩阑 墨乔茄促.
//
void CGuildFortress::StrToGuildAttList(TCHAR *pBuf, int iguild)
{
/*	int i, index = 0;
	int nLen = 0, gid = 0;

	for(i = 0; i < GUILDFORTRESS_ATTACK_MAX_NUM; i++)
	{
		gid = GetInt(pBuf, index);
		m_arAttackGuild[i].lGuild = gid;
		::ZeroMemory(m_arAttackGuild[i].strGuildName, sizeof(m_arAttackGuild[i].strGuildName));

		if(gid > 0 && gid < g_arGuildData.GetSize())
		{
			nLen = strlen(g_arGuildData[gid]->m_strGuildName);
			if(nLen > 0) 
			{
				InterlockedIncrement(&m_lListCount);
				strncpy(m_arAttackGuild[i].strGuildName, g_arGuildData[gid]->m_strGuildName, nLen);
			}
		}
	}
*/
	int i, j;
	int nLen = 0;

	nLen = strlen(pBuf);
	if(nLen <= 0 || nLen > CHAR_NAME_LENGTH) return;

	for(i = 0; i < g_arGuildData.GetSize(); i++)
	{
		if(!g_arGuildData[i]) continue;

		if(strcmp(g_arGuildData[i]->m_strGuildName, pBuf) == 0)
		{
			for(j = 0; j < GUILDFORTRESS_ATTACK_MAX_NUM; j++)
			{
				if(InterlockedCompareExchange((PVOID*)&m_arAttackGuild[j].lUsed, (PVOID)1, (PVOID)0) == (PVOID*)0)
				{
					::ZeroMemory(m_arAttackGuild[j].strGuildName, sizeof(m_arAttackGuild[j].strGuildName));
					m_arAttackGuild[j].lGuild = iguild;
					strncpy(m_arAttackGuild[j].strGuildName, g_arGuildData[i]->m_strGuildName, nLen);
					return;
				}
			}
		}
	}
}

void CGuildFortress::StrGuildGuardList(TCHAR *pBuf)
{
	int index = 0;
	for(int i = 0; i < GUILD_GUARD_MAX_NUM; i++)
	{
		m_iGuardList[i] = GetInt(pBuf, index);
	}
}

///////////////////////////////////////////////////////////////////////////////
//	Buffer 俊 GuildAttList 沥焊甫 Copy 茄促.
//
void CGuildFortress::GuildAttListToStr(TCHAR *pBuf)
{
	int	index = 0;
	for(int i = 0; i < GUILDFORTRESS_ATTACK_MAX_NUM; i++)
	{
		SetInt(pBuf, m_arAttackGuild[i].lGuild,index);
	}
}

void CGuildFortress::GuildGuardListToStr(TCHAR *pBuf)
{
	int	index = 0;
	for(int i = 0; i < GUILD_GUARD_MAX_NUM; i++)
	{
		SetInt(pBuf, m_iGuardList[i],index);
	}
}

///////////////////////////////////////////////////////////////////////////////
//	阿 NPC俊 辨靛傈烙阑 舅赴促.
//
void CGuildFortress::SetNpcToFortressWarBegin()
{
	int i, j;
	int nid = 0;

	CNpc* pNpc = NULL;

	for(i = 0; i < m_arNpcList.GetSize(); i++)
	{
		nid = m_arNpcList[i];

		pNpc = GetNpc(nid);
		if(!pNpc) continue;

		if(pNpc->m_sEZone >= GUILD_FORTRESS_NPC_BAND)
		{
			for(j = 0; j < FORTRESS_TARGET_MAX_NUM; j++)
			{
				if(m_arFortressTarget[j].sTargertID == pNpc->m_sNid)
				{
					m_arWarNpcList.Add(pNpc->m_sNid);
					pNpc->m_tGuildWar = GUILD_WARRING;
					pNpc->m_tNCircle = NPC_NCIRCLE_DEF_STATE;
					pNpc->m_sHP = pNpc->m_sMaxHP;
					pNpc->m_lFortressState = 0;
					break;
				}
			}
		}
		else if(pNpc->m_tNpcType == NPCTYPE_GUILD_GUARD || pNpc->m_sEZone >= GUILD_REPAIR_NPC_BAND)
		{
			m_arWarNpcList.Add(pNpc->m_sNid);
			pNpc->m_tGuildWar = GUILD_WARRING;
			pNpc->m_lFortressState = 0;

			if(pNpc->m_tNpcType == NPCTYPE_GUILD_GUARD) pNpc->m_tNpcAttType = 1;
		}
	}
}

CNpc* CGuildFortress::GetNpc(int nid)
{
	if( nid < 0 || nid >= g_arNpc.GetSize() ) return NULL;

	return g_arNpc[nid];

	return NULL;
}

///////////////////////////////////////////////////////////////////////////////
//	阿 NPC俊 辨靛傈捞 场车澜阑 舅赴促.
//
void CGuildFortress::SetNpcToFortressWarEnd(COM *pCom)
{
	int i, j;
	int nid = 0;

	m_dwRepairCost = 0;

	DWORD dwCost = 0;
	CNpc* pNpc = NULL;

	BOOL bRepair = FALSE;

	for(i = 0; i < m_arWarNpcList.GetSize(); i++)
	{
		nid = m_arWarNpcList[i];

		pNpc = GetNpc(nid);
		if(!pNpc) continue;

		bRepair = FALSE;

		for(j = 0; j < GUILD_REPAIR_MAX_NUM; j++)
		{
			if(m_arRepairDBList[j].sUid == pNpc->m_sEZone)
			{
				if(m_arRepairDBList[j].sHP < pNpc->m_sMaxHP)
				{
					m_arRepairDBList[j].sHP = pNpc->m_sHP;
					pNpc->m_tRepairDamaged = NPC_NEED_REPAIR_STATE;					

					dwCost += (pNpc->m_sMaxHP - pNpc->m_sHP) * 100;

					bRepair = TRUE;
					break;
				}				
			}
		}

		if(!bRepair) pNpc->m_sHP = pNpc->m_sMaxHP;

		pNpc->m_tGuildWar = GUILD_WAR_AFFTER;		
		pNpc->m_tNpcAttType = 0;
		pNpc->m_byColor = 0;
		pNpc->m_lFortressState = 0;

		if(pNpc->m_tNpcType == NPCTYPE_GUILD_DOOR)
		{
			if(pNpc->m_sHP <= 0)
			{
				pNpc->m_sHP = 1;		// Dead惑怕 --> Live惑怕肺(傍己傈俊辑 何辑柳 巩栏肺 老窜 促弗 蜡历狼 立辟阑 阜扁困秦) 
				pNpc->m_bFirstLive = TRUE;
			}
		}
	}

	InitMsgTime();						// Msg 矫埃阑 促矫 悸泼
	m_dwRepairCost = dwCost;
	m_arWarNpcList.RemoveAll();
}

void CGuildFortress::FortressRepairListToStr(TCHAR *pBuf)
{
	int	index = 0;
	for(int i = 0; i < GUILD_REPAIR_MAX_NUM; i++)
	{
		SetShort(pBuf, m_arRepairDBList[i].sUid,index);
		SetShort(pBuf, m_arRepairDBList[i].sHP,index);
	}
}

void CGuildFortress::StrFortressRepairList(CByteArray &Buf)//(TCHAR *pBuf)
{
	int i, index = 0;

	TCHAR TempBuf[1024];
	::ZeroMemory(TempBuf, sizeof(TempBuf));

	for(i = 0; i < Buf.GetSize(); i++)
	{
		TempBuf[i] = Buf[i];
	}

	for(i = 0; i < GUILD_REPAIR_MAX_NUM; i++)
	{
		m_arRepairDBList[i].sUid = GetShort(TempBuf, index);
		m_arRepairDBList[i].sHP = GetShort(TempBuf, index);
	}
}

void CGuildFortress::InitMsgTime()
{
	m_MsgTimer[0].iMsgTime = 60;
	m_MsgTimer[0].iUsed = 0;

	m_MsgTimer[1].iMsgTime = 30;
	m_MsgTimer[1].iUsed = 0;

	m_MsgTimer[2].iMsgTime = 20;
	m_MsgTimer[2].iUsed = 0;

	m_MsgTimer[3].iMsgTime = 10;
	m_MsgTimer[3].iUsed = 0;

	m_MsgTimer[4].iMsgTime = 5;
	m_MsgTimer[4].iUsed = 0;

	m_MsgTimer[5].iMsgTime = 3;
	m_MsgTimer[5].iUsed = 0;
}

void CGuildFortress::UpdateInitFortress()
{
	int i;

//	m_iCityDegree = 0;
	m_tTaxRate = 0;
	m_iGuildDN = 0;

	m_tWarType = GUILD_WAR_PREPARE;
	m_tGuildWar = GUILD_WAR_AFFTER;

	m_iStandingTime = 50;

	m_bHaveGuild = TRUE;				  // 泅犁 辨靛俊 加茄 Fortress = TRUE	
	m_lUsed = 0;						  // 辨靛傈 荐青吝牢瘤 酒囱瘤 钎矫...
	m_lChangeUsed = 0;

	m_lListUsed = 0;
	m_lListCount = 0;

	for(i = 0; i < GUILDFORTRESS_ATTACK_MAX_NUM; i++)
	{
		m_arAttackGuild[i].lUsed = 0;
		m_arAttackGuild[i].lGuild = 0;
		::ZeroMemory(m_arAttackGuild[i].strGuildName, sizeof(m_arAttackGuild[i].strGuildName));
	}

	// 瘤陛 公炼扒 场唱搁 刮缴篮 檬扁拳啊 等促.
	// 蝶扼辑 辑滚甫 促矫 犁 啊悼 登绰 矫痢俊 嘎眠绢辑 促矫 悸泼等促.
	// 捞巩力甫 秦搬窍妨搁 g_arGuildUserData俊 秦寸 矫刮 殿鞭阑 悸泼秦林绢具茄促.
	// 眠饶 焊碍 夸噶
	for(i = 0; i < MAX_GUILD_USER; i++)
	{
		m_arCityRankList[i].lUsed = 0;
		m_arCityRankList[i].lCityRank = 0;
		::ZeroMemory(m_arCityRankList[i].strUserID, sizeof(m_arCityRankList[i].strUserID));
	}

	InitMemFortress(GUILD_WAR_PREPARE);
}

/////////////////////////////////////////////////////////////////////////////////////////
//	夸货俊 措茄 皋葛府 DB狼 郴侩阑 檬扁拳 茄促.
//
void CGuildFortress::InitMemFortress(BYTE tGuildWarType)
{
	int i;
	int nSize = g_arFortressSharedMemory.GetSize();
	CSharedMemory* pShared = NULL;
	CMemFortress* pData = NULL;

	for(i = 0; i < nSize; i++)
	{
		pShared = g_arFortressSharedMemory[i];
		
		if(pShared == NULL) return;
		if(pShared->m_hMapping == NULL) return;
		
		pData = (CMemFortress*) pShared->m_lpData;
		
		if(pData == NULL) return;
		
		if(pData->m_sFortressID == m_sFortressID)
		{
			pData->m_iGuildSid = m_iGuildSid;
			pData->m_sTaxRate = 0;
			pData->m_dwStoreDN = 0;
			pData->m_tWarType = tGuildWarType;

			GuildAttListToStr(pData->m_AttackList);
			FortressRepairListToStr(pData->m_RepairList);
			break;
		}
	}
}

void CGuildFortress::SetInitFortress()
{
//	m_iCityDegree = 0;
	m_iGuildSid = 900000;

	::ZeroMemory(m_strGuildName, sizeof(m_strGuildName));
	::ZeroMemory(m_strMasterName, sizeof(m_strMasterName));
	m_tTaxRate = 0;
	m_iGuildDN = 0;

	m_bHaveGuild = FALSE;					  // 泅犁 辨靛俊 加茄 惑痢捞促	TRUE	
	m_lUsed = 0;							  // 辨靛傈 荐青吝牢瘤 酒囱瘤 钎矫...
	m_lViolenceUsed = 0;
	m_lChangeUsed = 0;

	m_tWarType = GUILD_WAR_DECISION;
	m_tGuildWar = GUILD_WAR_AFFTER;

	m_dwStartTick = 0;
	m_iStandingTime = 50;

//	m_wPlanWarTime.wDay = m_wPlanWarTime.wDay + 7;
	m_wMopPartyTime.wYear = 2030;		// 辨靛啊 秦魂登搁辑 唱赣瘤绰 葛滴 檬扁拳甫
}


void CGuildFortress::ApplyTaxToStore()
{
	int i, j;

	for(i = 0; i < arStoreTax.GetSize(); i++)
	{
		for(j = 0; j < g_arStore.GetSize(); j++)
		{
			if(g_arStore[j] == NULL) continue;

			if(g_arStore[j]->m_sStoreID == arStoreTax[i])
			{
				g_arStore[j]->m_sRate = (short)m_tTaxRate;
				break;
			}
		}
	}
}

int CGuildFortress::GetTotalCityValue()
{
	int iCount=  0;
	int i, sum = 0;
	int avg = 0;

	for(i = 0; i < MAX_GUILD_USER; i++)
	{
		if(m_arCityRankList[i].lUsed == 1)
		{
			sum += m_arCityRankList[i].lCityRank;
			iCount++;
		}
	}

	if(iCount <= 0) return 0;

	avg = (int)(sum / iCount);
	sum = 0;

	switch(avg)
	{
	case -5: case -4:
		sum = 40;
		break;
	case -3: case -2: case -1:
		sum = 30;
		break;
	case 0: case 1:
		sum = 20;
		break;
	case 2: case 3:
		sum = 10;
		break;
	case 4: case 5:
		sum = 0;
		break;
	default:
		sum = 0;
		break;
	}

	sum += m_tTaxRate;

	return sum;
}

void CGuildFortress::AddGuildUserForFortressCityRank(TCHAR *strUserID, int sCityRank)
{
	int nLen = strlen(strUserID);

	if(nLen <= 0 || nLen > CHAR_NAME_LENGTH) return;

	for(int i = 0; i < MAX_GUILD_USER; i++)
	{
		if(InterlockedCompareExchange((PVOID*)&m_arCityRankList[i].lUsed, (PVOID)1, (PVOID)0) == (PVOID*)0)
		{
			::ZeroMemory(m_arCityRankList[i].strUserID, sizeof(m_arCityRankList[i].strUserID));
			m_arCityRankList[i].lCityRank = sCityRank;
			strncpy(m_arCityRankList[i].strUserID, strUserID, nLen);
			return;
		}
	}
}

void CGuildFortress::SetNpcToFortressViolenceBegin()//(COM *pCom)
{
	int i;
	int nid = 0;

	CNpc* pNpc = NULL;

	for(i = 0; i < m_arViolenceNpcList.GetSize(); i++)
	{
		nid = m_arViolenceNpcList[i];

		pNpc = GetNpc(nid);
		if(!pNpc) continue;

		pNpc->m_NpcVirtualState = NPC_MOVING;
		pNpc->m_NpcState = NPC_LIVE;			
	}
}

BOOL CGuildFortress::SetNpcToFortressViolenceEnd(COM *pCom)
{
	int i;
	int nid = 0;

	BOOL bAlive = FALSE;

	CNpc* pNpc = NULL;

	for(i = 0; i < m_arViolenceNpcList.GetSize(); i++)
	{
		nid = m_arViolenceNpcList[i];

		pNpc = GetNpc(nid);
		if(!pNpc) continue;
		pNpc->m_tGuildWar = GUILD_WAR_AFFTER;

		if(pNpc->m_NpcState != NPC_DEAD || pNpc->m_sHP > 0)
		{
			pNpc->m_NpcVirtualState = NPC_WAIT;
			pNpc->m_NpcState = NPC_DEAD;
			pNpc->m_sHP = 0;
			pNpc->SendDead(pCom);

			bAlive = TRUE;
		}
	}

	return bAlive;
}

void CGuildFortress::SetInitFortressViolence()
{
	m_iGuildSid = 900000;

	::ZeroMemory(m_strGuildName, sizeof(m_strGuildName));
	::ZeroMemory(m_strMasterName, sizeof(m_strMasterName));
	m_tTaxRate = 0;
	m_iGuildDN = 0;

	m_bHaveGuild = FALSE;					  // 泅犁 辨靛俊 加茄 惑痢捞促	TRUE	
	m_lUsed = 0;							  // 辨靛傈 荐青吝牢瘤 酒囱瘤 钎矫...
	m_lViolenceUsed = 0;
	m_lChangeUsed = 0;

	m_tWarType = GUILD_WAR_DECISION;
	m_tGuildWar = GUILD_WAR_AFFTER;

	m_dwStartTick = 0;
	m_iStandingTime = 50;

	m_wMopPartyTime.wYear = 2030;		// 辨靛啊 秦魂登搁辑 唱赣瘤绰 葛滴 檬扁拳甫
}

void CGuildFortress::GetOutof(COM *pCom)
{
	int mapindex;
	int type = 0;
	int nLen = 0;

	USER *pUser = NULL;

	for(int i = 0; i < MAX_USER; i++)				// 葛电 蜡历甫 屁变促.
	{
		mapindex = -1;
		type = 0;
		pUser = pCom->GetUserUid(i);

		if(pUser == NULL || pUser->m_state != STATE_GAMESTARTED) continue;		

		type = pUser->CheckInvalidMapType();
		mapindex = pUser->GetGuildMapIndex(type);
		if(mapindex >= 0)
		{												//辨靛傈捞 老绢唱绰 惑痢瘤开捞搁
			if(m_iZone == pUser->m_curz && pUser->m_tIsOP != TRUE )
			{
				pUser->TownPotal();				
			}
			else if(g_arMapTable[mapindex]->m_sStoreZone && pUser->m_tIsOP != TRUE)		
			{											// 规绢辨靛盔捞 酒聪搁 葛滴 付阑肺	
				pUser->TownPotal();				
			}
		}
	}
}

⌨️ 快捷键说明

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