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

374 lines
9.9 KiB
C

/*=========================================================================
*
* Classes.c - Class conversion
*
* Version 1.0
* Revision date
*
*=======================================================================*/
#include <Windows.h>
#include "Classes.h"
#include "conventi.h"
#include "print.h"
#include "system.h"
#include "ModLib.h"
#include "PlgLoad.h"
#include "ModSave.h"
#include "PhySave.h"
#include "VseSave.h"
#include "ZooSave.h"
#include "Levels.h"
#include "SaveModifLst.h"
//--------------------------------------------------------------------
/****************************************************************************
* Description: compute all the classes found in the source directory
*
* Parameters: sRawData : source directory
* sGameData : destination directory
*---------------------------------------------------------------------------
* Revision date: Author:
*****************************************************************************/
void MLT_vComputeAllClasses (char *sRawData, char *sGameData)
{
xString sDirectory;
HANDLE hHandle;
WIN32_FIND_DATA stFindFileData;
// change directory
GetCurrentDirectory(256, sDirectory);
SetCurrentDirectory(sRawData);
// search all the classes files
memset(&stFindFileData,0,sizeof(stFindFileData));
hHandle = FindFirstFile("World/Graphics/Objects/Classes/*.mod", &stFindFileData);
if( hHandle == INVALID_HANDLE_VALUE)
{
SetCurrentDirectory(sDirectory);
printf("Can't find Classes directory");
return;
}
do
{
if(strlen(stFindFileData.cFileName) == 0) break;
// compute the class
MLT_vComputeOneClassMod(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 class
*
* Parameters: sClassName : class to convert
* sRawData : source directory
* sGameData : destination directory
*---------------------------------------------------------------------------
* Revision date: Author:
*****************************************************************************/
void MLT_vComputeOneClass (char *sClassName, 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 class file
if (g_bStandardConfig)
{
SetCurrentDirectory(sRawData);
sprintf(sFileSearch, "World\\Graphics\\Objects\\Classes\\%s.mod", sClassName);
}
else
sprintf(sFileSearch, "%s\\%s.mod", g_szClasses, sClassName);
memset(&stFindFileData,0,sizeof(stFindFileData));
hHandle = FindFirstFile(sFileSearch, &stFindFileData);
if( hHandle == INVALID_HANDLE_VALUE)
{
SetCurrentDirectory(sDirectory);
fprintf(stderr, "\nError : Can't find %s classe\n", sClassName);
return;
}
do
{
if(strlen(stFindFileData.cFileName) == 0) break;
// compute the MOD file
MLT_vComputeOneClassMod(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_vComputeOneClassMod(sClassName, sClassName, sRawData, sGameData);
#endif
}
/****************************************************************************
* Description: compute the MOD file in the specified class
*
* Parameters: sClassName : class to convert
* sModName : file to convert
* sRawData : source directory
* sGameData : destination directory
*---------------------------------------------------------------------------
* Revision date: Author:
*****************************************************************************/
void MLT_vComputeOneClassMod (char *sClassName, char *sModName, char *sRawData, char *sGameData)
{
xString sRawClass, sGameClass, sFile, sSection, sFileM, sFile1;
int i, f;
// register globals
sprintf(g_sFileIn, "%s", sModName);
sprintf(g_sFileMaterial, "%s", sClassName);
sprintf(g_sDirectorySave, "%s\\", sClassName);
// DISPLAY
MLT_vOutput( C_ComRes_cTitleLine, "\nClass %s\\%s.mod",sClassName, sModName);
// init paths
if (g_bStandardConfig)
sprintf(sRawClass, "%s\\World\\Graphics\\Objects\\Classes", sRawData);
else
sprintf(sRawClass, "%s", g_szClasses);
sprintf(sGameClass, "%s\\World\\Graphics\\Objects\\Classes\\%s", sGameData, sClassName);
// change directory
CreateDirectory(sGameClass, NULL);
SetCurrentDirectory(sGameClass);
// prepare TBL notifications
MLT_vInitSaveTbl();
// 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 (!SCR_fn_c_RdL0_IsSectionExists(sFile))
{
SCR_fn_v_SvL1_RegisterNotify(sFile, MLT_vSaveTexFile, NULL, SCR_EA_Ntfy_AddOrModifySection);
g_bExistTex = FALSE;
}
else
g_bExistTex = TRUE;
// 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 TBL file
sprintf(sFile, "%s.tbl", g_sFileIn);
SCR_fn_v_SvL1_RegisterNotify(sFile, MLT_vSaveTblFile, (void *)0x1, SCR_EA_Ntfy_AddSection);
// notify PHY file
sprintf(sFile, "%s.phy", g_sFileIn);
SCR_fn_v_SvL1_RegisterNotify(sFile, MLT_vSavePhyFile, NULL, SCR_EA_Ntfy_AddSection);
// notify ZOO file
sprintf(sFile, "%s.zoo", g_sFileIn);
if (!SCR_fn_c_RdL0_IsSectionExists(sFile))
SCR_fn_v_SvL1_RegisterNotify(sFile, MLT_vSaveZooFile, NULL, SCR_EA_Ntfy_AddSection);
// if ZOO file exist, check if must be rebuilt
else
{
if (g_bIgnoreZoo)
{
i=remove(sFile);
if (!i)
SCR_fn_v_SvL1_RegisterNotify(sFile, MLT_vSaveZooFile, NULL, SCR_EA_Ntfy_AddSection);
}
else
{
xString sSection;
CopyFile(sFile, "temp.zoo", FALSE);
SCR_fn_v_RdL0_ComputeSectionName(sSection, sFile, M_AllCollideSets, "");
SCR_fn_v_SvL1_RegisterNotify(sSection/*sFile*/, MLT_vSaveAllCollideSetsSection, NULL, SCR_EA_Ntfy_RebuildSection);
}
}
// 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);
}
// save all notified sections
SCR_fn_v_SvL1_UpdateAllNotify();
// register path for load
SCR_fn_v_RdL0_RegisterPath(sGameClass);
// change directory
SetCurrentDirectory(sRawClass);
// DISPLAY
MLT_vOutput( C_ComRes_cNormalLine, "\n\tLoad...");
// load MOD file
MLT_vLoadModFileInLib();
// load PLG file
MLT_vLoadPLGFileInLib();
// DISPLAY
MLT_vOutput( C_ComRes_cNormalLine, "\n\tCreate Physical...");
// build physical sections
MLT_vMakePhysicalInLib();
// change directory
SetCurrentDirectory(sGameClass);
// DISPLAY
MLT_vOutput( C_ComRes_cNormalLine, "\n\tSave...");
// save MOD file
MLT_vSaveLibInModFile(TRUE, TRUE, TRUE, TRUE);
// save PLG file
MLT_vSaveLibInPLGFile();
// if necessary, remove old files
g_bExistMdf = FALSE;
g_bExistMdt = FALSE;
if (g_bEraseMdf)
{
strcpy (sFile, sGameClass);
sprintf(sFileM, "%s.mdf", sClassName);
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, sGameClass);
sprintf(sFileM, "%s.mdt", sClassName);
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();
// rebuild TBL sections
sprintf(sFile, "%s.tbl", g_sFileIn);
SCR_fn_v_RdL0_ComputeSectionName(sSection, sFile, M_TBL_HEADER, "");
SCR_fn_v_SvL1_RegisterNotify(sSection, MLT_vSaveTblFile, NULL, SCR_EA_Ntfy_RebuildSection);
SCR_fn_v_SvL1_UpdateAllNotify();
// erase the libs
MLT_vEraseLib();
MLT_vErasePLGLib();
// update ModifLst file
MLT_vUpdatePathInModifFile(sGameClass);
// close all opened files for VSE
SCR_fn_v_RdL0_Close();
strcpy(sFile, sGameClass);
strcat(sFile, "temp.vse");
remove(sFile);
MLT_vInitSystem();
// close all opened files for ZOO
if (!g_bIgnoreZoo)
{
SCR_fn_v_RdL0_Close();
strcpy (sFile, sGameClass);
strcat(sFile, "temp.zoo");
remove(sFile);
MLT_vInitSystem();
}
// DISPLAY
MLT_vOutput( C_ComRes_cResultLine, "\nClass %s converted\n",sClassName);
// clean all opened structures
for (i=3; i<256; i++)
_close((int)i);
MLT_vInitSystem();
// multitextures
if (g_bIgnoreTex && g_bExistTex)
{
FILE *fileR, *file;
xString sRead;
strcpy (sFile, sGameClass);
sprintf(sFileM, "%s.tex", sClassName);
strcat(sFile, sFileM);
strcpy (sFile1, sGameClass);
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);
}
}