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

📄 battle_suryun.cpp

📁 墨香最新私服
💻 CPP
字号:
// Battle_Suryun.cpp: implementation of the CBattle_Suryun class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Battle_Suryun.h"

#include "Object.h"
#include "BattleTeam_Suryun.h"
#include "../[CC]Suryun/SuryunDefine.h"

#ifdef _MAPSERVER_
#include "RecallManager.h"
#include "UserTable.h"
#include "Player.h"
#include "Monster.h"
#include "CharMove.h"
#include "../[CC]Header/GameResourceManager.h"
#include "ObjectStateManager.h"
#include "SkillManager_Server.h"
#include "SuryunRegen.h"
#include "SuryunRegenManager.h"
#include "../[CC]Suryun/SuryunManager_server.h"

#else	// _MHCLIENT_
#include "ObjectManager.h"
#include "./interface/cWindowManager.h"
#include "MPMissionDialog.h"
#include "MPNoticeDialog.h"
#include "MPGuageDialog.h"
#include "GameIn.h"
#include "cMsgBox.h"
#include "ChatManager.h"
#include "WindowIDEnum.h"
#include "../[CC]Suryun/SuryunManager_client.h"
#include "Effect/EffectManager.h"
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

#define BATTLE_SURYUN_READYTIME		10000
#define BATTLE_SURYUN_RESULTTIME	10000

CBattle_Suryun::CBattle_Suryun()
{
	m_bDestroyed = FALSE;
}

CBattle_Suryun::~CBattle_Suryun()
{
	if(m_bDestroyed == FALSE)
		printf("ERROR!!!!! NOT DESTROYED");
}

void CBattle_Suryun::Initialize(BATTLE_INFO_BASE* pCreateInfo, CBattleTeam* pTeam1, CBattleTeam* pTeam2)
{
	CBattle::Initialize(pCreateInfo,&m_PlayerTeam,&m_MonsterTeam);
	m_bDestroyed = FALSE;
	m_pPlayer = NULL;
	m_BattleInfo.BattleState = eBATTLE_STATE_READY;
}

BOOL CBattle_Suryun::IsEnemy(CObject* pOperator,CObject* pTarget)
{
	if(m_BattleInfo.BattleState == eBATTLE_STATE_RESULT)
		return FALSE;
	
	if(pOperator->GetObjectKind() == eObjectKind_Player)
		return pTarget->GetObjectKind() & eObjectKind_Monster;
	else if(pOperator->GetObjectKind() & eObjectKind_Monster)
		return pTarget->GetObjectKind() == eObjectKind_Player;

	return FALSE;
}
BOOL CBattle_Suryun::IsFriend(CObject* pOperator,CObject* pTarget)
{ 
	if(pOperator->GetObjectKind() == eObjectKind_Player)
		return pTarget->GetObjectKind() & eObjectKind_Monster;

	return TRUE;
}

#ifdef _MAPSERVER_

void CBattle_Suryun::GetBattleInfo(char* pInfo,WORD* size)
{
	memcpy(pInfo,&m_BattleSuryunInfo,sizeof(BATTLE_INFO_SURYUN));
	*size = sizeof(BATTLE_INFO_SURYUN);
}
#endif


// event func
void CBattle_Suryun::OnCreate(BATTLE_INFO_BASE* pCreateInfo, CBattleTeam* pTeam1, CBattleTeam* pTeam2)
{
#ifdef _MHCLIENT_
	WINDOWMGR->CreateMPMissionDlg();
	WINDOWMGR->CreateMPNoticeDlg();
	WINDOWMGR->CreateMPGuageDlg();
	GAMEIN->GetMPMissionDialog()->SetActive(TRUE);
	
	m_ResultStartTime = 0;
	m_bSetResultTime = FALSE;
#endif

	m_dwCreateTime = gCurTime;
	BATTLE_INFO_SURYUN* pInfo = (BATTLE_INFO_SURYUN*)pCreateInfo;
	memcpy(&m_BattleSuryunInfo,pInfo,sizeof(BATTLE_INFO_SURYUN));
	m_pPlayer = NULL;
	m_bResultFirst = TRUE;
	SURYUNMISSIONINFO* pMissionInfo = SURYUNMGR->GetMissionInfo(pInfo->MugongIdx);
	ASSERT(pMissionInfo);
	if(pMissionInfo == NULL)
		return;

	m_pSuryunInfo = pMissionInfo->GetSuryunInfo(pInfo->CurrentSung);

	m_KilledCount = 0;
	
#ifdef _MAPSERVER_
	m_pRegen = SURYUNREGENMGR->MakeNewRegen(
		m_pSuryunInfo->RegenNum,
		pInfo->BattleID,
		pInfo->MonsterKindInfo);
#endif

	CBattle::OnCreate( pCreateInfo, pTeam1, pTeam2 );	
}

