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

📄 squaredeal.cpp

📁 魔域的源代码
💻 CPP
字号:
// SquareDeal.cpp: implementation of the CSquareDeal class.
//
//////////////////////////////////////////////////////////////////////

#include "AllMsg.h"
#include "windows.h"
#include "SquareDeal.h"
#include "Item.h"
#include "User.h"
#include <algorithm>
using namespace std;

MYHEAP_IMPLEMENTATION(CSquareDeal,s_heap)
//////////////////////////////////////////////////////////////////////
// constant
const int	MAX_SQUAREDEALITEMS		= 20;
const int	MAX_SQUAREDEALMONEY		= 100000000;	// 100 m


//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CSquareDeal::CSquareDeal()
{
	m_iface1.m_pParent	= this;
	m_iface2.m_pParent	= this;

	m_pUser1			= NULL;
	m_pUser2			= NULL;
//	m_setItem1;
//	m_setItem2;
	m_nAllWeight1		= 0;
	m_nAllWeight2		= 0;
	m_nMoney1			= 0;
	m_nMoney2			= 0;
	m_bClickOK1			= false;
	m_bClickOK2			= false;
	m_bTradeSuccess		= false;
}

//////////////////////////////////////////////////////////////////////
CSquareDeal::~CSquareDeal()
{
	if(!m_bTradeSuccess)
	{
		CUser*	pUser1	= m_pUser1->QueryUser();
		CUser*	pUser2	= m_pUser2->QueryUser();
		IF_OK(pUser1 && pUser2)
		{
			CMsgTrade	msg;
			IF_OK(msg.Create(_TRADE_FALSE, 0))
			{
				pUser1->SendMsg(&msg);
				pUser2->SendMsg(&msg);
			}
			pUser1->SendSysMsg(STR_TRADE_FAIL);
			pUser2->SendSysMsg(STR_TRADE_FAIL);
		}
	}

	if(m_pUser1)
		m_pUser1->Release();
	if(m_pUser2)
		m_pUser2->Release();
}

