/*=========================================================================
*
* ModSave.h	- Saving functions for MOD file
*
* Version			1.0
* Revision date
*
*=======================================================================*/
#include "ModSave.h"

#include "conventi.h"
#include "defines.h"
#include "main.h"
#include "print.h"
#include "system.h"

#include "ModLib.h"
#include "PhySave.h"
#include "SpoSave.h"
#include "VseSave.h"
#include "ZooSave.h"

#include "Altimaps.h"


//--- Global statics --------------------------------------------------------

static char *gs_a_szElementTypeName[] = 
	{
		"",
		M_IndexedTriangles,
		M_FaceMapDescriptors,
		M_Sprites,
		M_TMeshes,
		M_Points,
		M_Lines,
		M_Spheres,
		M_AlignedBoxes,
		M_Cones,
		M_Altimap,
		M_MegaFace
	};



//--- Global extern --------------------------------------------------------

char g_szInstancesSaved[200][256];
int	 g_iNbInstancesSaved = 0;

//--- header functions --------------------------------------------------------

void MLT_vSaveEmptyModHeader(SCR_tdst_File_Description *p_stFile, char *sFileName, void *p_vPtr, SCR_tde_Ntfy_Action xAction)
{
}


//--------------------------------------------------------------------



/****************************************************************************
*		Description:	save geometric object
*
*		Parameters:		p_stFile		: script file pointer
*						p_stGeometric	: geometric object
*						bPhy			: flag to save PHY
*						bTbl			: flag to save TBL
*						bZoo			: flag to save ZOO
*						bVse			: flag to save VSE
*---------------------------------------------------------------------------
*		Revision date:                                      Author:         
*****************************************************************************/
void MLT_vSaveGeometricObject (SCRIPT_tdstSaveFile *p_stFile, MLT_tdstGeometricObject *p_stGeometric, BOOL bPhy, BOOL bTbl,	BOOL bZoo, BOOL bVse)
{
	long	lNoPhy, lNoLod;
	long	i;
	MLT_tdstGeometricObject		*p_stObjOrg;
	MLT_tdstElementAltimap		*p_stAltimap;
	ACP_tdxIndex				xIndexOfParallelBox;
	xString						sSection, sFileOut;
	xString						mes, sComment;
	xString						sFile2, sIdent2;
	xString						sFile, sAction, sIdent;
	xString						sForme, sHabillage, sName;
	BOOL						bTest;
	BOOL						bAltimap = TRUE;
	char						*sName1, *p_Char1, *p_char;
	int							iX=0, iY=0, iZ=0;
	
	
	if(p_stGeometric == NULL) 
		return;
	if(p_stGeometric->bNotForSave) 
		return;
	// Rayman2 version : no more GoThrough
	if ((g_bRaymanII)&&(strstr(p_stGeometric->sName, "Gothrough")))
		return;	//don't save anymore the frtb objects

	if(strlen(p_stGeometric->sPhysicalSection) != 0)
	{
		// save TBL
		if(bTbl)
		{    
			sprintf(sFile, "%s.tbl", g_sFileIn);
			sprintf(mes, "%d", p_stGeometric->lNumberInTable);
			SCR_fn_v_RdL0_ComputeSectionName(sSection, sFile, M_Tbl, mes);
			SCR_fn_v_SvL1_RegisterNotify(sSection, MLT_vSaveTbl, p_stGeometric, SCR_EA_Ntfy_AddSection);
		}
		// save PHY
		if(bPhy)
		{    
			SCR_fn_v_RdL0_SplitSectionName(p_stGeometric->sPhysicalSection, sFile, sAction, sIdent);
			sprintf(sIdent2, "PO_%s", sIdent);
			SCR_fn_v_RdL0_ComputeSectionName(sSection, sFile, sAction, sIdent2);
			SCR_fn_v_SvL1_RegisterNotify(sSection, MLT_vSavePhy, p_stGeometric, SCR_EA_Ntfy_AddOrModifySection);
		}
		// save ZOO
		if(bZoo)
		{    
			SCR_fn_v_RdL0_SplitSectionName(p_stGeometric->sName, sFile, sAction, sIdent2);
			SCR_fn_v_RdL0_SplitSectionName(p_stGeometric->sPhysicalSection, sFile, sAction, sIdent);
			if (strcmp(sIdent, sIdent2))
				bTest = TRUE;
			else
				bTest = FALSE;
			sprintf(sFile2, "%s.zoo", g_sFileIn);
			SCR_fn_v_RdL0_ComputeSectionName(sFile, sFile2, M_AllCollideSets, "");
			sprintf(sFile2, "%s", sFile, SCR_CC_sz_Cfg_SectionIdMark);
			sprintf(sIdent2, "CS_%s", sIdent);
			SCR_fn_v_RdL0_ComputeSectionName(sSection, sFile2, M_CS, sIdent2);
			SCR_fn_v_SvL1_RegisterNotify(sFile, MLT_vSaveAllCollideSetsSection, NULL, SCR_EA_Ntfy_AddOrModifySection);
			SCR_fn_v_SvL1_RegisterNotify(sSection, MLT_vSaveZoo, p_stGeometric, SCR_EA_Ntfy_AddOrModifySection);
		}
		// save VSE
		if(bVse)
		{    
			SCR_fn_v_RdL0_SplitSectionName(p_stGeometric->sPhysicalSection, sFile, sAction, sIdent);
			sprintf(sFile, "%s.vse", g_sFileIn);
			MLT_vSplitModuleSectionName(sIdent, sForme, sHabillage, &lNoPhy, &lNoLod, sName);
			MLT_vComputeVisualSetSectionName(sIdent, sForme, sHabillage, sName);
			SCR_fn_v_RdL0_ComputeSectionName(sSection, sFile, M_VS, sIdent);
			p_stGeometric->lNbLod = MLT_lSaveLodInFile(sSection);
			sprintf(sIdent2, "VSE_%s", sIdent);
			SCR_fn_v_RdL0_ComputeSectionName(sSection, sFile, M_VS, sIdent2);
			SCR_fn_v_SvL1_RegisterNotify(sSection, MLT_vSaveVisualSet, p_stGeometric, SCR_EA_Ntfy_AddOrModifySection);
		}
	}
	
	sprintf(sFileOut, "%s.mod", g_sFileIn);
	
	SCR_fn_v_RdL0_SplitSectionName(p_stGeometric->sName, sFile, sAction, sIdent);

	// find object in lib
	p_stObjOrg = MLT_pFindAlmostInLib(p_stGeometric->sName);
	if (p_stObjOrg == NULL)
	{
		MLT_vOutput( C_ComRes_cErrorLine, "\nError : Can't find %s", p_stGeometric->sName);
	}
	// check coherence
	if ((p_stObjOrg != p_stGeometric)&&(!bTest))
	{
		if( (p_stObjOrg->xNbPoints != p_stGeometric->xNbPoints) )
		{
			MLT_vOutput( C_ComRes_cWarningLine, "\nWarning : Not the same object %s : %s", p_stObjOrg->sName, p_stGeometric->sName);
		}
		else
		{
			sprintf(p_stGeometric->sPointsOf, "%s", p_stObjOrg->sName);
		}
	}
	

	// check if this object is an instance
	if((p_char=strstr(sIdent, "=")) != NULL)
	{
		strcpy(p_char, "\0");
		for (i=0; i<g_iNbInstancesSaved; i++)
		{
			if (!strcmp(sIdent, g_szInstancesSaved[i]))
				return;
		}
		strcpy(g_szInstancesSaved[g_iNbInstancesSaved++], sIdent);
	}
	// remove collision flags
	if (strstr(MLT_p_cGetSectionName(p_stGeometric->sName), "!nocol")
		|| strstr(MLT_p_cGetSectionName(p_stGeometric->sName), "!NOCOL")) 
	{
		sName1 = MLT_vRemoveFromName(MLT_p_cGetSectionName(p_stGeometric->sName));
		if((p_char=strstr(sName1, "=")) != NULL)
			strcpy(p_char, "\0");
		SCR_M_SvL0_SaveBeginSection(p_stFile, sName1, SCR_CC_C_Cfg_NoChar);
	}
	else
	{
		sName1 = MLT_p_cGetSectionName(p_stGeometric->sName);
		if((p_char=strstr(sName1, "=")) != NULL)
			strcpy(p_char, "\0");
		SCR_M_SvL0_SaveBeginSection(p_stFile, sName1, SCR_CC_C_Cfg_NoChar);
	}
	
	// test altimap structure
	if (p_stGeometric->iFlags & ~IS_NOT_ALTIMAP & MAYBE_ALTIMAP)
	{
		p_stAltimap = (MLT_tdstElementAltimap*)malloc(sizeof(MLT_tdstElementAltimap));
		MLT_vCompleteAltimapStructure(p_stGeometric, p_stAltimap);
		bAltimap = FALSE;
	}
	if (p_stGeometric->iFlags & IS_NOT_ALTIMAP)
	{
		MLT_vOutput( C_ComRes_cWarningLine, "\nWarning : %s is not an altimap, even if its name contains #ALT or #alt suffix.", p_stGeometric->sName);
		bAltimap = TRUE;
	}
	// normal object
	if (!bAltimap)
	{
		SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 4, "%d,%d,%d",0,0,1);
		if(strlen(p_stGeometric->sComment) != 0)
		{
			SCR_M_SvL0_SaveEntry(p_stFile, M_MODActionComment, SCR_CC_C_Cfg_NoChar);
			SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Normal, 1, p_stGeometric->sComment);
		}
		if(strlen(p_stGeometric->sComment) == 0)
		{	
			if (MLT_bTestSymmetry(p_stGeometric) && (p_stGeometric->iFlags & MAYBE_SYM))
			{
				SCR_M_SvL0_SaveEntry(p_stFile, M_MODActionComment, SCR_CC_C_Cfg_NoChar);
				sprintf(sComment, "#Sym(%c,%.0f)", p_stGeometric->cGeom, p_stGeometric->fGeom);
				SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Normal, 1, sComment);
			}
			if (!MLT_bTestSymmetry(p_stGeometric) && (p_stGeometric->iFlags & MAYBE_SYM))
				MLT_vOutput( C_ComRes_cWarningLine, "\nWarning : %s is not symmetric with the given plane.", p_stGeometric->sName);

			if (p_stGeometric->iFlags & IS_LOOKAT)
			{
				SCR_M_SvL0_SaveEntry(p_stFile, M_MODActionLookAt, SCR_CC_C_Cfg_NoChar);
				SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Normal, 1, "FALSE");
			}
			if (p_stGeometric->iFlags & IS_SEMI_LA)
			{
				SCR_M_SvL0_SaveEntry(p_stFile, M_MODActionLookAt, SCR_CC_C_Cfg_NoChar);
				SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Normal, 1, "TRUE");
			}
		}
		SCR_fn_v_RdL0_SplitSectionName(p_stGeometric->sName, sFile, sAction, sIdent);
		if(stricmp(sFile, sFileOut)==0)
			sprintf(sFile, "*");
		SCR_fn_v_RdL0_ComputeSectionName(sSection, sFile, M_ElementAltimap, sIdent);
		SCR_M_SvL0_SaveEntry(p_stFile, M_MODActionAddElement, SCR_CC_C_Cfg_NoChar);
		SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 4, "%d,%s,%s", 0, M_Altimap, sSection);
		SCR_M_SvL0_SaveEndSection(p_stFile, SCR_CC_C_Cfg_EOL);
		SCR_fn_v_RdL0_ComputeSectionName(p_stAltimap->sName, sFileOut, M_ElementAltimap, sIdent);
		MLT_vSaveElementAltimap(p_stFile, p_stAltimap);
		MLT_vFreeAltimap(p_stAltimap);
	}
	// altimap object
	else
	{
		SCR_fn_v_SvL0_SaveParameters_MP (p_stFile, SCR_EF_SvL0_Scanf, 4, "%d,%d,%d", p_stGeometric->xNbPoints, 0, p_stGeometric->xNbElements);
		
		if(strlen(p_stGeometric->sComment) != 0)
		{
			SCR_M_SvL0_SaveEntry(p_stFile, M_MODActionComment, SCR_CC_C_Cfg_NoChar);
			SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Normal, 1, p_stGeometric->sComment);
		}
		if(strlen(p_stGeometric->sComment) == 0)
		{	
			if (MLT_bTestSymmetry(p_stGeometric) && (p_stGeometric->iFlags & MAYBE_SYM))
			{
				SCR_M_SvL0_SaveEntry(p_stFile, M_MODActionComment, SCR_CC_C_Cfg_NoChar);
				sprintf(sComment, "#Sym(%c,%.0f)", p_stGeometric->cGeom, p_stGeometric->fGeom);
				SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Normal, 1, sComment);
			}
			if (!MLT_bTestSymmetry(p_stGeometric) && (p_stGeometric->iFlags & MAYBE_SYM))
				MLT_vOutput( C_ComRes_cWarningLine, "\nWarning : %s is not symmetric with the given plane.", p_stGeometric->sName);

			if (p_stGeometric->iFlags & IS_LOOKAT)
			{
				SCR_M_SvL0_SaveEntry(p_stFile, M_MODActionLookAt, SCR_CC_C_Cfg_NoChar);
				SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Normal, 1, "FALSE");
			}
			if (p_stGeometric->iFlags & IS_SEMI_LA)
			{
				SCR_M_SvL0_SaveEntry(p_stFile, M_MODActionLookAt, SCR_CC_C_Cfg_NoChar);
				SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Normal, 1, "TRUE");
			}
		}

		if(strlen(p_stGeometric->sPointsOf) != 0)
		{
			SCR_fn_v_RdL0_SplitSectionName(p_stGeometric->sPointsOf, sFile, sAction, sIdent);
			if(stricmp(sFile, sFileOut)==0)
				sprintf(sFile, "*");
			SCR_fn_v_RdL0_ComputeSectionName(sSection, sFile, sAction, sIdent);
			
			SCR_M_SvL0_SaveEntry(p_stFile, M_MODActionGetVertices, SCR_CC_C_Cfg_NoChar);
			SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Normal, 1, sSection);
		}
		else
		{
			for(i=0; i<p_stGeometric->xNbPoints; i++)
			{
				SCR_M_SvL0_SaveEntry(p_stFile, M_MODActionAddVertex, SCR_CC_C_Cfg_NoChar);
				SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 11, "%d,%.6f,%.6f,%.6f,%.6f,%.6f,%.6f,%.1f,%.1f,%.1f",
					i,
					p_stGeometric->d_stListOfPoints[i].xX,
					p_stGeometric->d_stListOfPoints[i].xY,
					p_stGeometric->d_stListOfPoints[i].xZ,
					p_stGeometric->d_stListOfPointsNormals[i].xX,
					p_stGeometric->d_stListOfPointsNormals[i].xY,
					p_stGeometric->d_stListOfPointsNormals[i].xZ,
					p_stGeometric->d_stListOfPointsReceivedLightIntensity[i].xR,
					p_stGeometric->d_stListOfPointsReceivedLightIntensity[i].xG,
					p_stGeometric->d_stListOfPointsReceivedLightIntensity[i].xB);
			}
		} 
		
		for(i=0; i<p_stGeometric->xNbElements; i++)
		{
			typedef struct MLT_tdstElementBidon_
			{
				xString sName;
				ACP_tdxIndex			xIndexOfParallelBox;
			} MLT_tdstElementBidon;
			
			if(p_stGeometric->d_xListOfElementsTypes[i] == -1)
			{
				SCR_M_SvL0_SaveEntry(p_stFile, M_MODActionGetElement, SCR_CC_C_Cfg_NoChar);
				SCR_fn_v_SvL0_SaveParameters_MP
					(
						p_stFile, SCR_EF_SvL0_Scanf, 4, "%d,%s,%d",
						i,
						p_stGeometric->sElementOf[i],
						p_stGeometric->sIndexOf[i]
					);
			}
			else
			{
				SCR_fn_v_RdL0_SplitSectionName
					(
						((MLT_tdstElementBidon*)(p_stGeometric->d_stListOfElements[i]))->sName,
						sFile, sAction, sIdent
					);
				if(stricmp(sFile, sFileOut)==0)
					sprintf(sFile, "*");

				if (strstr(sIdent, "!nocol")
					|| strstr(sIdent, "!NOCOL")) 
				{	sName1 = MLT_vRemoveFromName(sIdent);
					strcpy(sIdent, sName1);	
				}

				p_Char1=sIdent;
				MLT_vRemoveFlags(&p_Char1);
				strcpy(sIdent, p_Char1);

				p_Char1=sIdent;
				MLT_vRemoveGeomProp(&p_Char1);
				strcpy(sIdent, p_Char1);

				SCR_fn_v_RdL0_ComputeSectionName(sSection, sFile, sAction, sIdent);

				xIndexOfParallelBox = ((MLT_tdstElementBidon*)(p_stGeometric->d_stListOfElements[i]))->xIndexOfParallelBox;
				SCR_M_SvL0_SaveEntry(p_stFile, M_MODActionAddElement, SCR_CC_C_Cfg_NoChar);

				if (xIndexOfParallelBox == -1)
				{
					SCR_fn_v_SvL0_SaveParameters_MP
					(
						p_stFile, 
						SCR_EF_SvL0_Scanf, 
						4, 
						"%d,%s,%s", 
						i, 
						gs_a_szElementTypeName[p_stGeometric->d_xListOfElementsTypes[i]], 
						sSection
					);
				}
				else
				{
					SCR_fn_v_SvL0_SaveParameters_MP
					(
						p_stFile, 
						SCR_EF_SvL0_Scanf, 
						5, 
						"%d,%s,%s,%d", 
						i, 
						gs_a_szElementTypeName[p_stGeometric->d_xListOfElementsTypes[i]], 
						sSection, 
						xIndexOfParallelBox
					);
				}
			}
		}
		
		SCR_M_SvL0_SaveEndSection(p_stFile, SCR_CC_C_Cfg_EOL);
		
		for(i=0; i<p_stGeometric->xNbElements; i++)
		{
			switch(p_stGeometric->d_xListOfElementsTypes[i])
			{
			case MLT_C_xElementIndexedTriangles:
				MLT_vSaveElementIndexedTriangle(p_stFile,
					(MLT_tdstElementIndexedTriangles*)(p_stGeometric->d_stListOfElements[i]));
				break;
			case MLT_C_xElementFaceMapDescriptors:
				MLT_vSaveElementFaceMapDescriptors(p_stFile,
					(MLT_tdstElementFaceMapDescriptors*)(p_stGeometric->d_stListOfElements[i]));
				break;
			case MLT_C_xElementSprites:
				MLT_vSaveElementSprites(p_stFile,
					(MLT_tdstElementSprite*)(p_stGeometric->d_stListOfElements[i]));
				break;
			case MLT_C_xElementTMeshes:
				MLT_vSaveElementTMeshes(p_stFile,
					(MLT_tdstElementTMeshes*)(p_stGeometric->d_stListOfElements[i]));
				break;
			case MLT_C_xElementPoints:
				MLT_vSaveElementPoints(p_stFile,
					(MLT_tdstElementPoints*)(p_stGeometric->d_stListOfElements[i]));
				break;
			case MLT_C_xElementLines:
				MLT_vSaveElementLines(p_stFile,
					(MLT_tdstElementLines*)(p_stGeometric->d_stListOfElements[i]));
				break;
			case MLT_C_xElementSpheres:
				MLT_vSaveElementSpheres(p_stFile,
					(MLT_tdstElementSpheres*)(p_stGeometric->d_stListOfElements[i]));
				break;
			case MLT_C_xElementAlignedBoxes:
				MLT_vSaveElementAlignedBox(p_stFile,
					(MLT_tdstElementAlignedBoxes*)(p_stGeometric->d_stListOfElements[i]));
				break;
			case MLT_C_xElementCones:
				MLT_vSaveElementCones(p_stFile,
					(MLT_tdstElementCones*)(p_stGeometric->d_stListOfElements[i]));
				break;
			case MLT_C_xElementMegaFace:
				MLT_vSaveElementMegaFace(p_stFile,
					(MLT_tdstElementMegaFace*)(p_stGeometric->d_stListOfElements[i]));
				break;
			}
		}
	}
}


