Register for your free account! | Forgot your password?

Go Back   elitepvpers > MMORPGs > Last Chaos
You last visited: Today at 01:47

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



Ultimativer Hack

Discussion on Ultimativer Hack within the Last Chaos forum part of the MMORPGs category.

Closed Thread
 
Old 01/25/2013, 17:11   #1636

 
damona's Avatar
 
elite*gold: 199
Join Date: Dec 2010
Posts: 2,161
Received Thanks: 2,695
Lol, hier denken echt welche Assembler wäre illegal, wieso sollte ne Programmiersprache illegal sein ? Welche Logik die Leute hier haben wundert mich
damona is offline  
Thanks
2 Users
Old 01/25/2013, 17:22   #1637
 
elite*gold: 0
Join Date: Jan 2012
Posts: 64
Received Thanks: 18
Quote:
Originally Posted by damona View Post
Lol, hier denken echt welche Assembler wäre illegal, wieso sollte ne Programmiersprache illegal sein ? Welche Logik die Leute hier haben wundert mich
Wer hat das geschrieben? Aufjedenfall wurden durch den Hack Einahmeausfälle und hohe Kosten auf Seiten Gamigos erzeugt. Und auf das hat Falo, wie er selbst schon des Öfteren indirekt gesagt hat hingearbeitet.
RumaniaPower is offline  
Old 01/25/2013, 17:28   #1638
 
Klo.Brille's Avatar
 
elite*gold: 0
Join Date: Aug 2012
Posts: 270
Received Thanks: 42
Quote:
Originally Posted by Klo.Brille View Post
Code:
/*
 *  Last Chaos
 *  Copyright (c) 1998, CroTeam. All rights reserved.
 *
 */


#include "StdH.h"
#include <io.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <process.h>
#include <Engine/CurrentVersion.h>
#include <Engine/Templates/Stock_CEntityClass.h>
#include <Engine/Templates/Stock_CFontData.h>
#include <Engine/Interface/UIManager.h>				// yjpark
#include <Engine/Interface/UIMouseCursor.h>
#include <Engine/GameState.h>
#include <Engine/GlobalDefinition.h>
#define DECL_DLL
#include <EntitiesMP/Global.h>
#include "resource.h"
//#include "SplashScreen.h"
#include "MainWindow.h"
#include "GlSettings.h"
//#include "LevelInfo.h"
//#include "LCDDrawing.h"
#include "CmdLine.h"
//#include "Credits.h"
#include <Engine/Base/Protection.h>
#if COPY_PROTECTION
	#include <Engine/Base/Protection.cpp>
#endif
#include <Engine/Network/Web.h>
#include <TlHelp32.h>
#include <float.h>
#include <Ext_ipc_event.h> // IPC
ENGINE_API extern cWeb g_web;
extern ENGINE_API char *g_szExitError;

#ifdef XTRAP_SECURE_CKBANG_2010_07_20
    #include "xTrapWrapper.h"
#endif

//#undef XTRAP_SECURE_CKBANG_2010_07_20

#ifndef NO_GAMEGUARD
#include <Nksp/GameGuard.h>
#endif

#ifndef NO_GAMEGUARD
extern ENGINE_API CTString g_szHackMsg;
#endif

//CTString _fnmForCDCheck = "Bin\\SeriousSam.exe";

// application state variables by NSP
extern BOOL g_bTcp = TRUE;
// end of ..

extern CGame		*_pGame = NULL;

// application state variables
//extern BOOL _bRunning = TRUE;
//extern BOOL _bQuitScreen = TRUE;
//extern BOOL _bMenuActive = FALSE;
//extern BOOL _bMenuRendering = FALSE;
#pragma comment(lib, "SharedMemoryDll.lib")


static PIX _apixRes[][2] = {	 
	640, 480,	 
		800, 500,
		800, 600,	 
		1024, 768,
		1152, 864,	
		1280, 800,
		1280, 960,	
		1280, 1024,
		1600,1200,    	
};

extern void enableFPExceptions()
{
    int i = _controlfp (0,0);

    i &= ~ (EM_ZERODIVIDE);

    _controlfp (i, MCW_EM);
}

// helper for limiting window size when changing mode out of full screen
extern void FindMaxResolution( PIX &pixSizeI, PIX &pixSizeJ)
{
	const INDEX ctResolutions = ARRAYCOUNT(_apixRes);
	for( INDEX iRes=(ctResolutions-1); iRes>=0; iRes--) 
	{
		if( pixSizeI>_apixRes[iRes][0] && pixSizeJ>_apixRes[iRes][1]) 
		{
			pixSizeI = _apixRes[iRes][0];
			pixSizeJ = _apixRes[iRes][1];
			return;
		}
	} // should not end up here
	ASSERTALWAYS( "Desktop resolution too low!");
	pixSizeI = _apixRes[0][0];
	pixSizeJ = _apixRes[0][1];
}

//extern BOOL _bDefiningKey;		// ¿øº».
extern BOOL _bDefiningKey = FALSE;
//static BOOL _bReconsiderInput = FALSE;
extern PIX  _pixDesktopWidth  = 0;
extern PIX  _pixDesktopHeight = 0;

static INDEX sam_iMaxFPSActive   = 500;
static INDEX sam_iMaxFPSInactive = 10;
static INDEX sam_bPauseOnMinimize = TRUE; // auto-pause when window has been minimized
extern ENGINE_API INDEX	sam_bWideScreen;		// yjpark
extern FLOAT sam_fPlayerOffset = 0.0f;

// Window handle
extern ENGINE_API HWND	_hwndMain;

// display mode settings
extern ENGINE_API BOOL	_bWindowChanging;				// yjpark |<--
extern ENGINE_API INDEX sam_bFullScreenActive;
extern ENGINE_API INDEX sam_iScreenSizeI;
extern ENGINE_API INDEX sam_iScreenSizeJ;
extern ENGINE_API INDEX sam_iDisplayDepth;
extern ENGINE_API INDEX sam_iDisplayAdapter;
extern ENGINE_API INDEX sam_iGfxAPI;	// 0==OpenGL	// yjpark     -->|
extern INDEX sam_bFirstStarted = FALSE;
extern FLOAT sam_tmDisplayModeReport = 5.0f;
//extern INDEX sam_bShowAllLevels = FALSE;
//extern INDEX sam_bMentalActivated = FALSE;

// network settings
extern CTString sam_strNetworkSettings = "";
// command line
extern CTString sam_strCommandLine = "";

// 0...app started for the first time
// 1...all ok
// 2...automatic fallback
static INDEX _iDisplayModeChangeFlag	= 0;
static TIME _tmDisplayModeChanged		= 100.0f; // when display mode was last changed

// rendering preferences for automatic settings
extern INDEX sam_iVideoSetup = 1;  // 0==speed, 1==normal, 2==quality, 3==custom
// automatic adjustment of audio quality
extern BOOL sam_bAutoAdjustAudio	= TRUE;

extern INDEX sam_bAutoPlayDemos		= TRUE;
static INDEX _bInAutoPlayLoop		= TRUE;

// menu calling
/*
extern INDEX sam_bMenuSave     = FALSE;
extern INDEX sam_bMenuLoad     = FALSE;
extern INDEX sam_bMenuControls = FALSE;
extern INDEX sam_bMenuHiScore  = FALSE;
*/
extern INDEX sam_bToggleConsole		= FALSE;
//extern INDEX sam_iStartCredits		= FALSE;

// for mod re-loading
extern CTFileName _fnmModToLoad		= CTString("");
extern CTString _strModServerJoin	= CTString("");
extern CTString _strURLToVisit		= CTString("");


// state variables fo addon execution
// 0 - nothing
// 1 - start (invoke console)
// 2 - console invoked, waiting for one redraw
extern INDEX _iAddonExecState		= 0;
extern CTFileName _fnmAddonToExec	= CTString("");

// logo textures
//static CTextureObject  _toLogoCT;
//static CTextureObject  _toLogoODI;
//static CTextureObject  _toLogoGSpy;
//static CTextureObject  _toLogoEAX;
//extern CTextureObject *_ptoLogoCT  = NULL;
//extern CTextureObject *_ptoLogoODI = NULL;
//extern CTextureObject *_ptoLogoGSpy = NULL;
//extern CTextureObject *_ptoLogoEAX = NULL;

extern CTString sam_strVersion = "0.5";
//extern CTString sam_strModName = TRANS("Prologue");
/*
#if _SE_DEMO
extern CTString sam_strFirstLevel = "Levels\\KarnakDemo.wld";
#else
extern CTString sam_strFirstLevel = "Levels\\01_Hatshepsut.wld";
#endif
*/
extern CTString sam_strIntroLevel = "Levels\\Intro.wld";
extern CTString sam_strGameName = "serioussam";

//extern CTString sam_strTechTestLevel = "Levels\\TechTest.wld";
//extern CTString sam_strTrainingLevel = "Levels\\KarnakDemo.wld";

ENGINE_API extern INDEX snd_iFormat;


// main window canvas
/*CDrawPort *pdp;
CDrawPort *pdpNormal;
CDrawPort *pdpWideScreen;
CViewPort *pvpViewPort;
HINSTANCE _hInstance;*/		// ypark

// main window canvas		// yjpark
extern ENGINE_API CDrawPort	*_pdpMain;
extern ENGINE_API CDrawPort	*_pdpNormalMain;
extern ENGINE_API CDrawPort	*_pdpWideScreenMain;
extern ENGINE_API CViewPort	*_pvpViewPortMain;
extern ENGINE_API HINSTANCE	_hInstanceMain;

/*
static void PlayDemo(const CTString &strDemoFilename)
{
	// ¾²ÀÌÁö ¾ÊÀ½.
	_gmMenuGameMode = GM_DEMO;
	CTFileName fnDemo = "demos\\" + strDemoFilename + ".dem";
	extern BOOL LSLoadDemo(const CTFileName &fnm);
	LSLoadDemo(fnDemo);
}
	*/
ENGINE_API extern INDEX g_iCountry;

// WSS_NPROTECT 070402 -------------------------->>
/*
#ifndef NO_GAMEGUARD
	extern ENGINE_API CTString g_szHackMsg;
#endif
	/**/
// ----------------------------------------------<<

void GetNM(LPSTR lpCmdLine)
{
	
	// wooss 060209 NetMable_JP 
	extern BOOL g_bAutoLogin;
	extern CTString g_nmVER;
	extern CTString g_nmCID;
	extern CTString g_nmID;
	extern CTString g_nmPW;
	
	// wooss NetMable_JP Auto login 060209
	CTString strTemp((CHAR*)lpCmdLine);

//	MessageBox(NULL, strTemp, "CommandLine", MB_OK);

	for(INDEX ii = 0; ii < 4; ii++)
	{
		INDEX tempPos = strTemp.FindSubstr(" ");

		CTString strInsert = strTemp;

		strInsert.TrimRight(tempPos);

		switch(ii)
		{
			case 0 :
				g_nmVER.PrintF("%s", strInsert);
				break;
			case 1 :
				g_nmCID.PrintF("%s", strInsert);
				break;
			case 2 :
				g_nmID.PrintF("%s", strInsert);
				break;
			case 3 :
				g_nmPW.PrintF("%s", strTemp);
				break;
		}

		if(ii < 3)
			strTemp.DeleteChars(0, tempPos + 1);
	}

//	MessageBox(NULL, g_nmID, "loginID", MB_OK);
//	MessageBox(NULL, g_nmPW, "loginPW", MB_OK);

	if(g_nmID.Length()!=0 && g_nmPW.Length()!=0 ) {
			switch(g_iCountry)
			{
			case KOREA :
					//if(g_nmCID.IsEqualCaseSensitive("em") || g_nmCID.IsEqualCaseSensitive("nt"))
					//if(g_nmCID.IsEqualCaseSensitive("or"))
					if(g_nmCID.Length() > 0)
						g_bAutoLogin = TRUE;

//					MessageBox(NULL, "g_bAutoLogin is True", "autologin", MB_OK);
				break;
			case TAIWAN :
				break;
			case CHINA :
				break;
			case THAILAND :
				break;
			case TAIWAN2:
				break;
			case JAPAN :
				g_bAutoLogin = TRUE;
				break;
			case MALAYSIA :
				break;
			case USA:
				break;
			case BRAZIL:
				break;
			case HONGKONG:
				g_bAutoLogin = TRUE;
				break;
			}
	}
}

/***********************************************************************************************
* IsRunning()
* Áߺ¹ ½ÇÇà ¹æÁö ÇÔ¼ö
* ÇöÀç ½ÇÇà ÁßÀÎ ÇÁ·Î¼¼½º¸¦ °Ë»öÇÏ¿© Nksp.exe°¡ ½ÇÇàµÇ¾î ÀÖ´Â °ÍÀÌ ÀÖ´ÂÁö È®ÀÎÇÏ¿© TRUE, FALSE¸¦
* ¸®ÅÏ ÇÑ´Ù.
*************************************************************************************************/
BOOL IsRunning(void)
{
	PROCESSENTRY32 peNext;

	// Á¢±Ù ÇÁ·Î¼¼½º ÇÚµéÀ» »ý¼ºÇÑ´Ù.
	HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

	if (hSnapShot == INVALID_HANDLE_VALUE )
	{
		if( g_iCountry == RUSSIA )
		{
			MessageBox(NULL, "Îøèáêà çàïóñê?ïðîãðàìì?LastChaos!", "LastChaos Run", MB_OK);
		}
		else
		{
			MessageBox(NULL, "Fail Execute LastChaos!", "LastChaos Run", MB_OK);
		}
		return TRUE;
	}

	peNext.dwSize = sizeof(PROCESSENTRY32);

	int nFindNum = 0;
	int nSize = 0;
	DWORD dwTemp = GetCurrentProcessId();
	BOOL bCurrentProcess = FALSE;

	Process32First(hSnapShot, &peNext); // ù¹ø° ÇÁ·Î¼¼½º¸¦ °¡Á®¿Â´Ù.

	while(Process32Next(hSnapShot, &peNext)) // ¸ðµç ÇÁ·Î¼¼½º¸¦ °Ë»öÇÑ´Ù.
	{
		if (peNext.th32ProcessID == dwTemp)
		{
			bCurrentProcess = TRUE;
			continue;
		}

		nSize = strlen(peNext.szExeFile);

		if ( nSize > 8 ) { nSize -= 8; }
		else { nSize = 0; }
		
		if (stricmp(peNext.szExeFile+(nSize), "Nksp.exe") == 0)
		{
			nFindNum++;

			if (nFindNum > 0)
			{
				CloseHandle(hSnapShot);
				return TRUE;
			}
		}
	}

	CloseHandle(hSnapShot);

	if (!bCurrentProcess)
	{
		if( g_iCountry == RUSSIA )
		{
			MessageBox(NULL, "Îøèáêà çàïóñê?ïðîãðàìì?LastChaos!", "LastChaos Run", MB_OK);	
		}
		else
		{
			MessageBox(NULL, "Fail Execute LastChaos!", "LastChaos Run", MB_OK);
		}
		return TRUE;
	}

	return FALSE;
}


static void ApplyRenderingPreferences(void)
{
	ApplyGLSettings(TRUE);
}

/*
extern void ApplyVideoMode(void)
{
	StartNewMode( (GfxAPIType)sam_iGfxAPI, sam_iDisplayAdapter, sam_iScreenSizeI, sam_iScreenSizeJ,
								(enum DisplayDepth)sam_iDisplayDepth, IsFullScreen( sam_bFullScreenActive) );
}
*/

static void BenchMark(void)
{
	_pGfx->Benchmark(_pvpViewPortMain, _pdpMain);
}