void CBattle_Suryun::OnFightStart()
{
#ifdef _MAPSERVER_
	m_pRegen->StartProcess();
#else
	m_BattleInfo.BattleTime = gCurTime;
	SURYUNMGR->SetActiveDlg(FALSE);
#endif

	CBattle::OnFightStart();
}
void CBattle_Suryun::OnDestroy()
{
	m_bDestroyed = TRUE;
#ifdef _MAPSERVER_
	SKILLMGR->ReleaseAllSkillInBattle(GetBattleID());
	if(m_pPlayer)
	{		
		CCharMove::ReleaseMove(m_pPlayer);
								
		m_pPlayer->SetBattle(m_BattleSuryunInfo.ReturnBattleID,0);
		m_pPlayer->SetGridID(m_BattleSuryunInfo.ReturnGridID);
		m_pPlayer->GetMoveInfo()->CurPosition = m_BattleSuryunInfo.ReturnPosition;
		
		MSG_DWORD msg;
		msg.Category = MP_SURYUN;
		msg.Protocol = MP_SURYUN_RETURNTOREALWORLD;
		msg.dwData = GAMERESRCMNGR->GetLoadMapNum();		
		m_pPlayer->SendMsg(&msg,sizeof(msg));

		if(m_pPlayer->GetState() == eObjectState_Die)
			OBJECTSTATEMGR_OBJ->EndObjectState(m_pPlayer,eObjectState_Die);
		m_pPlayer->SetLife(m_pPlayer->GetMaxLife(),FALSE);
		m_pPlayer->SetShield(m_pPlayer->GetMaxShield(),FALSE);
		m_pPlayer->SetNaeRyuk(m_pPlayer->GetMaxNaeRyuk(),FALSE);
	}
	SURYUNREGENMGR->ReleaseRegen(m_BattleInfo.BattleID);
#endif

	RemoveAllMonster();

	m_PlayerTeam.Release();
	m_MonsterTeam.Release();

	//CBattle::OnDestroy();
}
void CBattle_Suryun::OnTeamMemberAdd(int Team,DWORD MemberID,char* Name)
{
#ifdef _MAPSERVER_
	CObject* pObj = g_pUserTable->FindUser(MemberID);
#else
	CObject* pObj = OBJECTMGR->GetObject(MemberID);
#endif
	
	if(pObj == NULL)
	{
		MessageBox(NULL,"OnTeamMemberAdd is NULL",NULL,NULL);
		return;
	}

	if(pObj->GetObjectKind() == eObjectKind_Player)
	{
		ASSERT(m_pPlayer == NULL);
		m_pPlayer = (CPlayer*)pObj;
		m_BattleInfo.BattleTime = gCurTime;
#ifdef _MAPSERVER_
		m_pRegen->SetPlayer(m_pPlayer);
#endif
	}
}
BOOL CBattle_Suryun::OnTeamMemberDelete(int Team,DWORD MemberID,char* Name)
{
	if(IsDestroyed())
		return FALSE;

	ASSERT(m_pPlayer);
	if(MemberID == m_pPlayer->GetID())
	{
		SetDestroyFlag();
		m_pPlayer = NULL;
	}

	return FALSE;
}
BOOL CBattle_Suryun::OnTeamMemberDie(int Team,DWORD VictimMemberID,DWORD KillerID)
{
#ifdef _MAPSERVER_
	CObject* pObj = g_pUserTable->FindUser(VictimMemberID);
	if(Team == eBattleTeam1)	// 敲饭捞绢啊 磷菌阑版快
	{
		OBJECTSTATEMGR_OBJ->StartObjectState(pObj,eObjectState_Die,KillerID);	
		((CPlayer*)pObj)->m_bNeedRevive = FALSE;
		Victory(eBattleTeam2,eBattleTeam1);		// 阁胶磐狼 铰府
		return TRUE;
	}
	else
	{
		ASSERT(pObj->GetObjectKind() & eObjectKind_Monster);
		CMonster* pMonster = (CMonster*)pObj;
		if(pMonster->GetMonsterKind() == COMPLETELY_ALL_RECOVER)
		{
			m_pPlayer->SetLife(m_pPlayer->GetMaxLife());
			m_pPlayer->SetShield(m_pPlayer->GetMaxShield());
			m_pPlayer->SetNaeRyuk(m_pPlayer->GetMaxNaeRyuk());
		}
		else if(pMonster->GetMonsterKind() == NORMAL_LIFE_RECOVER)
			m_pPlayer->SetLife(m_pPlayer->GetLife()+m_pPlayer->GetMaxLife() *0.4);
		else if(pMonster->GetMonsterKind() == NORMAL_SHIELD_RECOVER)
			m_pPlayer->SetShield(m_pPlayer->GetShield()+m_pPlayer->GetMaxShield() *0.4);
		else if(pMonster->GetMonsterKind() == NORMAL_NAERYUK_RECOVER)
			m_pPlayer->SetNaeRyuk(m_pPlayer->GetNaeRyuk()+m_pPlayer->GetMaxNaeRyuk() *0.4);
		else
		{
			++m_KilledCount;
			m_pRegen->DecreaseMonster(pMonster->GetSuryunGroup());
			MSG_DWORD msg;
			SetProtocol(&msg,MP_SURYUN,MP_SURYUN_SUCCESSPERCENT);
			msg.dwData = (100*m_KilledCount) / m_pSuryunInfo->MonNum;
			if(msg.dwData > 100)
				msg.dwData = 100;
			m_pPlayer->SendMsg(&msg,sizeof(msg));
		}
	}
#endif
	
	return FALSE;
}
void CBattle_Suryun::OnTeamObjectCreate(int Team,CBattleObject* pBattleObject)
{
}
void CBattle_Suryun::OnTeamObjectDestroy(int Team,CBattleObject* pBattleObject)
{
}
void CBattle_Suryun::OnTeamMemberRevive(int Team,CObject* pReviver)
{
}
void CBattle_Suryun::OnMonsterDistribute(CMonster* pMonster,CObject* pKiller)
{
}