/****************************************************************************
*		Description:	save indexed triangle element
*
*		Parameters:		p_stFile		: script file pointer
*						p_stElement		: element
*---------------------------------------------------------------------------
*		Revision date:                                      Author:         
*****************************************************************************/
void MLT_vSaveElementIndexedTriangle (SCRIPT_tdstSaveFile *p_stFile, MLT_tdstElementIndexedTriangles *p_stElement)
{
  xString	mes,  sFile, sAction, sIdent, sIdent2;
  char		*sName1, *p_Char1;  
  long		i;

  SCR_fn_v_RdL0_SplitSectionName(p_stElement->sName, sFile, sAction, sIdent);
  p_Char1=sIdent;
  MLT_vRemoveFlags(&p_Char1);
  strcpy(sIdent, p_Char1);
  p_Char1=sIdent;
  MLT_vRemoveGeomProp(&p_Char1);
  strcpy(sIdent, p_Char1);
  SCR_fn_v_RdL0_ComputeSectionName(p_stElement->sName, sFile, sAction, sIdent);

  if (strstr(MLT_p_cGetSectionName(p_stElement->sName), "!nocol")
	  || strstr(MLT_p_cGetSectionName(p_stElement->sName), "!NOCOL")) 
  {	
	sName1 = MLT_vRemoveFromName(MLT_p_cGetSectionName(p_stElement->sName));
	SCR_M_SvL0_SaveBeginSection(p_stFile, sName1, SCR_CC_C_Cfg_NoChar);
  }
  else
    SCR_M_SvL0_SaveBeginSection(p_stFile, MLT_p_cGetSectionName(p_stElement->sName), SCR_CC_C_Cfg_NoChar);


  SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 3, "%d,%d", 
    p_stElement->xNbFaces,
    p_stElement->xNbElementUV);
  
  if(strlen(p_stElement->sMaterial) != 0)
  {
    SCR_fn_v_RdL0_SplitSectionName(p_stElement->sMaterial, sFile, sAction, sIdent);
    sprintf(sFile, "%s%s.gmt", g_sDirectorySave, g_sFileMaterial);
    SCR_fn_v_RdL0_ComputeSectionName(mes, sFile, M_GameMaterial, sIdent);
    SCR_M_SvL0_SaveEntry(p_stFile, M_MODActionMaterial, SCR_CC_C_Cfg_NoChar);
    SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Normal, 1, mes);

    SCR_fn_v_RdL0_SplitSectionName(p_stElement->sMaterial, sFile, sAction, sIdent);
    sprintf(sFile, "%s.gmt", g_sFileMaterial);
    SCR_fn_v_RdL0_ComputeSectionName(mes, sFile, M_GameMaterial, sIdent);
    SCR_fn_v_SvL1_RegisterNotify(mes, MLT_vSaveGameMaterial, p_stElement->hMaterial, SCR_EA_Ntfy_AddOrModifySection);

    SCR_fn_v_RdL0_SplitSectionName(p_stElement->sMaterial, sFile, sAction, sIdent);
    sprintf(sFile, "%s.vmt", g_sFileMaterial);
    sprintf(sIdent2, "MAT_%s", sIdent);
    SCR_fn_v_RdL0_ComputeSectionName(mes, sFile, M_Material, sIdent2);
    SCR_fn_v_SvL1_RegisterNotify(mes, MLT_vSaveVisualMaterial, p_stElement->hMaterial, SCR_EA_Ntfy_AddOrModifySection);

    for(i=0;i<p_stElement->hMaterial->lTexture;i++)
    {
      p_stElement->hMaterial->lCurTexture = 0;
      sprintf(sFile, "%s.tex", g_sFileMaterial);
      sprintf(sIdent2, "TEX_%s", MLT_p_cEraseSpace(MLT_p_cGetFileNameWithoutExt(MLT_p_cGetFileNameWithoutPath(p_stElement->hMaterial->sTexture[i]))));
      SCR_fn_v_RdL0_ComputeSectionName(mes, sFile, M_Texture, sIdent2);
      SCR_fn_v_SvL1_RegisterNotify(mes, MLT_vSaveTexture, p_stElement->hMaterial, SCR_EA_Ntfy_AddOrModifySection);
    }