static void QuitGame(void)
{
	_pGameState->Running()		= FALSE;
	_pGameState->QuitScreen()	= FALSE;
}

// check if another app is already running
static HANDLE _hLock = NULL;
static CTFileName _fnmLock;
static void DirectoryLockOn(void)
{
	// create lock filename
	_fnmLock = _fnmApplicationPath+"nksp.loc";
	// try to open lock file
	_hLock = CreateFile(
		_fnmLock, 
		GENERIC_WRITE,
		0/*no sharing*/,
		NULL, // pointer to security attributes
		CREATE_ALWAYS,
		FILE_ATTRIBUTE_NORMAL|FILE_FLAG_DELETE_ON_CLOSE,  // file attributes
		NULL);
	// if failed
	if (_hLock==NULL || GetLastError()!=0) {
		// report warning
		CPrintF(TRANS("WARNING: Last Chaos didn't shut down properly last time!\n"));
	}
}
static void DirectoryLockOff(void)
{
	// if lock is open
	if (_hLock!=NULL) {
		// close it
		CloseHandle(_hLock);
	}
}

//°*µ¿¹Î ¼öÁ¤ ½ÃÀÛ ½Ã½ºÅÛ ¸¶¿ì½º ÀÛ¾÷	09.09
// NOTE : ¾Ö´Ï¸ÞÀÌ¼Ç Ä¿¼*¸¦ ¸®¼Ò½º·ÎºÎÅÍ Àоî¿È.
static HCURSOR LoadAnimationCursor(HINSTANCE hInstance, UINT nID)
{
	HRSRC hRes		= FindResource(hInstance, MAKEINTRESOURCE(nID), "CURSORS");
	DWORD dwSize	= SizeofResource(hInstance, hRes);
	HGLOBAL hGlob	= LoadResource(hInstance, hRes);
	LPBYTE pBytes	= (LPBYTE)LockResource(hGlob);
	return (HCURSOR)CreateIconFromResource(pBytes, dwSize, FALSE, 0x00030000);	
}
//°*µ¿¹Î ¼öÁ¤ ³¡ ½Ã½ºÅÛ ¸¶¿ì½º ÀÛ¾÷		09.09

void End(void);


// automaticaly manage input enable/disable toggling
//static BOOL _bInputEnabled = FALSE;
/*void UpdateInputEnabledState(void)
{
	// do nothing if window is invalid
	if( _hwndMain==NULL) return;

	// input should be enabled if application is active
	// and no menu is active and no console is active
	BOOL bShouldBeEnabled = ( !IsIconic(_hwndMain) && !_pGameState->m_bMenuActive && _pGame->gm_csConsoleState==CS_OFF ) || _bDefiningKey;

	// if should be turned off
	if( (!bShouldBeEnabled && _bInputEnabled) || _bReconsiderInput) {
		// disable it and remember new state
		_pInput->DisableInput();
		_bInputEnabled = FALSE;
	}
	// if should be turned on
	if( bShouldBeEnabled && !_bInputEnabled) {
		// enable it and remember new state
		_pInput->EnableInput(_hwndMain);
		_bInputEnabled = TRUE;
	}
	_bReconsiderInput = FALSE;
}*/


// automaticaly manage pause toggling
void UpdatePauseState(void)
{
	// ¾²ÀÌÁö ¾Ê´Â ºÎºÐ.
	/*
	BOOL bShouldPause = ( _gmRunningGameMode == GM_SINGLE_PLAYER ) &&
						( _pGameState->m_bMenuActive || _pGame->gm_csConsoleState == CS_ON ||
						 _pGame->gm_csConsoleState == CS_TURNINGON || _pGame->gm_csConsoleState == CS_TURNINGOFF );
	_pNetwork->SetLocalPause(bShouldPause);
	*/
}


// limit current frame rate if neeeded
void LimitFrameRate(void)
{
	// measure passed time for each loop
	static CTimerValue tvLast(-1.0f);
	CTimerValue tvNow   = _pTimer->GetHighPrecisionTimer();
	TIME tmCurrentDelta = (tvNow-tvLast).GetSeconds();

	// limit maximum frame rate
	sam_iMaxFPSActive   = ClampDn( (INDEX)sam_iMaxFPSActive,   1L);
	sam_iMaxFPSInactive = ClampDn( (INDEX)sam_iMaxFPSInactive, 1L);
	INDEX iMaxFPS = sam_iMaxFPSActive;
	if( IsIconic(_hwndMain)) iMaxFPS = sam_iMaxFPSInactive;

	/*
	if(_pGame->gm_CurrentSplitScreenCfg==CGame::SSC_DEDICATED) 
	{
		iMaxFPS = ClampDn(iMaxFPS, 60L); // never go very slow if dedicated server
	}
	*/
	TIME tmWantedDelta = 1.0f / iMaxFPS;
	if( tmCurrentDelta<tmWantedDelta) Sleep( (tmWantedDelta-tmCurrentDelta)*1000.0f);
	
	// remember new time
	tvLast = _pTimer->GetHighPrecisionTimer();
}

/*
// load first demo
void StartNextDemo(void)
{
	// ¾µ¸ð¾ø´Â ºÎºÐÀ̹ǷΠÁÖ¼®Ã³¸®µÊ.
	if (!sam_bAutoPlayDemos || !_bInAutoPlayLoop) {
		_bInAutoPlayLoop = FALSE;
		return;
	}

	// skip if no demos
	if(_lhAutoDemos.IsEmpty()) {
		_bInAutoPlayLoop = FALSE;
		return;
	}

	// get first demo level and cycle the list
	CLevelInfo *pli = LIST_HEAD(_lhAutoDemos, CLevelInfo, li_lnNode);
	pli->li_lnNode.Remove();
	_lhAutoDemos.AddTail(pli->li_lnNode);

	// if intro
	if (pli->li_fnLevel==sam_strIntroLevel) {
		// start intro
		_gmRunningGameMode = GM_NONE;
		_pGame->gm_aiStartLocalPlayers[0] = 0;
		_pGame->gm_aiStartLocalPlayers[1] = -1;
		_pGame->gm_aiStartLocalPlayers[2] = -1;
		_pGame->gm_aiStartLocalPlayers[3] = -1;
		_pGame->gm_strNetworkProvider = "Local";
		_pGame->gm_StartSplitScreenCfg = CGame::SSC_PLAY1;

		_pShell->SetINDEX("gam_iStartDifficulty", CSessionProperties::GD_NORMAL);
		_pShell->SetINDEX("gam_iStartMode", CSessionProperties::GM_FLYOVER);

		CUniversalSessionProperties sp;
		_pGame->SetSinglePlayerSession(sp);

		_pGame->gm_bFirstLoading = TRUE;

		if ( _pGame->PreNewGame() && _pGame->NewGame( sam_strIntroLevel, sam_strIntroLevel, sp)) {
			_gmRunningGameMode = GM_INTRO;
		}
	// if not intro
	} else {
		// start the demo
		_pGame->gm_StartSplitScreenCfg = CGame::SSC_OBSERVER;
		_pGame->gm_aiStartLocalPlayers[0] = -1;
		_pGame->gm_aiStartLocalPlayers[1] = -1;
		_pGame->gm_aiStartLocalPlayers[2] = -1;
		_pGame->gm_aiStartLocalPlayers[3] = -1;
		// play the demo
		_pGame->gm_strNetworkProvider = "Local";
		_gmRunningGameMode = GM_NONE;
		if( _pGame->StartDemoPlay( pli->li_fnLevel)) {
			_gmRunningGameMode = GM_DEMO;
			CON_DiscardLastLineTimes();
		}
	}

	if (_gmRunningGameMode==GM_NONE) {
		_bInAutoPlayLoop = FALSE;
	}
}

// set registry key for GameSpy
void RegisterGameSpy(void)
{
	char strExePath[MAX_PATH+1] = "";
	// get full path to the exe
	GetModuleFileName( NULL, strExePath, sizeof(strExePath)-1);

	// create the registry key
	HKEY hkey;
	DWORD dwDisposition;
	LONG lRes = RegCreateKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\GameSpy\\games",0,
		"", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hkey, &dwDisposition);
	if (lRes!=ERROR_SUCCESS) {
		return;
	}

	// set the value to current application
#if !TECHTESTONLY
#if _SE_DEMO
		RegSetValueEx(hkey, "serioussamdemo", 0, REG_SZ, (UBYTE*)strExePath, strlen(strExePath));
#else
		RegSetValueEx(hkey, sam_strGameName, 0, REG_SZ, (UBYTE*)strExePath, strlen(strExePath));
#endif
#endif

	// close the key
	RegCloseKey(hkey);
}
*/

BOOL _bCDPathFound = FALSE;

BOOL FileExistsOnHD(const CTString &strFile)
{
	FILE *f = fopen(_fnmApplicationPath+strFile, "rb");
	if (f!=NULL) {
		fclose(f);
		return TRUE;
	} else {
		return FALSE;
	}
}
	

/*
// find possible cd path
BOOL FindCDPath(void)
{
	// if no specified cdpath
	if (_fnmCDPath=="") 
	{
		// use default one
		_fnmCDPath = CTString("C:\\Install\\");
	}

	// for each drive
	for(INDEX chDrive='C'; chDrive<='Z'; chDrive++) 
	{
		char strDrive[4];
		strDrive[0] = chDrive;
		strDrive[1] = ':';
		strDrive[2] = '\\';
		strDrive[3] = 0;
		// if not cdrom
		if (GetDriveType(strDrive) != DRIVE_CDROM) 
		{
			// skip it
			continue;
		}
		// substitute the drive letter
		((char*)(const char*)_fnmCDPath)[0] = chDrive;
		// if the path is valid
		FILE *f = fopen(_fnmCDPath+_fnmForCDCheck, "rb");
		_bCDPathFound = (BOOL)f;
		if (f!=NULL) 
		{
			// we have found the cd
			fclose(f);
			return TRUE;
		}
	}
	return FALSE;
}

BOOL IsCDInDrive(void)
{
	CTFileName fnmExpanded;
	INDEX iType = ExpandFilePath(EFP_READ, CTString("Setup.exe"), fnmExpanded);
	if (iType!=EFP_FILE || fnmExpanded.HasPrefix(_fnmCDPath)) 
	{
		return FALSE;
	}

	fnmExpanded = fnmExpanded.FileDir()+_fnmForCDCheck;
	FILE *f = fopen(fnmExpanded, "rb");
	if (f==NULL) {
		return FALSE;
	}
	fclose(f);

	return TRUE;
}
*/

void TrimString(char *str)
{
	int i = strlen(str);
	if (str[i-1]=='\n' || str[i-1]=='\r') {
		str[i-1]=0;
	}
}

/*
BOOL PerformCDCheck(void)
{
	// default message
	char strTitle[256] = "CD check";
	char strMessage[256] = "Please insert the game CD";

	// first get the application filename
	char strTmpPath[MAX_PATH] = "";
	GetModuleFileName( NULL, strTmpPath, sizeof(strTmpPath)-1);
	int iLen = strlen(strTmpPath);
	// generate 'insert-cd' text filename
	strTmpPath[iLen-3] = 'c';
	strTmpPath[iLen-2] = 'd';
	strTmpPath[iLen-1] = 0;

	// try to load the file
	FILE *f = fopen(strTmpPath, "rt");
	if (f!=NULL) 
	{
		fgets(strTitle, sizeof(strTitle)-1, f);       TrimString(strTitle);
		fgets(strMessage, sizeof(strMessage)-1, f);   TrimString(strMessage);
		fclose(f);
	}

	// repeat
	FOREVER{
		// if cd path found
		if (FindCDPath()) 
		{
			// ok
			return TRUE;
		}
#if !CD_CHECK || _SE_DEMO || TECHTESTONLY
			return TRUE;
#endif

		// ask user to insert CD
		int iResult = MessageBox(_hwndMain, strMessage, strTitle, MB_ICONEXCLAMATION|MB_RETRYCANCEL);

		if (iResult!=IDRETRY) 
		{
			return FALSE;
		}
		Sleep(1000);
	}
}

// run web browser and view an url
void RunBrowser(const char *strUrl)
{
	int iResult = (int)ShellExecute( _hwndMain, "OPEN", strUrl, NULL, NULL, SW_SHOWMAXIMIZED);
	if (iResult<32) {
		// should report error?
		NOTHING;
	}
}
*/

void LoadAndForceTexture(CTextureObject &to, CTextureObject *&pto, const CTFileName &fnm)
{
	try 
	{
		to.SetData_t(fnm);
		CTextureData *ptd = (CTextureData*)to.GetData();
		ptd->Force( TEX_CONSTANT);
		ptd = ptd->td_ptdBaseTexture;
		if( ptd!=NULL) ptd->Force( TEX_CONSTANT);
		pto = &to;
	} 
	catch( char *pchrError) 
	{
		(void*)pchrError;
		pto = NULL;
	}
}

//¾ÈÅÂÈÆ ¼öÁ¤ ½ÃÀÛ	//(DevPartner Bug Fix)(2005-01-14)
HMODULE g_hGame = NULL;
//¾ÈÅÂÈÆ ¼öÁ¤ ³¡	//(DevPartner Bug Fix)(2005-01-14)
void InitializeGame(void)
{
	try {
#ifndef NDEBUG 
#define GAMEDLL ("Bin\\Debug\\Game"+_strModExt+"D.dll")
#else
#define GAMEDLL ("Bin\\Game"+_strModExt+".dll")
#endif
		CTFileName fnmExpanded;
		ExpandFilePath(EFP_READ, CTString(GAMEDLL), fnmExpanded);

		CPrintF(TRANS("Loading game library '%s'...\n"), (const char *)fnmExpanded);
//¾ÈÅÂÈÆ ¼öÁ¤ ½ÃÀÛ	//(DevPartner Bug Fix)(2005-01-14)
		g_hGame = LoadLibrary(fnmExpanded);
		if (g_hGame==NULL) 
		{
			ThrowF_t("%s", GetWindowsError(GetLastError()));
		}
		CGame* (*GAME_Create)(void) = (CGame* (*)(void))GetProcAddress(g_hGame, "GAME_Create");
		if (GAME_Create==NULL) 
		{
			ThrowF_t("%s", GetWindowsError(GetLastError()));
		}
//¾ÈÅÂÈÆ ¼öÁ¤ ³¡	//(DevPartner Bug Fix)(2005-01-14)
		_pGame = GAME_Create();		
	} 
	catch (char *strError) 
	{
		FatalError("%s", strError);
	}
	// init game - this will load persistent symbols
	_pGame->Initialize(CTString("Data\\nksp.gms"));

//		ENGINE_API extern float g_fGWTimeMul;
//		ENGINE_API extern float g_fGWTime;			// Game world time
//		g_fGWTimeMul	= 0.0f;
//		g_fGWTime		= 100.0f;
}

static char strExePath[MAX_PATH] = "";
static char strDirPath[MAX_PATH] = "";
CEntityClass *g_pPlayer, *g_pWorldBase;
ENGINE_API void CheckEngineVersion();

