#pragma once #include "K3DTypes.h" #include "KObject.h" #include "ArcadiaClient.h" #include #include "SGameObject.h" //#include //이것들은 나중에 한 곳으로 몰자~ #define DEFAULT_ACTIVE 0 #define GAME_TYPE_01 0 #define GAME_TYPE_02 1 #define GAME_TYPE_03 2 #define GAME_TYPE_04 3 #define GAME_TYPE_05 4 #define GAME_TYPE_06 5 #define GAME_TYPE_07 6 #define GAME_TYPE_08 7 #define GAME_TYPE_09 8 #define GAME_TYPE_10 9 class KSequencer; class K3DCamera; class K3DRenderDeviceDX; class KViewportObject; class SSoundManager; class K3DTexture; class KTextureManager; class KNX3Manager; class SGameMilesSoundMgr; class SGameLoad; class SGameEffect; class SGameViewPort; class SShadowViewPort; class SGameVM; class SGameInterface; class KUIGenWnd; //Game DB struct SBASICSTAT_DATA; struct SCREATURE_DATA; struct SITEM_DATA; struct SJOB_DATA; struct SMONSTER_DATA; struct SSKILL_DATA; struct STENACITY_DATA; struct SGameMessage; struct STMSG_TIMESYNC; struct SMSG_LOGIN; struct TS_MESSAGE; struct TS_MOVE; struct TS_MOVE_ACK; struct TS_REGION_ACK; struct TS_LEAVE; struct TS_ENTER; struct TS_LOGIN_RESULT; struct TS_TIMESYNC; #define RAMADAN_PRAY_ROOM1 10000 #define RAMADAN_PRAY_ROOM2 10001 #define RAMADAN_PRAY_ROOM_X 1 #define RAMADAN_PRAY_ROOM_Y 0 /// [sonador] SWeatherAttr forward declaratino namespace env_fx { #ifdef DISTANCE_VIEW struct SSkyBoxAttr; struct SDistanceViewAttr; #endif struct SWeatherAttr; struct SWeatherInfo; struct SThunderAttr; struct SLightningAttr; } /** SGame 초기화 지시 "GAMECREATE" */ struct KCreateGameMessage : public KArg { KCreateGameMessage( float _x, float _y ) : x( _x ), y( _y ) { } float x, y; }; struct FX_DATA { FX_DATA() { nFX_ID = 0; nEffPos = 0; owner = 0; attack = 0; target = 0; nMode = 0; //NORMAL Mode nPlayID = 0; fPlayRate = 1.f; //STATE Mode nStateCode = 0; end_time = 0; ///< 상태 이상 종료 시간 state_handle = 0; ///< 상태 이상 핸들 bIsLoop = false; ///< 반복되는 Fx인가 keyhandleid = -1; keytime = -1; bDir = true; } //공통 int nFX_ID; int nEffPos; AR_HANDLE owner; AR_HANDLE attack; AR_HANDLE target; int nMode; //--NORMAL Mode int nPlayID; float fPlayRate; //--STATE Mode unsigned short nStateCode; ///< 상태 이상 코드 AR_TIME end_time; ///< 상태 이상 종료 시간 unsigned short state_handle;///< 상태 이상 핸들 bool bIsLoop; int keyhandleid; int keytime; bool bDir; }; struct FX_DATA_EX { FX_DATA_EX( const char* pEffectName, int nFlag, AR_HANDLE hOwner, AR_HANDLE hCaster, AR_HANDLE hTarget, int nUseBoneIndex, bool bOwnerDir = false, int nAniType = 0, float fPlayRate = 4.8f, AR_TIME end_time = 0) { m_pEffectName = pEffectName; m_nFlag = nFlag; m_owner = hOwner; m_caster = hCaster; m_target = hTarget; m_nUseBoneIndex = nUseBoneIndex; m_nAniType = nAniType; m_fPlayRate = fPlayRate; m_end_time = end_time; m_bIsOwnerDir = bOwnerDir; } const char * m_pEffectName; int m_nFlag; ///< 1이면 따라감 2이면 활 공격 AR_HANDLE m_owner; AR_HANDLE m_caster; AR_HANDLE m_target; int m_nUseBoneIndex; int m_nAniType; float m_fPlayRate; AR_TIME m_end_time; bool m_bIsOwnerDir; }; struct ATTACK_FX_DATA { ATTACK_FX_DATA() : nFX_ID(0), hAttack(0), hTarget(0) { } int nFX_ID; AR_HANDLE hAttack; AR_HANDLE hTarget; }; enum { GAME_TYPE_LOAD = 0, // Loading screen GAME_TYPE_TUTORIAL, // Tutorial GAME_TYPE_LOGIN, // Login GAME_TYPE_SELECT, // Character selection GAME_TYPE_WORLD, // World GAME_TYPE_MOVIE, // Cinematic/movie GAME_TYPE_END, // Ended/terminated game }; struct STRUCT_CREATURE_CMD_SCRIPT { enum C_CMD_SCRIPT { CMD_NONE = 0, CMD_STANDBY, CMD_IDLE, CMD_MOVE, CMD_ATTACK, CMD_SKILL }; AR_HANDLE mHandle; AR_HANDLE cHandle; AR_HANDLE tHandle; C_CMD_SCRIPT nCmdScipt; short nSlotNum; short nCreaturePosition; }; enum GET_PLAYER_INFO { GET_HP = 0, GET_MP, GET_MAXHP, GET_MAXMP, GET_PERCENTHP, GET_PERCENTMP, }; //=============================================================================== /// SGame : Game 하나~ class SGame : public SGameObject { public: enum { STAGE_NOTHING = 0, // Nothing STAGE_LOADING, // Loading data STAGE_MAP_LOAD_BUFFER, // Screen transition before map loading STAGE_MAP_PRELOAD, // Preload map STAGE_MAP_LOADING, // The meaning isn’t perfect… let’s use it together. STAGE_MAP_LOADING_AFTER, // Process messages accumulated after map loading completes STAGE_ING, // Processing STAGE_FADE_IN, // Fade In STAGE_FADE_IN_END, // Fade In Finished STAGE_FADE_OUT, // Fade Out STAGE_FADE_OUT_END, // Fade Out Finished STAGE_EVENT_SCENE, // Playing an event scene STAGE_WARP_COMPLETE, // Warp complete STAGE_END, // End, move to next Stage }; SGame( class SGameManager*, int nGameType, K3DRenderDeviceDX *pRenderDevice, SSoundManager * pSoundMng, KTextureManager * pTextureMng, KNX3Manager * pNX3Mng, SGameMilesSoundMgr* pMSoundMgr ); virtual ~SGame(void); virtual unsigned char GetGameObjectType( AR_HANDLE objHandle ){ assert(0); return 0; }; virtual void ApplyOption( int nOptionType ) {}; virtual void ToggleHelpWindow() {}; virtual void SetViewPort( class SGameViewPort* pViewPort ); virtual void SetRenderFlag( int nFlag ) { assert(0); }; virtual bool Render( unsigned long uRenderBitVector, KViewportObject** ppViewPortList, int nViewportCount ); virtual bool Process( DWORD time, unsigned long uProcessBitVector=0 ); virtual void AfterRender( unsigned long uRenderBitVector ) {}; virtual void AssistTarget( AR_HANDLE handle ) { assert(0); }; virtual void DropItem( AR_HANDLE handle ) { assert(0); }; virtual void ProcConsole( struct SGameMessage* pGameMsg ); virtual void *Perform( KID id, KArg& msg ) { return (void*)0; } virtual void AddSummon( class SGameAvatarEx * pSummon, struct SMSG_ENTER* pEnterMsg ) { assert(0); }; virtual void LeaveSummon( AR_HANDLE hLeaveHandle ) { assert(0); }; virtual void DelSummon( AR_HANDLE hCreature ) { assert(0); }; virtual void EvolutionSummon( struct SMSG_SUMMON_EVOLUTION* pMsg ) { assert(0); } virtual void AddSkillProp( class SGameAvatarEx * pSkillProp ) { assert(0); } virtual void SetPlayerAttack( class SGameAvatarEx * pTarget ) {}; virtual struct DATA_CREATURE * IsLocalCreature( AR_HANDLE handle ) { return NULL; } virtual SGameAvatarEx* IsSummonCreature( AR_HANDLE handle ) { return NULL; } // { sonador 10.2.1 팻 시스템 구현 /// if there exists a local pet has the handle which has passed through, return it's data structure virtual struct DATA_PET* IsLocalPet( AR_HANDLE handle ) { return NULL; } /// 이 팻이 소환되어 있는 상태인가? virtual SGameAvatarEx* IsSummonPet( AR_HANDLE handle ) { return NULL; } /// 로컬 팻우리인가? 그렇다면, 해당 데이터를 반환한다. virtual struct DATA_PET* IsLocalPetCage( AR_HANDLE handle ) { return NULL; } /// add pet whose master is local player virtual void AddPet( class SGameAvatarEx* pet, struct SMSG_ENTER* enterMsg ) { assert( 0 ); } /// remove pet whose master is local player virtual void RemovePet( AR_HANDLE handle ) { assert( 0 ); } // } //Effect========================================================================== virtual int AddEffectTest( const char * pFileName, AR_HANDLE hOwner ); virtual int AddEffect( FX_DATA * pFX_data ); virtual int AddEffect( FX_DATA_EX * pFX_data ); virtual int AddEffect( AR_HANDLE hAttacker, AR_HANDLE hTarget, AR_HANDLE hOwner, int nEffectID, int nEffectPos, bool bIsLoopFx ); virtual int AddAttackEffect( FX_DATA * fxdata ); virtual void DelEffect( int nEffectID ); virtual void DelOwnerEffect( AR_HANDLE hOwner ); virtual void EndLoopFx( int nEffectID ); virtual void OnDamage( AR_HANDLE target, struct SGameMessage* pDamage ) {} virtual void OnSkillDamage( AR_HANDLE caster, AR_HANDLE target, struct SGameMessage* pDamage ) {} virtual void OnDotDamage( struct SMSG_DAMAGE* pDamage, bool bFinalDmg = false ) {} virtual void OnDisplayDamage( struct SMSG_DAMAGE* pDamage ) {} virtual void OnUISync( AR_HANDLE caster, AR_HANDLE target ) {} virtual void AddStateEffect( SGameMessage * pGameMsg ); virtual void UpdateStateEffect( SGameMessage * pGameMsg ); virtual void DelStateEffect( SGameMessage * pGameMsg ); virtual void DelStateEffect( int nDelObjType ); /// 인터페이스 메니저로 바로 처리 virtual void SendGameInterfaceMsg( struct SGameMessage * game_msg ); //Particle======================================================================== virtual int AddEnhanceEffect( class SGameAvatarEx* pAvatar, int nWeaponEffectPos, struct EnhanceFX* pEnhanceFx, int nItemClass ); virtual void RemoveEnhanceEffect( int nEnhanceFxID ); virtual void SetRenderEnhanceFx( int nEnhanceFxID, bool bRender ); /// Network 설정==================================================================== virtual void SetNet( ArcadiaClient * pObject ) { m_pArObject = pObject; } const ArPosition & GetTargetPos() { return m_pArObject->GetTargetPos(); } virtual void ProcMsgAtStatic( SGameMessage * pGameMsg ); virtual bool onLeave( _Object *pPtr ) { return true; }; //Send 메세지~ virtual void PendMessage( const TS_MESSAGE * pMessage ); virtual void SendMsg( SGameObject *pGO, const TS_MESSAGE *msg ); virtual void SendMsg( const TS_MESSAGE *msg ); virtual void ReqMove( AR_HANDLE handle, const ArPosition & target, const ArPosition * targetposdata, int count, bool bSpeedSync ); virtual void Bot_Accept( int nSelect, const char * pName ) {} /// 프로세스, 네트웍 Send 까지 모두 막는다. virtual void StopProcess() { m_bStopProc = true; } bool IsStopProcess() { return m_bStopProc; } bool IsUIWindowOpened( int nWindowID ); bool IsWebPageWndOpened(); /// Game 상태 관련 void SetGameRef( int nGameRef ); int GetGameRef() { return m_nGameRef; } /// 더 이상 사용 안 함 void SetGameTypeEnd() { m_nGameType = GAME_TYPE_END; } int GetGameType() { return m_nGameType; } int GetNextGameType() { return m_nNextGameType; } /// Game이나, 맵엔진 쪽으로 빼야 한다. K3DTexture * CreateBump(K3DRenderDeviceDX *pDevice); K3DCamera* GetCamera() { return m_pCamera; } SGameViewPort* GetViewPort() { return m_pViewPort; } virtual void OnSysCommand( const char *pChat, std::vector< std::string > & vToken ); //게임 옵션 관련 virtual void WarpComplete( struct SGameMessage * pMsg ) {}; virtual void Game_LensFlare ( BOOL bFlag ) {}; virtual void Game_Cloud ( BOOL bFlag ) {}; virtual void Game_Prop ( BOOL bFlag ) {}; virtual void Game_Effect ( BOOL bFlag ) {}; virtual void Game_Sound ( BOOL bFlag ) {}; virtual void Game_Music ( BOOL bFlag ) {}; virtual void Game_Resolution ( int nResolution ) {}; virtual void Game_FSAA ( int nSize ) {}; virtual void Game_Cloud_vis ( float fVisibility ) {}; virtual void Game_Cloud_speed( float fSpeed ) {}; virtual void Game_Camera_fov ( float fFov ) {}; virtual void Game_Mip_Range ( float fRange ) {}; virtual void Game_Mip_Bias ( float fMipBias ) {}; virtual void Game_Sky_Color ( int nR, int nG, int nB, int nA ) {}; virtual void Game_Fog_Color ( int nR, int nG, int nB, int nA ) {}; virtual void Game_Target_CamPos( int nX, int nY, int nZ ) {}; virtual void Game_Sound_Set_Volume( int nVolume ); virtual void Game_Env_Off ( bool bOnOff ); virtual void Game_Music_Off( bool bOnOff ); virtual void Game_Light ( int type, K3DColor col ) {}; virtual void Game_Light_Pos ( int nX, int nY, int nZ ) {}; virtual void Game_Fog_Height_Start( float nUnit ) {}; virtual void Game_Fog_Height_End ( float nUnit ) {}; virtual void Game_Fog_Linear_Start( float nUnit ) {}; virtual void Game_Fog_Linear_End ( float nUnit ) {}; virtual void Game_Sky_Color_Start( int nR, int nG, int nB ) {}; virtual void Game_Sky_Color_Mid ( int nR, int nG, int nB ) {}; virtual void Game_Sky_Color_End ( int nR, int nG, int nB ) {}; virtual void Game_Sky_Color_MaxHeight( int nMaxHeight ) {}; virtual void Game_Sky_Color_MidHeightPercent( float fMidHeightPercent ) {}; virtual void Game_Sky_Color_MinHeight( int nMinHeight ) {}; virtual void Game_Cloud_Color( int nR, int nG, int nB, int nA ) {}; virtual void Game_Terrain_Specular( float fSpecular ) {}; virtual void Game_CharSkin_Color( float fAmbiant, float fDiffuse ) {}; virtual void Game_DryWet_Volume( float fDryVol, float fWetVol ) {}; virtual void Game_Effect_Light( int type, K3DColor col ) {}; virtual void Game_Effect_Light_Range( int nRange ) {}; virtual void Game_Effect_Light_Attenuation( float fAttenuation ) {}; virtual void SetUI_TargetActiveInfo( AR_HANDLE handle, int nType ) {}; virtual bool IsAttack(class SGameAvatarEx* pPickObject, int nSkillID = 0) { return false; } //virtual bool IsAttack( class SGameAvatarEx * pPickObject ) { return false; } virtual void AddGameInput( class SGameInput * pInput ) {}; void SetCheatMode( int nMode ); int GetCheatMode() { return m_nCheatMode; } enum { CHEAT_NONE, CHEAT_MODE01, CHEAT_MODE02, CHEAT_MODE03, }; /// 크리처 스크립 명령어 virtual void SendCreatureCmdScript( STRUCT_CREATURE_CMD_SCRIPT &sCCmdScr ){}; virtual int GetSelectedState( AR_HANDLE handle, GET_PLAYER_INFO nInfo ){ return 0; }; /// { [sonador] 날씨 스크립 명령어 virtual int GetWeatherTheme() const { return 0; } virtual void SetWeatherTheme( env_fx::SWeatherInfo* pInfo ) {} virtual void ChangeWeatherState( int nState ) {} virtual void SetThunderAttribute( env_fx::SThunderAttr* pAttr ) {} virtual void SetLightningAttribute( env_fx::SLightningAttr* pAttr ) {} // } #ifdef DISTANCE_VIEW virtual env_fx::SSkyBoxAttr* GetSkyThemeInfo() const { return 0; } virtual void SetSkyThemeInfo( env_fx::SSkyBoxAttr* pAttr ) {} virtual env_fx::SDistanceViewAttr* GetDistanceViewInfo() const { return 0; } virtual void SetDistanceViewInfo( env_fx::SDistanceViewAttr* pDistanceViewInfo ) {} virtual bool ChangeDistanceView( int local_id ) { return 1; } #endif /// 자동이동 명령 virtual K3DVector* GetWayPoint( int& nWayPointID ){ return NULL; } ///지역 관련 명령 virtual void SetLocalInfo( int nLocalID ) {} virtual void SetWorldInfo() {} int GetEnhanceRecycleID(); /// 파티클 치트키 void ParticleQuality( int nQuality ); void ParticleLifeTime( DWORD dwLifeTime ); void ParticleMoveSpeed( float fSpeed ); void ParticleSize( float fStartSize, float fEndSize ); void ParticleEmitRadius( K3DVector vEmitRadius ); void ParticleEmitRate( float fMin, float fMax ); void ParticleCreateInterval( float fInterval ); void ParticleMinDirection( K3DVector vMinDirection ); void ParticleMaxDirection( K3DVector vMaxDirection ); void EnhanceFxType( int nType ); int IsFriend( AR_HANDLE Handle, unsigned char& rType ); bool CheckCameraDistance( SGameObject* pObject ); SGameManager* GetGameManager() { return m_pGameMng; } // 2011.07.07 - servantes virtual class CTerrainMapEngine* getTerrainMapEngine() const { return NULL; } protected: SGameEffect* CreateEffect( const char * pEffectName, int nFlag, AR_HANDLE owner, AR_HANDLE caster, AR_HANDLE target, int nUseBoneIndex, int nAniType, float fPlayRate, AR_TIME end_time, bool bIsOwnerDir ); void _AllDelEffect(); void AllDelParticle(); bool m_bStopProc; ArcadiaClient m_Object; DWORD m_dwTime; FLOAT m_fTime; ///< Current time in seconds float m_fAccumTime; ///< the global time - Speed Tree FLOAT m_fElapsedTime; ///< Time elapsed since last frame //Select Character Index int m_nCurSelect; int m_nSpecialSelect; //Render K3DRenderDeviceDX* m_pRenderDevice; SSoundManager* m_pSoundMng; KTextureManager* m_pTextureMng; KNX3Manager* m_pNX3Mng; SGameMilesSoundMgr* m_pMSoundMgr; K3DCamera* m_pCamera; SGameViewPort* m_pViewPort; //Effect std::vector< class SGameEffect* > m_vEffectList; int m_nEffectID; ///< 순차 Effect ID 발급 std::vector< class SGameEffectEx* > m_vNewEffectList; int m_nNewEffectID; ///< 순차 Effect ID 발급 std::vector< class SGameAttackEffect* > m_vAttackEffectList; int m_nAttackEffectID; //파티클 std::vector< class SGameEnhanceFx* > m_vEnhanceFxList; int m_nNewEnhanceFxID; queue< int > m_RecycleID; ///< 재사용할 파티클 아이디 //Network ArcadiaClient * m_pArObject; int m_nDeltaX; int m_nDeltaY; int m_nDeltaSpeed; int m_nGameRef; ///< 게임 상태 참조 int m_nGameType; ///< 게임 타입 int m_nNextGameType; ///< 다음 예약 게임 타입 class SGameManager * m_pGameMng; // int m_nCheatMode; // };