// multitextures
    for(i=0;i<p_stElement->hMaterial->lMultiTexture;i++)
    {
      p_stElement->hMaterial->lCurTexture = 0;

	  if (!g_bExistTex) //the .tex file doesn't exist 
		  sprintf(sFile, "%s.tex", g_sFileMaterial);
	  else
	  {	
		if (g_bIgnoreTex)
		{  if (g_bLevelConversion) 
			 sprintf(sFile, "%s\\World\\levels\\%stemp.tex", g_sGameData, g_sDirectorySave);
	       if (g_bBankConversion)
			 sprintf(sFile, "%s\\World\\graphics\\objects\\banks\\%stemp.tex", g_sGameData, g_sDirectorySave);
	       if (g_bClassConversion)
			 sprintf(sFile, "%s\\World\\graphics\\objects\\classes\\%stemp.tex", g_sGameData, g_sDirectorySave);
		}
		else
		  sprintf(sFile, "%s.tex", g_sFileMaterial);
      }
	  sprintf(sIdent2, "%s", p_stElement->hMaterial->stMultiTexture[i].sTexture);
      SCR_fn_v_RdL0_ComputeSectionName(mes, sFile, M_Texture, sIdent2);
      SCR_fn_v_SvL1_RegisterNotify(mes, MLT_vSaveTexture, p_stElement->hMaterial, SCR_EA_Ntfy_AddOrModifySection);
    }
  }
  
  if(strlen(p_stElement->sSectorName) != 0)
  {
    SCR_fn_v_RdL0_SplitSectionName(p_stElement->sSectorName, sFile, sAction, sIdent);
    sprintf(sFile, "%s%s.spo", g_sDirectorySave, g_sFileIn);
    sprintf(sAction, M_SuperObject);
    sprintf(sIdent2, "SPO_%s", sIdent);
    SCR_fn_v_RdL0_ComputeSectionName(mes, sFile, sAction, sIdent2);
    SCR_M_SvL0_SaveEntry(p_stFile, M_MODActionPointedSector, SCR_CC_C_Cfg_NoChar);
    SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Normal, 1, mes);
  }
  
  if(strlen(p_stElement->sFacesOf) != 0)
  {
    SCR_M_SvL0_SaveEntry(p_stFile, M_MODActionGetFaces, SCR_CC_C_Cfg_NoChar);
    SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 1, p_stElement->sFacesOf);
  }
  else
  {
    for(i=0; i<p_stElement->xNbFaces; i++)
    {
      SCR_M_SvL0_SaveEntry(p_stFile, M_MODActionAddFaceUV, SCR_CC_C_Cfg_NoChar);
      SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 11, "%d,%d,%d,%d,%.6f,%.6f,%.6f,%d,%d,%d", 
        i,
        p_stElement->d_stListOfFacesTripled[i].a3_xIndex[0],
        p_stElement->d_stListOfFacesTripled[i].a3_xIndex[1],
        p_stElement->d_stListOfFacesTripled[i].a3_xIndex[2],
        p_stElement->d_stListOfFacesNormals[i].xX,
        p_stElement->d_stListOfFacesNormals[i].xY,
        p_stElement->d_stListOfFacesNormals[i].xZ,
        p_stElement->d_stListOfFacesTripledIndexUV[i].a3_xIndex[0],
        p_stElement->d_stListOfFacesTripledIndexUV[i].a3_xIndex[1],
        p_stElement->d_stListOfFacesTripledIndexUV[i].a3_xIndex[2]);
    }
  }

  if(strlen(p_stElement->sUVsOf) != 0)
  {
    SCR_M_SvL0_SaveEntry(p_stFile, M_MODActionGetUVs, SCR_CC_C_Cfg_NoChar);
    SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 1, p_stElement->sUVsOf);
  }
  else
  {
    for(i=0; i<p_stElement->xNbElementUV; i++)
    {
      SCR_M_SvL0_SaveEntry(p_stFile, M_MODActionAddUV, SCR_CC_C_Cfg_NoChar);
      SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 4, "%d,%.6f,%.6f", 
        i,
        p_stElement->d_stListOfElementUV[i].xU,
        p_stElement->d_stListOfElementUV[i].xV);
    }
  }
  SCR_M_SvL0_SaveEndSection(p_stFile, SCR_CC_C_Cfg_EOL);
}