BOOL Init( HINSTANCE hInstance, int nCmdShow, CTString strCmdLine)
{

	// »õ·Î¿î ¹öÀüÀÇ Launcher°¡ Àִ°¡ È®ÀÎÇÏ°í ÀÖ´Ù¸é, Laucher¸¦ ¾÷µ¥ÀÌÆ®ÇÑ´Ù.
	// by seo - 40727
	// get full path to the exe
	char strTmpPath[MAX_PATH] = "";
	GetModuleFileName( NULL, strExePath, sizeof(strExePath)-1);

	for (int i=0; i < 2; i++) {
		for (int j=strlen(strExePath)-1; j > 0; j--) {
			if (strExePath[j] == '\\') {
				strExePath[j] = '\0';
				break;
			}
		}
	}
	strcat(strExePath, "\\");

	CTFileName fnmLC = strExePath;
	CTFileName fnmLCNew = strExePath;
//	CTFileName fnmLW = strExePath;
//	CTFileName fnmLWNew = strExePath;
	CTFileName fnmLccnct = strExePath;
	CTFileName fnmLccnctNew = strExePath;

	fnmLC = fnmLC + "LC.exe";
	fnmLCNew = fnmLCNew + "LCNew.exe";

	// õÇÏ´ë¶õ¿ë.
//	fnmLW = fnmLW + "LW.exe";
//	fnmLWNew = fnmLWNew + "LWNew.exe";

	fnmLccnct = fnmLccnct + "lccnct.dta";
	fnmLccnctNew = fnmLccnctNew + "lccnctNew.dta";

	FILE *fp = fopen (fnmLccnctNew, "rb");

	if (fp)
	{
		fclose(fp);
		fclose(fp);
		Sleep(1000);
		remove (fnmLccnct);
		Sleep(1000);
		int ret = rename(fnmLccnctNew, fnmLccnct);
	}

	fp = NULL;
	fp = fopen (fnmLCNew, "rb");
	if (fp) {
		fclose(fp);
		Sleep(1000);
		remove (fnmLC);
		Sleep(1000);
		int ret = rename(fnmLCNew, fnmLC);
		// Date : 2005-05-17(¿ÀÈÄ 4:44:15), By Lee Ki-hwan Ãß°¡
		if (!ret) {
			ShowCursor(TRUE);
			if( GetSystemDefaultLangID() == 0x0804 ) // Áß±¹ ·ÎÄÃÀÇ °æ¿ì ¼öÁ¤
			{
				MessageBox(NULL, "Çëµã»÷È·¶¨£¬ÖØÐÂÆô¶¯Áú»ê¡£", "Áú»ê", MB_OK); 
			}
			else 
			{
				MessageBox(NULL, "Update is completed.\nPlease, restart game.", "Update completed", MB_OK);
			}
			return 0;
		}
	}
/*
	fp = NULL;
	fp = fopen (fnmLWNew, "rb");
	if (fp) {
		fclose(fp);
		Sleep(1000);
		remove (fnmLW);
		Sleep(1000);
		int ret = rename(fnmLWNew, fnmLW);
		// Date : 2005-05-17(¿ÀÈÄ 4:44:15), By Lee Ki-hwan Ãß°¡
		if (!ret) {
			ShowCursor(TRUE);
			if( GetSystemDefaultLangID() == 0x0804 ) // Áß±¹ ·ÎÄÃÀÇ °æ¿ì ¼öÁ¤
			{
				MessageBox(NULL, "Çëµã»÷È·¶¨£¬ÖØÐÂÆô¶¯Áú»ê¡£", "Áú»ê", MB_OK); 
			}
			else 
			{
				MessageBox(NULL, "Update is completed.\nPlease, restart game.", "Update completed", MB_OK);
			}
			return 0;
		}
	}*/
	// end.

	_hInstanceMain = hInstance;
	//0214 ½ºÇ÷¡½Ã ¾È¶ç¿ì±â.
	//  ShowSplashScreen(hInstance);

	// set registry key for GameSpy
	// deleted by seo - 40629
	//RegisterGameSpy();

	// remember desktop dimensions
	_pixDesktopWidth  = ::GetSystemMetrics(SM_CXSCREEN);
	_pixDesktopHeight = ::GetSystemMetrics(SM_CYSCREEN);

#ifdef USE_NEW_LAUNCHER
	if(strCmdLine.IsEqualCaseSensitive(CTString("4022")))
#else
	if(strCmdLine.IsEqualCaseSensitive(CTString("6574")))
#endif
	{

	}
	else
	{
		// WSS_NPROTECT 070405 ------------------>><<	
		// È«ÄáÀÇ °æ¿ì nProtect·Î Áߺ¹ °ËÃâ
#ifdef NO_GAMEGUARD
#ifndef MULTI_CLIENT
		if (IsRunning())
		{
			if( g_iCountry == RUSSIA )
			{
				MessageBox(NULL, "Êëèåíò LastChaos óæ?çàïóùå?", "LastChaos", MB_OK);
			}
			else
			{
				MessageBox(NULL, "LastChaos is already running on your system", "LastChaos Run", MB_OK);
			}
			return FALSE;
		}		
#endif // MULTI_CLIENT
#endif
#ifndef NKSP_NOT_NICKNAME
		const CTString CmpStr("dlwltnr");
		char* strPos = '\0';

		strPos = strstr(strCmdLine.str_String, CmpStr.str_String);

		if (!strPos || !CmpStr.IsEqualCaseSensitive(strPos))
		{
			if( g_iCountry == RUSSIA )
			{
				MessageBox(NULL, "Êëèåíò èãðû íå ìîæå?áûòü çàïóùå?ñàìîñò?òåëüíî.", "LastChaos", MB_OK);
			}
			else
			{
				MessageBox(NULL, "This program could not be run itself", "LastChaos", MB_OK);
			}
			return FALSE;
		}
#endif

	}
	// prepare main window
	MainWindow_Init();

#ifdef XTRAP_SECURE_CKBANG_2010_07_20

    if (XTRAP())
        XTRAP()->EngineConfirm();

#endif

	OpenMainWindowInvisible();

	// parse command line before initializing engine
	ParseCommandLine(strCmdLine);

	/*#if !_SE_DEMO
	if (!PerformCDCheck()) {
		return FALSE;
	}
#endif*/

	// initialize engine
	SE_InitEngine(sam_strGameName);

	extern BOOL g_bNasTrans;
	g_bNasTrans = FALSE;
	switch(g_iCountry)
	{
		case BRAZIL:
			SetClassLong( _hwndMain, GCL_HICON, (LONG)LoadIcon( _hInstanceMain, (LPCTSTR)IDI_GUNSOFT ) );
			g_bNasTrans = TRUE;
			break;
		case HONGKONG:
			SetClassLong( _hwndMain, GCL_HICON, (LONG)LoadIcon( _hInstanceMain, (LPCTSTR)IDI_FUNMILY ) );
			break;
	}


	// recheck for proper CD now
/*
	if (FileExistsOnHD("Bin\\EntitiesMP.dll")) {
		_fnmForCDCheck = "Bin\\EntitiesMP.dll";
	} else if (FileExistsOnHD("Bin\\Entities.dll")) {
		_fnmForCDCheck = "Bin\\Entities.dll";
	}
*/
	/*#if !_SE_DEMO
	if (!PerformCDCheck()) {
		return FALSE;
	}
#endif*/

#if COPY_PROTECTION

	// get full path to the exe
	char strExePath[MAX_PATH] = "";
	GetModuleFileName( NULL, strExePath, sizeof(strExePath)-1);
	char strDrive[] = "C:\\";
	strDrive[0] = strExePath[0];
	DWORD dwSerial;
	GetVolumeInformation(strDrive, NULL, 0, &dwSerial, NULL, NULL, NULL, 0);

	CTFileName fnmKey = CTString("TSE.key");
	INDEX iSerial = dwSerial;

	// init encryption table two times
	BLOWFISH_CTX ctx1;
	BLOWFISH_CTX ctx2;
	CTString strEnKey = _strEngineBuild;
	strEnKey.TrimLeft(16);
	char aubKey1[16];
	char aubKey2[16];
	for(INDEX i=0; i<16; i++) {
		aubKey1[i] = strEnKey[i];
		aubKey2[i] = strEnKey[16-1-i];
	}
	Blowfish_Init (&ctx1, (unsigned char*)aubKey1, 16);
	Blowfish_Init (&ctx2, (unsigned char*)aubKey2, 16);

	// if no key
	if (!FileExists(fnmKey)) {
		// just bail out
		FatalError(TRANS("No registration key!\nPlease request registration key for code:\n\n%08X"), iSerial);
		return FALSE;
	// if key is here
	} else {
		// load it
		CTString strKey;
		LoadStringVar(fnmKey, strKey);
		__int64 llCodeRead = 0;
		strKey.ScanF("%I64x", &llCodeRead);
		__int64 llCode1 = llCodeRead;
		__int64 llCode2 = llCodeRead;

		// decrypt the code
		Blowfish_Decrypt(&ctx1, (ULONG*)&llCode1+1, ((ULONG*)&llCode1));
		Blowfish_Decrypt(&ctx2, (ULONG*)&llCode2+1, ((ULONG*)&llCode2));
		// if not valid
		if (llCode1!=iSerial && llCode2!=iSerial) {
			// bail out
			FatalError(TRANS("Registration key is invalid!"));
			return FALSE;
		}
	}
#endif

	// if cd check didn't pass
	/*  
	if (!_bCDPathFound) {
		// check current time
		SYSTEMTIME st;
		GetSystemTime(&st);
		// if after 30.3.2001, fail
		if (st.wYear>2001) {
			return FALSE;
		} else if (st.wYear==2001) {
			if (st.wMonth>3) {
				return FALSE;
			} else if (st.wMonth==3) {
				if (st.wDay>30) {
					return FALSE;
				}
			}
		}
	}
	*/

	SE_LoadDefaultFonts();
	// now print the output of command line parsing
	// deleted by seo
	//CPrintF("%s", cmd_strOutput);

	// lock the directory
	DirectoryLockOn();

	// load all translation tables
	InitTranslation();
	try {
		AddTranslationTablesDir_t(CTString("Data\\Translations\\"), CTString("*.txt"));
		FinishTranslationTable();
	} catch (char *strError) {
		FatalError("%s", strError);
	}

	// always disable all warnings when in serious sam
	_pShell->Execute( "con_bNoWarnings=1;");

	// declare shell symbols
//	_pShell->DeclareSymbol("user void PlayDemo(CTString);", &PlayDemo);
	_pShell->DeclareSymbol("persistent INDEX sam_bFullScreen;",   &sam_bFullScreenActive);
	
	// ±âº»ÀÇ ¿øµµ¿ì ¸ðµå ½Ã¿¡ Àüü ¸ðµå·Î º¯°æ 
	/*
		if( OLD_WINDOW_MODE != WINDOW_MODE )
		if ( sam_bFullScreenActive == OLD_WINDOW_MODE ) sam_bFullScreenActive = FULLSCREEN_MODE;
	*/
	// Date : 2005-09-13(¿ÀÈÄ 2:58:13), By Lee Ki-hwan
	// ´ë¸¸¿¡¼* ±âº» ¿øµµ¿ì ¸ðµå¸¦ Áö¿øÇϸé¼* ÇÊ¿ä¾ø¾îÁü

	_pShell->DeclareSymbol("persistent INDEX sam_iScreenSizeI;",  &sam_iScreenSizeI);
	_pShell->DeclareSymbol("persistent INDEX sam_iScreenSizeJ;",  &sam_iScreenSizeJ);
	_pShell->DeclareSymbol("persistent INDEX sam_iDisplayDepth;", &sam_iDisplayDepth);
	_pShell->DeclareSymbol("persistent INDEX sam_iDisplayAdapter;", &sam_iDisplayAdapter);
	_pShell->DeclareSymbol("persistent INDEX sam_iGfxAPI;",         &sam_iGfxAPI);
	//_pShell->DeclareSymbol("persistent INDEX sam_bFirstStarted;", &sam_bFirstStarted);
	_pShell->DeclareSymbol("persistent INDEX sam_bAutoAdjustAudio;", &sam_bAutoAdjustAudio);
	_pShell->DeclareSymbol("persistent user INDEX sam_bWideScreen;", &sam_bWideScreen);
	_pShell->DeclareSymbol("persistent user FLOAT sam_fPlayerOffset;",  &sam_fPlayerOffset);
	_pShell->DeclareSymbol("persistent user INDEX sam_bAutoPlayDemos;", &sam_bAutoPlayDemos);
	_pShell->DeclareSymbol("persistent user INDEX sam_iMaxFPSActive;",    &sam_iMaxFPSActive);
	_pShell->DeclareSymbol("persistent user INDEX sam_iMaxFPSInactive;",  &sam_iMaxFPSInactive);
	_pShell->DeclareSymbol("persistent user INDEX sam_bPauseOnMinimize;", &sam_bPauseOnMinimize);
	_pShell->DeclareSymbol("persistent user FLOAT sam_tmDisplayModeReport;",   &sam_tmDisplayModeReport);
	_pShell->DeclareSymbol("persistent user CTString sam_strNetworkSettings;", &sam_strNetworkSettings);
	_pShell->DeclareSymbol("persistent user CTString sam_strIntroLevel;",      &sam_strIntroLevel);
	_pShell->DeclareSymbol("persistent user CTString sam_strGameName;",      &sam_strGameName);
	_pShell->DeclareSymbol("user CTString sam_strVersion;",    &sam_strVersion);
	//_pShell->DeclareSymbol("user CTString sam_strFirstLevel;", &sam_strFirstLevel);
	//_pShell->DeclareSymbol("user CTString sam_strModName;", &sam_strModName);
//	_pShell->DeclareSymbol("persistent INDEX sam_bShowAllLevels;", &sam_bShowAllLevels);
//	_pShell->DeclareSymbol("persistent INDEX sam_bMentalActivated;", &sam_bMentalActivated);

	//_pShell->DeclareSymbol("user CTString sam_strTechTestLevel;", &sam_strTechTestLevel);
	//_pShell->DeclareSymbol("user CTString sam_strTrainingLevel;", &sam_strTrainingLevel);
	
	_pShell->DeclareSymbol("user void Quit(void);", &QuitGame);

	_pShell->DeclareSymbol("persistent user INDEX sam_iVideoSetup;",     &sam_iVideoSetup);
	_pShell->DeclareSymbol("user void ApplyRenderingPreferences(void);", &ApplyRenderingPreferences);
	//_pShell->DeclareSymbol("user void ApplyVideoMode(void);",            &ApplyVideoMode);
	_pShell->DeclareSymbol("user void Benchmark(void);", &BenchMark);

	/*
	_pShell->DeclareSymbol("user INDEX sam_bMenuSave;",     &sam_bMenuSave);
	_pShell->DeclareSymbol("user INDEX sam_bMenuLoad;",     &sam_bMenuLoad);
	_pShell->DeclareSymbol("user INDEX sam_bMenuControls;", &sam_bMenuControls);
	_pShell->DeclareSymbol("user INDEX sam_bMenuHiScore;",  &sam_bMenuHiScore);
	*/
	_pShell->DeclareSymbol("user INDEX sam_bToggleConsole;",&sam_bToggleConsole);
//	_pShell->DeclareSymbol("INDEX sam_iStartCredits;", &sam_iStartCredits);

	// Obtain player and world base class without releasing it (this will never be released from stock)
	g_pPlayer = _pEntityClassStock->Obtain_t(CTString("Classes\\Player.ecl"));  // this must not be a dependency!
	g_pWorldBase = _pEntityClassStock->Obtain_t(CTString("Classes\\WorldBase.ecl"));  // this must not be a dependency!

	InitializeGame();
	_pNetwork->md_strGameID = sam_strGameName;

	//LCDInit();

	/*if( sam_bFirstStarted) {
		InfoMessage("%s", TRANS(
			"SeriousSam is starting for the first time.\n"
			"If you experience any problems, please consult\n"
			"ReadMe file for troubleshooting information."));
	}*/

	// initialize sound library
	snd_iFormat = Clamp( snd_iFormat, (INDEX)CSoundLibrary::SF_NONE, (INDEX)CSoundLibrary::SF_44100_16);
	_pSound->SetFormat( (enum CSoundLibrary::SoundFormat)snd_iFormat);

	if (sam_bAutoAdjustAudio) 
	{
		_pShell->Execute("include \"Scripts\\Addons\\SFX-AutoAdjust.ini\"");
	}

	/*
	// execute script given on command line
	if (cmd_strScript!="") 
	{
		CPrintF("Command line script: '%s'\n", cmd_strScript);
		CTString strCmd;
		strCmd.PrintF("include \"%s\"", cmd_strScript);
		_pShell->Execute(strCmd);
	}
	*/
	
	// load logo textures
	//LoadAndForceTexture(_toLogoCT,   _ptoLogoCT,   CTFILENAME("Textures\\Logo\\LogoCT.tex"));
	//LoadAndForceTexture(_toLogoODI,  _ptoLogoODI,  CTFILENAME("Textures\\Logo\\GodGamesLogo.tex"));
	//LoadAndForceTexture(_toLogoGSpy, _ptoLogoGSpy, CTFILENAME("Textures\\Logo\\LogoGSpy.tex"));
	//LoadAndForceTexture(_toLogoEAX,  _ptoLogoEAX,  CTFILENAME("Textures\\Logo\\LogoEAX.tex"));

	//LoadStringVar(CTString("Data\\Var\\Sam_Version.var"), sam_strVersion);
	//LoadStringVar(CTString("Data\\Var\\ModName.var"), sam_strModName);
	CPrintF(TRANS("Nksp version: %s\n"), sam_strVersion);
	//CPrintF(TRANS("Active mod: %s\n"), sam_strModName);
	//InitializeMenus();		// ¿øº».
	
	// if there is a mod
	/*if (_fnmMod!="") {
		// execute the mod startup script
		_pShell->Execute(CTString("include \"Scripts\\Mod_startup.ini\";"));
	}*/

	// init gl settings module
	// deleted by seo
	//InitGLSettings();

	// init level-info subsystem
	// deleted by seo
	//LoadLevelsList();
	//LoadDemosList();

	// apply application mode
	StartNewMode( GAT_D3D, sam_iDisplayAdapter, sam_iScreenSizeI, sam_iScreenSizeJ,
								(enum DisplayDepth)sam_iDisplayDepth, IsFullScreen( sam_bFullScreenActive) );

	_pGameState = new CGameState;
	_pUIMgr = new CUIManager;				// yjpark
	_pUIMgr->Create();						// yjpark
	//wooss 050822 add test ui version
	// TEST UI¸¦ À§ÇØ Ãß°¡
	// TEST ȯ°æÀÌ ¾Æ´Ò °æ¿ì À̺κÐÀ» FALSE·Î ó¸® 
	// TEST ÇÏ°íÀÚ ÇÏ´Â UI º¯°æ½Ã TYPE ºÎºÐÀ» °íÃÄ ÁØ´Ù 
	//------------------------------------------------------------------------------>>
	
//		_pUIMgr->m_testUI_MODE = TRUE;
		_pUIMgr->m_testUI_MODE = FALSE;
		_pUIMgr->m_testUI_TYPE = UI_SELECTLIST;		//wooss  UI test variable
	
	//<<------------------------------------------------------------------------------

	if(_pUIMgr->m_testUI_MODE) _pUIMgr->SetUIGameState( UGS_UI_TEST);
	else _pUIMgr->SetUIGameState( UGS_LOGIN );	// yjpark
	_pUIMgr->GetOption()->SetDesktopSize( _pixDesktopWidth, _pixDesktopHeight );
	_pUIMgr->SetGameHandle(_pGame);
	_pUIMgr->ResetUIPos( _pdpMain );

//°*µ¿¹Î ¼öÁ¤ ½ÃÀÛ ½Ã½ºÅÛ ¸¶¿ì½º ÀÛ¾÷	09.09
//#define ANIMATION_CURSOR
#ifdef ANIMATION_CURSOR
	_pUIMgr->GetMouseCursor()->SetCursorHandle( UMCT_NORMAL, LoadAnimationCursor( _hInstanceMain, IDC_NORMAL_CURSOR) );
	_pUIMgr->GetMouseCursor()->SetCursorHandle( UMCT_ATT_NORMAL, LoadAnimationCursor( _hInstanceMain, IDC_ATTACK_CURSOR) );
	_pUIMgr->GetMouseCursor()->SetCursorHandle( UMCT_ATT_SKILL, LoadAnimationCursor( _hInstanceMain, IDC_SKILL_CURSOR) );
	_pUIMgr->GetMouseCursor()->SetCursorHandle( UMCT_ATT_MAGIC, LoadAnimationCursor( _hInstanceMain, IDC_MAGIC_CURSOR) );
	_pUIMgr->GetMouseCursor()->SetCursorHandle( UMCT_ATT_BOW, LoadAnimationCursor( _hInstanceMain, IDC_BOW_CURSOR) );
	_pUIMgr->GetMouseCursor()->SetCursorHandle( UMCT_PICK, LoadAnimationCursor( _hInstanceMain, IDC_PICK_CURSOR) );
	_pUIMgr->GetMouseCursor()->SetCursorHandle( UMCT_TALK, LoadAnimationCursor( _hInstanceMain, IDC_TALK_CURSOR) );
	_pUIMgr->GetMouseCursor()->SetCursorHandle( UMCT_PRODUCE, LoadAnimationCursor( _hInstanceMain, IDC_PRODUCE_CURSOR) );
	_pUIMgr->GetMouseCursor()->SetCursorHandle( UMCT_SIZE, LoadAnimationCursor( _hInstanceMain, IDC_SIZE_CURSOR) );
	_pUIMgr->GetMouseCursor()->SetCursorHandle( UMCT_ZOOMIN, LoadAnimationCursor( _hInstanceMain, IDC_ZOOMIN_CURSOR) );
	_pUIMgr->GetMouseCursor()->SetCursorHandle( UMCT_SIGNAL, LoadAnimationCursor( _hInstanceMain, IDC_SIGNAL_CURSOR) );
#else
	// FIXME : EngineÀÇ Resource¿¡ *.cur È*ÀÏÀ» ³Ö¾îÁáÀ»¶§, ÇØ´ç Ä¿¼*¸¦ ¾ò¾î¿ÀÁö ¸øÇؼ* ÀÌ·±½ÄÀ¸·Î ó¸®ÇÔ.	
	_pUIMgr->GetMouseCursor()->SetCursorHandle( UMCT_NORMAL, LoadCursor( _hInstanceMain, MAKEINTRESOURCE(IDC_NORMAL_CURSOR) ) );
	_pUIMgr->GetMouseCursor()->SetCursorHandle( UMCT_ATT_NORMAL, LoadCursor( _hInstanceMain, MAKEINTRESOURCE(IDC_ATTACK_CURSOR) ) );
	_pUIMgr->GetMouseCursor()->SetCursorHandle( UMCT_ATT_SKILL, LoadCursor( _hInstanceMain, MAKEINTRESOURCE(IDC_SKILL_CURSOR) ) );
	_pUIMgr->GetMouseCursor()->SetCursorHandle( UMCT_ATT_MAGIC, LoadCursor( _hInstanceMain, MAKEINTRESOURCE(IDC_MAGIC_CURSOR) ) );
	_pUIMgr->GetMouseCursor()->SetCursorHandle( UMCT_ATT_BOW, LoadCursor( _hInstanceMain, MAKEINTRESOURCE(IDC_BOW_CURSOR) ) );
	_pUIMgr->GetMouseCursor()->SetCursorHandle( UMCT_PICK, LoadCursor( _hInstanceMain, MAKEINTRESOURCE(IDC_PICK_CURSOR) ) );
	_pUIMgr->GetMouseCursor()->SetCursorHandle( UMCT_TALK, LoadCursor( _hInstanceMain, MAKEINTRESOURCE(IDC_TALK_CURSOR) ) );
	_pUIMgr->GetMouseCursor()->SetCursorHandle( UMCT_PRODUCE, LoadCursor( _hInstanceMain, MAKEINTRESOURCE(IDC_PRODUCE_CURSOR) ) );
	_pUIMgr->GetMouseCursor()->SetCursorHandle( UMCT_SIZE, LoadCursor( _hInstanceMain, MAKEINTRESOURCE(IDC_SIZE_CURSOR) ) );
	_pUIMgr->GetMouseCursor()->SetCursorHandle( UMCT_ZOOMIN, LoadCursor( _hInstanceMain, MAKEINTRESOURCE(IDC_ZOOMIN_CURSOR) ) );
	_pUIMgr->GetMouseCursor()->SetCursorHandle( UMCT_SIGNAL, LoadCursor( _hInstanceMain, MAKEINTRESOURCE(IDC_SIGNAL_CURSOR) ) );
	
#endif
//°*µ¿¹Î ¼öÁ¤ ³¡ ½Ã½ºÅÛ ¸¶¿ì½º ÀÛ¾÷		09.09
	// set default mode reporting
	/*if( sam_bFirstStarted) {
		_iDisplayModeChangeFlag = 0;
		sam_bFirstStarted = FALSE;
	}*/
	
	//0214 ½ºÇ÷¡½Ã ¼û±â±â
	//  HideSplashScreen();

	/*
	if (cmd_strPassword!="") {
		_pShell->SetString("net_strConnectPassword", cmd_strPassword);
	}

	  #if TECHTESTONLY
	cmd_strWorld = CTString("Levels\\TechTestElsa.wld");
	  #endif

		if (cmd_strPlayer!="") 
		{
		int iPlayer = atoi(cmd_strPlayer);
		_pGame->gm_aiMenuLocalPlayers[0] = Clamp(iPlayer, 0, 7);
	}
	*/
	//0105 42line Áö¿ì±â
	/* 
	// if connecting to server from command line
	if (cmd_strServer!="") {
		CTString strPort = "";
		if (cmd_iPort>0) {
			_pShell->SetINDEX("net_iPort", cmd_iPort);
			strPort.PrintF(":%d", cmd_iPort);
		}
		CPrintF(TRANS("Command line connection: '%s%s'\n"), cmd_strServer, strPort);
		// go to join menu
		_pGame->gam_strJoinAddress = cmd_strServer;
		if (cmd_bQuickJoin) {
			extern void JoinNetworkGame(void);
			JoinNetworkGame();
		} else {
			StartMenus("join");
		}
	// if starting world from command line
	} else if (cmd_strWorld!="") {
		CPrintF(TRANS("Command line world: '%s'\n"), cmd_strWorld);
		// try to start the game with that level
		try {
			if (cmd_iGoToMarker>=0) {
				CPrintF(TRANS("Command line marker: %d\n"), cmd_iGoToMarker);
				CTString strCommand;
				strCommand.PrintF("cht_iGoToMarker = %d;", cmd_iGoToMarker);
				_pShell->Execute(strCommand);
			}
			_pGame->gam_strCustomLevel = cmd_strWorld;
			if (cmd_bServer) {
				extern void StartNetworkGame(void);
				StartNetworkGame();
			} else {
				extern void StartSinglePlayerGame(void);
				StartSinglePlayerGame();
			}
		} catch (char *strError) {
			CPrintF(TRANS("Cannot start '%s': '%s'\n"), cmd_strWorld, strError);
		}
	// if no relevant starting at command line
	} else {
		StartNextDemo();
	}
	*/
	//0105
	//_pGame->gam_strJoinAddress = "211.56.73.22";
	//_pGame->gm_strNetworkProvider = "TCP/IP Client";
	/*
	_pGame->gam_strJoinAddress = "211.56.73.12";		// by seo 40225
	_pGame->gm_strNetworkProvider = "TCP/IP Mmo";
	 
	if (_pGame->JoinGame( CNetworkSession( _pGame->gam_strJoinAddress)))
	{
	 _gmRunningGameMode = GM_NETWORK;
	}
	  //..
	*/
	//_pGameState->m_BackGroundWorld.Load_t(LOGIN_WORLD);
	{
		/*
		_pGame->gm_strNetworkProvider = "Local";
		_pGame->gm_aiStartLocalPlayers[0] = 0;
		_pGame->gm_CurrentSplitScreenCfg = CGame::SSC_PLAY1;

		CSessionProperties sp;
		_pGame->SetQuickStartSession(sp);
		CPlayerCharacter &pc = _pGame->gm_apcPlayers[0];
		pc.pc_iPlayerIndex = 0;
		if(!_pGame->PreNewGame() || !_pGame->NewGame( LOGIN_WORLD, LOGIN_WORLD, sp))
		{
			//DisableLoadingHook();
		}
		//_pNetwork->ga_World;
		//_pGameState->m_BackGroundWorld.Load_t(LOGIN_WORLD);
		_pUIMgr->SetBackgroundWorld(&_pNetwork->ga_World);	
		*/

		/*
		while(TRUE)
		{
			GameMainLoop();			
			pdp->SetAsCurrent();
			pdp->Fill(C_BLACK|CT_OPAQUE);
			pdp->FillZBuffer(ZBUF_BACK);
			GameRedrawView(pdp, GRV_SHOWEXTRAS);
			pvp->SwapBuffers();			
		};

		StopGame();
		DisableLoadingHook();
		*/
	}
//¾ÈÅÂÈÆ ¼öÁ¤ ½ÃÀÛ	//(5th Closed beta)(0.2)
	WebAddressInit();
	g_web.Begin();
//¾ÈÅÂÈÆ ¼öÁ¤ ³¡	//(5th Closed beta)(0.2)

	// 051121 nksp.exe version check on/off  
	if(strCmdLine.IsEqualCaseSensitive(CTString("6574"))) ;
	else { 
		CheckEngineVersion();
		CheckEntityVersion();
	}

	return TRUE;
}

