730 lines
21 KiB
C
730 lines
21 KiB
C
/*=========================================================================
|
|
*
|
|
* Families.c - Family conversion
|
|
*
|
|
* Version 1.0
|
|
* Revision date
|
|
*
|
|
*=======================================================================*/
|
|
#include <Windows.h>
|
|
|
|
#include "Families.h"
|
|
|
|
#include "SCR.h"
|
|
|
|
#include "conventi.h"
|
|
#include "print.h"
|
|
#include "system.h"
|
|
|
|
#include "PhySave.h"
|
|
#include "ZooSave.h"
|
|
|
|
#include "SaveModifLst.h"
|
|
|
|
//--- Global defines --------------------------------------------------------
|
|
|
|
int g_iSpecific1 = 0;
|
|
int g_iSpecific2 = 0;
|
|
|
|
// files
|
|
char g_szFiles[20][5];
|
|
int g_iNbFiles = 0;
|
|
|
|
|
|
//--- header functions --------------------------------------------------------
|
|
|
|
void MLT_vSaveEmptyChlHeader (SCR_tdst_File_Description *p_stFile, char *sFileName, void *p_vPtr, SCR_tde_Ntfy_Action xAction)
|
|
{
|
|
}
|
|
void MLT_vSaveEmptyStaHeader (SCR_tdst_File_Description *p_stFile, char *sFileName, void *p_vPtr, SCR_tde_Ntfy_Action xAction)
|
|
{
|
|
}
|
|
void MLT_vSaveEmptyAceHeader (SCR_tdst_File_Description *p_stFile, char *sFileName, void *p_vPtr, SCR_tde_Ntfy_Action xAction)
|
|
{
|
|
}
|
|
void MLT_vSaveEmptyAczHeader (SCR_tdst_File_Description *p_stFile, char *sFileName, void *p_vPtr, SCR_tde_Ntfy_Action xAction)
|
|
{
|
|
}
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
|
|
/****************************************************************************
|
|
* Description: compute all the families found in the source directory
|
|
*
|
|
* Parameters: sRawData : source directory
|
|
* sGameData : destination directory
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*****************************************************************************/
|
|
void MLT_vComputeAllFamilies (char *sRawData, char *sGameData)
|
|
{
|
|
xString sDirectory;
|
|
HANDLE hHandle;
|
|
WIN32_FIND_DATA stFindFileData;
|
|
|
|
// change directory
|
|
GetCurrentDirectory(256, sDirectory);
|
|
SetCurrentDirectory(sRawData);
|
|
|
|
// search all the families files
|
|
memset(&stFindFileData,0,sizeof(stFindFileData));
|
|
hHandle = FindFirstFile("World\\Families\\*.*", &stFindFileData);
|
|
if( hHandle == INVALID_HANDLE_VALUE)
|
|
{
|
|
SetCurrentDirectory(sDirectory);
|
|
fprintf(stderr, "\nError : Can't find Family directory\n");
|
|
return;
|
|
}
|
|
|
|
do if(stFindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
|
|
{
|
|
if(strlen(stFindFileData.cFileName) == 0) break;
|
|
if(strcmp(stFindFileData.cFileName, ".") == 0) continue;
|
|
if(strcmp(stFindFileData.cFileName, "..") == 0) continue;
|
|
|
|
// compute the family
|
|
MLT_vComputeOneFamily(stFindFileData.cFileName, sRawData, sGameData);
|
|
}
|
|
while(FindNextFile(hHandle, &stFindFileData));
|
|
FindClose(hHandle);
|
|
|
|
// restore directory
|
|
SetCurrentDirectory(sDirectory);
|
|
}
|
|
|
|
|
|
/****************************************************************************
|
|
* Description: compute the specified family
|
|
*
|
|
* Parameters: sFamilyName : family to convert
|
|
* sRawData : source directory
|
|
* sGameData : destination directory
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*****************************************************************************/
|
|
void MLT_vComputeOneFamily (char *sFamilyName, char *sRawData, char *sGameData)
|
|
{
|
|
xString sDirectory;
|
|
xString sFileSearch;
|
|
char *sTmp;
|
|
HANDLE hHandle;
|
|
WIN32_FIND_DATA stFindFileData;
|
|
|
|
// WIN version
|
|
#ifdef _WINDOWS
|
|
|
|
char szInterm[50];
|
|
|
|
if( ((sTmp=strstr(sFamilyName, "\\")) == NULL)
|
|
&& ((sTmp=strstr(sFamilyName, "/")) == NULL) )
|
|
{
|
|
GetCurrentDirectory(256, sDirectory);
|
|
if (g_bStandardConfig)
|
|
{
|
|
// get OBJ name
|
|
sprintf(sFileSearch, "World\\Families\\%s\\*.obj", sFamilyName);
|
|
// change directory
|
|
SetCurrentDirectory(sRawData);
|
|
}
|
|
else
|
|
sprintf(sFileSearch, "%s\\%s\\*.obj", g_szFamilies, sFamilyName);
|
|
|
|
// search for the family file
|
|
memset(&stFindFileData,0,sizeof(stFindFileData));
|
|
hHandle = FindFirstFile(sFileSearch, &stFindFileData);
|
|
if( hHandle == INVALID_HANDLE_VALUE)
|
|
{
|
|
SetCurrentDirectory(sDirectory);
|
|
sprintf(szInterm, "\nError : Can't find %s family\n", sFamilyName);
|
|
fn_vAfxOutputStringRes( szInterm, C_ComRes_cErrorLine);
|
|
return;
|
|
}
|
|
do
|
|
{
|
|
if(strlen(stFindFileData.cFileName) == 0) break;
|
|
|
|
// compute the OBJ file
|
|
MLT_vComputeOneObj(sFamilyName, MLT_p_cGetFileNameWithoutExt(stFindFileData.cFileName), sRawData, sGameData);
|
|
}
|
|
while(FindNextFile(hHandle, &stFindFileData));
|
|
FindClose(hHandle);
|
|
|
|
// restore directory
|
|
SetCurrentDirectory(sDirectory);
|
|
}
|
|
else
|
|
MLT_vComputeOneObj(sFamilyName, sFamilyName, sRawData, sGameData);
|
|
|
|
// DOS version
|
|
#else
|
|
|
|
// get OBJ name
|
|
if( ((sTmp=strstr(sFamilyName, "\\")) == NULL)
|
|
&& ((sTmp=strstr(sFamilyName, "/")) == NULL) )
|
|
sprintf(sFileSearch, "World\\Families\\%s\\*.obj", sFamilyName);
|
|
else
|
|
{
|
|
sprintf(sFileSearch, "World\\Families\\%s", sFamilyName);
|
|
*sTmp = 0;
|
|
}
|
|
|
|
// change directory
|
|
GetCurrentDirectory(256, sDirectory);
|
|
SetCurrentDirectory(sRawData);
|
|
|
|
// search for the family file
|
|
memset(&stFindFileData,0,sizeof(stFindFileData));
|
|
hHandle = FindFirstFile(sFileSearch, &stFindFileData);
|
|
if( hHandle == INVALID_HANDLE_VALUE)
|
|
{
|
|
SetCurrentDirectory(sDirectory);
|
|
fprintf(stderr, "\nError : Can't find %s family\n", sFamilyName);
|
|
return;
|
|
}
|
|
do
|
|
{
|
|
if(strlen(stFindFileData.cFileName) == 0) break;
|
|
|
|
// compute the OBJ file
|
|
MLT_vComputeOneObj(sFamilyName, MLT_p_cGetFileNameWithoutExt(stFindFileData.cFileName), sRawData, sGameData);
|
|
}
|
|
while(FindNextFile(hHandle, &stFindFileData));
|
|
FindClose(hHandle);
|
|
|
|
// restore directory
|
|
SetCurrentDirectory(sDirectory);
|
|
#endif
|
|
}
|
|
|
|
|
|
/****************************************************************************
|
|
* Description: compute the OBJ file in the specified family
|
|
*
|
|
* Parameters: sFamilyName : family to convert
|
|
* sObjName : file to convert
|
|
* sRawData : source directory
|
|
* sGameData : destination directory
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*****************************************************************************/
|
|
void MLT_vComputeOneObj (char *sFamilyName, char *sObjName, char *sRawData, char *sGameData)
|
|
{
|
|
xString sRowFamily, sGameFamily, sFile, sSection, sName, sGFam, sFileAll, sGam, sFileNew;
|
|
xString sDefaultDir;
|
|
int i;
|
|
|
|
// register globals
|
|
sprintf(g_sFileIn, "%s", sObjName);
|
|
sprintf(g_sFileMaterial, "%s", sFamilyName);
|
|
sprintf(g_sDirectorySave, "%s\\", sFamilyName);
|
|
|
|
// init paths
|
|
if (g_bStandardConfig)
|
|
sprintf(sRowFamily, "%s\\World\\Families\\%s", sRawData, g_sDirectorySave);
|
|
else
|
|
sprintf(sRowFamily, "%s\\%s", g_szFamilies, g_sDirectorySave);
|
|
|
|
sprintf(sGameFamily, "%s\\World\\Levels\\_Common\\Families\\%s", sGameData, g_sDirectorySave);
|
|
|
|
// init directories
|
|
sprintf(sGFam, "%s\\World\\Levels\\_Common\\Families\\%s", g_sGameCommon, g_sDirectorySave);
|
|
strcpy(sGam, "");
|
|
|
|
// DISPLAY
|
|
MLT_vOutput( C_ComRes_cTitleLine, "\nFamily %s\\%s.obj",sFamilyName, sObjName);
|
|
|
|
// change directory
|
|
CreateDirectory(sGameFamily, NULL);
|
|
CreateDirectory(sGFam, NULL);
|
|
|
|
// get TBL directory
|
|
if (MLT_bSearchExt("tbl"))
|
|
SetCurrentDirectory(sGameFamily);
|
|
else
|
|
SetCurrentDirectory(sGFam);
|
|
// init TBL saving functions
|
|
MLT_vInitSaveTbl();
|
|
// notify and save TBL file
|
|
sprintf(sFile, "%s.tbl", g_sFileIn);
|
|
SCR_fn_v_SvL1_RegisterNotify(sFile, MLT_vSaveTblFile, (void *)0x1, SCR_EA_Ntfy_AddOrModifySection);
|
|
SCR_fn_v_SvL1_UpdateAllNotify();
|
|
|
|
// get PHY directory
|
|
if (MLT_bSearchExt("phy"))
|
|
SetCurrentDirectory(sGameFamily);
|
|
else
|
|
SetCurrentDirectory(sGFam);
|
|
// notify and save PHY file
|
|
sprintf(sFile, "%s.phy", g_sFileIn);
|
|
SCR_fn_v_SvL1_RegisterNotify(sFile, MLT_vSavePhyFile, NULL, SCR_EA_Ntfy_AddSection);
|
|
SCR_fn_v_SvL1_UpdateAllNotify();
|
|
|
|
// get ZOO directory
|
|
if (g_iData)
|
|
SetCurrentDirectory(sGFam);
|
|
else
|
|
{
|
|
// There are files in GameSpecific1 and GameSpecific2 directories
|
|
if (g_iSpecific1 && g_iSpecific2)
|
|
{
|
|
// Module Zones is not checked -> the newest ZOO file is kept
|
|
struct _stat buf, buf1;
|
|
int fh, result;
|
|
|
|
strcpy(sFileAll, g_sGameSpecific1);
|
|
strcat(sFileAll, "\\World\\Levels\\_Common\\Families\\");
|
|
strcat(sFileAll, g_sFileIn);
|
|
strcat(sFileAll, "\\");
|
|
strcat(sFileAll, g_sFileIn);
|
|
strcat(sFileAll, M_FichierZOO);
|
|
if( (fh = _open( sFileAll, _O_RDONLY )) == -1) return;
|
|
result = _fstat( fh, &buf );
|
|
close(fh);
|
|
strcpy(sFileAll, g_sGameSpecific2);
|
|
strcat(sFileAll, "\\World\\Levels\\_Common\\Families\\");
|
|
strcat(sFileAll, g_sFileIn);
|
|
strcat(sFileAll, "\\");
|
|
strcat(sFileAll, g_sFileIn);
|
|
strcat(sFileAll, M_FichierZOO);
|
|
if( (fh = _open( sFileAll, _O_RDONLY )) == -1) return;
|
|
result = _fstat( fh, &buf1 );
|
|
close(fh);
|
|
if (buf.st_mtime>buf1.st_mtime)
|
|
remove(sFileAll);
|
|
else
|
|
{
|
|
strcpy(sFileAll, g_sGameSpecific1);
|
|
strcat(sFileAll, "\\World\\Levels\\_Common\\Families\\");
|
|
strcat(sFileAll, g_sFileIn);
|
|
strcat(sFileAll, "\\");
|
|
strcat(sFileAll, g_sFileIn);
|
|
strcat(sFileAll, M_FichierZOO);
|
|
remove(sFileAll);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// Keep GameSpecific1 file
|
|
if (g_iSpecific1)
|
|
{
|
|
strcpy(sGam, g_sGameSpecific1);
|
|
strcat(sGam, "\\World\\Levels\\_Common\\Families\\");
|
|
strcat(sGam, g_sFileIn);
|
|
strcat(sGam, "\\");
|
|
SetCurrentDirectory(sGam);
|
|
}
|
|
// Keep GameSpecific2 file
|
|
if (g_iSpecific2)
|
|
{
|
|
strcpy(sGam, g_sGameSpecific2);
|
|
strcat(sGam, "\\World\\Levels\\_Common\\Families\\");
|
|
strcat(sGam, g_sFileIn);
|
|
strcat(sGam, "\\");
|
|
SetCurrentDirectory(sGam);
|
|
}
|
|
}
|
|
}
|
|
|
|
// save ZOO file
|
|
sprintf(sFile, "%s.zoo", g_sFileIn);
|
|
// if ZOO file does not exist, create it
|
|
if(! SCR_fn_c_RdL0_IsSectionExists(sFile))
|
|
{
|
|
if (MLT_bSearchExt("zoo"))
|
|
SetCurrentDirectory(sGameFamily);
|
|
else
|
|
SetCurrentDirectory(sGFam);
|
|
SCR_fn_v_SvL1_RegisterNotify(sFile, MLT_vSaveZooFile, NULL, SCR_EA_Ntfy_AddSection);
|
|
}
|
|
// if ZOO file exists, check if it must be rebuilt
|
|
else
|
|
{
|
|
if (g_bIgnoreZoo)
|
|
{
|
|
i = remove(sFile);
|
|
if (!i)
|
|
{
|
|
if (MLT_bSearchExt("zoo"))
|
|
SetCurrentDirectory(sGameFamily);
|
|
else
|
|
SetCurrentDirectory(sGFam);
|
|
SCR_fn_v_SvL1_RegisterNotify(sFile, MLT_vSaveZooFile, NULL, SCR_EA_Ntfy_AddSection);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
xString sSection;
|
|
//the case when the generated file will use the .zoo file from specific directory
|
|
if (g_iData)
|
|
{
|
|
if (MLT_bSearchExt("zoo"))
|
|
SetCurrentDirectory(sGameFamily);
|
|
else
|
|
SetCurrentDirectory(sGFam);
|
|
strcpy(sFileAll, sGFam);
|
|
strcat(sFileAll, g_sFileIn);
|
|
strcat(sFileAll, ".zoo");
|
|
CopyFile(sFileAll, "temp.zoo", FALSE);
|
|
remove(sFileAll);
|
|
strcpy(sFileAll, sGameFamily);
|
|
strcat(sFileAll, g_sFileIn);
|
|
strcat(sFileAll, M_FichierZOO);
|
|
CopyFile("temp.zoo", sFileAll, FALSE);
|
|
}
|
|
else
|
|
{
|
|
strcpy(sFileAll, sGam);
|
|
strcat(sFileAll, g_sFileIn);
|
|
strcat(sFileAll, ".zoo");
|
|
strcpy(sFileNew, sGameFamily);
|
|
strcat(sFileNew, g_sFileIn);
|
|
strcat(sFileNew, M_FichierZOO);
|
|
CopyFile(sFileAll, sFileNew, FALSE);
|
|
strcpy(sFileNew, sGameFamily);
|
|
strcat(sFileNew, "temp.zoo");
|
|
CopyFile(sFileAll, sFileNew, FALSE);
|
|
if (strcmp(sGam,""))
|
|
remove(sFileAll);
|
|
SetCurrentDirectory(sGameFamily);
|
|
}
|
|
|
|
SCR_fn_v_RdL0_ComputeSectionName(sSection, sFile, M_AllCollideSets, "");
|
|
SCR_fn_v_SvL1_RegisterNotify(sSection/*sFile*/, MLT_vSaveAllCollideSetsSection, NULL, SCR_EA_Ntfy_RebuildSection);
|
|
}
|
|
}
|
|
|
|
// if necessary, copy the animations
|
|
if (g_bCopyAnims)
|
|
MLT_vCopyAnims(sFamilyName);
|
|
|
|
// save all notified sections
|
|
SCR_fn_v_SvL1_UpdateAllNotify();
|
|
|
|
// register path for load
|
|
SCR_fn_v_RdL0_RegisterPath(sGameFamily);
|
|
|
|
// change directory
|
|
SetCurrentDirectory(sGameFamily);
|
|
|
|
// DISPLAY
|
|
MLT_vOutput( C_ComRes_cNormalLine, "\n\tCopy...");
|
|
|
|
// copy CHL file
|
|
sprintf(sFile, "%s.chl", g_sFileIn);
|
|
strcpy(sDefaultDir, g_sGameCommon);
|
|
strcat(sDefaultDir, "\\default");
|
|
if (!MLT_bSearchExt("chl"))
|
|
{
|
|
SetCurrentDirectory(sGFam);
|
|
MLT_vCopyFiles("*.chl", sRowFamily, sGFam);
|
|
}
|
|
else
|
|
{
|
|
SetCurrentDirectory(sGameFamily);
|
|
MLT_vCopyFiles("*.chl", sRowFamily, sGameFamily);
|
|
}
|
|
SCR_fn_v_SvL1_RegisterNotify(sFile, MLT_vSaveEmptyChlHeader, NULL, SCR_EA_Ntfy_AddSection);
|
|
SCR_fn_v_SvL1_UpdateAllNotify();
|
|
|
|
// copy and update STA file
|
|
if (!MLT_bSearchExt("sta"))
|
|
SetCurrentDirectory(sGFam);
|
|
else
|
|
SetCurrentDirectory(sGameFamily);
|
|
sprintf(sName, "%s.sta", sFamilyName);
|
|
MLT_vCopyAndRenameFile("Default.sta", sDefaultDir, sName, ".", FALSE);
|
|
MLT_vSubstituteAnimInStaFile(sFamilyName);
|
|
SCR_fn_v_SvL1_RegisterNotify(sName, MLT_vSaveEmptyStaHeader, NULL, SCR_EA_Ntfy_AddSection);
|
|
SCR_fn_v_SvL1_UpdateAllNotify();
|
|
|
|
// copy and update ACE file
|
|
if (!MLT_bSearchExt("ace"))
|
|
SetCurrentDirectory(sGFam);
|
|
else
|
|
SetCurrentDirectory(sGameFamily);
|
|
sprintf(sName, "%s.ace", sFamilyName);
|
|
MLT_vCopyAndRenameFile("Default.ace", sDefaultDir, sName, ".", FALSE);
|
|
SCR_fn_v_SvL1_RegisterNotify(sName, MLT_vSaveEmptyAceHeader, NULL, SCR_EA_Ntfy_AddSection);
|
|
SCR_fn_v_SvL1_UpdateAllNotify();
|
|
|
|
// copy and update ACZ file
|
|
if (!MLT_bSearchExt("acz"))
|
|
SetCurrentDirectory(sGFam);
|
|
else
|
|
SetCurrentDirectory(sGameFamily);
|
|
sprintf(sName, "%s.acz", sFamilyName);
|
|
MLT_vCopyAndRenameFile("Default.acz", sDefaultDir, sName, ".", FALSE);
|
|
SCR_fn_v_SvL1_RegisterNotify(sName, MLT_vSaveEmptyAczHeader, NULL, SCR_EA_Ntfy_AddSection);
|
|
SCR_fn_v_SvL1_UpdateAllNotify();
|
|
|
|
|
|
// change directory
|
|
SetCurrentDirectory(sRowFamily);
|
|
|
|
// DISPLAY
|
|
MLT_vOutput( C_ComRes_cNormalLine, "\n\tLoad...");
|
|
|
|
// load library
|
|
MLT_vLoadModuleLib();
|
|
|
|
// DISPLAY
|
|
MLT_vOutput( C_ComRes_cNormalLine, "\n\tCreate Physical...");
|
|
|
|
// set appropriate directory
|
|
if (MLT_bSearchExt("tbl"))
|
|
SetCurrentDirectory(sGameFamily);
|
|
else
|
|
SetCurrentDirectory(sGFam);
|
|
|
|
// DISPLAY
|
|
MLT_vOutput( C_ComRes_cNormalLine, "\n\tSave...");
|
|
|
|
// save all notified sections
|
|
SCR_fn_v_SvL1_UpdateAllNotify();
|
|
|
|
// save TBL file
|
|
sprintf(sFile, "%s.tbl", g_sFileIn);
|
|
SCR_fn_v_RdL0_ComputeSectionName(sSection, sFile, M_TBL_HEADER, "");
|
|
if (MLT_bSearchExt("tbl"))
|
|
SetCurrentDirectory(sGameFamily);
|
|
else
|
|
SetCurrentDirectory(sGFam);
|
|
SCR_fn_v_SvL1_RegisterNotify(sSection, MLT_vSaveTblFile, NULL, SCR_EA_Ntfy_RebuildSection);
|
|
SCR_fn_v_SvL1_UpdateAllNotify();
|
|
|
|
// erase the libs
|
|
MLT_vDeleteModuleLib();
|
|
|
|
// update ModifLst file
|
|
MLT_vUpdatePathInModifFile(sGameFamily);
|
|
|
|
// close all opened files for ZOO
|
|
if (!g_bIgnoreZoo)
|
|
{
|
|
SCR_fn_v_RdL0_Close();
|
|
strcpy (sFile, sGameFamily);
|
|
strcat(sFile, "temp.zoo");
|
|
remove(sFile);
|
|
MLT_vInitSystem();
|
|
}
|
|
|
|
// DISPLAY
|
|
MLT_vOutput( C_ComRes_cResultLine, "\nFamily %s converted\n",sFamilyName);
|
|
|
|
// clean all opened structures
|
|
for (i=3; i<256; i++)
|
|
_close((int)i);
|
|
MLT_vInitSystem();
|
|
}
|
|
|
|
/****************************************************************************
|
|
* Description: copy the animations of the family from source to destination directory
|
|
*
|
|
* Parameters: sFamily : name of the family
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*****************************************************************************/
|
|
void MLT_vCopyAnims (char *sFamily)
|
|
{
|
|
xString sRawAnim, sGameAnim;
|
|
|
|
// get the appropriate destination directory
|
|
switch (g_iData)
|
|
{
|
|
case 0:
|
|
sprintf(sGameAnim, "%s\\World\\Graphics\\Anims\\%s", g_sGameCommon, sFamily);
|
|
break;
|
|
|
|
case 1:
|
|
sprintf(sGameAnim, "%s\\World\\Graphics\\Anims\\%s", g_sGameSpecific1, sFamily);
|
|
break;
|
|
|
|
case 2:
|
|
sprintf(sGameAnim, "%s\\World\\Graphics\\Anims\\%s", g_sGameSpecific2, sFamily);
|
|
break;
|
|
}
|
|
|
|
// get the appropriate source directory
|
|
if (g_bStandardConfig)
|
|
{
|
|
switch (g_iRaw)
|
|
{
|
|
case 0:
|
|
sprintf(sRawAnim, "%s\\World\\Graphics\\Anims\\%s", g_sRawCommon, sFamily);
|
|
break;
|
|
case 1:
|
|
sprintf(sRawAnim, "%s\\World\\Graphics\\Anims\\%s", g_sRawSpecific1, sFamily);
|
|
break;
|
|
case 2:
|
|
sprintf(sRawAnim, "%s\\World\\Graphics\\Anims\\%s", g_sRawSpecific2, sFamily);
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
sprintf(sRawAnim, "%s\\%s", g_szAnims, sFamily);
|
|
|
|
// create the destination directory
|
|
CreateDirectory(sGameAnim, NULL);
|
|
|
|
|
|
// DISPLAY
|
|
MLT_vOutput( C_ComRes_cNormalLine, "\n\tCopy animations for the family %s...", sFamily);
|
|
|
|
// copy the animations
|
|
MLT_vCopyFiles("*.a3d", sRawAnim, sGameAnim);
|
|
}
|
|
|
|
|
|
/****************************************************************************
|
|
* Description: set the animation name of the default state in STA file
|
|
*
|
|
* Parameters: sFamily : name of the family
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*****************************************************************************/
|
|
void MLT_vSubstituteAnimInStaFile (char *sFamily)
|
|
{
|
|
FILE *fileR, *fileW;
|
|
xString sAnim, sName, sRead, sWrite;
|
|
char *sTmp;
|
|
BOOL bDeleteAnim=FALSE;
|
|
BOOL bFound = FALSE;
|
|
|
|
// get the appropriate destination directory
|
|
switch(g_iData)
|
|
{
|
|
case 0:
|
|
MLT_vSearchInGame(sFamily, &bFound, g_sGameCommon, sAnim);
|
|
MLT_vSearchInGame(sFamily, &bFound, g_sGameSpecific1, sAnim);
|
|
MLT_vSearchInGame(sFamily, &bFound, g_sGameSpecific2, sAnim);
|
|
break;
|
|
case 1:
|
|
MLT_vSearchInGame(sFamily, &bFound, g_sGameSpecific1, sAnim);
|
|
MLT_vSearchInGame(sFamily, &bFound, g_sGameCommon, sAnim);
|
|
MLT_vSearchInGame(sFamily, &bFound, g_sGameSpecific2, sAnim);
|
|
break;
|
|
case 2:
|
|
MLT_vSearchInGame(sFamily, &bFound, g_sGameSpecific2, sAnim);
|
|
MLT_vSearchInGame(sFamily, &bFound, g_sGameCommon, sAnim);
|
|
MLT_vSearchInGame(sFamily, &bFound, g_sGameSpecific1, sAnim);
|
|
break;
|
|
}
|
|
|
|
// no animation found
|
|
if (!bFound)
|
|
{
|
|
MLT_vOutput( C_ComRes_cWarningLine, "\nWarning : No anims for the %s Family", sFamily);
|
|
bDeleteAnim=TRUE;
|
|
}
|
|
|
|
// search the string to substitute
|
|
sprintf(sName, "%s.sta", sFamily);
|
|
rename(sName, "temp.sta");
|
|
// open source file
|
|
fileR = fopen("temp.sta", "rt");
|
|
if (!fileR)
|
|
{
|
|
MLT_vOutput( C_ComRes_cWarningLine, "\nWarning: The file temp.sta can't be open for reading!");
|
|
return;
|
|
}
|
|
// open destination file
|
|
fileW = fopen(sName, "wt");
|
|
if (!fileW)
|
|
{
|
|
MLT_vOutput( C_ComRes_cWarningLine, "\nWarning: The file %s can't be open for reading!", sName);
|
|
return;
|
|
}
|
|
|
|
// read the source file
|
|
while(fgets(sRead, 255, fileR) != NULL)
|
|
{
|
|
// search for the string to replace
|
|
sTmp = strstr(sRead, M_NomAnim);
|
|
if(sTmp != NULL)
|
|
{
|
|
xString sBuffer;
|
|
|
|
if(bDeleteAnim)
|
|
continue;
|
|
|
|
*sTmp = 0;
|
|
sprintf(sBuffer, "%s", sRead);
|
|
sTmp += 11;
|
|
sprintf(sWrite, "%s%s%s", sBuffer, sAnim, sTmp);
|
|
}
|
|
else
|
|
sprintf(sWrite, "%s", sRead);
|
|
// copy in destinatio file
|
|
fputs(sWrite, fileW);
|
|
}
|
|
|
|
// close files
|
|
fclose(fileR);
|
|
fclose(fileW);
|
|
// delete temporary file
|
|
remove("temp.sta");
|
|
}
|
|
|
|
|
|
/****************************************************************************
|
|
* Description: search for the animation files in the game directory
|
|
*
|
|
* Parameters: sFamily : family to convert
|
|
* bFound : return the result
|
|
* sGame : game directory
|
|
* sAnim : name of the animation
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*****************************************************************************/
|
|
void MLT_vSearchInGame (char *sFamily, BOOL *bFound, xString sGame, xString sAnim)
|
|
{
|
|
HANDLE hHandle;
|
|
WIN32_FIND_DATA stFindFileData;
|
|
xString sName;
|
|
|
|
if (!(*bFound) && strcmp(sGame,""))
|
|
{
|
|
// search in Game directory
|
|
sprintf(sName, "%s\\World\\Graphics\\Anims\\%s\\*.a3d", sGame, sFamily);
|
|
memset(&stFindFileData,0,sizeof(stFindFileData));
|
|
hHandle = FindFirstFile(sName, &stFindFileData);
|
|
if( hHandle != INVALID_HANDLE_VALUE)
|
|
{
|
|
do
|
|
{
|
|
if(strlen(stFindFileData.cFileName) != 0)
|
|
{
|
|
sprintf(sAnim, "%s", MLT_p_cGetFileNameWithoutExt(stFindFileData.cFileName));
|
|
(*bFound) = TRUE;
|
|
return;
|
|
}
|
|
}
|
|
while(FindNextFile(hHandle, &stFindFileData));
|
|
FindClose(hHandle);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/****************************************************************************
|
|
* Description: search if the extension is a specific one
|
|
*
|
|
* Parameters: sExt : extension to test
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*****************************************************************************/
|
|
BOOL MLT_bSearchExt (char *sExt)
|
|
{
|
|
int i;
|
|
for (i=0; i<g_iNbFiles+1; i++)
|
|
{
|
|
if (!stricmp(sExt, g_szFiles[i]))
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|