/****************************************************************************
*		Description:	save face map descriptor element
*
*		Parameters:		p_stFile		: script file pointer
*						p_stElement		: element
*---------------------------------------------------------------------------
*		Revision date:                                      Author:         
*****************************************************************************/
void MLT_vSaveElementFaceMapDescriptors(SCRIPT_tdstSaveFile *p_stFile, MLT_tdstElementFaceMapDescriptors *p_stElement)
{
  xString	sSection, sFile, sAction, sIdent, sFileOut;
  char		*sName1, *p_Char1;  
  long		i;

  SCR_fn_v_RdL0_SplitSectionName(p_stElement->sName, sFile, sAction, sIdent);
  p_Char1=sIdent;
  MLT_vRemoveFlags(&p_Char1);
  strcpy(sIdent, p_Char1);
  p_Char1=sIdent;
  MLT_vRemoveGeomProp(&p_Char1);
  strcpy(sIdent, p_Char1);
  SCR_fn_v_RdL0_ComputeSectionName(p_stElement->sName, sFile, sAction, sIdent);

  sprintf(sFileOut, "%s.mod", g_sFileIn);
  if (strstr(MLT_p_cGetSectionName(p_stElement->sName), "!nocol")
	  || strstr(MLT_p_cGetSectionName(p_stElement->sName), "!NOCOL")) 
  {	  sName1 = MLT_vRemoveFromName(MLT_p_cGetSectionName(p_stElement->sName));
	  SCR_M_SvL0_SaveBeginSection(p_stFile, sName1, SCR_CC_C_Cfg_NoChar);
  }
  else
	  SCR_M_SvL0_SaveBeginSection(p_stFile, MLT_p_cGetSectionName(p_stElement->sName), SCR_CC_C_Cfg_NoChar);

  SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 2, "%d", p_stElement->xNbFaces);
  
  for(i=0; i<p_stElement->xNbFaces; i++)
  {
    SCR_fn_v_RdL0_SplitSectionName(p_stElement->d_stListOfFacesQuadrupled[i].hFaceMapDescriptor->sName,
      sFile, sAction, sIdent);

	p_Char1=sIdent;
	MLT_vRemoveFlags(&p_Char1);
	strcpy(sIdent, p_Char1);

	p_Char1=sIdent;
	MLT_vRemoveGeomProp(&p_Char1);
	strcpy(sIdent, p_Char1);

    if (strstr(sIdent, "!nocol")
	  || strstr(sIdent, "!NOCOL")) 
	{	sName1 = MLT_vRemoveFromName(sIdent);
		strcpy(sIdent, sName1);
	}

	if(stricmp(sFile, sFileOut)==0)
      sprintf(sFile, "*");
    else
      sprintf(sFile, "%s%s.mod", g_sDirectorySave, g_sFileIn);
    SCR_fn_v_RdL0_ComputeSectionName(sSection, sFile, sAction, sIdent);
    SCR_M_SvL0_SaveEntry(p_stFile, M_MODActionAddFaceFMD, SCR_CC_C_Cfg_NoChar);
    SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 9, "%d,%d,%d,%d,%.6f,%.6f,%.6f,%s", 
      i,
      p_stElement->d_stListOfFacesQuadrupled[i].stFaceTripled.a3_xIndex[0],
      p_stElement->d_stListOfFacesQuadrupled[i].stFaceTripled.a3_xIndex[1],
      p_stElement->d_stListOfFacesQuadrupled[i].stFaceTripled.a3_xIndex[2],
      p_stElement->d_stListOfFacesNormals[i].xX,
      p_stElement->d_stListOfFacesNormals[i].xY,
      p_stElement->d_stListOfFacesNormals[i].xZ,
      sSection);
  }
  
  SCR_M_SvL0_SaveEndSection(p_stFile, SCR_CC_C_Cfg_EOL);
  
  for(i=0; i<p_stElement->xNbFaces; i++)
  {
    MLT_vSaveFaceMapDescriptor(p_stFile, p_stElement->d_stListOfFacesQuadrupled[i].hFaceMapDescriptor);
  }
}

/****************************************************************************
*		Description:	save sprite element
*
*		Parameters:		p_stFile		: script file pointer
*						p_stElement		: element
*---------------------------------------------------------------------------
*		Revision date:                                      Author:         
*****************************************************************************/
void MLT_vSaveElementSprites(SCRIPT_tdstSaveFile *p_stFile, MLT_tdstElementSprite *p_stElement)
{
  xString	sSection, sFile, sAction, sIdent, sFileOut;
  char		*sName1, *p_Char1;  
  long		i;
  
  SCR_fn_v_RdL0_SplitSectionName(p_stElement->sName, sFile, sAction, sIdent);
  p_Char1=sIdent;
  MLT_vRemoveFlags(&p_Char1);
  strcpy(sIdent, p_Char1);
  p_Char1=sIdent;
  MLT_vRemoveGeomProp(&p_Char1);
  strcpy(sIdent, p_Char1);
  SCR_fn_v_RdL0_ComputeSectionName(p_stElement->sName, sFile, sAction, sIdent);

  sprintf(sFileOut, "%s.mod", g_sFileIn);

  if (strstr(MLT_p_cGetSectionName(p_stElement->sName), "!nocol")
	  || strstr(MLT_p_cGetSectionName(p_stElement->sName), "!NOCOL")) 
  {	  sName1 = MLT_vRemoveFromName(MLT_p_cGetSectionName(p_stElement->sName));
	  SCR_M_SvL0_SaveBeginSection(p_stFile, sName1, SCR_CC_C_Cfg_NoChar);
  }
  else
  SCR_M_SvL0_SaveBeginSection(p_stFile, MLT_p_cGetSectionName(p_stElement->sName), SCR_CC_C_Cfg_NoChar);
  
  SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 2, "%d", p_stElement->xNbSprites);
  
  for(i=0; i<p_stElement->xNbSprites; i++)
  {
    SCR_fn_v_RdL0_SplitSectionName(p_stElement->d_stListOfSprites[i].hSprite->sName,
      sFile, sAction, sIdent);
    if(stricmp(sFile, sFileOut)==0)
      sprintf(sFile, "*");
    else
      sprintf(sFile, "%s%s.mod", g_sDirectorySave, g_sFileIn);

	  p_Char1=sIdent;
	  MLT_vRemoveFlags(&p_Char1);
	  strcpy(sIdent, p_Char1);
	  p_Char1=sIdent;
	  MLT_vRemoveGeomProp(&p_Char1);
	  strcpy(sIdent, p_Char1);

	  if (strstr(sIdent, "!nocol")
		|| strstr(sIdent, "!NOCOL")) 
	  {	sName1 = MLT_vRemoveFromName(sIdent);
		strcpy(sIdent, sName1);
	  }
  
	SCR_fn_v_RdL0_ComputeSectionName(sSection, sFile, sAction, sIdent);
    SCR_M_SvL0_SaveEntry(p_stFile, M_MODActionAddSprite, SCR_CC_C_Cfg_NoChar);
    SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 6, "%d,%d,%.6f,%.6f,%s", 
      i,
      p_stElement->d_stListOfSprites[i].xCenterPoint,
      p_stElement->d_stListOfSprites[i].stSize.xX,
      p_stElement->d_stListOfSprites[i].stSize.xY,
      sSection);
  }
  
  SCR_M_SvL0_SaveEndSection(p_stFile, SCR_CC_C_Cfg_EOL);
  
  for(i=0; i<p_stElement->xNbSprites; i++)
  {
    MLT_vSaveSprite(p_stFile, p_stElement->d_stListOfSprites[i].hSprite);
  }
}


/****************************************************************************
*		Description:	save line element
*
*		Parameters:		p_stFile		: script file pointer
*						p_stElement		: element
*---------------------------------------------------------------------------
*		Revision date:                                      Author:         
*****************************************************************************/
void MLT_vSaveElementLines(SCRIPT_tdstSaveFile *p_stFile, MLT_tdstElementLines *p_stElement)
{
  xString	sFile, sAction, sIdent;
  char		*sName1, *p_Char1;  
  long		i;
  
  SCR_fn_v_RdL0_SplitSectionName(p_stElement->sName, sFile, sAction, sIdent);
  p_Char1=sIdent;
  MLT_vRemoveFlags(&p_Char1);
  strcpy(sIdent, p_Char1);
  p_Char1=sIdent;
  MLT_vRemoveGeomProp(&p_Char1);
  strcpy(sIdent, p_Char1);
  SCR_fn_v_RdL0_ComputeSectionName(p_stElement->sName, sFile, sAction, sIdent);

  if (strstr(MLT_p_cGetSectionName(p_stElement->sName), "!nocol")
	  || strstr(MLT_p_cGetSectionName(p_stElement->sName), "!NOCOL")) 
  {	  sName1 = MLT_vRemoveFromName(MLT_p_cGetSectionName(p_stElement->sName));
	  SCR_M_SvL0_SaveBeginSection(p_stFile, sName1, SCR_CC_C_Cfg_NoChar);
  }
  else
  SCR_M_SvL0_SaveBeginSection(p_stFile, MLT_p_cGetSectionName(p_stElement->sName), SCR_CC_C_Cfg_NoChar);

  SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 2, "%d", p_stElement->xNbLines);
  
  SCR_M_SvL0_SaveEntry(p_stFile, M_MODActionThickness, SCR_CC_C_Cfg_NoChar);
  SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 2, "%.6f", p_stElement->xThickness);
  
  for(i=0; i<p_stElement->xNbLines; i++)
  {
    SCR_M_SvL0_SaveEntry(p_stFile, M_MODActionAddLine, SCR_CC_C_Cfg_NoChar);
    SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 4, "%d,%d,%d", 
      i,
      p_stElement->d_stListOfLineIndex[i].a2_xIndex[0],
      p_stElement->d_stListOfLineIndex[i].a2_xIndex[1]);
  }
  
  SCR_M_SvL0_SaveEndSection(p_stFile, SCR_CC_C_Cfg_EOL);
}