void End(void)
{
//¾ÈÅÂÈÆ ¼öÁ¤ ½ÃÀÛ	//(5th Closed beta)(0.2)
	g_web.End();
//¾ÈÅÂÈÆ ¼öÁ¤ ³¡	//(5th Closed beta)(0.2)
	_pGame->DisableLoadingHook();
	// cleanup level-info subsystem
	//ClearLevelsList();		// ¿øº».
	//ClearDemosList();

	_pFontStock->Release(_pfdDisplayFont);
	_pfdDisplayFont = NULL;
	_pFontStock->Release(_pfdConsoleFont);
	_pfdConsoleFont = NULL;

	_pEntityClassStock->Release(g_pPlayer);
	g_pPlayer = NULL;
	_pEntityClassStock->Release(g_pWorldBase);
	g_pWorldBase = NULL;
	
	// destroy the main window and its canvas
	if (_pvpViewPortMain!=NULL) 
	{
 		_pGfx->DestroyWindowCanvas( _pvpViewPortMain);
		_pvpViewPortMain = NULL;
		_pdpNormalMain   = NULL;
	}
	CloseMainWindow();
	MainWindow_End();
	//DestroyMenus();		// ¿øº».
	_pGame->End();

	//LCDEnd();
	// unlock the directory
	DirectoryLockOff();
	SE_EndEngine();
	
	void (*GAME_Destroy)(void) = (void (*)(void))GetProcAddress(g_hGame, "GAME_Destroy");
	if (GAME_Destroy==NULL) 
	{
		ThrowF_t("%s", GetWindowsError(GetLastError()));
	}
	GAME_Destroy();
//¾ÈÅÂÈÆ ¼öÁ¤ ½ÃÀÛ	//(DevPartner Bug Fix)(2005-01-14)
	if(g_hGame) FreeLibrary(g_hGame);
//¾ÈÅÂÈÆ ¼öÁ¤ ³¡	//(DevPartner Bug Fix)(2005-01-14)
}