void CBattle_Suryun::OnTick()
{
	DWORD AliveTime = gCurTime - m_dwCreateTime;
	if(AliveTime > 10*60*1000)
	{
		//YH烙矫
		m_BattleInfo.BattleState = eBATTLE_STATE_RESULT;
		m_BattleInfo.BattleTime = gCurTime + 1;
	}

	ySWITCH(m_BattleInfo.BattleState)
		yCASE(eBATTLE_STATE_READY)			
			if(m_pPlayer == NULL)
				return;

			DWORD ElapTime = gCurTime - m_BattleInfo.BattleTime;
			if( ElapTime > BATTLE_SURYUN_READYTIME)
			{
				StartBattle();
			}

		yCASE(eBATTLE_STATE_FIGHT)
#ifdef _MAPSERVER_
			m_pRegen->Process();

			Judge();
#endif

		yCASE(eBATTLE_STATE_RESULT)
#ifdef _MAPSERVER_
			DWORD ElapTime = gCurTime - m_BattleInfo.BattleTime;
			if(m_bResultFirst && ElapTime > BATTLE_SURYUN_RESULTTIME)
			{
				SKILLMGR->ReleaseAllSkillInBattle(GetBattleID());
				RemoveAllMonster();
				m_bResultFirst = FALSE;
				SetDestroyFlag();
			}

#endif
	
	yENDSWITCH
}