/****************************************************************************
*		Description:	save sphere element
*
*		Parameters:		p_stFile		: script file pointer
*						p_stElement		: element
*---------------------------------------------------------------------------
*		Revision date:                                      Author:         
*****************************************************************************/
void MLT_vSaveElementSpheres (SCRIPT_tdstSaveFile *p_stFile, MLT_tdstElementSpheres *p_stElement)
{
  xString	sFile, sAction, sIdent;
  char		*sName1, *p_Char1;  
  long		i;
 
  SCR_fn_v_RdL0_SplitSectionName(p_stElement->sName, sFile, sAction, sIdent);
  p_Char1=sIdent;
  MLT_vRemoveFlags(&p_Char1);
  strcpy(sIdent, p_Char1);
  p_Char1=sIdent;
  MLT_vRemoveGeomProp(&p_Char1);
  strcpy(sIdent, p_Char1);
  SCR_fn_v_RdL0_ComputeSectionName(p_stElement->sName, sFile, sAction, sIdent);

  if (strstr(MLT_p_cGetSectionName(p_stElement->sName), "!nocol")
	  || strstr(MLT_p_cGetSectionName(p_stElement->sName), "!NOCOL")) 
  {	  sName1 = MLT_vRemoveFromName(MLT_p_cGetSectionName(p_stElement->sName));
	  SCR_M_SvL0_SaveBeginSection(p_stFile, sName1, SCR_CC_C_Cfg_NoChar);
  }
  else
  SCR_M_SvL0_SaveBeginSection(p_stFile, MLT_p_cGetSectionName(p_stElement->sName), SCR_CC_C_Cfg_NoChar);

  SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 2, "%d", p_stElement->xNbSpheres);
  
  for(i=0; i<p_stElement->xNbSpheres; i++)
  {
    SCR_fn_v_RdL0_SplitSectionName(p_stElement->d_stListOfSpheres[i].sMaterial,
      sFile, sAction, sIdent);
    sprintf(sFile, "Ed.gmt");
    SCR_fn_v_RdL0_ComputeSectionName(p_stElement->d_stListOfSpheres[i].sMaterial,
      sFile, M_GameMaterial, sIdent);
    SCR_M_SvL0_SaveEntry(p_stFile, M_MODActionAddSphere, SCR_CC_C_Cfg_NoChar);
    SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 5, "%d,%d,%.6f,%s", i,
      p_stElement->d_stListOfSpheres[i].xCenterPoint,
      p_stElement->d_stListOfSpheres[i].xRadius,
      p_stElement->d_stListOfSpheres[i].sMaterial);
  }
  
  SCR_M_SvL0_SaveEndSection(p_stFile, SCR_CC_C_Cfg_EOL);
}

/****************************************************************************
*		Description:	save aligned box element
*
*		Parameters:		p_stFile		: script file pointer
*						p_stElement		: element
*---------------------------------------------------------------------------
*		Revision date:                                      Author:         
*****************************************************************************/
void MLT_vSaveElementAlignedBox(SCRIPT_tdstSaveFile *p_stFile, MLT_tdstElementAlignedBoxes *p_stElement)
{
  xString	mes, sFile, sAction, sIdent, sSection, sIdent2;
  char		*sName1, *p_Char1;  
  long		i, j;
  
  SCR_fn_v_RdL0_SplitSectionName(p_stElement->sName, sFile, sAction, sIdent);
  p_Char1=sIdent;
  MLT_vRemoveFlags(&p_Char1);
  strcpy(sIdent, p_Char1);
  p_Char1=sIdent;
  MLT_vRemoveGeomProp(&p_Char1);
  strcpy(sIdent, p_Char1);
  SCR_fn_v_RdL0_ComputeSectionName(p_stElement->sName, sFile, sAction, sIdent);
  
  if (strstr(MLT_p_cGetSectionName(p_stElement->sName), "!nocol")
	  || strstr(MLT_p_cGetSectionName(p_stElement->sName), "!NOCOL")) 
  {	  sName1 = MLT_vRemoveFromName(MLT_p_cGetSectionName(p_stElement->sName));
	  SCR_M_SvL0_SaveBeginSection(p_stFile, sName1, SCR_CC_C_Cfg_NoChar);
  }
  else
  SCR_M_SvL0_SaveBeginSection(p_stFile, MLT_p_cGetSectionName(p_stElement->sName), SCR_CC_C_Cfg_NoChar);

  SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 2, "%d", p_stElement->xNbAlignedBoxes);
  
  for(i=0; i<p_stElement->xNbAlignedBoxes; i++)
  {
    SCR_fn_v_RdL0_SplitSectionName(p_stElement->d_stListOfAlignedBoxes[i].sMaterial,
      sFile, sAction, sIdent);
    sprintf(sFile, "%s%s.gmt", g_sDirectorySave, g_sFileMaterial);
    SCR_fn_v_RdL0_ComputeSectionName(sSection, sFile, M_GameMaterial, sIdent);
    SCR_M_SvL0_SaveEntry(p_stFile, M_MODActionAddAlignedBox, SCR_CC_C_Cfg_NoChar);
    SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 5, "%d,%d,%d,%s", 
      i,
      p_stElement->d_stListOfAlignedBoxes[i].xMinPoint,
      p_stElement->d_stListOfAlignedBoxes[i].xMaxPoint,
      sSection);

	SCR_fn_v_RdL0_SplitSectionName(p_stElement->d_stListOfAlignedBoxes[i].sMaterial, sFile, sAction, sIdent);
	sprintf(sFile, "%s.gmt", g_sFileMaterial);
	SCR_fn_v_RdL0_ComputeSectionName(mes, sFile, M_GameMaterial, sIdent);
	SCR_fn_v_SvL1_RegisterNotify(mes, MLT_vSaveGameMaterial, p_stElement->d_stListOfAlignedBoxes[i].hMaterial, SCR_EA_Ntfy_AddOrModifySection);

	SCR_fn_v_RdL0_SplitSectionName(p_stElement->d_stListOfAlignedBoxes[i].sMaterial, sFile, sAction, sIdent);
	sprintf(sFile, "%s.vmt", g_sFileMaterial);
	sprintf(sIdent2, "MAT_%s", sIdent);
	SCR_fn_v_RdL0_ComputeSectionName(mes, sFile, M_Material, sIdent2);
	SCR_fn_v_SvL1_RegisterNotify(mes, MLT_vSaveVisualMaterial, p_stElement->d_stListOfAlignedBoxes[i].hMaterial, SCR_EA_Ntfy_AddOrModifySection);

	for(j=0;j<p_stElement->d_stListOfAlignedBoxes[i].hMaterial->lTexture;j++)
	{
		p_stElement->d_stListOfAlignedBoxes[i].hMaterial->lCurTexture = 0;
		sprintf(sFile, "%s.tex", g_sFileMaterial);
		sprintf(sIdent2, "TEX_%s", MLT_p_cEraseSpace(MLT_p_cGetFileNameWithoutExt(MLT_p_cGetFileNameWithoutPath(p_stElement->d_stListOfAlignedBoxes[i].hMaterial->sTexture[j]))));
		SCR_fn_v_RdL0_ComputeSectionName(mes, sFile, M_Texture, sIdent2);
		SCR_fn_v_SvL1_RegisterNotify(mes, MLT_vSaveTexture, p_stElement->d_stListOfAlignedBoxes[i].hMaterial, SCR_EA_Ntfy_AddOrModifySection);
	}

// multitextures
    for(j=0;j<p_stElement->d_stListOfAlignedBoxes[i].hMaterial->lMultiTexture;j++)
    {
      p_stElement->d_stListOfAlignedBoxes[i].hMaterial->lCurTexture = 0;
	  if (!g_bExistTex) //the .tex file doesn't exist 
		  sprintf(sFile, "%s.tex", g_sFileMaterial);
	  else
	  {	if (g_bIgnoreTex)
		{  if (g_bLevelConversion) 
			 sprintf(sFile, "%s\\World\\levels\\%stemp.tex", g_sGameData, g_sDirectorySave);
	       if (g_bBankConversion)
			 sprintf(sFile, "%s\\World\\graphics\\objects\\banks\\%stemp.tex", g_sGameData, g_sDirectorySave);
	       if (g_bClassConversion)
			 sprintf(sFile, "%s\\World\\graphics\\objects\\classes\\%stemp.tex", g_sGameData, g_sDirectorySave);
		}
		else
		  sprintf(sFile, "%s.tex", g_sFileMaterial);
	  }

      sprintf(sIdent2, "%s", p_stElement->d_stListOfAlignedBoxes[i].hMaterial->stMultiTexture[j].sTexture);
      SCR_fn_v_RdL0_ComputeSectionName(mes, sFile, M_Texture, sIdent2);
      SCR_fn_v_SvL1_RegisterNotify(mes, MLT_vSaveTexture, p_stElement->d_stListOfAlignedBoxes[i].hMaterial, SCR_EA_Ntfy_AddOrModifySection);
    }
  }
  
  SCR_M_SvL0_SaveEndSection(p_stFile, SCR_CC_C_Cfg_EOL);
}