// print display mode info if needed
void PrintDisplayModeInfo(void)
{
	// skip if timed out
	if( _pTimer->GetRealTimeTick() > (_tmDisplayModeChanged+sam_tmDisplayModeReport)) return;

	// cache some general vars
	SLONG slDPWidth  = _pdpMain->GetWidth();
	SLONG slDPHeight = _pdpMain->GetHeight();
	if( _pdpMain->IsDualHead())   slDPWidth/=2;
	if( _pdpMain->IsTripleHead()) slDPWidth/=3;

	CDisplayMode dm;
	dm.dm_pixSizeI = slDPWidth;
	dm.dm_pixSizeJ = slDPHeight;
	// determine proper text scale for statistics display
	FLOAT fTextScale = (FLOAT)slDPHeight/480.0f/2;

	// get resolution
	CTString strRes;
	extern CTString _strPreferencesDescription;
	strRes.PrintF( "%dx%dx%s", slDPWidth, slDPHeight, _pGfx->gl_dmCurrentDisplayMode.DepthString());
	if( dm.IsDualHead())   strRes += TRANS(" DualMonitor");
	if( dm.IsTripleHead()) strRes += TRANS(" TripleMonitor");
	if( dm.IsWideScreen()) strRes += TRANS(" WideScreen");
			 if( _pGfx->gl_eCurrentAPI==GAT_OGL) strRes += " (OpenGL)";
	else 
		if( _pGfx->gl_eCurrentAPI==GAT_D3D) strRes += " (Direct3D)";

	CTString strDescr;
	strDescr.PrintF("\n%s (%s)\n", _strPreferencesDescription, RenderingPreferencesDescription(sam_iVideoSetup));
	strRes += strDescr;
	// tell if application is started for the first time, or failed to set mode
		if( _iDisplayModeChangeFlag==0) 
		{
		strRes += TRANS("Display mode set by default!");
		} 
		else if( _iDisplayModeChangeFlag==2) 
		{
		strRes += TRANS("Last mode set failed!");
	}

	// print it all
	_pdpMain->SetFont( _pfdDisplayFont);
	_pdpMain->SetTextScaling( fTextScale);
	_pdpMain->SetTextShadow( +2);
	_pdpMain->SetTextAspect( 1.0f);
	const FLOAT fPosMul = _pdpMain->IsTripleHead() ? 1.05f : 0.05f;
	//pdp->PutText( strRes, slDPWidth*fPosMul, slDPHeight*0.85f, LCDGetColor(C_GREEN|255, "display mode"));		// ¿øº».
	_pdpMain->PutText( strRes, slDPWidth*fPosMul, slDPHeight*0.85f);
}

// do the main game loop and render screen
void DoGame(void)
{
	// set flag if not in game
	if( !_pGame->gm_bGameOn) 
		//_gmRunningGameMode = GM_NONE;		// ¿øº».		
		_pGameState->GetGameMode() = CGameState::GM_NONE;

	// °ÔÀÓ ¸ðµå°¡ µ¥¸ð¸ðµåÀ϶§...
	/*
	if( _gmRunningGameMode==GM_DEMO  && _pNetwork->IsDemoPlayFinished()
		||_gmRunningGameMode==GM_INTRO && _pNetwork->IsGameFinished()) 
	{
		_pGame->StopGame();
		_gmRunningGameMode = GM_NONE;

		// load next demo
		StartNextDemo();
	  if (!_bInAutoPlayLoop) {
			// start menu
			StartMenus();
		}
	}
	*/
	/*
	// do the main game loop
	if( _gmRunningGameMode == GM_LOGIN){
	_pNetwork->
	}
	else*/


	// °ÔÀÓ ½ÇÇàÁßÀ϶§ »óÅÂ!
	//_pGameState->m_bMenuActive	0
	//_pGameState->m_bMenuRendering	1
	//_gmMenuGameMode	GM_NONE
	//_gmRunningGameMode	GM_NETWORK
	//_pGame->gm_bGameOn	1
	//_pGame->gm_bMenuOn	0

	// °ÔÀÓÀÌ ½ÇÇàÁßÀ϶§¸¸ È£ÃâµÇ´Â ºÎºÐ.
	//if( _gmRunningGameMode != GM_NONE) 
	//if( _gmRunningGameMode != GM_NONE)		// ¿øº».
	if( _pGameState->GetGameMode() != CGameState::GM_NONE)		// ¿øº».
	{
		_pGame->GameMainLoop();
		//0215
		//	 CSoundObject soMusic;  
		//     soMusic.Play_t(CTFILENAME("Music\\Credits.mp3"), SOF_NONGAME|SOF_MUSIC|SOF_LOOP);
		//
	// if game is not started
	} 
	else 
	{
		// just handle broadcast messages
		_pNetwork->GameInactive();
	}

	// redraw the view
	if( !IsIconic(_hwndMain) && _pdpMain!=NULL && _pdpMain->Lock())
	{
		// ¸Þ´º°¡ ºñÈ°¼ºÈ* µÇ¾ú°í, °ÔÀÓ ½ÇÇàÁßÀ϶§???
		//if( _gmRunningGameMode!=GM_NONE && !_pGameState->m_bMenuActive ) 
		//if( _gmRunningGameMode!=GM_NONE && !_pGameState->m_bMenuActive )		// ¿øº».
		int iState = _pGameState->GetGameMode();
		//BOOL bState = _pGameState->m_bMenuActive;
		if( _pGameState->GetGameMode() != CGameState::GM_NONE)		// ¿øº».
		{
			// handle pretouching of textures and shadowmaps
			_pdpMain->Unlock();

			// °á±¹Àº RenderView()¸¦ È£ÃâÇÔ.
			_pGame->GameRedrawView( _pdpMain, (_pGame->gm_csConsoleState!=CS_OFF)?0:GRV_SHOWEXTRAS);

			_pdpMain->Lock();			
		} 
		else 
		{
			//pdp->Fill( LCDGetColor(C_dGREEN|CT_OPAQUE, "bcg fill"));	// ¿øº».
			_pdpMain->Fill(C_dGREEN|CT_OPAQUE);
		}

		// do menu
		/*
		if( _pGameState->m_bMenuRendering) {
			// clear z-buffer
			pdp->FillZBuffer( ZBUF_BACK);
			// remember if we should render menus next tick
			_pGameState->m_bMenuRendering = DoMenu(pdp);
		}
		*/
		//_pUIMgr->SetBackgroundWorld(&_pGameState->m_BackGroundWorld);
		//pdp->FillZBuffer( ZBUF_BACK);

		/*
		TIME tmTickNow = _pTimer->GetRealTimeTick();
		
		while( _tmMenuLastTickDone < tmTickNow)
		{
			_pTimer->SetCurrentTick(_tmMenuLastTickDone);
			_tmMenuLastTickDone += _pTimer->TickQuantum;
		}
			
		SetMenuLerping();
		*/

		//if(_pGameState->m_bMenuRendering)
		// Render User interface
		//_pUIMgr->Render( _pdpMain );			// yjpark

		//0609 kwon
		_pGame->GameRedrawCursor( _pdpMain, (_pGame->gm_csConsoleState!=CS_OFF)?0:GRV_SHOWEXTRAS);

		// print display mode info if needed
		//PrintDisplayModeInfo();

		// render console
		// ÄܼÖâ ·»´õ¸µ.
		_pGame->ConsoleRender(_pdpMain);

		// done with all
		_pdpMain->Unlock();

		// clear upper and lower parts of screen if in wide screen mode
/*
		if( _pdpMain==_pdpWideScreenMain && _pdpNormalMain->Lock()) {
			const PIX pixWidth  = _pdpWideScreenMain->GetWidth();
			const PIX pixHeight = (_pdpNormalMain->GetHeight() - _pdpWideScreenMain->GetHeight()) /2;
			const PIX pixJOfs   = pixHeight + _pdpWideScreenMain->GetHeight()-1;
			_pdpNormalMain->Fill( 0, 0,       pixWidth, pixHeight, C_BLACK|CT_OPAQUE);
			_pdpNormalMain->Fill( 0, pixJOfs, pixWidth, pixHeight, C_BLACK|CT_OPAQUE);
			_pdpNormalMain->Unlock();
		}
*/
		// show
		_pvpViewPortMain->SwapBuffers();
	}
}


/*
void TeleportPlayer(int iPosition)
{
CTString strCommand;
strCommand.PrintF( "cht_iGoToMarker = %d;", iPosition);
_pShell->Execute(strCommand);
}
*/


CTextureObject _toStarField;
static FLOAT _fLastVolume = 1.0f;
void RenderStarfield(CDrawPort *pdp, FLOAT fStrength)
{
	CTextureData *ptd = (CTextureData *)_toStarField.GetData();
	// skip if no texture
	if(ptd==NULL) return;

	PIX pixSizeI = pdp->GetWidth();
	PIX pixSizeJ = pdp->GetHeight();
	FLOAT fStretch = pixSizeJ / 480.0f;
	fStretch *= FLOAT(ptd->GetPixWidth()) / ptd->GetWidth();

	PIXaabbox2D boxScreen(PIX2D(0,0), PIX2D(pixSizeI, pixSizeJ));
	MEXaabbox2D boxTexture(MEX2D(0, 0), MEX2D(pixSizeI/fStretch, pixSizeJ/fStretch));
	pdp->PutTexture(&_toStarField, boxScreen, boxTexture, LerpColor(C_BLACK, C_WHITE, fStrength)|CT_OPAQUE);
}


FLOAT RenderQuitScreen(CDrawPort *pdp, CViewPort *pvp)
{
	CDrawPort dpQuit(pdp, 0);
	CDrawPort dpWide;
	dpQuit.MakeWideScreen(&dpWide);
	// redraw the view
	if (!dpWide.Lock()) {
		return 0;
	}

	dpWide.Fill(C_BLACK|CT_OPAQUE);
	RenderStarfield(&dpWide, _fLastVolume);
	
//	FLOAT fVolume = Credits_Render(&dpWide);
//	_fLastVolume = fVolume;
	_fLastVolume	= 1.0f;

	dpWide.Unlock();
	pvp->SwapBuffers();

	return _fLastVolume;
}

// Á¾·á½Ã Credit º¸¿©ÁÖ´Â ºÎºÐ.
void QuitScreenLoop(void)
{
//	Credits_On(3);
	CSoundObject soMusic;
	try 
	{
		_toStarField.SetData_t(CTFILENAME("Textures\\Background\\Night01\\Stars01.tex"));
		//0603 kwon »èÁ¦.
		//		soMusic.Play_t(CTFILENAME("Music\\Credits.mp3"), SOF_NONGAME|SOF_MUSIC|SOF_LOOP);
	} 
	catch (char *strError) 
	{
		CPrintF("%s\n", strError);
	}
	// while it is still running
	FOREVER 
	{
		FLOAT fVolume = RenderQuitScreen(_pdpMain, _pvpViewPortMain);
		if (fVolume<=0) 
		{
			return;
		}
		// assure we can listen to non-3d sounds
		soMusic.SetVolume(fVolume, fVolume);
		_pSound->UpdateSounds();
		// while there are any messages in the message queue
		MSG msg;
		while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) 
		{
			// if it is not a keyboard or mouse message
			if(msg.message==WM_LBUTTONDOWN||
				 msg.message==WM_RBUTTONDOWN||
				 msg.message==WM_KEYDOWN) 
			{
				return;
			}
		}
		//Sleep(5);
	}
}

// reverses string
void StrRev( char *str) {
	char ctmp;
	char *pch0 = str;
	char *pch1 = str+strlen(str)-1;
	while( pch1>pch0) {
		ctmp  = *pch0;
		*pch0 = *pch1;
		*pch1 = ctmp;
		pch0++;
		pch1--;
	}
}

void GetLCModulePathName(char* Path)
{
	char strTmpPath[MAX_PATH] = "";
	GetModuleFileName(NULL, strTmpPath, MAX_PATH);

	StrRev(strTmpPath);

	char *pstr = strchr( strTmpPath, '\\');
	if( strnicmp( pstr, "\\gubed", 6)==0) pstr += 6;
	if( pstr[0] = '\\') pstr++;
	char *pstrFin = strchr( pstr, '\\');
	if( pstrFin==NULL) {
		strcpy( pstr, "\\");
		pstrFin = pstr;
	}
	StrRev(pstrFin);
	strncpy(strTmpPath, pstrFin, MAX_PATH-1);
	strcpy(Path, strTmpPath);
}

int SubMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	(void)hPrevInstance;

#ifdef USE_NEW_LAUNCHER
	CTString strparam = CTString(lpCmdLine);
	IPCEventInfo EventInfo;
	memset(EventInfo.ulParameter2, 0, sizeof(EventInfo.ulParameter2));

	//////////////////////////////////////////////////////////////////////////
	// 
	char strPathName[MAX_PATH] = "";
	GetLCModulePathName(strPathName);
	CTFileName fnmBatch(strPathName);
	fnmBatch = fnmBatch + "LAUNCHER.BAT";
	FILE* fp = NULL;
	BOOL	bExistNewLauncher = FALSE;
	int		nLoopCount = 0;

	// launcher patch process change. [8/27/2010 rumist]
	if ((fp = fopen(fnmBatch, "rb")) != NULL)
	{
 		fclose(fp);
// 		MessageBox(NULL, "Update is completed.\nPlease, restart game.", "Update completed", MB_OK);
// 		ShellExecute(NULL, "open", fnmBatch, NULL, strPathName, SW_HIDE);
// 		return TRUE;
		bExistNewLauncher = TRUE;
	}

	if (!strparam.IsEqualCaseSensitive(CTString("4022")))
	{
		// IPC //////////////////////////////////////////////////////////////////////////
		XExtIPCManager<IPCEventInfo> IPCMgr;

		int Ret = IPCMgr.XExtIPCEventCreate(1, FALSE);

		if (Ret < 0)
		{
			MessageBox(NULL, "This program could not be run itself", "LastChaos", MB_OK);
			IPCMgr.XExtIPCEventRelease(FALSE);
			return TRUE;
		}

		do 
		{
			EventInfo.EventID = 0;

			Ret = IPCMgr.XExtIPCEventQueryIPCEvent(&EventInfo, NULL);
			++nLoopCount;

			if (Ret > 0)
			{
				IPCEventInfo SendEventInfo;
				
				if (bExistNewLauncher)
				{
					SendEventInfo.EventID = -1;
					SendEventInfo.DestProcessID = 0;
					SendEventInfo.ulParameter1 = 0;
					memset(SendEventInfo.ulParameter2, 0, sizeof(SendEventInfo.ulParameter2));
					IPCMgr.XExtIPCEventPost(&SendEventInfo);
					IPCMgr.XExtIPCEventRelease(FALSE);
					MessageBox(NULL, "Update is completed.\nPlease, restart game.", "Update completed", MB_OK);
 					ShellExecute(NULL, "open", fnmBatch, NULL, strPathName, SW_HIDE);
					return TRUE;
				}
				else if (EventInfo.EventID != 100)
				{
					SendEventInfo.EventID = -1;
					SendEventInfo.DestProcessID = 0;
					SendEventInfo.ulParameter1 = 0;
					memset(SendEventInfo.ulParameter2, 0, sizeof(SendEventInfo.ulParameter2));
					IPCMgr.XExtIPCEventPost(&SendEventInfo);
					MessageBox(NULL, "This program could not be run itself", "LastChaos", MB_OK);
					IPCMgr.XExtIPCEventRelease(FALSE);
					return TRUE;
				}
				if (SE_GetEngineDllRefCnt() > 1  || IsRunning() )// ¸ÖƼ Ŭ¶óÀ̾ðÆ® ¸·±â. [2/4/2010 rumist]
				{
					SendEventInfo.EventID = -1;
					SendEventInfo.DestProcessID = 0;
					SendEventInfo.ulParameter1 = 0;
					memset(SendEventInfo.ulParameter2, 0, sizeof(SendEventInfo.ulParameter2));
					IPCMgr.XExtIPCEventPost(&SendEventInfo);
					MessageBox(NULL, "Already Executive Game.", "LastChaos", MB_OK);
					IPCMgr.XExtIPCEventRelease(FALSE);
					return TRUE;
				}
				else
				{
					SendEventInfo.EventID = 100;
					SendEventInfo.DestProcessID = 0;
					SendEventInfo.ulParameter1 = 0;
					memset(SendEventInfo.ulParameter2, 0, sizeof(SendEventInfo.ulParameter2));
					IPCMgr.XExtIPCEventPost(&SendEventInfo);
					IPCMgr.XExtIPCEventRelease(FALSE);
					//MessageBox(NULL, "Send Event message", "LastChaos", MB_OK);
				}

				break;
			}

		} while( nLoopCount != 1000 );
	}

	GetNM(EventInfo.ulParameter2);
