// SectorBGMTrigger.cpp: implementation of the CSectorBGMTrigger class. // ////////////////////////////////////////////////////////////////////// #include "SoundMgr.h" #include "BaseGraphicsLayer.h" #include "SceneManager.h" #include "SectorBGMTrigger.h" #include "GMMemory.h" struct TESTSCREEN_VERTEX { float x, y, z, rhw; DWORD color; float u, v; }; CSectorBGMTrigger::CSectorBGMTrigger() { } CSectorBGMTrigger::~CSectorBGMTrigger() { } void CSectorBGMTrigger::Create() { m_pBgmTexture = NULL; m_ResizeTexture.Create( BGM_TEXTURESIZE, BGM_TEXTURESIZE ); } void CSectorBGMTrigger::Destroy() { SAFE_RELEASE( m_pBgmTexture ); DeleteScriptData(); DeleteBgmData(); } PerSectorTriggerInfo* CSectorBGMTrigger::GetTrigger( int SectorX, int SectorY ) { vector::iterator iter; for( iter = m_SectorBgmList.begin(); iter != m_SectorBgmList.end(); iter++ ) { if( (*iter)->iSectorX == SectorX && (*iter)->iSectorY == SectorY ) return (*iter); } return NULL; } void CSectorBGMTrigger::DeleteScriptData() { vector::iterator iter; for( int Zone = 0; Zone < ZONE_NUM; Zone++ ) { for( iter = m_ScriptDataList[Zone].begin(); iter != m_ScriptDataList[Zone].end(); iter++ ) { (*iter)->Destroy(); delete (*iter); *iter = NULL; } m_ScriptDataList[Zone].clear(); } } void CSectorBGMTrigger::GetScriptData( const char* strFilename ) { int TriggerNum, Zone; char strTrigger[MAX_PATH]; char strMsg[MAX_PATH]; ZeroMemory( strMsg, sizeof(strMsg) ); ZeroMemory( strTrigger, sizeof(strTrigger) ); strcpy( strTrigger, APP_BGM_TRIGGER ); DeleteScriptData(); TriggerNum = GetPrivateProfileInt( APP_SET, KEY_TRIGGER, 0, strFilename ); for( int count = 1; count < TriggerNum+1; count++ ) { /*** Script Interface (ex) *** [SET] TRIGGER = 2 [BGM_TRIGGER1] ZONE = 1 SECTORX = 8 SECTORY = 1 EVENTNUM = 2 TEXTURE = "C:\\WorkTest\\WorldCreator\\8_1.bmp" COLOR1 = 0x0000ff; BGM1 = "C:\\WorkTest\\WorldCreator\\music.ogg" EVENTKEY1 = 0 COLOR2 = 0xffffff; BGM2 = "C:\\WorkTest\\WorldCreator\\Believe.ogg" EVENTKEY2 = 1 [BGM_TRIGGER2] ......... */ PerSectorTriggerInfo* pInfo = new PerSectorTriggerInfo; ZeroMemory( pInfo, sizeof(pInfo) ); sprintf( strTrigger, "%s%d", APP_BGM_TRIGGER, count ); //----------- // ZONE //----------- sprintf( strMsg, "%s, %s", strTrigger, KEY_ZONE ); Zone = GetPrivateProfileInt( strTrigger, KEY_ZONE, -1, strFilename ); if( Zone == -1 ) MessageBox( NULL, strMsg, "ÆÄ½Ì½ÇÆÐ:BGM½ºÅ©¸³Æ®", MB_OK ); //----------- // SECTORX //----------- sprintf( strMsg, "%s, %s", strTrigger, KEY_SECTORX ); pInfo->iSectorX = GetPrivateProfileInt( strTrigger, KEY_SECTORX, -1, strFilename ); if( pInfo->iSectorX == -1 ) MessageBox( NULL, strMsg, "ÆÄ½Ì½ÇÆÐ:BGM½ºÅ©¸³Æ®", MB_OK ); //----------- // SECTORY //----------- sprintf( strMsg, "%s, %s", strTrigger, KEY_SECTORY ); pInfo->iSectorY = GetPrivateProfileInt( strTrigger, KEY_SECTORY, -1, strFilename ); if( pInfo->iSectorY == -1 ) MessageBox( NULL, strMsg, "ÆÄ½Ì½ÇÆÐ:BGM½ºÅ©¸³Æ®", MB_OK ); //----------- // EVENTNUM //----------- sprintf( strMsg, "%s, %s", strTrigger, KEY_EVENTNUM ); pInfo->iEventNum = GetPrivateProfileInt( strTrigger, KEY_EVENTNUM, -1, strFilename ); if( pInfo->iEventNum == -1 ) MessageBox( NULL, strMsg, "ÆÄ½Ì½ÇÆÐ:BGM½ºÅ©¸³Æ®", MB_OK ); //----------- // TEXTURE //----------- sprintf( strMsg, "%s, %s", strTrigger, KEY_TEXTURE ); GetPrivateProfileString( strTrigger, KEY_TEXTURE, "x", pInfo->strTexFilename, sizeof(pInfo->strTexFilename), strFilename ); if( !strcmp(pInfo->strTexFilename, "x") ) MessageBox( NULL, strMsg, "ÆÄ½Ì½ÇÆÐ:BGM½ºÅ©¸³Æ®", MB_OK ); for( int i = 1; i < pInfo->iEventNum+1; i++ ) { char buf[MAX_PATH]; ZeroMemory( buf, sizeof(buf) ); sprintf( buf, "%s%d", KEY_COLOR, i ); //------------- // Color //------------- DWORD dwColor; int temp; sprintf( strMsg, "%s, %s", strTrigger, buf ); temp = GetPrivateProfileInt( strTrigger, buf, -1, strFilename ); if( temp == -1 ) MessageBox( NULL, strMsg, "ÆÄ½Ì½ÇÆÐ:BGM½ºÅ©¸³Æ®", MB_OK ); else dwColor = (DWORD)temp; pInfo->BGMColorKeyList.push_back( dwColor ); //------------- // BGM //------------- sprintf( buf, "%s%d", KEY_BGM, i ); char* strBgm; strBgm = new char[MAX_PATH]; sprintf( strMsg, "%s, %s", strTrigger, buf ); GetPrivateProfileString( strTrigger, buf, "x", strBgm, MAX_PATH, strFilename ); if( !strcmp(strBgm, "x") ) MessageBox( NULL, strMsg, "ÆÄ½Ì½ÇÆÐ:BGM½ºÅ©¸³Æ®", MB_OK ); pInfo->BGMFileList.push_back( strBgm ); char* strEsf; strEsf = new char[MAX_PATH]; strncpy(strEsf, strBgm, strlen(strBgm)-3); strcpy(strEsf, "esf"); pInfo->ESFFileList.push_back( strEsf ); //------------- // EVENTKEY //------------- sprintf( buf, "%s%d", KEY_EVENTKEY, i ); int EventKey; sprintf( strMsg, "%s, %s", strTrigger, buf ); EventKey = GetPrivateProfileInt( strTrigger, buf, -1, strFilename ); if( EventKey == -1 ) MessageBox( NULL, strMsg, "ÆÄ½Ì½ÇÆÐ:BGM½ºÅ©¸³Æ®", MB_OK ); pInfo->EventKeyList.push_back( EventKey ); } //===================== // Add Trigger //===================== MakeColorTable( pInfo->ColorTable[0], pInfo->strTexFilename ); m_ScriptDataList[Zone].push_back( pInfo ); } } void CSectorBGMTrigger::WriteBinData() { FILE* fp; char strFile[MAX_PATH]; ZeroMemory( strFile, sizeof(strFile) ); vector::iterator iter; for( int Zone = 0; Zone < ZONE_NUM; Zone++ ) { if( m_ScriptDataList[Zone].size() == 0 ) continue; sprintf( strFile, "%sZone%d.bgm", BGMPATH, Zone ); fp = fopen( strFile, "wb" ); if( fp == NULL ) { MessageBox( NULL, "BGMTriggerÆÄÀÏÀ» ¾²´Âµ¥ ½ÇÆÐ!!", "ÆÄÀÏ¿¡·¯", MB_OK ); } int TriggerNum = m_ScriptDataList[Zone].size(); fwrite( &TriggerNum, sizeof(int), 1, fp ); for( iter = m_ScriptDataList[Zone].begin(); iter != m_ScriptDataList[Zone].end(); iter++ ) { fwrite( &((*iter)->iSectorX), sizeof(int), 1, fp ); fwrite( &((*iter)->iSectorY), sizeof(int), 1, fp ); (*iter)->strTexFilename[MAX_PATH-1] = NULL; fwrite( (*iter)->strTexFilename, sizeof(char), MAX_PATH, fp ); fwrite( &((*iter)->iEventNum), sizeof(int), 1, fp ); fwrite( (*iter)->ColorTable[0], sizeof(DWORD), BGM_TEXTURESIZE*BGM_TEXTURESIZE, fp ); for( int n = 0; n < (int)((*iter)->EventKeyList.size()); n++ ) { fwrite( &((*iter)->EventKeyList[n]), sizeof(int), 1, fp ); } for( int n = 0; n < (int)((*iter)->BGMColorKeyList.size()); n++ ) { fwrite( &((*iter)->BGMColorKeyList[n]), sizeof(DWORD), 1, fp ); } for( int n = 0; n < (int)((*iter)->BGMFileList.size()); n++ ) { (*iter)->BGMFileList[n][MAX_PATH-1] = NULL; fwrite( (*iter)->BGMFileList[n], sizeof(char), MAX_PATH, fp ); } } fclose( fp ); } } void CSectorBGMTrigger::DeleteBgmData() { vector::iterator iter; for( iter = m_SectorBgmList.begin(); iter != m_SectorBgmList.end(); iter++ ) { (*iter)->Destroy(); delete (*iter); *iter = NULL; } m_SectorBgmList.clear(); } void CSectorBGMTrigger::LoadData( char* strFile ) { FILE* fp; vector::iterator iter; fp = fopen( strFile, "rb" ); if( fp == NULL ) { MessageBox( NULL, "BGMÆÄÀÏÀ» ¿©´Âµ¥ ½ÇÆÐ!!", "ÆÄÀÏ¿¡·¯", MB_OK ); return; } DeleteBgmData(); int TriggerNum; fread( &TriggerNum, sizeof(int), 1, fp ); int iSectorX, iSectorY, iEventNum; for( int j = 0; j < TriggerNum; j++ ) { fread( &(iSectorX), sizeof(int), 1, fp ); fread( &(iSectorY), sizeof(int), 1, fp ); PerSectorTriggerInfo* pTrigger = GetTrigger( iSectorX, iSectorY ); if(pTrigger) // ÀÌ¹Ì ÀÖ´Â Æ®¸®°Å´Ù { // ´Ù½Ã·Îµå. ÀÌ¹Ì ÇßÁö¸¸.. °á±¹ ¶È°°Àº µ¥ÀÌŸ´Ù. fread( pTrigger->strTexFilename, sizeof(char), MAX_PATH, fp ); // À̺¥Æ® ³Ñ¹ö´Â ³ªÁß¿¡ Ãß°¡µÈ°ÍÀ̱⠶§¹®¿¡ +·Î Áõ°¡½ÃÄÑÁØ´Ù. fread( &(iEventNum), sizeof(int), 1, fp ); pTrigger->iEventNum += iEventNum; fread( pTrigger->ColorTable[0], sizeof(DWORD), BGM_TEXTURESIZE*BGM_TEXTURESIZE, fp ); // Ãß°¡ÇÑ´Ù. int temp; DWORD temp2; for( int n = 0; n < iEventNum; n++ ) { fread( &temp, sizeof(int), 1, fp ); pTrigger->EventKeyList.push_back( temp ); } for( int n = 0; n < iEventNum; n++ ) { fread( &temp2, sizeof(DWORD), 1, fp ); pTrigger->BGMColorKeyList.push_back( temp2 ); } for( int n = 0; n < iEventNum; n++ ) { char* path = new char[MAX_PATH]; char file[MAX_PATH]; fread( file, sizeof(char), MAX_PATH, fp ); sprintf( path, "%s%s", BGMPATH, file ); pTrigger->BGMFileList.push_back( path ); path = new char[MAX_PATH]; memset(path, 0, MAX_PATH); strncpy(path, file, strlen(file)-3 ); strcat(path, "esf"); pTrigger->ESFFileList.push_back( path ); } } else { //Create Trigger PerSectorTriggerInfo* pTrigger = new PerSectorTriggerInfo; pTrigger->iSectorX = iSectorX; pTrigger->iSectorY = iSectorY; // fread( &(pTrigger->iSectorX), sizeof(int), 1, fp ); // fread( &(pTrigger->iSectorY), sizeof(int), 1, fp ); fread( pTrigger->strTexFilename, sizeof(char), MAX_PATH, fp ); fread( &(pTrigger->iEventNum), sizeof(int), 1, fp ); fread( pTrigger->ColorTable[0], sizeof(DWORD), BGM_TEXTURESIZE*BGM_TEXTURESIZE, fp ); int temp; DWORD temp2; for( int n = 0; n < pTrigger->iEventNum; n++ ) { fread( &temp, sizeof(int), 1, fp ); pTrigger->EventKeyList.push_back( temp ); } for( int n = 0; n < pTrigger->iEventNum; n++ ) { fread( &temp2, sizeof(DWORD), 1, fp ); pTrigger->BGMColorKeyList.push_back( temp2 ); } for( int n = 0; n < pTrigger->iEventNum; n++ ) { char* path = new char[MAX_PATH]; char file[MAX_PATH]; fread( file, sizeof(char), MAX_PATH, fp ); sprintf( path, "%s%s", BGMPATH, file ); pTrigger->BGMFileList.push_back( path ); path = new char[MAX_PATH]; memset(path, 0, MAX_PATH); if(strlen(file) > 3) { strncpy(path, file, strlen(file)-3 ); strcat(path, "esf"); } pTrigger->ESFFileList.push_back( path ); } m_SectorBgmList.push_back( pTrigger ); } } fclose( fp ); } void CSectorBGMTrigger::LoadZoneData( int Zone ) { FILE* fp; char strFile[MAX_PATH]; vector::iterator iter; sprintf( strFile, "c:\\MP-Project\\SOUND\\Bgm\\Bgm_Zone%d", Zone ); fp = fopen( strFile, "rb" ); if( fp == NULL ) { MessageBox( NULL, "BGMTriggerÆÄÀÏÀ» Àдµ¥ ½ÇÆÐ!!", "ÆÄÀÏ¿¡·¯", MB_OK ); } DeleteBgmData(); int TriggerNum; fread( &TriggerNum, sizeof(int), 1, fp ); int iSectorX, iSectorY, iEventNum; for( int j = 0; j < TriggerNum; j++ ) { fread( &(iSectorX), sizeof(int), 1, fp ); fread( &(iSectorY), sizeof(int), 1, fp ); PerSectorTriggerInfo* pTrigger = GetTrigger( iSectorX, iSectorY ); if(pTrigger) // ÀÌ¹Ì ÀÖ´Â Æ®¸®°Å´Ù { // ´Ù½Ã·Îµå. ÀÌ¹Ì ÇßÁö¸¸.. °á±¹ ¶È°°Àº µ¥ÀÌŸ´Ù. fread( pTrigger->strTexFilename, sizeof(char), MAX_PATH, fp ); // À̺¥Æ® ³Ñ¹ö´Â ³ªÁß¿¡ Ãß°¡µÈ°ÍÀ̱⠶§¹®¿¡ +·Î Áõ°¡½ÃÄÑÁØ´Ù. fread( &(iEventNum), sizeof(int), 1, fp ); pTrigger->iEventNum += iEventNum; fread( pTrigger->ColorTable[0], sizeof(DWORD), BGM_TEXTURESIZE*BGM_TEXTURESIZE, fp ); // Ãß°¡ÇÑ´Ù. int temp; DWORD temp2; for( int n = 0; n < iEventNum; n++ ) { fread( &temp, sizeof(int), 1, fp ); pTrigger->EventKeyList.push_back( temp ); } for( int n = 0; n < iEventNum; n++ ) { fread( &temp2, sizeof(DWORD), 1, fp ); pTrigger->BGMColorKeyList.push_back( temp2 ); } for( int n = 0; n < iEventNum; n++ ) { char* path = new char[MAX_PATH]; char file[MAX_PATH]; fread( file, sizeof(char), MAX_PATH, fp ); sprintf( path, "%s%s", BGMPATH, file ); pTrigger->BGMFileList.push_back( path ); path = new char[MAX_PATH]; memset(path, 0, MAX_PATH); strncpy(path, file, strlen(file)-3 ); strcat(path, "esf"); pTrigger->ESFFileList.push_back( path ); } } else { //Create Trigger PerSectorTriggerInfo* pTrigger = new PerSectorTriggerInfo; pTrigger->iSectorX = iSectorX; pTrigger->iSectorY = iSectorY; // fread( &(pTrigger->iSectorX), sizeof(int), 1, fp ); // fread( &(pTrigger->iSectorY), sizeof(int), 1, fp ); fread( pTrigger->strTexFilename, sizeof(char), MAX_PATH, fp ); fread( &(pTrigger->iEventNum), sizeof(int), 1, fp ); fread( pTrigger->ColorTable[0], sizeof(DWORD), BGM_TEXTURESIZE*BGM_TEXTURESIZE, fp ); int temp; DWORD temp2; for( int n = 0; n < pTrigger->iEventNum; n++ ) { fread( &temp, sizeof(int), 1, fp ); pTrigger->EventKeyList.push_back( temp ); } for( int n = 0; n < pTrigger->iEventNum; n++ ) { fread( &temp2, sizeof(DWORD), 1, fp ); pTrigger->BGMColorKeyList.push_back( temp2 ); } for( int n = 0; n < pTrigger->iEventNum; n++ ) { char* buf = new char[MAX_PATH]; fread( buf, sizeof(char), MAX_PATH, fp ); pTrigger->BGMFileList.push_back( buf ); char* path = new char[MAX_PATH]; memset(path, 0, MAX_PATH); strncpy(path, buf, strlen(buf)-3 ); strcat(path, "esf"); pTrigger->ESFFileList.push_back( path ); } m_SectorBgmList.push_back( pTrigger ); } } fclose( fp ); } void CSectorBGMTrigger::LoadBgmTexture( char* strFile ) { SAFE_RELEASE( m_pBgmTexture ); D3DXCreateTextureFromFileEx( BaseGraphicsLayer::GetDevice(), strFile, D3DX_DEFAULT, D3DX_DEFAULT, 1, 0, D3DFMT_UNKNOWN, D3DPOOL_MANAGED, D3DX_FILTER_NONE, D3DX_FILTER_NONE, 0x00000000, NULL, NULL, &m_pBgmTexture ); TESTSCREEN_VERTEX pVertex[4]; pVertex[0].x = 0; pVertex[0].y = 0; pVertex[0].z = 0.0f; pVertex[0].rhw = 1.0f; pVertex[0].u = 0.0f; pVertex[0].v = 0.0f; pVertex[0].color = 0x55ffffff; pVertex[1].x = 128.0f; pVertex[1].y = 0; pVertex[1].z = 0.0f; pVertex[1].rhw = 1.0f; pVertex[1].u = 1.0f; pVertex[1].v = 0.0f; pVertex[1].color = 0x55ffffff; pVertex[2].x = 0; pVertex[2].y = 128.0f; pVertex[2].z = 0.0f; pVertex[2].rhw = 1.0f; pVertex[2].u = 0.0f; pVertex[2].v = 1.0f; pVertex[2].color = 0x55ffffff; pVertex[3].x = 128.0f; pVertex[3].y = 128.0f; pVertex[3].z = 0.0f; pVertex[3].rhw = 1.0f; pVertex[3].u = 1.0f; pVertex[3].v = 1.0f; pVertex[3].color = 0x55ffffff; LPDIRECT3DDEVICE8 pd3dDevice = BaseGraphicsLayer::GetDevice(); pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1 ); pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_DISABLE ); pd3dDevice->SetVertexShader( D3DFVF_XYZRHW | D3DFVF_TEX1 | D3DFVF_DIFFUSE ); pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE ); pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE ); pd3dDevice->SetRenderState( D3DRS_ZENABLE, FALSE ); pd3dDevice->SetRenderState( D3DRS_FOGENABLE, FALSE ); pd3dDevice->SetTextureStageState(0, D3DTSS_ADDRESSU, D3DTADDRESS_CLAMP); pd3dDevice->SetTextureStageState(0, D3DTSS_ADDRESSV, D3DTADDRESS_CLAMP); pd3dDevice->SetTexture( 0, m_pBgmTexture ); m_ResizeTexture.Begin( pd3dDevice ); D3DVIEWPORT8 temp; BaseGraphicsLayer::GetDevice()->GetViewport( &temp ); temp.Height = 128; temp.Width = 128; BaseGraphicsLayer::GetDevice()->SetViewport( &temp ); pd3dDevice->Clear(0, NULL, D3DCLEAR_ZBUFFER|D3DCLEAR_TARGET,0xffffffff, 1.0f, 0); pd3dDevice->BeginScene(); pd3dDevice->DrawPrimitiveUP( D3DPT_TRIANGLESTRIP, 2, pVertex, sizeof(TESTSCREEN_VERTEX) ); pd3dDevice->EndScene(); m_ResizeTexture.End( pd3dDevice ); //Set things back to normal pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_CCW ); pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE ); pd3dDevice->SetRenderState( D3DRS_ZENABLE, TRUE ); pd3dDevice->SetRenderState( D3DRS_FOGENABLE, TRUE ); } void CSectorBGMTrigger::MakeColorTable( DWORD* pDest, char* strSrcFile ) { DWORD ColorTable[BGM_TEXTURESIZE][BGM_TEXTURESIZE]; LoadBgmTexture( strSrcFile ); LPDIRECT3DSURFACE8 lpSrcSurface = NULL; LPDIRECT3DSURFACE8 lpDestSurface = NULL; LPDIRECT3DTEXTURE8 lpLockTexture = NULL; D3DXCreateTextureFromFileEx( BaseGraphicsLayer::GetDevice(), strSrcFile, D3DX_DEFAULT, D3DX_DEFAULT, 1, 0, D3DFMT_UNKNOWN, D3DPOOL_MANAGED, D3DX_FILTER_NONE, D3DX_FILTER_NONE, 0x00000000, NULL, NULL, &lpLockTexture ); m_ResizeTexture.GetTexture()->GetSurfaceLevel(0,&lpSrcSurface); lpLockTexture->GetSurfaceLevel(0,&lpDestSurface); D3DXLoadSurfaceFromSurface( lpDestSurface,NULL,NULL, lpSrcSurface,NULL,NULL, D3DX_FILTER_NONE,0); RECT rct; D3DLOCKED_RECT PixelData; SetRect( &rct, 0, 0, BGM_TEXTURESIZE, BGM_TEXTURESIZE ); lpLockTexture->LockRect( 0, &PixelData, &rct, 0 ); for( int y = 0; y < BGM_TEXTURESIZE; y++ ) { for( int x = 0; x < BGM_TEXTURESIZE; x++ ) { DWORD* color = (DWORD*)PixelData.pBits; color += x + y*PixelData.Pitch/4; ColorTable[y][x] = *color; } } lpLockTexture->UnlockRect(0); memcpy( pDest, ColorTable[0], sizeof(DWORD)*BGM_TEXTURESIZE*BGM_TEXTURESIZE ); SAFE_RELEASE(lpLockTexture); }