/****************************************************************************
*		Description:	save cone element
*
*		Parameters:		p_stFile		: script file pointer
*						p_stElement		: element
*---------------------------------------------------------------------------
*		Revision date:                                      Author:         
*****************************************************************************/
void MLT_vSaveElementCones(SCRIPT_tdstSaveFile *p_stFile, MLT_tdstElementCones *p_stElement)
{
  xString	sFile, sAction, sIdent;
  char		*sName1, *p_Char1;  
  long		i;
  
  SCR_fn_v_RdL0_SplitSectionName(p_stElement->sName, sFile, sAction, sIdent);
  p_Char1=sIdent;
  MLT_vRemoveFlags(&p_Char1);
  strcpy(sIdent, p_Char1);
  p_Char1=sIdent;
  MLT_vRemoveGeomProp(&p_Char1);
  strcpy(sIdent, p_Char1);
  SCR_fn_v_RdL0_ComputeSectionName(p_stElement->sName, sFile, sAction, sIdent);

  if (strstr(MLT_p_cGetSectionName(p_stElement->sName), "!nocol")
	  || strstr(MLT_p_cGetSectionName(p_stElement->sName), "!NOCOL")) 
  {	  sName1 = MLT_vRemoveFromName(MLT_p_cGetSectionName(p_stElement->sName));
	  SCR_M_SvL0_SaveBeginSection(p_stFile, sName1, SCR_CC_C_Cfg_NoChar);
  }
  else
  SCR_M_SvL0_SaveBeginSection(p_stFile, MLT_p_cGetSectionName(p_stElement->sName), SCR_CC_C_Cfg_NoChar);

  SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 2, "%d", p_stElement->xNbCones);
  
  for(i=0; i<p_stElement->xNbCones; i++)
  {
    SCR_M_SvL0_SaveEntry(p_stFile, M_MODActionAddCone, SCR_CC_C_Cfg_NoChar);
    SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 5, "%d,%d,%d,%d", i,
      p_stElement->d_stListOfCones[i].xTopPoint,
      p_stElement->d_stListOfCones[i].xBasePoint,
      p_stElement->d_stListOfCones[i].xBaseRadius);
  }
  
  SCR_M_SvL0_SaveEndSection(p_stFile, SCR_CC_C_Cfg_EOL);
}

/****************************************************************************
*		Description:	save point element
*
*		Parameters:		p_stFile		: script file pointer
*						p_stElement		: element
*---------------------------------------------------------------------------
*		Revision date:                                      Author:         
*****************************************************************************/
void MLT_vSaveElementPoints (SCRIPT_tdstSaveFile *p_stFile, MLT_tdstElementPoints *p_stElement)
{
  xString	mes, sFile, sAction, sIdent;
  char		*sName1, *p_Char1;  
  long		i;
  
  SCR_fn_v_RdL0_SplitSectionName(p_stElement->sName, sFile, sAction, sIdent);
  p_Char1=sIdent;
  MLT_vRemoveFlags(&p_Char1);
  strcpy(sIdent, p_Char1);
  p_Char1=sIdent;
  MLT_vRemoveGeomProp(&p_Char1);
  strcpy(sIdent, p_Char1);
  SCR_fn_v_RdL0_ComputeSectionName(p_stElement->sName, sFile, sAction, sIdent);

  if (strstr(MLT_p_cGetSectionName(p_stElement->sName), "!nocol")
	  || strstr(MLT_p_cGetSectionName(p_stElement->sName), "!NOCOL")) 
  {	  sName1 = MLT_vRemoveFromName(MLT_p_cGetSectionName(p_stElement->sName));
	  SCR_M_SvL0_SaveBeginSection(p_stFile, sName1, SCR_CC_C_Cfg_NoChar);
  }
  else
  SCR_M_SvL0_SaveBeginSection(p_stFile, MLT_p_cGetSectionName(p_stElement->sName), SCR_CC_C_Cfg_NoChar);

  SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 2, "%d", p_stElement->xNbPoints);
  
  sprintf(mes, "%.6f", p_stElement->xFatness);
  SCR_M_SvL0_SaveEntry(p_stFile, M_MODActionFatness, SCR_CC_C_Cfg_NoChar);
  SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 3, "%.6f", p_stElement->xFatness);
  
  for(i=0; i<p_stElement->xNbPoints; i++)
  {
    SCR_M_SvL0_SaveEntry(p_stFile, M_MODActionAddPoint, SCR_CC_C_Cfg_NoChar);
    SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 3, "%d,%d", i, p_stElement->d_xListOfPointIndex[i]);
  }
  
  SCR_M_SvL0_SaveEndSection(p_stFile, SCR_CC_C_Cfg_EOL);
}

/****************************************************************************
*		Description:	save Mesh element
*
*		Parameters:		p_stFile		: script file pointer
*						p_stElement		: element
*---------------------------------------------------------------------------
*		Revision date:                                      Author:         
*****************************************************************************/
void MLT_vSaveElementTMeshes (SCRIPT_tdstSaveFile *p_stFile, MLT_tdstElementTMeshes *p_stElement)
{
}


/****************************************************************************
*		Description:	save Altimap element
*
*		Parameters:		p_stFile		: script file pointer
*						p_stElement		: element
*---------------------------------------------------------------------------
*		Revision date:                                      Author:         
*****************************************************************************/
void MLT_vSaveElementAltimap (SCRIPT_tdstSaveFile *p_stFile, MLT_tdstElementAltimap *p_stElement)
{
  int		i, j, k;
  char		*sName1, *p_Char1;  
  xString	szMes;
  xString	sFile, sAction, sIdent;
  
  SCR_fn_v_RdL0_SplitSectionName(p_stElement->sName, sFile, sAction, sIdent);
  p_Char1=sIdent;
  MLT_vRemoveFlags(&p_Char1);
  strcpy(sIdent, p_Char1);
  p_Char1=sIdent;
  MLT_vRemoveGeomProp(&p_Char1);
  strcpy(sIdent, p_Char1);
  SCR_fn_v_RdL0_ComputeSectionName(p_stElement->sName, sFile, sAction, sIdent);

  // save the parameters for the altimap
  if (strstr(MLT_p_cGetSectionName(p_stElement->sName), "!nocol")
	  || strstr(MLT_p_cGetSectionName(p_stElement->sName), "!NOCOL")) 
  {	  
	  sName1 = MLT_vRemoveFromName(MLT_p_cGetSectionName(p_stElement->sName));
	  SCR_M_SvL0_SaveBeginSection(p_stFile, sName1, SCR_CC_C_Cfg_NoChar);
  }
  else
	  SCR_M_SvL0_SaveBeginSection(p_stFile, MLT_p_cGetSectionName(p_stElement->sName), SCR_CC_C_Cfg_NoChar);

  SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 5, "%d,%d,%d,%d", 
    p_stElement->xNbVertexes,
    p_stElement->xNbSquares,
	p_stElement->xNbFaces,
	p_stElement->xNbElementUV);

  //save the origin parameters
  SCR_M_SvL0_SaveEntry(p_stFile, M_MODActionOrigin, SCR_CC_C_Cfg_NoChar);
  SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 4, "%.6f,%.6f,%.6f",
	p_stElement->stOrigin.xX,
	p_stElement->stOrigin.xY,
	p_stElement->stOrigin.xZ);

  //save the Width, Height, DeltaX, DeltaY for the square
  SCR_M_SvL0_SaveEntry(p_stFile, M_MODActionSquarePattern, SCR_CC_C_Cfg_NoChar);
  SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 5, "%d,%.6f,%d,%.6f",
	p_stElement->xWidth,
	p_stElement->xDeltaX,
	p_stElement->xDepth,
	p_stElement->xDeltaY);

  //for all vertexes save the Z and normals
  for(i=0; i<p_stElement->xNbVertexes; i++)
  {
      SCR_M_SvL0_SaveEntry(p_stFile, M_MODActionSetVertex, SCR_CC_C_Cfg_NoChar);
      SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 6, "%d,%.6f,%.6f,%.6f,%.6f", 
        i,
        p_stElement->d_xHeight[i],
        p_stElement->d_stPointNormals[i].xX,
        p_stElement->d_stPointNormals[i].xY,
        p_stElement->d_stPointNormals[i].xZ);
  }
  
  k=0;
  //for every square save the type and the first index triangle for it
  for(i=0; i<p_stElement->xNbSquares; i++)
  {
      SCR_M_SvL0_SaveEntry(p_stFile, M_MODActionSetSquare, SCR_CC_C_Cfg_NoChar);
      SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 4, "%d,%d,%d", 
        i,
        p_stElement->d_stSquare[i].ucType,
        p_stElement->d_stSquare[i].xFaceIndex);

	  //for each triangle of the current square save the index, the normals to faces
	  //and three indexes for the UV
	  for (j=0; j< p_stElement->d_stSquare[i].sNbFacesForSquare; j++)
	  {	SCR_fn_v_RdL0_SplitSectionName(p_stElement->d_hFMD[p_stElement->d_stSquare[i].xFaceIndex+j]->sMaterial, sFile, sAction, sIdent);
        sprintf(sFile, "%s%s.gmt", g_sDirectorySave, g_sFileMaterial);
        SCR_fn_v_RdL0_ComputeSectionName(szMes, sFile, M_GameMaterial, sIdent);
		SCR_M_SvL0_SaveEntry(p_stFile, M_MODActionSetTriangle, SCR_CC_C_Cfg_NoChar);
		SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 9, "%d,%.6f,%.6f,%.6f,%s,%d,%d,%d", 
			p_stElement->d_stSquare[i].xFaceIndex+j,
			p_stElement->d_stFaceNormals[k].xX,
			p_stElement->d_stFaceNormals[k].xY,
			p_stElement->d_stFaceNormals[k].xZ,
			szMes,
			p_stElement->d_hFMD[p_stElement->d_stSquare[i].xFaceIndex+j]->stTrianglesIndexUVValues.a3_xIndex[0],
			p_stElement->d_hFMD[p_stElement->d_stSquare[i].xFaceIndex+j]->stTrianglesIndexUVValues.a3_xIndex[1],
			p_stElement->d_hFMD[p_stElement->d_stSquare[i].xFaceIndex+j]->stTrianglesIndexUVValues.a3_xIndex[2]
			);
		k++;
	  }
  }
  //save the UVs
  for(i=0; i<p_stElement->xNbElementUV; i++)
  {
      SCR_M_SvL0_SaveEntry(p_stFile, M_MODActionAddUV, SCR_CC_C_Cfg_NoChar);
      SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 4, "%d,%.6f,%.6f", 
        i,
        p_stElement->d_stUVValues[i].xU,
        p_stElement->d_stUVValues[i].xV);
  }

  SCR_M_SvL0_SaveEndSection(p_stFile, SCR_CC_C_Cfg_EOL);
}