#else
	if (strlen(lpCmdLine) <= 0) {
		if( g_iCountry == RUSSIA )
		{
			MessageBox(NULL, "Êëèåíò èãðû íå ìîæå?áûòü çàïóùå?ñàìîñò?òåëüíî.", "LastChaos", MB_OK);
		}
		else
		{
			MessageBox(NULL, "This program could not be run itself", "LastChaos", MB_OK);
		}
		return TRUE;
	}
	
	GetNM(lpCmdLine);
#endif
	
	ShowCursor(FALSE);
	
	if( !Init( hInstance, nCmdShow, lpCmdLine )) return FALSE;

	BOOL bInit = TRUE;
	// WSS_NPROTECT 070402 ------------------------------->>
#ifndef NO_GAMEGUARD
//	CPrintF("[ ---->> GameGuard Init...Start <<---- ] - %lu\n",timeGetTime());
	//bInit = _pNetwork->Init_nProtect();
	//_pGameState->Running() = bInit;
	//WinMain ÃÖ»ó´Ü¿¡ ³Ö¾úÀ¸³ª string ó¸® ºÎºÐÀÌ uimanager¿¡ ÀÖ¾î¼* uimanagerÀ» »ý¼º ÈÄ Ã³¸®ÇØ¾ß µÈ´Ù. 
	CREATE_GAMEGUARD_WRAPPER();
	bInit = GAME_GUARD()->Init();	
//	CPrintF("[ ---->> GameGuard Init...End <<---- ] - %lu\n",timeGetTime());
#endif
	// ---------------------------------------------------<<
	
	// initialy, application is running and active, console and menu are off
	//_bRunning    = TRUE;
	//_bQuitScreen = TRUE;
	if(g_szExitError == NULL && bInit)
	{
		_pGameState->Running()	= TRUE;
		_pGameState->QuitScreen() = TRUE;
	}
	_pGame->gm_csConsoleState  = CS_OFF;
	//_pGame->gm_csComputerState = CS_OFF;
	//  _pGameState->m_bMenuActive    = FALSE;
	//_pGameState->m_bMenuRendering = FALSE;
	// while it is still running
	
#if _DEBUG
//	enableFPExceptions();
#endif	
	//_pGame->QuickTest(LOGIN_WORLD, pdp, pvpViewPort);
//#define AUTO_LOGIN
#ifndef AUTO_LOGIN
	if(_pGameState->Running())
	{
		_pGame->LoginGame(LOGIN_WORLD);
	}
#else	
	if(_pGameState->Running())
	{
		g_slZone = 0;
		_pGame->LoginGame(START_WORLD);
	}
#endif
	
	ShowCursor(TRUE);
	
	// À̱âȯ ¼öÁ¤ ½ÃÀÛ (11. 15) : IME »óÅ â Á¦°Å 
	SendMessage ( _hwndMain, WM_IME_NOTIFY, IMN_CLOSESTATUSWINDOW, NULL );
	// À̱âȯ ¼öÁ¤ ³¡ 


//¾ÈÅÂÈÆ ¼öÁ¤ ½ÃÀÛ	//(5th Closed beta)(0.2)
	FLOAT tmPrev = 0;
	FLOAT tmNow = 0;
	INDEX cntFrame = 0;
	FLOAT tmLastSndMute = 0;
//¾ÈÅÂÈÆ ¼öÁ¤ ³¡	//(5th Closed beta)(0.2)

	// WSS_NPROTECT 070402 ------------------------------->>
	// À©µµ¿ì ÇÚµé »ý¼º ÀÌÈÄ ¸ðµç ±×·¡ÇÈ UI°ü·Ã ÃʱâÈ*°¡ ³¡³* ÈÄ SetHwnd() È£Ãâ
	// ÀÌ ÇÔ¼ö·Î ºÎÅÍ CallBack ÇÔ¼ö°¡ È£Ã⠵DZ⠽ÃÀÛÇÔ...
#ifndef NO_GAMEGUARD
//	CPrintF("[ ---->> GameGuard SetHwnd...Start <<---- ] - %lu\n",timeGetTime());
	//_pNetwork->SetHwnd_nProtect(_hwndMain);
	GAME_GUARD()->SetMainHwnd( _hwndMain );
//	CPrintF("[ ---->> GameGuard SetHwnd...End <<---- ] - %lu\n",timeGetTime());
#endif
	// ---------------------------------------------------<<

	//while( _bRunning && _fnmModToLoad=="")
	while( _pGameState->Running() && _fnmModToLoad=="")
	{
		// while there are any messages in the message queue
		MSG msg;
		while( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE)) 
		{
			// if it is not a mouse message
			if( !(msg.message>=WM_MOUSEFIRST && msg.message<=WM_MOUSELAST) ) 
			{
				// if not system key messages
				if( !(msg.message==WM_KEYDOWN&& msg.wParam==VK_F10
					||msg.message==WM_SYSKEYDOWN) ) 
				{
					if(g_iCountry == JAPAN && msg.message ==WM_IME_COMPOSITION) ;
					else {
						// dispatch it
						TranslateMessage(&msg);
						DispatchMessage(&msg);
					}
				}
				// À̱âȯ ¼öÁ¤ ½ÃÀÛ (11. 15) : ±¹°¡ ¼³Á¤ º¯°æ½Ã ó¸® (¿¡·¯Ãâ·Â, º¯°æ ¸·À½)
				/*if ( msg.message == WM_INPUTLANGCHANGE || msg.message == WM_INPUTLANGCHANGEREQUEST )
				{
					_pUIMgr->MsgProc( &msg, &_bIMEProc ); 
				}*/
				// À̱âȯ ¼öÁ¤ ³¡ 
			}
			
			// system commands (also send by the application itself)
			if( msg.message==WM_SYSCOMMAND)
			{
				switch( msg.wParam & ~0x0F) 
				{
					// if should minimize
				case SC_MINIMIZE:
					if( _bWindowChanging) break;
					_bWindowChanging  = TRUE;
					//_bReconsiderInput = TRUE;
					// ¾²ÀÌÁö ¾Ê´Â ºÎºÐ.
					/*
					// if allowed, not already paused and only in single player game mode
					if( sam_bPauseOnMinimize && !_pNetwork->IsPaused() && _gmRunningGameMode==GM_SINGLE_PLAYER) 
					{
					// pause game
					_pNetwork->TogglePause();
					}
					*/
					// if in full screen
					if( IsFullScreen( sam_bFullScreenActive) ) 
					{
						// reset display mode and minimize window
						_pGfx->ResetDisplayMode();
						ShowWindow(_hwndMain, SW_MINIMIZE);
					}
					// if not in full screen
					else 
					{
						// just minimize the window
						ShowWindow(_hwndMain, SW_MINIMIZE);
					}
					break;
					// if should restore
				case SC_RESTORE:
					if( _bWindowChanging) break;
					_bWindowChanging  = TRUE;
					//_bReconsiderInput = TRUE;
					// if in full screen
					if( IsFullScreen( sam_bFullScreenActive) ) 
					{
						ShowWindow(_hwndMain, SW_SHOWNORMAL);
						// set the display mode once again
						StartNewMode( (GfxAPIType)sam_iGfxAPI, sam_iDisplayAdapter, sam_iScreenSizeI, sam_iScreenSizeJ,
							(enum DisplayDepth)sam_iDisplayDepth, IsFullScreen( sam_bFullScreenActive));
						// if not in full screen
					} else {
						// restore window
						ShowWindow(_hwndMain, SW_SHOWNORMAL);
					}
					break;
					// if should maximize
				case SC_MAXIMIZE:
					if( _bWindowChanging) break;
					_bWindowChanging  = TRUE;
					//_bReconsiderInput = TRUE;
					// go to full screen
					StartNewMode( (GfxAPIType)sam_iGfxAPI, sam_iDisplayAdapter, sam_iScreenSizeI, sam_iScreenSizeJ,
						(enum DisplayDepth)sam_iDisplayDepth, TRUE);
					ShowWindow( _hwndMain, SW_SHOWNORMAL);
					break;
				}
			}
			
			// toggle full-screen on alt-enter
			/*if( msg.message==WM_SYSKEYDOWN && msg.wParam==VK_RETURN && !IsIconic(_hwndMain)) {
			StartNewMode( (GfxAPIType)sam_iGfxAPI, sam_iDisplayAdapter, sam_iScreenSizeI, sam_iScreenSizeJ,
			(enum DisplayDepth)sam_iDisplayDepth, !IsFullScreen( sam_bFullScreenActive));
			}*/
			
			// if application should stop
			if( msg.message==WM_QUIT || msg.message==WM_CLOSE) 
			{				
				QuitGame();
			}
			
			// if application is deactivated or minimized
			if( (msg.message==WM_ACTIVATE && (LOWORD(msg.wParam)==WA_INACTIVE || HIWORD(msg.wParam)))
				||  msg.message==WM_CANCELMODE
				||  msg.message==WM_KILLFOCUS
				|| (msg.message==WM_ACTIVATEAPP && !msg.wParam)) 
			{
				// À̱âȯ ¼öÁ¤ ½ÃÀÛ (11. 15) : IME »óÅ â Á¦°Å 
				SendMessage ( _hwndMain, WM_IME_NOTIFY, IMN_CLOSESTATUSWINDOW, NULL );
				// À̱âȯ ¼öÁ¤ ³¡ 

				// if application is running and in full screen mode
				if( !_bWindowChanging && _pGameState->Running()) 
				{
					// minimize if in full screen 
					//if( IsFullScreen( sam_bFullScreenActive)) PostMessage(NULL, WM_SYSCOMMAND, SC_MINIMIZE, 0);
					// just disable input if not in full screen 
					//else _pInput->DisableInput();
				}
			}
			// if application is activated or minimized
			else if( (msg.message==WM_ACTIVATE && (LOWORD(msg.wParam)==WA_ACTIVE || LOWORD(msg.wParam)==WA_CLICKACTIVE))
				||  msg.message==WM_SETFOCUS
				|| (msg.message==WM_ACTIVATEAPP && msg.wParam)) 
			{
				if (msg.message == WM_SETFOCUS)
					msg = msg;
				// À̱âȯ ¼öÁ¤ ½ÃÀÛ (11. 15) : IME »óÅ â Á¦°Å 
				SendMessage ( _hwndMain, WM_IME_NOTIFY, IMN_CLOSESTATUSWINDOW, NULL );
				// À̱âȯ ¼öÁ¤ ³¡ 
				
				// enable input back again if needed
				//_bReconsiderInput = TRUE;
			}
			// UI message
			_pUIMgr->MsgProc( &msg, &_bIMEProc );	// yjpark // À̱âȯ ¼öÁ¤ 11.12 : IME ó¸® Ãß°¡
			
			BOOL bMenuForced = 
				//(_gmRunningGameMode==GM_NONE &&		// ¿øº».
				(_pGameState->GetGameMode() == CGameState::GM_NONE &&
				(_pGame->gm_csConsoleState==CS_OFF || 
				_pGame->gm_csConsoleState==CS_TURNINGOFF));
			
			// interpret console key presses
			// ÄܼÖâ¿¡ Å°ÀԷ¹޴ ºÎºÐ.
			if (_iAddonExecState==0) 
			{				
				if (msg.message==WM_KEYDOWN) 
				{
					_pGame->ConsoleKeyDown(msg);
					}/* else if (msg.message==WM_KEYUP) {		// yjpark
					 // special handler for talk (not to invoke return key bind)
					 if( msg.wParam==VK_RETURN && _pGame->gm_csConsoleState==CS_TALK) _pGame->gm_csConsoleState = CS_OFF;
			}*/ else if (msg.message==WM_CHAR) 
				{
					_pGame->ConsoleChar(msg);
				}
			}
			
			// if toggling console
			// ÄÜ¼Ö Å°¸¦ ´*·¶À»¶§~!!!
			BOOL bConsoleKey = sam_bToggleConsole || msg.message==WM_KEYDOWN && _pNetwork->m_ubGMLevel > 0 &&
				( MapVirtualKey( msg.wParam, 0 ) == 41 /* scan code for '~' */ );
			if(bConsoleKey && !_bDefiningKey)
			{
				sam_bToggleConsole = FALSE;
				if( _iAddonExecState==3) _iAddonExecState = 0;
				// if it is up, or pulling up
				if( _pGame->gm_csConsoleState==CS_OFF || _pGame->gm_csConsoleState==CS_TURNINGOFF) 
				{
					// start it moving down and disable menu
					_pGame->gm_csConsoleState = CS_TURNINGON;
					// stop all IFeel effects
					IFeel_StopEffect(NULL);
					
					// ¸Þ´º°¡ È°¼ºÈ*µÇ¾îÀÖ´Ù¸é, ¸Þ´º¸¦ ºñÈ°¼ºÈ*ÇÔ.	
					//_pGameState->m_bMenuActive = FALSE;
					//if(_pGame->gm_bGameOn)
					// °ÔÀÓÀÌ ½ÇÇàÁßÀ϶§¸¸ È£ÃâµÇ¾î¾ßÇÔ.
					//	_pUIMgr->SetUIGameState( UGS_GAMEON );
					/*
					if( _pGameState->m_bMenuActive) 
					{
					StopMenus(FALSE);
					}
					*/
					// if it is down, or dropping down
				}
				
				// ÄܼÖâÀ» ´ÝÀ¸·ÁÇÒ¶§...
				// Áï, ÄܼÖâÀÌ ¿*¸°»óÅ¿¡¼*....
				else if( _pGame->gm_csConsoleState==CS_ON || _pGame->gm_csConsoleState==CS_TURNINGON) 
				{
					// start it moving up
					_pGame->gm_csConsoleState = CS_TURNINGOFF;
				}
			}
			
			/*if (_pShell->GetINDEX("con_bTalk") && _pGame->gm_csConsoleState==CS_OFF) {
			_pShell->SetINDEX("con_bTalk", FALSE);
			_pGame->gm_csConsoleState = CS_TALK;
			}*/		// yjpark
			
			/*
			// if pause pressed// ¸Þ´º°¡ È°¼ºÈ*µÈ »óÅ¿¡¼* PAUSEÅ°¸¦ ´*·¶À»¶§...(ÇÊ¿ä¾øÀ½)
			if (msg.message==WM_KEYDOWN && msg.wParam==VK_PAUSE) 
			{
			// toggle pause
			_pNetwork->TogglePause();
			}
			*/
			
		} // loop while there are messages
		
		// when all messages are removed, window has surely changed
		_bWindowChanging = FALSE;
		
		// get real cursor position
		/*if( _pGame->gm_csComputerState!=CS_OFF && _pGame->gm_csComputerState!=CS_ONINBACKGROUND) {
		POINT pt;
		::GetCursorPos(&pt);
		::ScreenToClient(_hwndMain, &pt);
		_pGame->ComputerMouseMove(pt.x, pt.y);
			}*/		// yjpark
		
		// if addon is to be executed
		if (_iAddonExecState==1) {
			// print header and start console
			CPrintF(TRANS("---- Executing addon: '%s'\n"), (const char*)_fnmAddonToExec);
			sam_bToggleConsole = TRUE;
			_iAddonExecState = 2;
			// if addon is ready for execution
		} else if (_iAddonExecState==2 && _pGame->gm_csConsoleState == CS_ON) {
			// execute it
			CTString strCmd;
			strCmd.PrintF("include \"%s\"", (const char*)_fnmAddonToExec);
			_pShell->Execute(strCmd);
			CPrintF(TRANS("Addon done, press Escape to close console\n"));
			_iAddonExecState = 3;
		}
		
		// automaticaly manage input enable/disable toggling
		//UpdateInputEnabledState();
		// automaticaly manage pause toggling
		UpdatePauseState();
		// notify game whether menu is active
		//_pGame->gm_bMenuOn = _pGameState->m_bMenuActive;
		
		// do the main game loop and render screen
		DoGame();
		
