reman3/Rayman_X/cpa/Appli/Max23Dos/src/Banks.c

974 lines
28 KiB
C

/*=========================================================================
*
* Banks.c - Bank conversion
*
* Version 1.0
* Revision date
*
*=======================================================================*/
#include <Windows.h>
#include <stdio.h>
#include "Banks.h"
#include "SCR.h"
#include "conventi.h"
#include "main.h"
#include "print.h"
#include "system.h"
#include "sprobj.h"
#include "ModLib.h"
#include "PlgLoad.h"
#include "A3dSave.h"
#include "ChlSave.h"
#include "ModSave.h"
#include "ObjSave.h"
#include "RliSave.h"
#include "VseSave.h"
#include "Anims.h"
#include "Levels.h"
#include "Families.h"
#include "SaveModifLst.h"
//--- Global externs --------------------------------------------------------
MLT_tdxHandleToSuperObject g_hBankRoot;
//--- Global statics --------------------------------------------------------
char gs_szFilesCommon[10][5];
//--------------------------------------------------------------------
/****************************************************************************
* Description: compute all the banks found in the source directory
*
* Parameters: sRawData : source directory
* sGameData : destination directory
*---------------------------------------------------------------------------
* Revision date: Author:
*****************************************************************************/
void MLT_vComputeAllBanks(char *sRawData, char *sGameData)
{
xString sDirectory;
HANDLE hHandle;
WIN32_FIND_DATA stFindFileData;
// change directory
GetCurrentDirectory(256, sDirectory);
SetCurrentDirectory(sRawData);
// search all the banks files
memset(&stFindFileData,0,sizeof(stFindFileData));
hHandle = FindFirstFile("World\\Graphics\\Objects\\Banks\\*.mod", &stFindFileData);
if( hHandle == INVALID_HANDLE_VALUE)
{
SetCurrentDirectory(sDirectory);
fprintf(stderr, "\nError : Can't find the Banks directory\n");
return;
}
do
{
if(strlen(stFindFileData.cFileName) == 0) break;
// compute the bank
MLT_vComputeOneMod(MLT_p_cGetFileNameWithoutExt(stFindFileData.cFileName), MLT_p_cGetFileNameWithoutExt(stFindFileData.cFileName), sRawData, sGameData);
}
while(FindNextFile(hHandle, &stFindFileData));
FindClose(hHandle);
// restore directory
SetCurrentDirectory(sDirectory);
}
/****************************************************************************
* Description: compute the specified bank
*
* Parameters: sBankName : bank to convert
* sRawData : source directory
* sGameData : destination directory
*---------------------------------------------------------------------------
* Revision date: Author:
*****************************************************************************/
void MLT_vComputeOneBank (char *sBankName, char *sRawData, char *sGameData)
{
// WIN version
#ifndef _WINDOWS
xString sDirectory, sFileSearch;
HANDLE hHandle;
WIN32_FIND_DATA stFindFileData;
// change directory
GetCurrentDirectory(256, sDirectory);
// search for the bank file
if (g_bStandardConfig)
{
SetCurrentDirectory(sRawData);
sprintf(sFileSearch, "World\\Graphics\\Objects\\Banks\\%s.mod", sBankName);
}
else
sprintf(sFileSearch, "%s\\%s.mod", g_szBanks, sBankName);
memset(&stFindFileData,0,sizeof(stFindFileData));
hHandle = FindFirstFile(sFileSearch, &stFindFileData);
if( hHandle == INVALID_HANDLE_VALUE)
{
SetCurrentDirectory(sDirectory);
fprintf(stderr, "\nError : Can't find %s bank\n", sBankName);
return;
}
do
{
if(strlen(stFindFileData.cFileName) == 0) break;
// compute the MOD file
MLT_vComputeOneMod(MLT_p_cGetFileNameWithoutExt(stFindFileData.cFileName), MLT_p_cGetFileNameWithoutExt(stFindFileData.cFileName), sRawData, sGameData);
}
while(FindNextFile(hHandle, &stFindFileData));
FindClose(hHandle);
// restore directory
SetCurrentDirectory(sDirectory);
// DOS version
#else
MLT_vComputeOneMod (sBankName, sBankName, sRawData, sGameData);
#endif
}
/****************************************************************************
* Description: compute the MOD file in the specified bank
*
* Parameters: sBankName : bank to convert
* sModName : file to convert
* sRawData : source directory
* sGameData : destination directory
*---------------------------------------------------------------------------
* Revision date: Author:
*****************************************************************************/
void MLT_vComputeOneMod (char *sBankName, char *sModName, char *sRawData, char *sGameData)
{
SCR_tdst_Cxt_Values *p_stVal;
xString sRawBank, sGameBank, sRawFamily, sRawAnims, sRead;
xString sFile, sFileM, sFile1, sFileNew;
xString sRoot, sFileSpo, sDir;
FILE *file, *fileR, *fileF;
int f, i, ii, p, jj, j = 0, k = 0, k1 = 0, l = 0;
// register globals
sprintf(g_sFileIn, "%s", sModName);
sprintf(g_sFileMaterial, "%s", sBankName);
sprintf(g_sDirectorySave, "%s\\", sBankName);
// init paths
if (g_bStandardConfig)
{
sprintf(sRawBank, "%s\\World\\Graphics\\Objects\\Banks", sRawData);
sprintf(sRawAnims, "%s\\World\\Graphics\\Anims", sRawData);
sprintf(sRawFamily, "%s\\World\\Families", sRawData);
}
else
{
sprintf(sRawBank, g_szBanks);
sprintf(sRawAnims, g_szAnims);
sprintf(sRawFamily, g_szFamilies);
}
sprintf(sGameBank, "%s\\World\\Graphics\\Objects\\Banks\\%s\\", sGameData, sBankName);
// DISPLAY
MLT_vOutput( C_ComRes_cTitleLine, "\nBank %s\\%s.mod",sBankName, sModName);
// change directory
CreateDirectory(sGameBank, NULL);
SetCurrentDirectory(sGameBank);
// notify OBJ file, CHL file and A3d file
sprintf(sFile, "%s\\%s.spo", sRawBank, sBankName);
fileF = fopen (sFile, "r");
//create the basic family if the .spo file exists
if (g_bCreateBasicFamily && fileF)
{
if (g_bStandardConfig)
{
MLT_vExistFile (sBankName, sRawData, "\\world\\families\\", "obj", &j);
MLT_vExistFile (sBankName, sRawData, "\\world\\families\\", "chl", &j);
}
else
{
MLT_vExistFileInBank (sBankName, g_szFamilies, "obj", &j);
MLT_vExistFileInBank (sBankName, g_szFamilies, "chl", &j);
}
//the source files for a family exist in RawData directory, so convert them
if (j == 2)
MLT_vOutput( C_ComRes_cNormalLine, "\nA source family already exists for this bank : the Converting Tool will convert this existing family instead of creating a new one.");
// find the common extensions for the family
MLT_vGetCommonExt(&jj);
// test if at least one common file for a family exist in the GameData directory
MLT_vExistFile (sBankName, g_sGameCommon, "\\world\\levels\\_common\\families\\", gs_szFilesCommon[0], &k);
if (k)
{
// check if all te common files exist for the family
for (p=1; p<jj; p++)
MLT_vExistFile (sBankName, g_sGameCommon, "\\world\\levels\\_common\\families\\", gs_szFilesCommon[p], &k);
// check if one of the specific file exist in the common directory
MLT_vExistFile (sBankName, g_sGameCommon, "\\world\\levels\\_common\\families\\", g_szFiles[0], &k);
//the family is a common one
if (k==4)
{
// check if all specific files exist in the common directory
for (ii = 1 ; ii < g_iNbFiles; ii++)
MLT_vExistFile (sBankName, g_sGameCommon, "\\world\\levels\\_common\\families\\", g_szFiles[ii], &k);
}
else
{
//search for the files in the GameSpecific1 or GameSpecific2 directories
MLT_vExistFile (sBankName, g_sGameSpecific1, "\\world\\levels\\_common\\families\\", g_szFiles[0], &k1);
//the family is a specific one, with the specific files in GameSpecific2
if (!k1)
{
for (ii = 0 ; ii < g_iNbFiles; ii++)
MLT_vExistFile (sBankName, g_sGameSpecific2, "\\world\\levels\\_common\\families\\", g_szFiles[ii], &k);
}
//the family is a specific one, with the specific files in GameSpecific1
else
{
for (ii = 1 ; ii < g_iNbFiles; ii++)
MLT_vExistFile (sBankName, g_sGameSpecific1, "\\world\\levels\\_common\\families\\", g_szFiles[ii], &k);
}
}
}
//the files already exist, so don't create them
if (k == 7)
MLT_vOutput( C_ComRes_cNormalLine, "\nA Family already exists for this bank : the Converting Tool will keep it instead of creating a new one.");
//the family don't exist
else
{
xString sDirFamily;
sprintf(sDirFamily, "%s\\%s", sRawFamily, sBankName);
CreateDirectory(sDirFamily, NULL);
// notify files
sprintf(sFile, "%s\\%s.obj", sDirFamily, sBankName);
SCR_fn_v_SvL1_RegisterNotify(sFile, MLT_vSaveObjHeader, (void *)0x1, SCR_EA_Ntfy_AddOrModifySection);
sprintf(sFile, "%s\\%s.chl", sDirFamily, sBankName);
SCR_fn_v_SvL1_RegisterNotify(sFile, MLT_vSaveChlHeader, NULL, SCR_EA_Ntfy_AddOrModifySection);
}
//If an animation already exists (and the family does not exist)
if ((k!=7) && (j!=2))
{
//search if the animation exists
if (g_bStandardConfig)
MLT_vExistFile (sBankName, sRawData, "\\world\\graphics\\anims\\", "a3d", &l);
else
MLT_vExistFileInBank (sBankName, g_szAnims, "a3d", &l);
//the .a3d file doesn't exist in RawData directory
if (!l)
{
MLT_vExistFile (sBankName, sGameData, "\\world\\graphics\\anims\\", "a3d", &l);
//if is not in chosen directory
if (!l)
{
//the animation is in GameCommon?
MLT_vExistFile (sBankName, g_sGameCommon, "\\world\\graphics\\anims\\", "a3d", &l);
//if is not in gamedata
if (!l)
{
MLT_vExistFile (sBankName, g_sGameSpecific1, "\\world\\graphics\\anims\\", "a3d", &l);
if (!l)
{
MLT_vExistFile (sBankName, g_sGameSpecific2, "\\world\\graphics\\anims\\", "a3d", &l);
if (l)
{
//copy the animation in the other specific directory
if (strcmp(sGameData, g_sGameCommon))
{
sprintf(sFile, "%s\\world\\graphics\\anims\\%s\\%s.a3d", g_sGameSpecific2, sBankName, sBankName);
sprintf(sFileNew, "%s\\world\\graphics\\anims\\%s\\", sGameData, sBankName);
CreateDirectory(sFileNew, NULL);
strcat(sFileNew, sBankName);
strcat(sFileNew, ".a3d");
CopyFile(sFile, sFileNew, FALSE);
}
}
}
else
{
//copy the animation in the other specific directory (not the gamedat)
if (strcmp(sGameData, g_sGameCommon))
{
sprintf(sFile, "%s\\world\\graphics\\anims\\%s\\%s.a3d", g_sGameSpecific1, sBankName, sBankName);
sprintf(sFileNew, "%s\\world\\graphics\\anims\\%s\\", sGameData, sBankName);
CreateDirectory(sFileNew, NULL);
strcat(sFileNew, sBankName);
strcat(sFileNew, ".a3d");
CopyFile(sFile, sFileNew, FALSE);
}
}
}
}
}
else
{
//convert the animation existing in RawData directory
sprintf(sFile, "%s\\%s", sRawAnims, sBankName);
GetCurrentDirectory(256, sDir);
SetCurrentDirectory(sFile);
MLT_vComputeOneAnim(sBankName, sRawData, sGameData);
SetCurrentDirectory(sDir);
}
//if the file doesn't exist
if (!l)
{
sprintf(sFile, "%s\\%s", sRawAnims, sBankName);
CreateDirectory( sFile, NULL );
strcat(sFile, "\\");
strcat(sFile, sBankName);
strcat(sFile, ".a3d");
SCR_fn_v_SvL1_RegisterNotify(sFile, MLT_vSaveA3dHeader, NULL, SCR_EA_Ntfy_AddOrModifySection);
}
}
}
// notify MOD file
sprintf(sFile, "%s.mod", g_sFileIn);
SCR_fn_v_SvL1_RegisterNotify(sFile, MLT_vSaveEmptyModHeader, NULL, SCR_EA_Ntfy_AddOrModifySection);
// multitextures
// notify TEX file
sprintf(sFile, "%s.tex", g_sFileIn);
if (!(file = fopen(sFile, "r")))
{
g_bExistTex = FALSE;
SCR_fn_v_SvL1_RegisterNotify(sFile, MLT_vSaveTexFile, NULL, SCR_EA_Ntfy_AddOrModifySection);
}
else
{
g_bExistTex = TRUE;
fclose(file);
}
// notify VMT file
sprintf(sFile, "%s.vmt", g_sFileIn);
if(! SCR_fn_c_RdL0_IsSectionExists(sFile))
SCR_fn_v_SvL1_RegisterNotify(sFile, MLT_vSaveVmtFile, NULL, SCR_EA_Ntfy_AddOrModifySection);
// notify VSE file
sprintf(sFile, "%s.vse", g_sFileIn);
if(! SCR_fn_c_RdL0_IsSectionExists(sFile))
SCR_fn_v_SvL1_RegisterNotify(sFile, MLT_vSaveVseFile, NULL, SCR_EA_Ntfy_AddSection);
else
{
CopyFile(sFile, "temp.vse", FALSE);
remove(sFile);
SCR_fn_v_SvL1_RegisterNotify(sFile, MLT_vSaveVseFile, NULL, SCR_EA_Ntfy_AddSection);
}
// notify GMT file
sprintf(sFile, "%s.gmt", g_sFileIn);
if(! SCR_fn_c_RdL0_IsSectionExists(sFile))
{
SCR_fn_v_SvL1_RegisterNotify(sFile, MLT_vSaveGmtFile, NULL, SCR_EA_Ntfy_AddOrModifySection);
g_bCreatedGmt = FALSE;
}
else
g_bCreatedGmt=TRUE;
// if GMT file exist, check if must be rebuilt
if (g_bCreatedGmt)
{
if (g_bIgnoreGmt)
{
remove(sFile);
SCR_fn_v_SvL1_RegisterNotify(sFile, MLT_vSaveGmtFile, NULL, SCR_EA_Ntfy_AddOrModifySection);
}
else
{
CopyFile(sFile, "temp.gmt", FALSE);
remove(sFile);
SCR_fn_v_SvL1_RegisterNotify(sFile, MLT_vSaveGmtFile, NULL, SCR_EA_Ntfy_AddOrModifySection);
}
}
// save all notified sections
SCR_fn_v_SvL1_UpdateAllNotify();
// register path for load
SCR_fn_v_RdL0_RegisterPath(sGameBank);
// change directory
SetCurrentDirectory(sRawBank);
// DISPLAY
MLT_vOutput( C_ComRes_cNormalLine, "\n\tLoad...");
// find SPO file
GetCurrentDirectory(256, sDir);
SetCurrentDirectory(sRawBank);
sprintf(sFileSpo, "%s.spo", g_sFileIn);
if(! SCR_fn_c_RdL0_IsSectionExists(sFileSpo))
g_bExistSpo = FALSE;
else
g_bExistSpo = TRUE;
SetCurrentDirectory(sDir);
// load MOD file
MLT_vLoadModFileInLib();
// load PLG file
MLT_vLoadPLGFileInLib();
// find Root section
GetCurrentDirectory(256, sDir);
SetCurrentDirectory(sRawBank);
SCR_fn_v_RdL0_ComputeSectionName(sRoot, sFileSpo, M_SuperObject, M_Root);
// load module hierarchy
if(SCR_fn_c_RdL0_IsSectionExists(sRoot))
{
p_stVal = SCR_fnp_st_RdL0_AnalyseSection(sRoot, SCR_CDF_uw_Anl_Normal);
g_hBankRoot = (MLT_tdxHandleToSuperObject)SCR_M_ul_RdL0_ExtractLongValue(p_stVal,0);
g_bExistSpoBank=TRUE;
}
else
g_bExistSpoBank=FALSE;
// if necessary, load RLI
if(g_bGenerateRLI)
MLT_vLoadLG2();
// restore directory
SetCurrentDirectory(sDir);
// DISPLAY
MLT_vOutput( C_ComRes_cNormalLine, "\n\tCreate Physical...");
// build physical sections
MLT_vMakePhysicalInLib();
// change directory
SetCurrentDirectory(sGameBank);
// DISPLAY
MLT_vOutput( C_ComRes_cNormalLine, "\n\tSave...");
// save MOD file
MLT_vSaveLibInModFile(FALSE, FALSE, FALSE, TRUE);
// save PLG file
MLT_vSaveLibInPLGFile();
// if necessary, remove old files
g_bExistMdf = FALSE;
g_bExistMdt = FALSE;
if (g_bEraseMdf)
{
strcpy (sFile, sGameBank);
sprintf(sFileM, "%s.mdf", sModName);
strcat(sFile, sFileM);
_chmod(sFile, _S_IREAD | _S_IWRITE );
f = remove(sFile); //remove the old gmt file
if (f != -1)
g_bExistMdf = TRUE;
strcpy (sFile, sGameBank);
sprintf(sFileM, "%s.mdt", sModName);
strcat(sFile, sFileM);
_chmod(sFile, _S_IREAD | _S_IWRITE );
f = remove(sFile); //remove the old gmt file
if (f != -1)
g_bExistMdt = TRUE;
}
// save all notified sections
SCR_fn_v_SvL1_UpdateAllNotify();
// create basic family
if (g_bCreateBasicFamily && fileF)
{
if (!l && (j!=2))
{
sprintf(sFile, "%s\\%s\\%s.a3d", sRawAnims, sBankName, sBankName);
SCR_fn_v_SvL1_RegisterNotify(sFile, MLT_vSaveA3dFile, NULL, SCR_EA_Ntfy_AddOrModifySection);
// save all notified sections
SCR_fn_v_SvL1_UpdateAllNotify();
}
// the family is already converted in the destination directory, keep it
if (k != 7)
{
if (j != 2)
{
sprintf(sFile, "%s\\%s\\%s.obj", sRawFamily, sBankName, sBankName);
SCR_fn_v_SvL1_RegisterNotify(sFile, MLT_vSaveObjFile, NULL, SCR_EA_Ntfy_AddOrModifySection);
sprintf(sFile, "%s\\%s\\%s.chl", sRawFamily, sBankName, sBankName);
SCR_fn_v_SvL1_RegisterNotify(sFile, MLT_vSaveChlFile, NULL, SCR_EA_Ntfy_AddOrModifySection);
// save all notified sections
SCR_fn_v_SvL1_UpdateAllNotify();
}
if (!l && (j!=2))
{
//convert the animation
sprintf(sFile, "%s\\%s", sRawAnims, sBankName);
GetCurrentDirectory(256, sDir);
SetCurrentDirectory(sFile);
MLT_vComputeOneAnim(sBankName, sRawData, sGameData);
SetCurrentDirectory(sDir);
}
//convert the family
sprintf(sFile, "%s\\%s\\", sRawFamily, sBankName);
GetCurrentDirectory(256, sDir);
SetCurrentDirectory(sFile);
g_cCategoryType = C_Family;
MLT_vComputeOneFamily(sBankName, sRawData, sGameData);
SetCurrentDirectory(sDir);
}
}
if (fileF)
fclose(fileF);
g_cCategoryType = C_Bank;
// if necessary, create
if (g_bGenerateRLI)
MLT_vCreateRLI();
// erase the libs
MLT_vEraseLib();
MLT_vErasePLGLib();
// update ModifLst file
MLT_vUpdatePathInModifFile(sGameBank);
// close all opened files for VSE
SCR_fn_v_RdL0_Close();
strcpy(sFile, sGameBank);
strcat(sFile, "temp.vse");
remove(sFile);
MLT_vInitSystem();
// close all opened files for GMT
if (g_bCreatedGmt && !g_bIgnoreGmt)
{
SCR_fn_v_RdL0_Close();
strcpy (sFile, sGameBank);
strcat(sFile, "temp.gmt");
_chmod(sFile, _S_IREAD | _S_IWRITE );
remove(sFile); //remove the old gmt file
MLT_vInitSystem();
}
// DISPLAY
MLT_vOutput( C_ComRes_cResultLine, "\nBank %s converted\n",sModName);
// clean all opened structures
for (i=3; i<256; i++)
_close((int)i);
MLT_vInitSystem();
// multitextures
if (g_bIgnoreTex && g_bExistTex)
{
strcpy (sFile, sGameBank);
sprintf(sFileM, "%s.tex", sBankName);
strcat(sFile, sFileM);
strcpy (sFile1, sGameBank);
strcat(sFile1, "temp.tex");
fileR=fopen(sFile1, "rt");
file =fopen(sFile, "r+");
if (!fileR) return;
if (!file) return;
while (!feof(fileR))
{
fgets(sRead, 256, fileR);
if (strstr(sRead, "Texture"))
{ //a new section begins
MLT_vSearch(sRead, file);
fputs(sRead, file);
fgets(sRead, 256, fileR);
while (!strstr(sRead, "}"))
{ fputs(sRead, file);
fgets(sRead, 256, fileR);
}
}
}
fclose(file);
fclose(fileR);
remove(sFile1);
}
}
/****************************************************************************
* Description: search the specified section in the raw bank
*
* Parameters: sFile : initial file to search in
* sIdent : name of the geometric object to search
* sFamily : return the family
*---------------------------------------------------------------------------
* Revision date: Author:
*****************************************************************************/
BOOL MLT_bFindFileInBank (char *sFile, char *sIdent, char *sFamily)
{
xString sDirectory, sSection, sDirs, sDir1;
HANDLE hHandle;
WIN32_FIND_DATA stFindFileData;
// change directory
GetCurrentDirectory(256, sDirectory);
SetCurrentDirectory(g_sRawData);
// first: search in the specified bank
if (g_bStandardConfig)
{
SetCurrentDirectory(g_sRawData);
// first: search in the specified bank
sprintf(sDirs, "World\\Graphics\\Objects\\Banks\\%s", sFile);
}
else
{ //SetCurrentDirectory(g_szBanks);
sprintf(sDirs, "%s\\%s", g_szBanks, sFile);
}
SCR_fn_v_RdL0_ComputeSectionName(sSection, sDirs, M_Geometric, sIdent);
if(SCR_fn_c_RdL0_IsSectionExists(sSection))
{
// the first is the best
sprintf(sFamily, "%s", sFile);
// restore directory
SetCurrentDirectory(sDirectory);
// file was found
return TRUE;
}
// if not : search in all the banks
memset(&stFindFileData,0,sizeof(stFindFileData));
if (g_bStandardConfig)
hHandle = FindFirstFile("World\\Graphics\\Objects\\Banks\\*.mod", &stFindFileData);
else
{
sprintf(sDir1, "%s\\*.mod", g_szBanks);
hHandle = FindFirstFile(sDir1, &stFindFileData);
}
// no bank in Raw directory ?
if( hHandle == INVALID_HANDLE_VALUE)
{
// DISPLAY
if (g_bStandardConfig)
MLT_vOutput( C_ComRes_cErrorLine, "\nError : No banks in %s", g_sRawData);
else
MLT_vOutput( C_ComRes_cErrorLine, "\nError : No banks in %s", g_szBanks);
// erase name
sprintf(sFamily, "%s", sFile);
// restore directory
SetCurrentDirectory(sDirectory);
// file was not found
return FALSE;
}
// search all banks
do if(stFindFileData.dwFileAttributes)
{
if(strlen(stFindFileData.cFileName) == 0) break;
// search in current bank
if (g_bStandardConfig)
sprintf(sDirs, "World\\Graphics\\Objects\\Banks\\%s", stFindFileData.cFileName);
else
sprintf(sDirs, "\\%s", stFindFileData.cFileName);
SCR_fn_v_RdL0_ComputeSectionName(sSection, sDirs, M_Geometric, sIdent);
if(SCR_fn_c_RdL0_IsSectionExists(sSection))
{
// the first is the best
sprintf(sFamily, "%s", stFindFileData.cFileName);
// restore directory
SetCurrentDirectory(sDirectory);
// file was found
return TRUE;
}
}
while(FindNextFile(hHandle, &stFindFileData));
FindClose(hHandle);
// restore directory
SetCurrentDirectory(sDirectory);
// file was not found
return FALSE;
}
/****************************************************************************
* Description: search the specified section in the game bank
*
* Parameters: sFile : initial file to search in
* sIdent : name of the geometric object to search
* sFamily : return the family
*---------------------------------------------------------------------------
* Revision date: Author:
*****************************************************************************/
BOOL MLT_bFindFileInBankInGameData (char *sFile, char *sIdent, char *sFamily)
{
BOOL bResult;
xString sDirectory;
// save current directory
GetCurrentDirectory(256, sDirectory);
// search in the appropriate directories
switch(g_iData)
{
case 0:
// GameData
MLT_vFindInDir(sDirectory, g_sGameCommon, sFile, sIdent, sFamily, &bResult);
if (bResult)
return TRUE;
// GameSpecific1
MLT_vFindInDir(sDirectory, g_sGameSpecific1, sFile, sIdent, sFamily, &bResult);
if (bResult)
return TRUE;
// GameSpecific2
MLT_vFindInDir(sDirectory, g_sGameSpecific2, sFile, sIdent, sFamily, &bResult);
if (bResult)
return TRUE;
break;
case 1:
// GameSpecific1
MLT_vFindInDir(sDirectory, g_sGameSpecific1, sFile, sIdent, sFamily, &bResult);
if (bResult)
return TRUE;
// GameData
MLT_vFindInDir(sDirectory, g_sGameCommon, sFile, sIdent, sFamily, &bResult);
if (bResult)
return TRUE;
// GameSpecific2
MLT_vFindInDir(sDirectory, g_sGameSpecific2, sFile, sIdent, sFamily, &bResult);
if (bResult)
return TRUE;
break;
case 2:
// GameSpecific2
MLT_vFindInDir(sDirectory, g_sGameSpecific2, sFile, sIdent, sFamily, &bResult);
if (bResult)
return TRUE;
// GameData
MLT_vFindInDir(sDirectory, g_sGameCommon, sFile, sIdent, sFamily, &bResult);
if (bResult)
return TRUE;
// GameSpecific1
MLT_vFindInDir(sDirectory, g_sGameSpecific1, sFile, sIdent, sFamily, &bResult);
if (bResult)
return TRUE;
break;
}
// restore directory
SetCurrentDirectory(sDirectory);
// file was not found
return FALSE;
}
/****************************************************************************
* Description: search the specified section in the given directory
*
* Parameters: sDirectory : current directory
* sGame : name of directory to search in
* sFile : initial file to search in
* sIdent : name of the geometric object to search
* sFamily : return the family
* bRes : return the result
*---------------------------------------------------------------------------
* Revision date: Author:
*****************************************************************************/
void MLT_vFindInDir (xString sDirectory, xString sGame, char* sFile, char *sIdent, char *sFamily, BOOL *bRes)
{
xString sSection, sDirs, sFileExe;
HANDLE hHandle;
WIN32_FIND_DATA stFindFileData;
// init result
*bRes = FALSE;
if (strcmp(sGame, ""))
{
// change directory
SetCurrentDirectory(sGame);
// init serach data
strcpy(sFileExe, MLT_p_cGetFileNameWithoutExt(sFile));
// first: search in the specified bank
sprintf(sDirs, "World\\Graphics\\Objects\\Banks\\%s\\%s", sFileExe, sFile);
SCR_fn_v_RdL0_ComputeSectionName(sSection, sDirs, M_Geometric, sIdent);
if(SCR_fn_c_RdL0_IsSectionExists(sSection))
{
// the first is the best
sprintf(sFamily, "%s", sFile);
SetCurrentDirectory(sDirectory);
*bRes = TRUE;
return;
}
// if not : search in all the bank's
memset(&stFindFileData,0,sizeof(stFindFileData));
sprintf(sDirs, "World\\Graphics\\Objects\\Banks\\*");
hHandle = FindFirstFile(sDirs, &stFindFileData);
if( hHandle == INVALID_HANDLE_VALUE)
{
SetCurrentDirectory(sDirectory);
sprintf(sFamily, "%s", sFile);
}
else {
do if(stFindFileData.dwFileAttributes)
{
if(strlen(stFindFileData.cFileName) == 0) break;
if(strcmp(stFindFileData.cFileName, ".") == 0) continue;
if(strcmp(stFindFileData.cFileName, "..") == 0) continue;
// search in current bank
sprintf(sDirs, "World\\Graphics\\Objects\\Banks\\%s\\%s.mod", stFindFileData.cFileName, sFileExe);
SCR_fn_v_RdL0_ComputeSectionName(sSection, sDirs, M_Geometric, sIdent);
if(SCR_fn_c_RdL0_IsSectionExists(sSection))
{
sprintf(sFamily, "%s", stFindFileData.cFileName);
SetCurrentDirectory(sDirectory);
*bRes = TRUE;
return;
}
} while(FindNextFile(hHandle, &stFindFileData));
FindClose(hHandle);
}
}
}
/****************************************************************************
* Description: find if the file exist in a directory
*
* Parameters: sBankName : bank to convert
* sRawData : source directory
* sDir : source sub-directory
* sExt : the extension of the file
* j : 1 if the file exists
*---------------------------------------------------------------------------
* Revision date: Author:
*****************************************************************************/
void MLT_vExistFile (char *sBankName, char *sRawData, char *sDir, char *sExt, int *j)
{
xString sFile;
FILE *file;
sprintf(sFile, "%s%s%s\\%s.%s", sRawData, sDir, sBankName, sBankName, sExt);
if (file = fopen(sFile, "r"))
{
(*j)++;
fclose(file);
}
}
/****************************************************************************
* Description: find if the file exist in a bank directory
*
* Parameters: sBankName : bank to convert
* sRawData : source directory
* sExt : the extension of the file
* j : 1 if the file exists
*---------------------------------------------------------------------------
* Revision date: Author:
*****************************************************************************/
void MLT_vExistFileInBank (char *sBankName, char * sDir, char *sExt, int *j)
{
xString sFile;
FILE *file;
sprintf(sFile, "%s\\%s\\%s.%s", sDir, sBankName, sBankName, sExt);
if (file = fopen(sFile, "r"))
{
(*j)++;
fclose(file);
}
}
/****************************************************************************
* Description: compute the MOD file in the specified bank
*
* Parameters: jj : number of common files found
*---------------------------------------------------------------------------
* Revision date: Author:
*****************************************************************************/
void MLT_vGetCommonExt (int *jj)
{
*jj=0;
// for each family extension, test if it is a specific one
if (!MLT_bSearchExt ("ace"))
{
strcpy(gs_szFilesCommon[*jj], "ace");
(*jj)++;
}
if (!MLT_bSearchExt ("acz"))
{
strcpy(gs_szFilesCommon[*jj], "acz");
(*jj)++;
}
if (!MLT_bSearchExt ("sta"))
{
strcpy(gs_szFilesCommon[*jj], "sta");
(*jj)++;
}
if (!MLT_bSearchExt ("phy"))
{
strcpy(gs_szFilesCommon[*jj], "phy");
(*jj)++;
}
if (!MLT_bSearchExt ("tbl"))
{
strcpy(gs_szFilesCommon[*jj], "tbl");
(*jj)++;
}
if (!MLT_bSearchExt ("zoo"))
{
strcpy(gs_szFilesCommon[*jj], "zoo");
(*jj)++;
}
if (!MLT_bSearchExt ("chl"))
{
strcpy(gs_szFilesCommon[*jj], "chl");
(*jj)++;
}
}