// 铰菩 魄沥
BOOL CBattle_Suryun::Judge()
{
	if(m_KilledCount >= m_pSuryunInfo->MonNum)
	{
		Victory(eBattleTeam1,eBattleTeam2);
		return TRUE;
	}
	if(gCurTime - m_BattleInfo.BattleTime > m_pSuryunInfo->LimitTime)
	{
		Draw();
		return TRUE;
	}

	return FALSE;	
}
void CBattle_Suryun::Victory(int WinnerTeamNum,int LoserTeamNum)
{
#ifdef _MAPSERVER_
	SKILLMGR->ReleaseAllSkillInBattle(GetBattleID());
	if(WinnerTeamNum == eBattleTeam1)
	{
		m_pPlayer->AddExpPointToMugong(m_BattleSuryunInfo.MugongIdx,1,TRUE);		
	}
#endif
	CBattle::Victory(WinnerTeamNum,LoserTeamNum);
}
void CBattle_Suryun::Draw()
{
#ifdef _MAPSERVER_
	SKILLMGR->ReleaseAllSkillInBattle(GetBattleID());
#endif
	CBattle::Draw();
}

void CBattle_Suryun::RemoveAllMonster()
{
#ifdef _MAPSERVER_
	ToEachTeam(pTeam)
		YHTPOSITION pos = pTeam->GetPositionHead();
		while(CObject* pObject = pTeam->GetNextTeamMember(&pos))
		{
			if(pObject->GetObjectKind() == eObjectKind_BossMonster)
			{
				g_pServerSystem->RemoveBossMonster(pObject->GetID());
			}
			else if(pObject->GetObjectKind() & eObjectKind_Monster)
			{
				g_pServerSystem->RemoveMonster(pObject->GetID());
			}
		}
	EndToEachTeam	
#endif		

}


// Render
#ifdef _MHCLIENT_


#include "interface/cFont.h"
void CBattle_Suryun::Render()
{
	DWORD ElapsedTime = gCurTime-m_BattleInfo.BattleTime;
	RECT rect;
	SetRect(&rect,30,100,500,150);
	char temp[256];
	sprintf(temp,"Suryun Battle");
	CFONT_OBJ->RenderFont(0,temp,strlen(temp),&rect,0xffffffff);
	ySWITCH(m_BattleInfo.BattleState)
		yCASE(eBATTLE_STATE_READY)
			rect.top += 15;
			rect.bottom += 15;
			sprintf(temp,"Ready");
			CFONT_OBJ->RenderFont(0,temp,strlen(temp),&rect,0xffffffff);
			
		yCASE(eBATTLE_STATE_FIGHT)
			rect.top += 15;
			rect.bottom += 15;
			sprintf(temp,"Fight");
			CFONT_OBJ->RenderFont(0,temp,strlen(temp),&rect,0xffffffff);
			
			DWORD A = m_pSuryunInfo->LimitTime;
			DWORD RemainTime = A > ElapsedTime ? A - ElapsedTime : 0;
			GAMEIN->GetMPGuageDialog()->SetTime(RemainTime);

		yCASE(eBATTLE_STATE_RESULT)
			rect.top += 15;
			rect.bottom += 15;
			sprintf(temp,"Result");
			
			if(m_bSetResultTime == FALSE)
			{
				m_ResultStartTime = gCurTime;
				m_bSetResultTime = TRUE;
				m_bResultEffect = FALSE;
			}
			CFONT_OBJ->RenderFont(0,temp,strlen(temp),&rect,0xffffffff);
			if(gCurTime - m_ResultStartTime > MSGBOXTIME)
			{
				if(m_WinnerTeam == eBattleTeam1)
				{
					if(m_bResultEffect == FALSE)
					{
						EFFECTMGR->StartEffectProcess(eEffect_LevelUpSentence,HERO,NULL,0,0);
						m_bResultEffect = TRUE;
					}
					WINDOWMGR->MsgBox( MBI_MPNOTICE_SUCCESS, MBT_NOBTN, CHATMGR->GetChatMsg(663) );
				}
				else	
					WINDOWMGR->MsgBox( MBI_MPNOTICE_FAIL, MBT_NOBTN, CHATMGR->GetChatMsg(664) );
			}

	yENDSWITCH	
}

#endif

⌨️ 快捷键说明

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