//¾ÈÅÂÈÆ ¼öÁ¤ ½ÃÀÛ	//(5th Closed beta)(0.2)
		extern ENGINE_API FLOAT g_fFramePerSecond;
		extern ENGINE_API BOOL g_bNoPlaySnd;
		++cntFrame;
		tmNow = (FLOAT)_pTimer->GetHighPrecisionTimer().GetSeconds();
		static bool bForDebug = FALSE;
		if(!bForDebug)
		{
			if(g_fFramePerSecond == FLT_MAX || (tmNow - tmPrev) >= 1.0f)	//1ÃÊ¿¡ Çѹø ó¸®.
			{
				g_fFramePerSecond = FLOAT( cntFrame / (tmNow - tmPrev) );
				if(g_fFramePerSecond < 6.1f)
				{
					tmLastSndMute = tmNow;
					g_bNoPlaySnd = TRUE;
				}
				else if( tmLastSndMute != 0 && (tmNow - tmLastSndMute) > 1.f )
				{
					tmLastSndMute = 0;
					g_bNoPlaySnd = FALSE;
				}
				cntFrame = 0;
				tmPrev = tmNow;

				// WSS_NPROTECT 070402 ------------------------------->>
#ifndef NO_GAMEGUARD
				//_pNetwork->Check_nProtect();
				GAME_GUARD()->CheckGameGuard();
#endif
				// ---------------------------------------------------<<
			}
		}
//¾ÈÅÂÈÆ ¼öÁ¤ ³¡	//(5th Closed beta)(0.2)
		// limit current frame rate if neeeded
		//LimitFrameRate();
		
	} // end of main application loop
	
	//_pInput->DisableInput();
	_pGame->StopGame();

	// WSS_NPROTECT 070402 ------------------------------->>
	/*
#ifndef NO_GAMEGUARD
	if(g_szHackMsg.Length()>0)
	{
		MessageBox(_hwndMain,g_szHackMsg.str_String,"nProtect GameGuard",MB_OK);
	}	
#endif
	/**/
	// ---------------------------------------------------<<
	
	
	// invoke quit screen if needed
	// °ÔÀÓ Á¾·á½Ã È£ÃâµÇ´Â ºÎºÐ.
	//if( _bQuitScreen && _fnmModToLoad=="") QuitScreenLoop();
	
	End();
	
	return TRUE;
}

void CheckModReload(void)
{
	if (_fnmModToLoad!="") {
#ifndef NDEBUG
		CTString strDebug = "Debug\\";
#else
		CTString strDebug = "";
#endif
		CTString strCommand = _fnmApplicationPath+"Bin\\"+strDebug+"SeriousSam.exe";
		//+mod "+_fnmModToLoad.FileName()+"\"";
		CTString strMod = _fnmModToLoad.FileName();
		const char *argv[7];
		argv[0] = strCommand;
		argv[1] = "+game";
		argv[2] = strMod;
		argv[3] = NULL;
		if (_strModServerJoin!="") {
			argv[3] = "+connect";
			argv[4] = _strModServerJoin;
			argv[5] = "+quickjoin";
			argv[6] = NULL;
		}
		_execv(strCommand, argv);
	}
}

/*
void CheckTeaser(void)
{
	CTFileName fnmTeaser = _fnmApplicationPath+CTString("Bin\\AfterSam.exe");
	if (fopen(fnmTeaser, "r")!=NULL) {
		Sleep(500);
		_execl(fnmTeaser, "\""+fnmTeaser+"\"", NULL);
	}
}

void CheckBrowser(void)
{
	if (_strURLToVisit!="") {
		RunBrowser(_strURLToVisit);
	}
}
*/
#ifdef   _DEBUG
#define  SET_CRT_DEBUG_FIELD(a) \
            _CrtSetDbgFlag((a) | _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG))
#define  CLEAR_CRT_DEBUG_FIELD(a) \
            _CrtSetDbgFlag(~(a) & _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG))
#else
#define  SET_CRT_DEBUG_FIELD(a)   ((void) 0)
#define  CLEAR_CRT_DEBUG_FIELD(a) ((void) 0)
#endif

int PASCAL WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
			LPSTR lpCmdLine, int nCmdShow)
{
/*
	HANDLE hMutex = CreateMutex(NULL, TRUE, "LastChaosIsOnlyOne!");
	if(hMutex == NULL || GetLastError() == ERROR_ALREADY_EXISTS)
	{
		return 1;
	}
*/

#ifdef XTRAP_SECURE_CKBANG_2010_07_20
    CREATE_XTRAP_WRAPPER("");
#endif

	int iResult;
	CTSTREAM_BEGIN {
		iResult = SubMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow);
	} CTSTREAM_END;
	CTStream::ClearStreamHandling();

	CheckModReload();


#ifdef XTRAP_SECURE_CKBANG_2010_07_20
    DESTROY_XTRAP_WRAPPER();
#endif

#ifndef NO_GAMEGUARD
	GAME_GUARD()->ShowErrMsg();
	DESTROY_GAMEGUARD_WRAPPER();
#endif 
	
/*
	CloseHandle(hMutex);
*/
	if(g_szExitError != NULL)
	{
		::MessageBox(NULL, g_szExitError, "Error", MB_OK);
		delete[] g_szExitError;
	}

	SET_CRT_DEBUG_FIELD( _CRTDBG_LEAK_CHECK_DF );

	return iResult;
}


// try to start a new display mode
BOOL TryToSetDisplayMode( enum GfxAPIType eGfxAPI, INDEX iAdapter, PIX pixSizeI, PIX pixSizeJ,
													enum DisplayDepth eColorDepth, BOOL bFullScreenMode)
{
	CDisplayMode dmTmp;
	dmTmp.dm_ddDepth = eColorDepth;
	CPrintF( TRANS("  Starting display mode: %dx%dx%s (%s)\n"),
					 pixSizeI, pixSizeJ, dmTmp.DepthString(),
					 bFullScreenMode ? TRANS("fullscreen") : TRANS("window"));

	// mark to start ignoring window size/position messages until settled down
	_bWindowChanging = TRUE;
	
	// destroy canvas if existing
	_pGame->DisableLoadingHook();
	if( _pvpViewPortMain!=NULL) {
 	  _pGfx->DestroyWindowCanvas( _pvpViewPortMain);
		_pvpViewPortMain = NULL;
		_pdpNormalMain = NULL;
	}

	// close the application window
	CloseMainWindow();

	// try to set new display mode
	BOOL bSuccess;
	if( bFullScreenMode) {
		if( eGfxAPI==GAT_D3D) OpenMainWindowFullScreen( pixSizeI, pixSizeJ);
		bSuccess = _pGfx->SetDisplayMode( eGfxAPI, iAdapter, pixSizeI, pixSizeJ, eColorDepth);
		if( bSuccess && eGfxAPI==GAT_OGL) OpenMainWindowFullScreen( pixSizeI, pixSizeJ);
	} else {
		if( eGfxAPI==GAT_D3D) OpenMainWindowNormal( pixSizeI, pixSizeJ);
		bSuccess = _pGfx->ResetDisplayMode( eGfxAPI);
		if( bSuccess && eGfxAPI==GAT_OGL) OpenMainWindowNormal( pixSizeI, pixSizeJ);
		if( bSuccess && eGfxAPI==GAT_D3D) ResetMainWindowNormal();
	}

	// if new mode was set
	if( bSuccess) {
		// create canvas
		ASSERT( _pvpViewPortMain==NULL);
		ASSERT( _pdpNormalMain==NULL);
		if(_pdpNormalMain) delete _pdpNormalMain;
 	  _pGfx->CreateWindowCanvas( _hwndMain, &_pvpViewPortMain, &_pdpNormalMain);

	    // À©µµ¿ì Æ÷Ä¿½º Á¶Á¤
	    SetFocus(_hwndMain);

		// erase context of both buffers (for the sake of wide-screen)
		_pdpMain = _pdpNormalMain;
		if( _pdpMain!=NULL && _pdpMain->Lock()) {
			_pdpMain->Fill(C_BLACK|CT_OPAQUE);
			_pdpMain->Unlock();
			_pvpViewPortMain->SwapBuffers();
			_pdpMain->Lock();
			_pdpMain->Fill(C_BLACK|CT_OPAQUE);
			_pdpMain->Unlock();
			_pvpViewPortMain->SwapBuffers();
		}

		// lets try some wide screen screaming :)
		const PIX pixYBegAdj = _pdpMain->GetHeight() * 21/24;
		const PIX pixYEndAdj = _pdpMain->GetHeight() * 3/24;
		const PIX pixXEnd    = _pdpMain->GetWidth();
		//if(_pdpWideScreenMain) delete _pdpWideScreenMain;
		//_pdpWideScreenMain = new CDrawPort( _pdpMain, PIXaabbox2D( PIX2D(0,pixYBegAdj), PIX2D(pixXEnd, pixYEndAdj)));
		//_pdpWideScreenMain->dp_fWideAdjustment = 9.0f / 12.0f;
		//if( sam_bWideScreen) _pdpMain = _pdpWideScreenMain;

		// initial screen fill and swap, just to get context running
		BOOL bSuccess = FALSE;
		if( _pdpMain!=NULL && _pdpMain->Lock()) 
		{
			//pdp->Fill( LCDGetColor( C_dGREEN|CT_OPAQUE, "bcg fill"));		// ¿øº».
			_pdpMain->Fill( C_BLACK|CT_OPAQUE);				// maybe µ¿¹Î
			_pdpMain->Unlock();
			_pvpViewPortMain->SwapBuffers();
			bSuccess = TRUE;
		}
		_pGame->EnableLoadingHook(_pdpMain);

		// if the mode is not working, or is not accelerated
		if( !bSuccess || !_pGfx->IsCurrentModeAccelerated())
		{ // report error
			CPrintF( TRANS("This mode does not support hardware acceleration.\n"));
			// destroy canvas if existing
			if( _pvpViewPortMain!=NULL) {
				_pGame->DisableLoadingHook();
 				_pGfx->DestroyWindowCanvas( _pvpViewPortMain);
				_pvpViewPortMain = NULL;
				_pdpNormalMain = NULL;
			}
			// close the application window
			CloseMainWindow();
			// report failure
			return FALSE;
		}

		// Compressed texture
		if( eGfxAPI == GAT_D3D )
		{
			HRESULT	hrDXT1 = _pGfx->gl_pD3D->CheckDeviceFormat( iAdapter,
																D3DDEVTYPE_HAL,
																_pGfx->gl_d3dColorFormat,
									                            0,
																D3DRTYPE_TEXTURE,
																D3DFMT_DXT1 );
			HRESULT	hrDXT3 = _pGfx->gl_pD3D->CheckDeviceFormat( iAdapter,
																D3DDEVTYPE_HAL,
																_pGfx->gl_d3dColorFormat,
									                            0,
																D3DRTYPE_TEXTURE,
																D3DFMT_DXT3 );
			HRESULT	hrDXT5 = _pGfx->gl_pD3D->CheckDeviceFormat( iAdapter,
																D3DDEVTYPE_HAL,
																_pGfx->gl_d3dColorFormat,
									                            0,
																D3DRTYPE_TEXTURE,
																D3DFMT_DXT5 );

			_pGfx->gl_bCompressedTexture = SUCCEEDED( hrDXT1 ) && SUCCEEDED( hrDXT3 ) && SUCCEEDED( hrDXT5 );
		}

		// remember new settings
		sam_bFullScreenActive = (bFullScreenMode==FULLSCREEN_MODE)?FULLSCREEN_MODE:OLD_WINDOW_MODE;
		sam_iScreenSizeI = pixSizeI;
		sam_iScreenSizeJ = pixSizeJ;
		sam_iDisplayDepth = eColorDepth;
		sam_iDisplayAdapter = iAdapter;
		sam_iGfxAPI = eGfxAPI;

		// report success
		return TRUE;
	}

	// if couldn't set new mode
	else {
		// close the application window
		CloseMainWindow();
		// report failure
		return FALSE;
	}
}


// list of possible display modes for recovery 
const INDEX aDefaultModes[][3] =
{ // color, API, adapter
	{ DD_DEFAULT, GAT_OGL, 0},
	{ DD_16BIT,   GAT_OGL, 0},
	{ DD_16BIT,   GAT_OGL, 1}, // 3dfx Voodoo2
	{ DD_DEFAULT, GAT_D3D, 0},
	{ DD_16BIT,   GAT_D3D, 0},
	{ DD_16BIT,   GAT_D3D, 1},
};
const INDEX ctDefaultModes = ARRAYCOUNT(aDefaultModes);

// start new display mode
void StartNewMode( enum GfxAPIType eGfxAPI, INDEX iAdapter, PIX pixSizeI, PIX pixSizeJ,
									 enum DisplayDepth eColorDepth, BOOL bFullScreenMode)
{
	CPrintF( TRANS("\n* START NEW DISPLAY MODE ...\n"));

	// clamp window size to screen size if in window mode
	if( !bFullScreenMode) {
		PIX pixMaxSizeI = _pixDesktopWidth  - 1; // need 1st lower resolution than desktop
		PIX pixMaxSizeJ = _pixDesktopHeight - 1;
		if( pixSizeI>pixMaxSizeI || pixSizeJ>pixMaxSizeJ) {
			extern void FindMaxResolution( PIX &pixSizeI, PIX &pixSizeJ);
			FindMaxResolution( pixMaxSizeI, pixMaxSizeJ);
			pixSizeI = pixMaxSizeI;
			pixSizeJ = pixMaxSizeJ;
		}
	}

	// try to set the mode
	BOOL bSuccess = TryToSetDisplayMode( eGfxAPI, iAdapter, pixSizeI, pixSizeJ, eColorDepth, bFullScreenMode);