//////////////////////////////////////////////////////////////////////
bool CSquareDeal::TradeOK()
{
	CHECKF(m_pUser1 && m_pUser2);

	CUser*	pUser1	= m_pUser1->QueryUser();
	CUser*	pUser2	= m_pUser2->QueryUser();
	IF_NOT(pUser1 && pUser2)
		return false;
	IF_NOT(pUser1->GetMapID() == pUser2->GetMapID())
		return false;
	IF_NOT(pUser1->GetDistance(pUser2->GetPosX(), pUser2->GetPosY()) <= CELLS_PER_VIEW)
		return false;

	// check money
	bool	bRet = true;
	if(	(m_nMoney1 && (m_nMoney1 > pUser1->GetMoney() || m_nMoney1 + pUser2->GetMoney() > _MAX_MONEYLIMIT))
			|| (m_nMoney2 && (m_nMoney2 > pUser2->GetMoney() || m_nMoney2 + pUser1->GetMoney() > _MAX_MONEYLIMIT)) )
		bRet = false;

	// check items
	int	nAmountCount	= 0;
	int	nAmountWeight	= 0;
	int nCount[ITEMPOSITION_PACK_END - ITEMPOSITION_PACK_BEGIN];
	memset(&nCount, 0L, sizeof(nCount));
	IUserPackage* pUserPackage = pUser1->QueryPackage();
	if (!pUserPackage)
		return false;
	for(int i = 0; i < m_setItem1.size(); i++)
	{
		CItemPtr pItem = pUser1->GetItem(m_setItem1[i]);
		if(!pItem)
			return false;
		nAmountCount++;
		nAmountWeight	+= pItem->GetWeight();
		int nPosition = pUserPackage->GetItemPosition(pItem);
		if (nPosition < ITEMPOSITION_PACK_END && nPosition >= ITEMPOSITION_PACK_BEGIN)
		{
			++nCount[nPosition];
		}
	}
	for (i=0; i<ITEMPOSITION_PACK_END - ITEMPOSITION_PACK_BEGIN; i++)
	{
		if (!pUser2->IsBackPackSpare(nCount[i], 0, ID_NONE, ITEMPOSITION_PACK_BEGIN+i))
			return false;
	}
//	if(!pUser2->IsBackPackSpare(nAmountCount, nAmountWeight))
//		bRet = false;

	// check items
		nAmountCount	= 0;
		nAmountWeight	= 0;
	memset(&nCount, 0L, sizeof(nCount));
	pUserPackage = pUser2->QueryPackage();
	if (!pUserPackage)
		return false;
	for( i = 0; i < m_setItem2.size(); i++)
	{
		CItemPtr pItem = pUser2->GetItem(m_setItem2[i]);
		if(!pItem)
			return false;
		nAmountCount++;
		nAmountWeight	+= pItem->GetWeight();
		int nPosition = pUserPackage->GetItemPosition(pItem);
		if (nPosition < ITEMPOSITION_PACK_END && nPosition >= ITEMPOSITION_PACK_BEGIN)
		{
			++nCount[nPosition];
		}
	}
	for (i=0; i<ITEMPOSITION_PACK_END - ITEMPOSITION_PACK_BEGIN; i++)
	{
		if (!pUser1->IsBackPackSpare(nCount[i], 0, ID_NONE, ITEMPOSITION_PACK_BEGIN+i))
			return false;
	}
//	if(!pUser1->IsBackPackSpare(nAmountCount, nAmountWeight))
//		bRet = false;

	if(bRet)
	{
		DEBUG_TRY		// VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
		// exchange, 客户端自动同步
		if(m_nMoney1)
		{
			ASSERT(pUser1->SpendMoney(m_nMoney1, SYNCHRO_FALSE));
			ASSERT(pUser2->GainMoney(m_nMoney1, SYNCHRO_FALSE));
		}
		if(m_nMoney2)
		{
			ASSERT(pUser2->SpendMoney(m_nMoney2, SYNCHRO_FALSE));
			ASSERT(pUser1->GainMoney(m_nMoney2, SYNCHRO_FALSE));
		}
		for(int i = 0; i < m_setItem1.size(); i++)
		{
			CItemPtr pItem = pUser1->GetItem(m_setItem1[i]);
			ASSERT(pItem);
			if(pItem)
			{
				bool bSynchro = pItem->WarGhostLevelReset();

				// 不是夫妻交易幻兽要扣亲密度
				if (pItem->IsEudemon() && !pUser1->IsMate(pUser2))
				{
					int nDecFidelity = EUDEMON_DEC_FIDELITY_WHEN_DEAL;
					if (pUser1->GetFriend(pUser2->GetID()))
						nDecFidelity /= 2;		// 好友交易少扣一半的亲密度
					int nFidelity = pItem->GetInt(ITEMDATA_FIDELITY);
					nFidelity = __max(0, (nFidelity - nDecFidelity));
					pItem->SetInt(ITEMDATA_FIDELITY, nFidelity, true);
					bSynchro = SYNCHRO_TRUE;
				}

				ASSERT(pUser1->PopItem(pItem->GetID(), SYNCHRO_FALSE, UPDATE_FALSE));
				ASSERT(pUser2->AddItem(pItem, bSynchro, UPDATE_TRUE));
				
				if(pItem->IsNonsuchItem())
				{
					::MyLogSave("gmlog/trade_item", STR_NONSUCH_TRADE_sssu, pUser1->GetName(), pUser2->GetName(), pItem->GetStr(ITEMDATA_NAME), pItem->GetID());
				}
			}
		}
		for( i = 0; i < m_setItem2.size(); i++)
		{
			CItemPtr pItem = pUser2->GetItem(m_setItem2[i]);
			ASSERT(pItem);
			if(pItem)
			{
				bool bSynchro = pItem->WarGhostLevelReset();

				// 不是夫妻交易幻兽要扣亲密度
				if (pItem->IsEudemon() && !pUser2->IsMate(pUser1))
				{
					int nDecFidelity = EUDEMON_DEC_FIDELITY_WHEN_DEAL;
					if (pUser2->GetFriend(pUser1->GetID()))
						nDecFidelity /= 2;		// 好友交易少扣一半的亲密度
					int nFidelity = pItem->GetInt(ITEMDATA_FIDELITY);
					nFidelity = __max(0, (nFidelity - nDecFidelity));
					pItem->SetInt(ITEMDATA_FIDELITY, nFidelity, true);
					bSynchro = SYNCHRO_TRUE;
				}

				ASSERT(pUser2->PopItem(pItem->GetID(), SYNCHRO_FALSE, UPDATE_FALSE));
				ASSERT(pUser1->AddItem(pItem, bSynchro, UPDATE_TRUE));

				if(pItem->IsNonsuchItem())
				{
					::MyLogSave("gmlog/trade_item", STR_NONSUCH_TRADE_sssu, pUser2->GetName(), pUser1->GetName(), pItem->GetStr(ITEMDATA_NAME), pItem->GetID());
				}
			}
		}
		pUser1->SendSysMsg(STR_TRADE_SUCCEED);
		pUser2->SendSysMsg(STR_TRADE_SUCCEED);
		DEBUG_CATCH("★公平交易出错★")		// AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

		CMsgTrade	msg;
		CHECKF(msg.Create(_TRADE_SUCCESS, 0));
		pUser1->SendMsg(&msg);
		pUser2->SendMsg(&msg);
		m_bTradeSuccess	= true;

		pUser1->SaveInfo();
		pUser2->SaveInfo();

		return true;
	}
	else
	{
		/*
		CMsgTrade	msg;
		CHECKF(msg.Create(_TRADE_FALSE, 0));
		pUser1->SendMsg(&msg);
		pUser2->SendMsg(&msg);
		pUser1->SendSysMsg(STR_TRADE_FAIL);
		pUser2->SendSysMsg(STR_TRADE_FAIL);
		return false;
		*/
	}

	return true;
}

