// stdafx.h : 자주 사용하지만 자주 변경되지는 않는
// 표준 시스템 포함 파일 및 프로젝트 관련 포함 파일이 
// 들어 있는 포함 파일입니다.
//

#pragma once

#define WIN32_LEAN_AND_MEAN		// 거의 사용되지 않는 내용은 Windows 헤더에서 제외합니다.
#define DIRECTINPUT_VERSION         0x0800


// 아래 플래그는 기존에 사용하던 String관련 함수들도 그대로 두도록 한것임.
#define STRSAFE_NO_DEPRECATE

#pragma warning (push, 3)

#include <winsock2.h>
#include <stdio.h>
#include <tchar.h>
#include <ocidl.h>
#include <time.h>

#include <dinput.h>

#include <NiBuildConfiguration.h>
#include <NiDirectXVersion.h>
#include <NiDX9SystemDesc.h>
#include <NiD3DDefines.h>
#include <NiD3DRendererHeaders.h>
#include <NiUniversalTypes.h>
#include <NiStaticDataManager.h>

/// 자료구조
#include <NiTQueue.h>

/// Animation
#include <NiAnimation.h>

/// I/O
#include <NiStream.h>
#include <NiFilename.h>
#include <NiTexturePalette.h>
#include <NiDevImageConverter.h>
#include <NiCloningProcess.h>

/// camera & frustum
#include <NiDrawSceneUtility.h>
#include <NiCollision.h>
#include <NiAlphaAccumulator.h>
#include <NiBackToFrontAccumulator.h>

/// Light & Effect
#include <NiParticle.h>
#include <NiSpotLight.h>
#include <NiAmbientLight.h>
#include <NiDirectionalLight.h>


/// Sound
#ifndef MILES_AUDIO_SYSTEM
#define MILES_AUDIO_SYSTEM
#endif

//#include <NiAudio.h>
#include <NiMilesAudio.h>
#include <NiAudioSource.h>

/// Object system
#include <NiTristrips.h>
#include <NiTriShape.h>
#include <NiTriShapeDynamicData.h>

/// property
#include <NiPropertyState.h>
#include <NiAlphaProperty.h>
#include <NiFogProperty.h>
#include <NiMaterialProperty.h>
#include <NiStencilProperty.h>
#include <NiShadeProperty.h>
#include <NiTexturingProperty.h>
#include <NiVertexColorProperty.h>
#include <NiWireframeProperty.h>
#include <NiZBufferProperty.h>

/// 2/2.5D
#include <NiScreenElements.h>
#include <NiScreenTexture.h>

/// Texture
#include <NiDynamicTexture.h>
#include <NiRenderedTexture.h>
#include <NiRenderTargetGroup.h>

/// etc
#include <NIColor.h>
#include <NiString.h>
#include <NIMessagebox.h>

/// Shader
#include <NiShaderFactory.h>
#include <NiShaderLibrary.h>
#include <NiShaderLibraryDesc.h>

#include <NiD3DShaderProgramFactory.h>

#include <MMSystem.h>

#pragma warning (pop)

///


#define STRSAFE_LIB
#include <STRSAFE.H>

/// 080403 Client Network Model (신규통신 모듈) - 최종수정.
#include "iocpclient.h"


/// 비표준 확장을 사용했습니다 : 구조체/공용 구조체의 이름이 없습니다.
#pragma warning( disable: 4201 )

// 복사 생성자를 생성하지 못했습니다.
#pragma warning( disable: 4511 )

// 컴파일러에서 주어진 클래스에 대한 대입 연산자를 생성할 수 없습니다.
#pragma warning( disable: 4512 )

/// STL
#include "Pool.h"
#include "BasicString.h"
#include "Algorithm.h"
#include "Allocator.h"
#include "PriorityQueue.h"
#include "Array.h"
#include "DefragmentArray.h"
#include "List.h"
#include "HashMap.h"
#include "HashSet.h"
#include "PointerArray.h"
#include "PointerList.h"
#include "PointerHashMap.h"
#include "PointerHashSet.h"

/// 파일
#include "Console.h"
#include "File.h"
#include "FileLoader.h"
#include "FileSaver.h"
#include "GameFile.h"

/// 토큰
#include "Tokenizer.h"

#include "XPerformanceGuard.h"

/// defines
#define SAFE_DELETE(x) if(x) { delete x; x = NULL; }
#define SAFE_DELETE_ARRAY(x) if(x) { delete[] x; x = NULL; }
#define SAFE_RELEASE(x) if(x) { x->Release(); x = NULL; }
#define SAFE_NIDELETE(x) if(x) { NiDelete x; x = NULL; }
#define SAFE_EXIT_DELETE(x) if(x) { x->Exit(); delete x; x = NULL; }

inline long FloatToInt( float value ) { int i = (int)value; return ( value - i >= 0.999f ) ? ++i : i; }

const int SECOND = 1000;
const int MINUTE = 60 * SECOND;
const int HOUR = 60 * MINUTE;
const int DAY = 24 * HOUR;

#define S_PI    (3.14159265358979323846f)
#define S_ToRadian( degree ) ((degree) * (S_PI / 180.0f))

#define ASSERTDLG(s)\
{TCHAR _0x3031[1024];\
	_stprintf(_0x3031,_T("%s\nline : %d\n- %s"),__FILE__,__LINE__,s);\
	MessageBox(NULL,_0x3031,_T("--^"),MB_OK);}

/// 존재하지 않는 파일을 알리기 위해 제작
#define ASSERTDLGEX(s,f)\
{TCHAR _0x3031[1024];\
	_stprintf(_0x3031,_T("%s\nline : %d\n- %s %s"),__FILE__,__LINE__,s,f);\
	MessageBox(NULL,_0x3031,_T("--^"),MB_OK);}

int ConvertToAscii( const wchar_t* uniStr, char* str, unsigned int bufferSize );
int ConvertToUnicode( const char* str, wchar_t* uniStr, unsigned int buffersize );

#define MAXSTRINGLEN(s) ((sizeof(s)/sizeof(s[0]))-1)
void Sstrncpy( LPTSTR pDest, unsigned int destMaxLen, LPCTSTR pSrc, unsigned int count );
void Sstrncat( LPTSTR pDest, unsigned int destMaxLen, LPCTSTR pSrc, unsigned int count );

#if defined (_DEVSYS) && !defined (_DEBUG)
#undef assert
#define assert(exp) {if(!(exp)) _asm{int 0x03}}
#endif

void GameErrorLog( char* format, ... );