	// if failed
	if( !bSuccess)
	{
		// report failure and reset to default resolution
		_iDisplayModeChangeFlag = 2;  // failure
		CPrintF( TRANS("Requested display mode could not be set!\n"));
		pixSizeI = 640;
		pixSizeJ = 480;
		bFullScreenMode = TRUE;
		// try to revert to one of recovery modes
		for( INDEX iMode=0; iMode<ctDefaultModes; iMode++) {
			eColorDepth = (DisplayDepth)aDefaultModes[iMode][0];
			eGfxAPI     = (GfxAPIType)  aDefaultModes[iMode][1];
			iAdapter    =               aDefaultModes[iMode][2];
			CPrintF(TRANS("\nTrying recovery mode %d...\n"), iMode);
			bSuccess = TryToSetDisplayMode( eGfxAPI, iAdapter, pixSizeI, pixSizeJ, eColorDepth, bFullScreenMode);
			if( bSuccess) break;
		}
		// if all failed
		if( !bSuccess) {
			FatalError(TRANS(
				"Cannot set display mode!\n"
				"Last Chaos was unable to find display mode with hardware acceleration.\n"
				"Make sure you install proper drivers for your video card as recommended\n"
				"in documentation and set your desktop to 16 bit (65536 colors).\n"
				"Please see ReadMe file for troubleshooting information.\n"));
		}

	// if succeeded
	} else {
		_iDisplayModeChangeFlag = 1;  // all ok
	}

	// apply 3D-acc settings
	ApplyGLSettings(FALSE);

	// remember time of mode setting
	_tmDisplayModeChanged = _pTimer->GetRealTimeTick();
}


Ist das der Source-Code von der nksp.exe ?



Würde mich noch interessieren ^^
Klo.Brille is offline  
Old 01/25/2013, 17:32   #1639
 
shadow52's Avatar
 
elite*gold: 13
Join Date: May 2009
Posts: 1,314
Received Thanks: 1,483
@Klo.Brille
Es ist ein Teil... es fehlen aber noch einige.
Demnach bringt sie dir rein 0.
(Da wie gesagt noch einige andere Teile fehlen, und nebenbei bemerkt er schon uralt ist...)
shadow52 is offline  
Old 01/25/2013, 17:49   #1640
 
elite*gold: 8
Join Date: May 2010
Posts: 2,138
Received Thanks: 783
Naja aber ist es nicht illegal das spielgeschehen so zu schädigen das maßnahmen wie rollbacks ect ergiffen werden müssen?

Ich denke da steckt man in einer Lücke zwischen legal und illegalität.

Zu mal wird falo nicht dumm sein , ipblocker,changer ect wird doch alles vorhanden sein.
Sachverständiger is offline  
Old 01/25/2013, 18:24   #1641
 
eventmaker's Avatar
 
elite*gold: 0
Join Date: Apr 2011
Posts: 548
Received Thanks: 555
Quote:
Originally Posted by •A.Я.E.Z•™ View Post
Naja aber ist es nicht illegal das spielgeschehen so zu schädigen das maßnahmen wie rollbacks ect ergiffen werden müssen?

Ich denke da steckt man in einer Lücke zwischen legal und illegalität.

Zu mal wird falo nicht dumm sein , ipblocker,changer ect wird doch alles vorhanden sein.
Nein eben nicht wir selber haben den Spielspaß anderer nicht beeinflusst wir haben zwar items verteilt aber jeder hätte spielen können Gamigo hatte die wahl zwischen Server abschalten und Rb oder weiterlaufen lassen wir haben Gamigo die Wahl nicht genommen indem wir die Server crashen oder so.
Und gamigo weiss auch das sie uns nicht anzeigen können ganz einfach,
ja Gamigo hat in der Zeit einen schaden erlitten der aber aufgrund eines Spielfehlers aufgetreten ist und nicht die Server in irgendeiner hinsicht beschädigt und genau dass ist der Punkt warum Gamigo uns nicht Anzeigen wird/kann.
eventmaker is offline  
Thanks
1 User
Old 01/25/2013, 19:34   #1642
 
elite*gold: 0
Join Date: Oct 2009
Posts: 51
Received Thanks: 7
Quote:
Originally Posted by eventmaker View Post
Nein eben nicht wir selber haben den Spielspaß anderer nicht beeinflusst wir haben zwar items verteilt aber jeder hätte spielen können Gamigo hatte die wahl zwischen Server abschalten und Rb oder weiterlaufen lassen wir haben Gamigo die Wahl nicht genommen indem wir die Server crashen oder so.
Und gamigo weiss auch das sie uns nicht anzeigen können ganz einfach,
ja Gamigo hat in der Zeit einen schaden erlitten der aber aufgrund eines Spielfehlers aufgetreten ist und nicht die Server in irgendeiner hinsicht beschädigt und genau dass ist der Punkt warum Gamigo uns nicht Anzeigen wird/kann.
hmm rein theoretisch könnten aber die spieler eine anzeige erstatten den sie haben auch schaden erlitten
was vermutlich zu viel aufwand für so wenig schaden wär
DarkGaara is offline  
Old 01/25/2013, 19:37   #1643
 
eventmaker's Avatar
 
elite*gold: 0
Join Date: Apr 2011
Posts: 548
Received Thanks: 555
Quote:
Originally Posted by DarkGaara View Post
hmm rein theoretisch könnten aber die spieler eine anzeige erstatten den sie haben auch schaden erlitten
was vermutlich zu viel aufwand für so wenig schaden wär
Ok ich bitte dich nun zur Polizei zur laufen (am besten du nimmst das irgendwie auf) und zu sagen das du eine Anzeige gegen Unbekannt einreichen willst weil jemand virtuelles gold in deinem mmorpg verteilt hat,
ernsthaft Leute meint ihr das ernst?
eventmaker is offline  
Thanks
2 Users
Old 01/25/2013, 19:41   #1644
 
elite*gold: 0
Join Date: Dec 2012
Posts: 79
Received Thanks: 116
Quote:
Originally Posted by honkadi View Post
You do realize that Gaymigo is a german company and could care less about the DMCA?

Hier noch ein paar Wikipedia Infos

Crack (Software)

Rechtliche Lage

Die meisten kommerziellen Applikationen untersagen in ihren Lizenzbedingungen jegliche Modifikationen der Software oder sogar schon den Vorgang des Disassemblierens. In vielen Ländern existieren Gesetze, die definieren, inwieweit eine Modifikation eines Binärprogramms erlaubt ist. In Deutschland ist das Modifizieren eines Binärprogramms somit grundsätzlich erlaubt, solange die ursprüngliche Funktionalität des Programms nicht beeinträchtigt wird. Zusätzliche Funktionen dürfen dabei alleine zum Zwecke der Herstellung von Kompatibilität zu eigenen Programmen implementiert werden. Ein Patch darf dabei nur in Form eines Programms verbreitet werden, das die Originaldatei nach Vorgaben verändert, jedoch nicht in Form einer modifizierten Kopie der Originaldatei. Das Recht, ein Programm zum Zwecke der Herstellung von Kompatibilität verändern zu dürfen ist auf internationaler Ebene nicht selbstverständlich. Das Untersagen jeglicher Modifikationen in den Lizenzbedingungen hat jedoch in den seltensten Fällen rechtswirksame Konsequenzen, da dies u. a. auch den Vorgang des Entfernens eines Computervirus durch Antivirenprogramme in Frage stellt.
Da die rechtliche Lage häufig unklar ist, was das Entfernen von einem Kopierschutz betrifft, verwenden manche kommerzielle Applikationen einen verschlüsselten oder komprimierten Binärcode, wodurch die Daten gemäß Vorgaben in ausführbaren Maschinencode konvertiert werden müssen, bevor sie vom Computer interpretierbar sind. Da die Programme jedoch dem Rechner „verraten“ müssen, wie die integrierten Daten zu konvertieren sind, ist es auch für Cracker nachvollziehbar, wie sich der Code in einen interpretierbaren Zustand konvertieren lässt. Die Software-Industrie implementiert solche Verfahren, um es einerseits den Crackern zu erschweren, das Programm zu interpretieren. Jedoch auch, um die Möglichkeit zu unterbinden, ein Patch-Programm zur Modifikation des Original-Programms zu veröffentlichen, da es so nicht mehr möglich ist, das Programm durch das Verändern einzelner Bytes zu modifizieren und als einzige Möglichkeit die Verbreitung einer vollständigen modifizierten Originaldatei verbleibt. Dies ist urheberrechtlich meist eindeutig untersagt.


Aber wie gesagt, ich glaube nicht das hier jemand mit Urheberrechtsverletzung wegen Erzeugen des Hack kommt, sondern eher wegen des Stören des Spielbetrieb. Und das ist in jedem Fall verboten und wird auch recht hart bestraft, wenn man denn erwischt wird.

Denial of Service

Rechtliche Situation

In Deutschland ist die Beteiligung an DoS-Attacken als "Computersabotage" nach § 303b Abs. 1 StGB mit bis zu drei Jahren Freiheitsstrafe oder mit Geldstrafe bedroht, wenn die Dateneingabe oder -übermittlung in der Absicht erfolgt, einem anderen Nachteil zuzufügen, und dadurch eine Datenverarbeitung, die für einen anderen von wesentlicher Bedeutung ist, erheblich gestört wird.[12][13] Dementsprechend verurteilte das LG Düsseldorf einen Täter, der im Wege einer DDos-Attacke fremde Server mehrfach lahmgelegt hatte, wegen Computersabotage und Erpressung zu einer mehrjährigen Freiheitsstrafe.[14]
Gemäß § 303b Abs. 3 StGB ist auch der Versuch strafbar. Daneben ist ferner auch die Vorbereitung einer Straftat nach § 303b Abs. 1 StGB selbst strafbar, § 303b Abs. 5 StGB i. V. m. § 202c StGB. Hierunter fällt insbesondere die Herstellung und Verbreitung von Computerprogrammen für DoS-Attacken.[15]
Außerdem kann der Geschädigte Schadenersatz fordern.[16] Im Verhältnis zwischen Zugangsanbieter und Reseller liegt das Vertragsrisiko nach Ansicht des Amtsgerichts Gelnhausen regelmäßig bei dem Reseller, so dass er jenem gegenüber auch dann zahlungspflichtig ist, wenn die Leitung durch eine DDoS-Attacke gestört wird.[17]

Und geh mal davon aus, wenn sowas simples wie ein DDoS schon als Computersabotage gewertet wird, dann fällt das bewusste Verteilen von gehackten Cash Items und Gold und kram mit dem Wissen das dann das Spiel offline genommen wird und ein Rollback kommen muss, ziemlich sicher darunter.
You do understand the difference between cracking and reverse engineering right? Cracking software is actually applying changes to the file, causing it to work in another way that was not originally intended. 99% of the hacks and bots for games on the internet do not change the client files at all. We hook the client, use its functions (send/recv/etc), and change its memory during runtime. This is not the same as changing actual byte structure of the file itself. So in theory you are not "cracking" the software. Plus your wiki link says the same exact thing.

Quote:
Dabei wird nichts Neues programmiert, sondern nur nachvollzogen, wie der ursprüngliche Code funktioniert, um das Programm gezielt zu verändern.
Game hacking is not illegal.
WarmongerR23 is offline  
Old 01/25/2013, 19:45   #1645

 
elite*gold: 2
Join Date: May 2010
Posts: 2,257
Received Thanks: 1,919
Quote:
Originally Posted by eventmaker View Post
Ok ich bitte dich nun zur Polizei zur laufen (am besten du nimmst das irgendwie auf) und zu sagen das du eine Anzeige gegen Unbekannt einreichen willst weil jemand virtuelles gold in deinem mmorpg verteilt hat,
ernsthaft Leute meint ihr das ernst?
Ich muss dir leider sagen, dass sie es ernst meinen, aber du hast Recht, die Polizei wird lachen und wahrscheinlich die Leute die eine Anzeige erstatten wollen, erstmal auf Drogen untersuchen. Naja LastChaos ist schon lange die Luft raus...
Ih¢sãs123 is offline  
Old 01/26/2013, 01:08   #1646
 
elite*gold: 0
Join Date: Dec 2009
Posts: 122
Received Thanks: 8
is schon irgendwas public? oder halten die kiddys das Teil immer noch zurück?
soLong09 is offline  
Old 01/26/2013, 09:09   #1647
 
elite*gold: 0
Join Date: Oct 2012
Posts: 158
Received Thanks: 25
Quote:
Originally Posted by soLong09 View Post
is schon irgendwas public? oder halten die kiddys das Teil immer noch zurück?
les den ersten Post von Falo du depp
SeVeRaL...? is offline  
Thanks
1 User
Old 01/26/2013, 11:30   #1648
 
elite*gold: 0
Join Date: Dec 2009
Posts: 122
Received Thanks: 8
Klappe zu du lappen, wer einen Fred aufmacht und dann hier einen auf dicke Hose macht wird auf kurz oder lang was preis geben, das liegt in der Natur des jenigen ansonsten hätte er sich ja den Fred sparen können.
soLong09 is offline  
Old 01/26/2013, 12:33   #1649
 
elite*gold: 0
Join Date: Jan 2010
Posts: 100
Received Thanks: 23
Quote:
Originally Posted by soLong09 View Post
Klappe zu du lappen, wer einen Fred aufmacht und dann hier einen auf dicke Hose macht wird auf kurz oder lang was preis geben, das liegt in der Natur des jenigen ansonsten hätte er sich ja den Fred sparen können.
gehts auch mal ohne beleidigungen ?
moller999 is offline  
Thanks
2 Users
Old 01/26/2013, 13:09   #1650
 
Projekt22's Avatar
 
elite*gold: 0
Join Date: Jun 2011
Posts: 326
Received Thanks: 65
Quote:
Originally Posted by soLong09 View Post
Klappe zu du lappen, wer einen Fred aufmacht und dann hier einen auf dicke Hose macht wird auf kurz oder lang was preis geben, das liegt in der Natur des jenigen ansonsten hätte er sich ja den Fred sparen können.
Vielleicht wollte er die Leute auch nur drüber informieren, was er so schönes herausgefunden hat. Die du an dem Thread hier sehen kannst, diskutieren die Leute sehr gerne (165 seiten *hust*)
Außerdem wartet Falo ja auch drauf das die Bugs bzw. Dupes gefixt werden. Also wieso sollte er hier die Funktionen seines Hacks nicht posten ?
Er hat ja auch gesagt, dass der Hack erst public wird, wenn alles gefixt ist.

PS: Spar dir die Beleidigungen.
Projekt22 is offline  
Closed Thread


Similar Threads Similar Threads
[B] ULTIMATIVER e*G/PSC Rechner!
11/12/2011 - elite*gold Trading - 18 Replies
http://www.abload.de/img/vinnislzoo2.png Ihr wolltet ihn, ihr kriegt ihn! Neues Design, neue Features! JETZT WIRD AUCH DER CODE VERKAUFT!!!!!!!! 25 e*G!!!! Features:
Ultimativer Darkorbit Bot
07/20/2011 - DarkOrbit - 4 Replies
Dieser Bot Enthaltet alles was man brauch egal ob gates oder bis zum klicken getarnter Feinde der bot kann alles und es fällt im system nicht als botten auf sondern als normales spielen. Download Link
Ultimativer Hack?
09/26/2010 - WarRock - 9 Replies
Hey liebe Gemeinschaft, war gerade in nem 16er room da hatte wer nen Hack das das Team direkt nach Spawn stirbt aber keinen death dazubekam das Game ging mit Win/loose und KD 0/0 aus. Habs zum ersten mal miterlebt bzw. davon gehört ^^ Könnt mir einer mehr dazu sagen? :D
Ultimativer Multihack
06/07/2010 - Metin2 Hacks, Bots, Cheats, Exploits & Macros - 11 Replies
Hi, ich habe mich mal im proggen geübt, und das kam dabei raus: funktionen: Teleport moblock speed attack speed



All times are GMT +2. The time now is 01:47.


Powered by vBulletin®
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2024 elitepvpers All Rights Reserved.