//////////////////////////////////////////////////////////////////////
// ISquareDeal 1
//////////////////////////////////////////////////////////////////////
bool CSquareDeal::XSquareDeal1::Create(IUserSquareDeal* pUser, IUserSquareDeal* pTarget)
{
	This()->m_pUser1		= pUser;
	This()->m_pUser2		= pTarget;

	if(!pUser->Create(&This()->m_iface1))			//? 好象多余
		return false;
	if(!pTarget->Create(&This()->m_iface2))
		return false;

	return true;
}

//////////////////////////////////////////////////////////////////////
bool CSquareDeal::XSquareDeal1::AddItem(CItem* pItem)
{
	CHECKF(pItem && pItem->GetID());

	if(This()->m_setItem1.size() >= MAX_SQUAREDEALITEMS)
		return false;

	// 检查重复加入
	if(find(This()->m_setItem1.begin(), This()->m_setItem1.end(), pItem->GetID()) != This()->m_setItem1.end())
		return false;

	if(!This()->m_pUser2->AddItem(pItem, This()->m_setItem1.size()+1, This()->m_nAllWeight1 + pItem->GetWeight()))
		return false;

	This()->m_nAllWeight1	+= pItem->GetWeight();
	This()->m_setItem1.push_back(pItem->GetID());
	return true;
}

//////////////////////////////////////////////////////////////////////
int CSquareDeal::XSquareDeal1::AddMoney(int nMoney)		// return allmoney
{
	ASSERT(nMoney > 0);
	if(nMoney <= 0)
		return This()->m_nMoney1;

	if(This()->m_nMoney1 + nMoney > MAX_SQUAREDEALMONEY)
		return This()->m_nMoney1;

	if(!This()->m_pUser2->AddMoney(This()->m_nMoney1 + nMoney))
		return This()->m_nMoney1;
	This()->m_nMoney1	+= nMoney;
	return This()->m_nMoney1;
}

//////////////////////////////////////////////////////////////////////
bool CSquareDeal::XSquareDeal1::ClickOK()
{
	This()->m_bClickOK1		= true;
	This()->m_pUser2->ClickOK();

	if(This()->m_bClickOK2 == true)
	{
		This()->TradeOK();

		return true;		// release by outside
	}

	return false;
}

//////////////////////////////////////////////////////////////////////
CUser* CSquareDeal::XSquareDeal1::GetTarget()
{
	return This()->m_pUser2->QueryUser();
}

//////////////////////////////////////////////////////////////////////
// ISquareDeal 2
//////////////////////////////////////////////////////////////////////
bool CSquareDeal::XSquareDeal2::Create(IUserSquareDeal* pUser, IUserSquareDeal* pTarget)
{
	This()->m_pUser2		= pUser;
	This()->m_pUser1		= pTarget;

	if(!pUser->Create(&This()->m_iface2))			//? 好象多余
		return false;
	if(!pTarget->Create(&This()->m_iface1))
		return false;

	return true;
}

//////////////////////////////////////////////////////////////////////
bool CSquareDeal::XSquareDeal2::AddItem(CItem* pItem)
{
	CHECKF(pItem);

	if(This()->m_setItem2.size() >= MAX_SQUAREDEALITEMS)
		return false;

	// 检查重复加入
	if(find(This()->m_setItem2.begin(), This()->m_setItem2.end(), pItem->GetID()) != This()->m_setItem2.end())
		return false;

	if(!This()->m_pUser1->AddItem(pItem, This()->m_setItem2.size()+1, This()->m_nAllWeight2 + pItem->GetWeight()))
		return false;

	This()->m_nAllWeight2	+= pItem->GetWeight();
	This()->m_setItem2.push_back(pItem->GetID());
	return true;
}

//////////////////////////////////////////////////////////////////////
int CSquareDeal::XSquareDeal2::AddMoney(int nMoney)		// return allmoney
{
	ASSERT(nMoney > 0);
	if(nMoney <= 0)
		return This()->m_nMoney2;

	if(This()->m_nMoney2 + nMoney > MAX_SQUAREDEALMONEY)
		return This()->m_nMoney2;

	if(!This()->m_pUser1->AddMoney(This()->m_nMoney2 + nMoney))
		return This()->m_nMoney2;
	This()->m_nMoney2	+= nMoney;
	return This()->m_nMoney2;
}

//////////////////////////////////////////////////////////////////////
bool CSquareDeal::XSquareDeal2::ClickOK()
{
	This()->m_bClickOK2		= true;
	This()->m_pUser1->ClickOK();

	if(This()->m_bClickOK1 == true)
	{
		This()->TradeOK();

		return true;		// release by outside
	}

	return false;
}

//////////////////////////////////////////////////////////////////////
CUser* CSquareDeal::XSquareDeal2::GetTarget()
{
	return This()->m_pUser1->QueryUser();
}






⌨️ 快捷键说明

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