/****************************************************************************
*		Description:	save mega face element
*
*		Parameters:		p_stFile		: script file pointer
*						p_stElement		: element
*---------------------------------------------------------------------------
*		Revision date:                                      Author:         
*****************************************************************************/
void MLT_vSaveElementMegaFace (SCRIPT_tdstSaveFile *p_stFile, MLT_tdstElementMegaFace *p_stElement)
{
  xString	sFile, sAction, sIdent;
  char		*sName1, *p_Char1;  
  long		i, j;

  SCR_fn_v_RdL0_SplitSectionName(p_stElement->sName, sFile, sAction, sIdent);
  p_Char1=sIdent;
  MLT_vRemoveFlags(&p_Char1);
  strcpy(sIdent, p_Char1);
  p_Char1=sIdent;
  MLT_vRemoveGeomProp(&p_Char1);
  strcpy(sIdent, p_Char1);
  SCR_fn_v_RdL0_ComputeSectionName(p_stElement->sName, sFile, sAction, sIdent);

  if (strstr(MLT_p_cGetSectionName(p_stElement->sName), "!nocol")
	  || strstr(MLT_p_cGetSectionName(p_stElement->sName), "!NOCOL")) 
  {	
	sName1 = MLT_vRemoveFromName(MLT_p_cGetSectionName(p_stElement->sName));
	SCR_M_SvL0_SaveBeginSection(p_stFile, sName1, SCR_CC_C_Cfg_NoChar);
  }
  else
    SCR_M_SvL0_SaveBeginSection(p_stFile, MLT_p_cGetSectionName(p_stElement->sName), SCR_CC_C_Cfg_NoChar);


  SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 2, "%d", p_stElement->lNbMegaFaces);
  
  
  for(i=0; i<p_stElement->lNbMegaFaces; i++)
  {
      char				szParam[256];
	  char				szFace[10];
	  MLT_tdstMegaFace *p_stMegaFace = &p_stElement->d_stListOfMegaFaces[i];
	  
	  SCR_M_SvL0_SaveEntry(p_stFile, M_MODActionAddMegaFace, SCR_CC_C_Cfg_NoChar);
      
	  sprintf(szParam, "%d", i);
	  for (j=0; j<p_stMegaFace->lNbFaces; j++)
	  {
		  strcat(szParam, ",");
		  strcat(szParam, itoa(p_stMegaFace->d_stListOfFaces[j], szFace, 10));
	  }

	  SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 1, "%s", szParam);
  }

  SCR_M_SvL0_SaveEndSection(p_stFile, SCR_CC_C_Cfg_EOL);
}


/****************************************************************************
*		Description:	save face map descriptor
*
*		Parameters:		p_stFile	: script file pointer
*						hFMD		: face map descriptor
*---------------------------------------------------------------------------
*		Revision date:                                      Author:         
*****************************************************************************/
void MLT_vSaveFaceMapDescriptor (SCRIPT_tdstSaveFile *p_stFile, MLT_tdstFaceMapDescriptor *hFMD)
{
  xString	mes, sFile, sAction, sIdent, sIdent2;
  char		*sName1, *p_Char1;  
  long		i;

  if(hFMD->AlreadySave == TRUE) 
	  return;

  SCR_fn_v_RdL0_SplitSectionName(hFMD->sName, sFile, sAction, sIdent);
  p_Char1=sIdent;
  MLT_vRemoveFlags(&p_Char1);
  strcpy(sIdent, p_Char1);
  p_Char1=sIdent;
  MLT_vRemoveGeomProp(&p_Char1);
  strcpy(sIdent, p_Char1);
  SCR_fn_v_RdL0_ComputeSectionName(hFMD->sName, sFile, sAction, sIdent);

  if (strstr(MLT_p_cGetSectionName(hFMD->sName), "!nocol")
	  || strstr(MLT_p_cGetSectionName(hFMD->sName), "!NOCOL")) 
  {	  sName1 = MLT_vRemoveFromName(MLT_p_cGetSectionName(hFMD->sName));
	  SCR_M_SvL0_SaveBeginSection(p_stFile, sName1, SCR_CC_C_Cfg_NoChar);
  }
  else
	  SCR_M_SvL0_SaveBeginSection(p_stFile, MLT_p_cGetSectionName(hFMD->sName), SCR_CC_C_Cfg_NoChar);
  
  if(strlen(hFMD->sMaterial) != 0)
  {
    SCR_fn_v_RdL0_SplitSectionName(hFMD->sMaterial, sFile, sAction, sIdent);
    sprintf(sFile, "%s%s.gmt", g_sDirectorySave, g_sFileMaterial);
    SCR_fn_v_RdL0_ComputeSectionName(mes, sFile, M_GameMaterial, sIdent);
    SCR_M_SvL0_SaveEntry(p_stFile, M_MODActionMaterial, SCR_CC_C_Cfg_NoChar);
    SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Normal, 1, mes);

    SCR_fn_v_RdL0_SplitSectionName(hFMD->sMaterial, sFile, sAction, sIdent);
    sprintf(sFile, "%s.gmt", g_sFileMaterial);
    SCR_fn_v_RdL0_ComputeSectionName(mes, sFile, M_GameMaterial, sIdent);
    SCR_fn_v_SvL1_RegisterNotify(mes, MLT_vSaveGameMaterial, hFMD->hMaterial, SCR_EA_Ntfy_AddOrModifySection);

    SCR_fn_v_RdL0_SplitSectionName(hFMD->sMaterial, sFile, sAction, sIdent);
    sprintf(sFile, "%s.vmt", g_sFileMaterial);
    sprintf(sIdent2, "MAT_%s", sIdent);
    SCR_fn_v_RdL0_ComputeSectionName(mes, sFile, M_Material, sIdent2);
    SCR_fn_v_SvL1_RegisterNotify(mes, MLT_vSaveVisualMaterial, hFMD->hMaterial, SCR_EA_Ntfy_AddOrModifySection);

    for(i=0;i<hFMD->hMaterial->lTexture;i++)
    {
      hFMD->hMaterial->lCurTexture = 0;
      sprintf(sFile, "%s.tex", g_sFileMaterial);
      sprintf(sIdent2, "TEX_%s", MLT_p_cEraseSpace(MLT_p_cGetFileNameWithoutExt(MLT_p_cGetFileNameWithoutPath(hFMD->hMaterial->sTexture[i]))));
      SCR_fn_v_RdL0_ComputeSectionName(mes, sFile, M_Texture, sIdent2);
      SCR_fn_v_SvL1_RegisterNotify(mes, MLT_vSaveTexture, hFMD->hMaterial, SCR_EA_Ntfy_AddOrModifySection);
    }
// multitextures
    for(i=0;i<hFMD->hMaterial->lMultiTexture;i++)
    {
      hFMD->hMaterial->lCurTexture = 0;

	  if (!g_bExistTex) //the .tex file doesn't exist 
		  sprintf(sFile, "%s.tex", g_sFileMaterial);
	  else
	  {	if (g_bIgnoreTex)
		{  if (g_bLevelConversion) 
			 sprintf(sFile, "%s\\World\\levels\\%stemp.tex", g_sGameData, g_sDirectorySave);
	       if (g_bBankConversion)
			 sprintf(sFile, "%s\\World\\graphics\\objects\\banks\\%stemp.tex", g_sGameData, g_sDirectorySave);
	       if (g_bClassConversion)
			 sprintf(sFile, "%s\\World\\graphics\\objects\\classes\\%stemp.tex", g_sGameData, g_sDirectorySave);
		}
		else
		  sprintf(sFile, "%s.tex", g_sFileMaterial);
	  }

      sprintf(sIdent2, "%s", hFMD->hMaterial->stMultiTexture[i].sTexture);
      SCR_fn_v_RdL0_ComputeSectionName(mes, sFile, M_Texture, sIdent2);
      SCR_fn_v_SvL1_RegisterNotify(mes, MLT_vSaveTexture, hFMD->hMaterial, SCR_EA_Ntfy_AddOrModifySection);
    }
  }
  
  if(strlen(hFMD->sSprObjName) != 0)
  {
    SCR_fn_v_RdL0_SplitSectionName(hFMD->sSprObjName, sFile, sAction, sIdent);
    sprintf(sFile, "%s%s.spo", g_sDirectorySave, g_sFileIn);
    SCR_fn_v_RdL0_ComputeSectionName(mes, sFile, sAction, sIdent);
    SCR_M_SvL0_SaveEntry(p_stFile, M_MODActionPointedSector, SCR_CC_C_Cfg_NoChar);
    SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Normal, 1, mes);
  }
  
  SCR_M_SvL0_SaveEntry(p_stFile, M_MODActionTripledUV, SCR_CC_C_Cfg_NoChar);
  SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 7, "%.6f,%.6f,%.6f,%.6f,%.6f,%.6f",
    hFMD->stUVValues[0].xU,
    hFMD->stUVValues[0].xV,
    hFMD->stUVValues[1].xU,
    hFMD->stUVValues[1].xV,
    hFMD->stUVValues[2].xU,
    hFMD->stUVValues[2].xV);
  
  SCR_M_SvL0_SaveEndSection(p_stFile, SCR_CC_C_Cfg_EOL);
  
  hFMD->AlreadySave = TRUE;
}

