Files
2022-10-26 12:25:11 +08:00

417 lines
10 KiB
C++

//------------------------------------------------------------------------------
/**
월드 상의 오브젝트 특성을 정의
@author
@since
@remarks
- SceneBase에 기본적으로 할일을 올려주는 작업 진행중. ( 재영 )
. 유닛 process / Render
. Object Process / Render
. Packet Parse --> 각 Scene에서 Overide 하여 사용.
-
*/
//=======================================================================================================================
#ifndef _SceneBase_H
#define _SceneBase_H
#include "GameFramework.h"
struct BASE_PLAYERINFO;
struct CHARINFO_FOR_PACKET;
#define MAX_SCENE_NAME 0xFF
#include "FTextParser.h"
#include "FTextSentence.h"
#include "FTextRender.h"
#include "GameFunc.h"
enum
{
IMG_LOADING_BACKGROUND = 0,
IMG_LOADING_BAR,
IMG_LOADING_BAR_START,
IMG_LOADING_BAR_CENTER,
IMG_LOADING_BAR_END,
IMG_MAX_COUNT,
};
enum
{
IMG_LOADING_KALBUS = 1000, //!< 탑돌때는 마지막 이미지라고 생각한다.
};
enum eFADE_STATE
{
eFADE_STATE_NONE,
eFADE_STATE_IN,
eFADE_STATE_OUT,
};
class SceneBase
{
protected:
BOOL m_bEnableRender; // 프로세스가 한번도 실행되지 않은 상태로 랜더링을 실행할 경우가 있다.
// 그래서 프로세스가 실행될때 TRUE 로 셋팅되고,
// 랜더링시 이 변수가 FALSE 이면 랜더링하지 않는다
HANDLE m_hTexture[IMG_MAX_COUNT]; // 로딩 화면
HANDLE m_hLoadingGageTexture; // 로딩 게이지
HANDLE m_hLoadingGageBackTexture; // 로딩 게이지 Back
protected:
// Scene 상의 Global protected Func들을 등록하자
public:
SceneBase( void ) : m_SceneType(SCENE_TYPE_NONE), m_bEnableRender(FALSE),m_fLoadingCount(0.0f),m_fMaxCount(1.0f),m_bChangeImage(FALSE),m_bUsePlayerCollision(FALSE),m_eFadeState(eFADE_STATE_NONE)
{
InitLoadingImg();
}
virtual ~SceneBase( void ) {}
BOOL IsEnablePkScene();
BOOL InPVPScene();
// 각 씬의 내용
virtual void Activate( void ) {} // 활성화 되었을 때
virtual BOOL Init( void );
virtual DWORD AddBattleTimeSerial() { return 0;}
virtual DWORD GetBattleTimeSerial() { return 0;}
virtual BOOL Process( DWORD dwTick ); // 메인 계산
virtual void StartFadeIn();
virtual void SetViewport(); // 뷰포트
virtual BOOL Render( DWORD dwTick ); // 메인 랜더링
virtual BOOL PreInterfaceRender(DWORD dwTick); // 인터페이스 이전 그릴것(2D)
virtual BOOL PostInterfaceRender(DWORD dwTick); // 인터페이스 이후 그릴것(2D)
virtual void Release( void ); // 종료
void UserInterfaceManagersParsePacket( MSG_BASE * pMsg );
void UserInterfaceManagersParsePacketWorld (MSG_BASE * pMsg);
virtual void ParsePacket( MSG_BASE * pMsg ); // 네트워크 패킷 처리
virtual void ParsePacketInChat( MSG_BASE * pMsg ); // 체팅 서버 패킷 처리
virtual BOOL PeekChangeScene();
virtual void ChangeSceneReady(DWORD waitingSec, SCENE_TYPE sceneType);
virtual void ClearSceneReady();
virtual DWORD GetChangeSceneTickOver();
virtual DWORD ProcessChangeSceneOverTick(DWORD dwTick);
virtual DWORD GetCurrentTick();
virtual BOOL SceneWndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam ,SI_MESSAGE *stMessage);
virtual void OnConnectWorldServer() {}
virtual void OnDeviceReset();
virtual void PopupExp(INT64 /*expoffset*/, int bonusExpRatio = 0, int ExpType = 0 ) {}
virtual void IncreaseLoadingProcess();
void InitLoadingImg();
void LoadingImg( BOOL bIsChangeImage = TRUE ,int iForceIndex = -1); // 0번째 배경 인덱스도 있기때문에 -1로 바꿉니다.
void LoadingCI( BOOL bIsChangeImage = TRUE );
void ReleaseLoadingImg();
void RenderLoadingImg();
void RenderLoadingGage();
void ChangeImage(bool bCheck, int iLoadingImg = -1) {m_bChangeImage = bCheck; m_iForceIndex = iLoadingImg; }
void SetReadyDeadFlag(BOOL bFlag);
void ShowBillingAlarm(DWORD dwRestTerm);
void ShowDisconnectAlarm(DWORD dwErrCode);
void loadInitMessage();
void EnablePlayerCollision(BOOL bUse){m_bUsePlayerCollision=bUse;}
BOOL IsEnablePlayerCollision(){return m_bUsePlayerCollision;}
virtual void ProcessFade(DWORD dwTick);
eFADE_STATE GetFadeState();
const TCHAR *GetRevengeName(){ return m_ptszRevengeName;}
SCENE_TYPE GetType() const
{
return m_SceneType;
}
DWORD GetpacketStatus()
{
return m_packetStatus;
}
virtual int OnEndRendering( DWORD dwTick );
#ifdef __NA_0_20080415_PROCESS_END_PROECSS
virtual int OnEndProcess( DWORD dwTick );
#endif
virtual RELATIONKIND::TYPE GetRelationKindOfCharacter( Character* pObject, BOOL bForceEnemy ) { return RELATIONKIND::Friend; }
virtual void InserCenterTextMessage( char * szText, DWORD eType ) {}
virtual void InsertKillMessage(
TCHAR* first_user_id,
DWORD first_user_color,
TCHAR* second_user_id,
DWORD second_user_color,
TCHAR* format_string) // 전장 킬 메세지
{
}
#ifdef _NA_007114_20140313_CHAOSZONE_GOLDRUSH
virtual void InsertMonsterKillMessage(
TCHAR* first_user_id,
DWORD first_user_color,
TCHAR* monster_id,
DWORD second_user_color,
TCHAR* format_string) // 골드러시 킬 메세지
{
}
#endif // _NA_007114_20140313_CHAOSZONE_GOLDRUSH
private:
void loadLoadingMessage();
protected:
// 게임 서버 패킷 Proc
virtual void OnRecvCG_CONNECTION( MSG_BASE * pMsg );
virtual void OnRecvCG_CHARINFO( MSG_BASE * pMsg );
virtual void OnRecvCG_MAP( MSG_BASE * pMsg );
virtual void OnRecvCG_SYNC( MSG_BASE * pMsg );
virtual void OnRecvCG_BATTLE( MSG_BASE * pMsg );
virtual void OnRecvCG_SKILL( MSG_BASE * pMsg );
virtual void OnRecvCG_CONVERSATION( MSG_BASE * pMsg );
virtual void OnRecvCG_ETC( MSG_BASE * pMsg );
virtual void OnRecvCG_GM( MSG_BASE * pMsg );
virtual void OnRecvCG_Chao( MSG_BASE * pMsg );
virtual void OnRecvCG_Party( MSG_BASE * pMsg);
void OnRecvCG_ArmorKit(MSG_BASE * pMsg);
// 채팅 서버 패킷 Proc
virtual void OnRecvCW_CHAT( MSG_BASE * pMsg );
virtual void OnRecvCW_CRYPTOGRAPHY( MSG_BASE * pMsg );
#ifdef _NA_008283_20150511_NOTIFICATIONS_SYSTEM
virtual void OnRecvCW_NOTIFICATION( MSG_BASE* message );
#endif // _NA_008283_20150511_NOTIFICATIONS_SYSTEM
void OnRecvCG_CRYPTOGRAPHY(MSG_BASE * pMsg);
#ifdef _JBH_ADD_AGE_LIMIT_MARK
virtual void RenderGameRatingMark();
virtual void LoadingGameRatingMarkTexture();
virtual void ReleaseGameRatingMarkTexture();
#endif
FTextParser m_FTextParser;
FTextSentence m_FTextSentence;
FTextRender m_FTextRender;
FTextParser m_TipFTextPraser;
FTextSentence m_TipFTextSentence;
FTextRender m_TipFTextRender;
// 4:3 비율 이미지를 기본으로 사용하고 wide 일경우에는 높이를 짤라서 사용한다.
const static int kLoadingImageWidth = 1024;
const static int kLoadingImageHeight = 768;
#ifdef _JBH_ADD_AGE_LIMIT_MARK
HANDLE m_hGameRatingMarkTexture;
#endif //_JBH_ADD_AGE_LIMIT_MARK
// Auth 서버 패킷 Proc
// 큐매니저 proc
protected:
virtual void OnRecvCG_CONNECTION__CG_PREPARE_WORLD_CONNECT_ACK( MSG_BASE * pMsg );
virtual void OnRecvCG_CONNECTION__CG_PREPARE_WORLD_CONNECT_NAK( MSG_BASE * pMsg );
public:
virtual void KeyManagerProc(DWORD wParam,DWORD lParam);
protected:
SCENE_TYPE m_SceneType;
DWORD m_packetStatus; //패킷 상태 관리-지완 추가
BOOL m_bChangeSceneReady; //ChangeSceneReady
DWORD m_dwChangeSceneTick; //ChangeSceneReady가 호출된 시점의 Tick
DWORD m_dwChangeSceneOverTick; //
DWORD m_dwChangeSceneSecond; //
SCENE_TYPE m_ChangeSceneType; //
DWORD m_dwBaseTick; // Tick
BOOL m_bReadyDeadFlag;
TCHAR m_ptszRevengeName[MAX_CHARNAME_LENGTH+1];
float m_fLoadingCount;
float m_fMaxCount;
BOOL m_bUsePlayerCollision; //플레이어간의 충돌 처리를 할것인가.패스 엔진이 적용된 맵만 가능함
DWORD m_dwCurFadeTime;
BOOL m_bFristRender;
BOOL m_bChangeImage;
eFADE_STATE m_eFadeState;
int m_iForceIndex;
private:
// Attributes
// ...
};
//------------------------------------------------------------------------------
/**
각종 공용 초기화
*/
inline BOOL SceneBase::Init()
{
m_dwCurFadeTime=0;
m_packetStatus=0;
m_bChangeSceneReady = FALSE;
m_dwBaseTick = 0;
m_dwChangeSceneTick = 0;
m_dwChangeSceneOverTick = 0;
m_dwChangeSceneSecond = 0;
m_bReadyDeadFlag = FALSE;
m_bUsePlayerCollision =FALSE;
m_bFristRender=TRUE;
ZeroMemory(m_ptszRevengeName,sizeof(m_ptszRevengeName));
return TRUE;
}
inline void SceneBase::SetReadyDeadFlag(BOOL bFlag)
{
m_bReadyDeadFlag = bFlag;
}
//------------------------------------------------------------------------------
/**
*/
inline BOOL SceneBase::PeekChangeScene()
{
return m_bChangeSceneReady;
}
//------------------------------------------------------------------------------
/**
*/
inline void SceneBase::ChangeSceneReady(DWORD waitingSec, SCENE_TYPE sceneType)
{
m_bChangeSceneReady = TRUE;
m_dwChangeSceneTick = GetCurrentTick();
m_dwChangeSceneOverTick = GetCurrentTick() + (waitingSec * 1000);
m_ChangeSceneType = sceneType;
}
//------------------------------------------------------------------------------
/**
*/
inline DWORD SceneBase::GetChangeSceneTickOver()
{
return m_dwChangeSceneOverTick;
}
//------------------------------------------------------------------------------
/**
*/
inline DWORD SceneBase::ProcessChangeSceneOverTick(DWORD dwTick)
{
m_dwChangeSceneTick += dwTick;
return m_dwChangeSceneTick;
}
//------------------------------------------------------------------------------
/**
*/
inline DWORD SceneBase::GetCurrentTick()
{
return m_dwBaseTick;
}
//------------------------------------------------------------------------------
/**
*/
inline void SceneBase::ClearSceneReady()
{
m_bChangeSceneReady = FALSE;
}
//------------------------------------------------------------------------------
/**
*/
inline int SceneBase::OnEndRendering( DWORD /*dwTick*/ )
{
return 0;
}
extern int g_iLoadingImage;
//#define _WRITE_SCENE_LOG
#ifdef _WRITE_SCENE_LOG
static void xxInitSceneLog(int t)
{
if( FILE* fp = fopen("c:\\ddafds.txt", "w") )
{
fprintf(fp, "init\n");
fclose(fp);
}
};
static void xxWriteSceneLog( const char* message, ... )
{
char buffer[2048];
va_list args;
va_start(args, message);
_vsntprintf( buffer, 2048-1, message, args );
va_end(args);
if( FILE* fp = fopen("c:\\ddafds.txt", "a") )
{
fprintf(fp, buffer);
fprintf(fp, "\n");
fclose(fp);
}
};
#else
#define xxInitSceneLog
#define xxWriteSceneLog
#endif // _WRITE_SCENE_LOG
#endif // _SceneBase_H