/****************************************************************************
*		Description:	save sprite
*
*		Parameters:		p_stFile	: script file pointer
*						hSprite		: sprite
*---------------------------------------------------------------------------
*		Revision date:                                      Author:         
*****************************************************************************/
void MLT_vSaveSprite (SCRIPT_tdstSaveFile *p_stFile, MLT_tdstSprite *hSprite)
{
  xString	sSection, sFile, sAction, sIdent, mes, sTypeSprite, sIdent2;
  char		*sName1, *p_Char1;  
  long		i,j;

  if(hSprite->AlreadySave == TRUE) 
	  return;
  
  SCR_fn_v_RdL0_SplitSectionName(hSprite->sName, sFile, sAction, sIdent);
  p_Char1=sIdent;
  MLT_vRemoveFlags(&p_Char1);
  strcpy(sIdent, p_Char1);
  p_Char1=sIdent;
  MLT_vRemoveGeomProp(&p_Char1);
  strcpy(sIdent, p_Char1);
  SCR_fn_v_RdL0_ComputeSectionName(hSprite->sName, sFile, sAction, sIdent);

  if (strstr(MLT_p_cGetSectionName(hSprite->sName), "!nocol")
	  || strstr(MLT_p_cGetSectionName(hSprite->sName), "!NOCOL")) 
  {	  sName1 = MLT_vRemoveFromName(MLT_p_cGetSectionName(hSprite->sName));
	  SCR_M_SvL0_SaveBeginSection(p_stFile, sName1, SCR_CC_C_Cfg_NoChar);
  }
  else
	  SCR_M_SvL0_SaveBeginSection(p_stFile, MLT_p_cGetSectionName(hSprite->sName), SCR_CC_C_Cfg_NoChar);

  SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 2, "%d", hSprite->xNbSprites);
  
  for(i=0; i<hSprite->xNbSprites; i++)
  {
    SCR_fn_v_RdL0_SplitSectionName(hSprite->d_sMaterial[i], sFile, sAction, sIdent);
    sprintf(sFile, "%s%s.gmt", g_sDirectorySave, g_sFileMaterial);
    SCR_fn_v_RdL0_ComputeSectionName(sSection, sFile, M_GameMaterial, sIdent);
    sprintf(mes, "%d,%s", i, sSection);
    SCR_M_SvL0_SaveEntry(p_stFile, M_MODActionAddMaterial, SCR_CC_C_Cfg_NoChar);
    SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 3, "%d,%s", i, sSection);

    if(hSprite->d_xSpriteDrawMode[i] == MLT_C_lSpriteDrawMode2DScaled)
      sprintf(sTypeSprite, M_2DScaled);
    else if(hSprite->d_xSpriteDrawMode[i] == 0)
      sprintf(sTypeSprite, M_2DNonScaled);
    else
      sprintf(sTypeSprite, M_2DNonScaled);

    SCR_M_SvL0_SaveEntry(p_stFile, M_MODActionAddInfo, SCR_CC_C_Cfg_NoChar);
    SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 8, "%d,%s,%.6f,%.6f,%.6f,%.6f,%.6f", 
     i, 
     sTypeSprite,
     hSprite->d_xThresholds[i],
     hSprite->d_xSizeOfSprite[i].xX,
     hSprite->d_xSizeOfSprite[i].xY,
     hSprite->d_xDisplacementOfSprite[i].xX,
     hSprite->d_xDisplacementOfSprite[i].xY);

    SCR_fn_v_RdL0_SplitSectionName(hSprite->d_sMaterial[i], sFile, sAction, sIdent);
    sprintf(sFile, "%s.gmt", g_sFileMaterial);
    SCR_fn_v_RdL0_ComputeSectionName(mes, sFile, M_GameMaterial, sIdent);
    SCR_fn_v_SvL1_RegisterNotify(mes, MLT_vSaveGameMaterial, hSprite->d_hMaterial[i], SCR_EA_Ntfy_AddOrModifySection);

    SCR_fn_v_RdL0_SplitSectionName(hSprite->d_sMaterial[i], sFile, sAction, sIdent);
    sprintf(sFile, "%s.vmt", g_sFileMaterial);
    sprintf(sIdent2, "MAT_%s", sIdent);
    SCR_fn_v_RdL0_ComputeSectionName(mes, sFile, M_Material, sIdent2);
    SCR_fn_v_SvL1_RegisterNotify(mes, MLT_vSaveVisualMaterial, hSprite->d_hMaterial[i], SCR_EA_Ntfy_AddOrModifySection);

    for(j=0;j<hSprite->d_hMaterial[i]->lTexture;j++)
    {
      hSprite->d_hMaterial[i]->lCurTexture = 0;
      sprintf(sFile, "%s.tex", g_sFileMaterial);
      sprintf(sIdent2, "TEX_%s", MLT_p_cEraseSpace(MLT_p_cGetFileNameWithoutExt(MLT_p_cGetFileNameWithoutPath(hSprite->d_hMaterial[i]->sTexture[j]))));
      SCR_fn_v_RdL0_ComputeSectionName(mes, sFile, M_Texture, sIdent2);
      SCR_fn_v_SvL1_RegisterNotify(mes, MLT_vSaveTexture, hSprite->d_hMaterial[i], SCR_EA_Ntfy_AddOrModifySection);
    }

// multitextures
    for(j=0;j<hSprite->d_hMaterial[i]->lMultiTexture;j++)
    {
      hSprite->d_hMaterial[i]->lCurTexture = 0;
	  if (!g_bExistTex) //the .tex file doesn't exist 
		  sprintf(sFile, "%s.tex", g_sFileMaterial);
	  else
	  {	if (g_bIgnoreTex)
		{  if (g_bLevelConversion) 
			 sprintf(sFile, "%s\\World\\levels\\%stemp.tex", g_sGameData, g_sDirectorySave);
	       if (g_bBankConversion)
			 sprintf(sFile, "%s\\World\\graphics\\objects\\banks\\%stemp.tex", g_sGameData, g_sDirectorySave);
	       if (g_bClassConversion)
			 sprintf(sFile, "%s\\World\\graphics\\objects\\classes\\%stemp.tex", g_sGameData, g_sDirectorySave);
		}
		else
		  sprintf(sFile, "%s.tex", g_sFileMaterial);
	  }

      sprintf(sIdent2, "%s", hSprite->d_hMaterial[i]->stMultiTexture[j].sTexture);
      SCR_fn_v_RdL0_ComputeSectionName(mes, sFile, M_Texture, sIdent2);
      SCR_fn_v_SvL1_RegisterNotify(mes, MLT_vSaveTexture, hSprite->d_hMaterial[i], SCR_EA_Ntfy_AddOrModifySection);
    }

    SCR_M_SvL0_SaveEndSection(p_stFile, SCR_CC_C_Cfg_EOL);
  }  
  hSprite->AlreadySave = TRUE;
}



/****************************************************************************
*		Description:	test if the vertexes from a geometric object are symmetric with a plane
*
*		Parameters:		p_stGeometric	: geometric object
*---------------------------------------------------------------------------
*		Revision date:                                      Author:         
*****************************************************************************/
BOOL MLT_bTestSymmetry(MLT_tdstGeometricObject *p_stGeometric)
{
	long i;
	MTH3D_tdstVector stValues;

	for (i=0; i<p_stGeometric->xNbPoints; i++)
	{
		//symetric with plane yoz
		if ((p_stGeometric->cGeom == 'x') || (p_stGeometric->cGeom == 'X'))
		{
			stValues.xX = (float)(2*p_stGeometric->fGeom) - p_stGeometric->d_stListOfPoints[i].xX;		
			stValues.xY = p_stGeometric->d_stListOfPoints[i].xY;		
			stValues.xZ = p_stGeometric->d_stListOfPoints[i].xZ;		
		}
		//symetric with plane xoz
		if ((p_stGeometric->cGeom == 'y') || (p_stGeometric->cGeom == 'Y'))
		{
			stValues.xX = p_stGeometric->d_stListOfPoints[i].xX;		
			stValues.xY = (float)(2*p_stGeometric->fGeom) - p_stGeometric->d_stListOfPoints[i].xY;		
			stValues.xZ = p_stGeometric->d_stListOfPoints[i].xZ;		
		}
		//symetric with plane xoy
		if ((p_stGeometric->cGeom == 'z') || (p_stGeometric->cGeom == 'Z'))
		{
			stValues.xX = p_stGeometric->d_stListOfPoints[i].xX;		
			stValues.xY = p_stGeometric->d_stListOfPoints[i].xY;		
			stValues.xZ = (float)(2*p_stGeometric->fGeom) - p_stGeometric->d_stListOfPoints[i].xZ;		
		}
		if (!MLT_bFindVertex(p_stGeometric, stValues))
			return FALSE;
	}
	return TRUE;
}



/****************************************************************************
*		Description:	check if the vertex belong to the object
*
*		Parameters:		p_stGeometric	: geometric object
*						stValues		: vertex
*---------------------------------------------------------------------------
*		Revision date:                                      Author:         
*****************************************************************************/
BOOL MLT_bFindVertex (MLT_tdstGeometricObject *p_stGeometric, MTH3D_tdstVector stValues)
{
	long i;

	for (i=0; i<p_stGeometric->xNbPoints; i++)
	{	
		//for all the points for the geometric object
		if ((fabs(stValues.xX - p_stGeometric->d_stListOfPoints[i].xX )<=g_fLimit2)
			&&(fabs(stValues.xY- p_stGeometric->d_stListOfPoints[i].xY )<=g_fLimit2)
			&&(fabs(stValues.xZ - p_stGeometric->d_stListOfPoints[i].xZ )<=g_fLimit2))
		return TRUE;
	}
	return FALSE;
}



