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

435 lines
16 KiB
C

/*=========================================================================
*
* Actors.h - LVL and ALW functions
*
* Version 1.0
* Revision date
*
*=======================================================================*/
#include "Actors.h"
#include "conventi.h"
#include "system.h"
#include "vertex.h"
//--- Global statics --------------------------------------------------------
MLT_tdstAlways **gs_hAlwaysInFile = NULL;
long gs_lAlwaysIndex = 0;
//--------------------------------------------------------------------
/****************************************************************************
* Description: register the loading function for the LVL file
*
* Parameters:
*---------------------------------------------------------------------------
* Revision date: Author:
*****************************************************************************/
void MLT_vInitLVLLoad ()
{
SCR_fn_v_RdL0_RegisterCallback(M_InsertCharacter, MLT_xLoadInsertCharacter,SCR_CRC_c_RdL0_ForSection);
}
/****************************************************************************
* Description: save character in LVL file
*
* Parameters: p_stFile : script file pointer
* sFileName : file name
* p_vPtr : data pointer
* xAction : script action
*---------------------------------------------------------------------------
* Revision date: Author:
*****************************************************************************/
void MLT_vSaveInsertCharacter(SCR_tdst_File_Description *p_stFile, char *sFileName, void *p_vPtr, SCR_tde_Ntfy_Action xAction)
{
MLT_tdstInsertCharacter *p_stInsertCharacter;
MLT_tdstInsertCharacter *p_stOldInsertCharacter=NULL;
xString sFile, sAction, sIdent, sSection, sChar;
char *p_Char;
// get character pointer
p_stInsertCharacter = (MLT_tdstInsertCharacter *)p_vPtr;
if(xAction != SCR_EA_Ntfy_AddSection)
{
SCR_fn_v_SvL1_DeleteSection(p_stFile);
}
// compute section name
sprintf(sFile, "%s", p_stFile->a_szOpenFileName);
sprintf(sAction, M_InsertCharacter);
sprintf(sIdent, "World", (MLT_p_cGetFileNameWithoutExt(sFile)));
SCR_fn_v_RdL0_ComputeSectionName(sSection, sFile, sAction, sIdent);
// save character section
SCR_M_SvL0_SaveBeginSection(p_stFile, MLT_p_cGetSectionName(sSection), SCR_CC_C_Cfg_EOL);
// save linked character
SCR_M_SvL0_SaveEntry(p_stFile, M_LVLActionLinkCharacter, SCR_CC_C_Cfg_NoChar);
// compute character name
p_Char = strstr(p_stInsertCharacter->szLink, "World1");
strcpy(sChar, p_Char);
p_stInsertCharacter->szLink[strlen(p_stInsertCharacter->szLink)-strlen(sChar)]='\0';
strcat(p_stInsertCharacter->szLink, "Level");
strcat(p_stInsertCharacter->szLink, MLT_p_cGetFileNameWithoutExt(sFile));
strcat(p_stInsertCharacter->szLink, sChar + 6);
// save corresponding name
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Normal, 1, p_stInsertCharacter->szLink);
// save character translation
SCR_M_SvL0_SaveEntry(p_stFile, M_LVLActionTranslation, SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 4, "%.6f,%.6f,%.6f",
p_stInsertCharacter->Translation.xX,
p_stInsertCharacter->Translation.xY,
p_stInsertCharacter->Translation.xZ);
// save character rotation
SCR_M_SvL0_SaveEntry(p_stFile, M_LVLActionRotation, SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 10, "%.6f,%.6f,%.6f,%.6f,%.6f,%.6f,%.6f,%.6f,%.6f",
p_stInsertCharacter->RotMatrix[0][0],
p_stInsertCharacter->RotMatrix[1][0],
p_stInsertCharacter->RotMatrix[2][0],
p_stInsertCharacter->RotMatrix[0][1],
p_stInsertCharacter->RotMatrix[1][1],
p_stInsertCharacter->RotMatrix[2][1],
p_stInsertCharacter->RotMatrix[0][2],
p_stInsertCharacter->RotMatrix[1][2],
p_stInsertCharacter->RotMatrix[2][2]);
// save character scale
SCR_M_SvL0_SaveEntry(p_stFile, M_LVLActionScale, SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 10, "%.6f,%.6f,%.6f,%.6f,%.6f,%.6f,%.6f,%.6f,%.6f",
p_stInsertCharacter->ScaleMatrix[0][0],
p_stInsertCharacter->ScaleMatrix[1][0],
p_stInsertCharacter->ScaleMatrix[2][0],
p_stInsertCharacter->ScaleMatrix[0][1],
p_stInsertCharacter->ScaleMatrix[1][1],
p_stInsertCharacter->ScaleMatrix[2][1],
p_stInsertCharacter->ScaleMatrix[0][2],
p_stInsertCharacter->ScaleMatrix[1][2],
p_stInsertCharacter->ScaleMatrix[2][2]);
// save character initial state
SCR_M_SvL0_SaveEntry(p_stFile, M_LVLActionInitialState, SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Normal, 1, p_stInsertCharacter->szInitial);
// save end section
SCR_M_SvL0_SaveEndSection(p_stFile, SCR_CC_C_Cfg_EOL);
}
/****************************************************************************
* Description: load character section in LVL file
*
* Parameters: p_stFile : script file pointer
* szAction : section or entry name
* szParams : parameters
* cType : action type
*---------------------------------------------------------------------------
* Revision date: Author:
*****************************************************************************/
SCR_tde_Anl_ReturnValue MLT_xLoadInsertCharacter (SCR_tdst_File_Description *p_fFile, char *szAction, char *szParams[], SCR_tde_Anl_Action cType)
{
MLT_tdstInsertCharacter *p_stInsertCharacter;
MTH_tdxReal a_xVertex[3];
int i, j;
switch (cType)
{
case SCR_EA_Anl_BeginSection:
// create character structure
p_stInsertCharacter=(MLT_tdstInsertCharacter*)malloc(sizeof(MLT_tdstInsertCharacter));
SCR_M_RdL0_SetSectionLong(0,0,(long)p_stInsertCharacter);
SCR_M_RdL0_SetContextLong(0,0,(long)p_stInsertCharacter);
sprintf(p_stInsertCharacter->sName,"%s",SCR_M_RdL0_GetCompleteSectionNameR(0));
break;
case SCR_EA_Anl_Entry:
// get character pointer
SCR_M_RdL0_GetContextLong(0,0,MLT_tdstInsertCharacter*,p_stInsertCharacter);
// load linked character
if (strcmp(szAction,M_LVLActionLinkCharacter)==0)
{
strcpy(p_stInsertCharacter->szLink, szParams[0]);
}
// load translation
if (strcmp(szAction,M_LVLActionTranslation)==0)
{
for (i=0;i<3;i++)
a_xVertex[i]=(MTH_tdxReal)MTH_M_xFloatToReal(atof(szParams[i])/**MLT_dGetUnitInMeterInFile(p_fFile->a_szOpenFileName)*/);
MLT_M_SetVertexXYZ(&p_stInsertCharacter->Translation,a_xVertex[0],a_xVertex[1],a_xVertex[2]);
}
// load the rotation
if (strcmp(szAction,M_LVLActionRotation)==0)
{
for (i=0;i<3;i++)
for (j=0;j<3;j++)
p_stInsertCharacter->RotMatrix[j][i] = (MTH_tdxReal)MTH_M_xFloatToReal(atof(szParams[3*i+j]));
}
// load the scale
if (strcmp(szAction,M_LVLActionScale)==0)
{
for (i=0;i<3;i++)
for (j=0;j<3;j++)
p_stInsertCharacter->ScaleMatrix[j][i] = (MTH_tdxReal)MTH_M_xFloatToReal(atof(szParams[3*i+j]));
}
// load initial state
if (strcmp(szAction,M_LVLActionInitialState)==0)
{
strcpy(p_stInsertCharacter->szInitial, szParams[0]);
}
break;
case SCR_EA_Anl_EndSection:
break;
}
return SCR_ERV_Anl_NormalReturn;
}
/****************************************************************************
* Description: register the loading function for the ALW file
*
* Parameters:
*---------------------------------------------------------------------------
* Revision date: Author:
*****************************************************************************/
void MLT_vInitALWLoad()
{
SCR_fn_v_RdL0_RegisterCallback(M_InsertAlways,MLT_xLoadAlways, SCR_CRC_c_RdL0_ForSection);
SCR_fn_v_RdL0_RegisterCallback(M_FichierALW,MLT_xLoadALWCallback, SCR_CRC_c_RdL0_ForFile);
}
/****************************************************************************
* Description: save character in ALW file
*
* Parameters: p_stFile : script file pointer
* sFileName : file name
* p_vPtr : data pointer
* xAction : script action
*---------------------------------------------------------------------------
* Revision date: Author:
*****************************************************************************/
void MLT_vSaveAlways(SCR_tdst_File_Description *p_stFile, char *sFileName, void *p_vPtr, SCR_tde_Ntfy_Action xAction)
{
MLT_tdstAlways *p_stAlways;
xString mes, sFile, sAction, sIdent;
p_stAlways = (MLT_tdstAlways *)p_vPtr;
if(xAction == SCR_EA_Ntfy_AddSection)
{
SCR_fn_v_SvL1_ToEndSection(p_stFile);
}
else
return;
SCR_fn_v_RdL0_SplitSectionName(p_stAlways->sName, sFile, sAction, sIdent);
sprintf(sFile, "%s%s.alw", g_sDirectorySave, g_sFileIn);
SCR_fn_v_RdL0_ComputeSectionName(mes, sFile, M_InsertAlways, sIdent);
if (! SCR_fn_c_RdL0_IsSectionExists(mes)) //the section don't exist
{ SCR_M_SvL0_SaveBeginSection(p_stFile, MLT_p_cGetSectionName(mes), SCR_CC_C_Cfg_EOL);
SCR_M_SvL0_SaveEntry(p_stFile, M_LVLActionLinkCharacter, SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 2, "%s", p_stAlways->sLinkCharacter);
if (p_stAlways->iCharacter != -1)
{ SCR_M_SvL0_SaveEntry(p_stFile, M_LVLActionCharacterFlags, SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 2, "%d", p_stAlways->iCharacter);
}
if (p_stAlways->fTransparency != -1)
{ SCR_M_SvL0_SaveEntry(p_stFile, M_LVLActionTransparency, SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 2, "%f", p_stAlways->fTransparency);
}
SCR_M_SvL0_SaveEndSection(p_stFile, SCR_CC_C_Cfg_EOL);
}
}
/****************************************************************************
* Description: load character section in ALW file
*
* Parameters: p_stFile : script file pointer
* szAction : section or entry name
* szParams : parameters
* cType : action type
*---------------------------------------------------------------------------
* Revision date: Author:
*****************************************************************************/
SCR_tde_Anl_ReturnValue MLT_xLoadAlways (SCR_tdst_File_Description *p_fFile, char *szAction, char *szParams[], SCR_tde_Anl_Action cType)
{
MLT_tdstAlways *p_stAlways;
switch (cType)
{
case SCR_EA_Anl_BeginSection:
p_stAlways=(MLT_tdstAlways*)malloc(sizeof(MLT_tdstAlways));
SCR_M_RdL0_SetSectionLong(0,0,(long)p_stAlways);
SCR_M_RdL0_SetContextLong(0,0,(long)p_stAlways);
sprintf(p_stAlways->sName,"%s",SCR_M_RdL0_GetCompleteSectionNameR(0));
p_stAlways->iCharacter= -1;
p_stAlways->fTransparency= -1;
break;
case SCR_EA_Anl_Entry:
SCR_M_RdL0_GetContextLong(0,0,MLT_tdstAlways*,p_stAlways);
// Loading object's Always
if (strcmp(szAction,M_LVLActionLinkCharacter)==0)
{
sprintf(p_stAlways->sLinkCharacter,"%s",szParams[0]);
}
if (strcmp(szAction,M_LVLActionCharacterFlags)==0)
{
p_stAlways->iCharacter= (int)atoi(szParams[0]);
}
if (strcmp(szAction,M_LVLActionTransparency)==0)
{
p_stAlways->fTransparency= (float)atof(szParams[0]);
}
break;
case SCR_EA_Anl_EndSection:
break;
}
return SCR_ERV_Anl_NormalReturn;
}
/****************************************************************************
* Description: load ALW file
*
* Parameters: p_stFile : script file pointer
* szAction : section or entry name
* szParams : parameters
* cType : action type
*---------------------------------------------------------------------------
* Revision date: Author:
*****************************************************************************/
SCR_tde_Anl_ReturnValue MLT_xLoadALWCallback(SCR_tdst_File_Description *p_fFile, char *szAction, char *szParams[], SCR_tde_Anl_Action cType)
{
MLT_tdstAlways **p_xAlwaysInFile;
long xNbAlways;
switch (cType)
{
case SCR_EA_Anl_BeginSection:
p_xAlwaysInFile = (MLT_tdstAlways**)malloc(sizeof(MLT_tdstAlways*));
SCR_M_RdL0_SetContextLong(0,0,(long)p_xAlwaysInFile);
SCR_M_RdL0_SetContextLong(0,1,(long)0);
break;
case SCR_EA_Anl_EndSubSection:
if (strcmp(szParams[0],M_InsertAlways)==0)
{
MLT_tdstAlways *hAlways;
SCR_M_RdL0_GetContextLong(0,0,MLT_tdstAlways**,p_xAlwaysInFile);
SCR_M_RdL0_GetContextLong(0,1,long,xNbAlways);
p_xAlwaysInFile = (MLT_tdstAlways**)realloc(p_xAlwaysInFile,(++xNbAlways)*sizeof(MLT_tdstAlways*));
SCR_M_RdL0_GetSectionLong(1,0,MLT_tdstAlways*,hAlways);
p_xAlwaysInFile[xNbAlways-1]=hAlways;
SCR_M_RdL0_SetContextLong(0,0,(long)p_xAlwaysInFile);
SCR_M_RdL0_SetContextLong(0,1,(long)xNbAlways);
}
break;
case SCR_EA_Anl_EndSection:
SCR_M_RdL0_GetContextLong(0,0,MLT_tdstAlways**,p_xAlwaysInFile);
SCR_M_RdL0_GetContextLong(0,1,long,xNbAlways);
SCR_M_RdL0_SetSectionLong(0,0,(long)p_xAlwaysInFile);
SCR_M_RdL0_SetSectionLong(0,1,(long)xNbAlways);
break;
}
return SCR_ERV_Anl_NormalReturn;
}
/****************************************************************************
* Description: free all the always in the library
*
* Parameters:
*---------------------------------------------------------------------------
* Revision date: Author:
*****************************************************************************/
void MLT_vEraseALWLib()
{
int i;
if (gs_hAlwaysInFile == NULL)
return;
for (i=0; i<gs_lAlwaysIndex; i++)
{
if (gs_hAlwaysInFile[i] == NULL)
continue;
free(gs_hAlwaysInFile[i]);
}
gs_lAlwaysIndex = 0;
free(gs_hAlwaysInFile);
gs_hAlwaysInFile = NULL;
}
/****************************************************************************
* Description: load alw file in library
*
* Parameters:
*---------------------------------------------------------------------------
* Revision date: Author:
*****************************************************************************/
void MLT_vLoadALWFileInLib()
{
SCR_tdst_Cxt_Values *p_stVal;
xString szFileName;
//Inits
strcpy(szFileName, g_sGameCommon);
strcat(szFileName, "\\default\\Default.alw");
if(SCR_fn_c_RdL0_IsSectionExists(szFileName))
{
p_stVal = SCR_fnp_st_RdL0_AnalyseSection(szFileName, SCR_CDF_uw_Anl_ForceAnalyse);
gs_hAlwaysInFile = (MLT_tdstAlways **)SCR_M_ul_RdL0_ExtractLongValue(p_stVal,0);
gs_lAlwaysIndex = (long)SCR_M_ul_RdL0_ExtractLongValue(p_stVal,1);
}
}
/****************************************************************************
* Description: save library in alw file
*
* Parameters:
*---------------------------------------------------------------------------
* Revision date: Author:
*****************************************************************************/
void MLT_vSaveLibInALWFile ()
{
long i;
xString sFile, sIdent, sSection;
for (i=0; i<gs_lAlwaysIndex; i++)
{
SCR_fn_v_RdL0_SplitSectionName(gs_hAlwaysInFile[i]->sName, sFile, sSection, sIdent);
sprintf(sFile, "%s.alw", g_sFileIn);
SCR_fn_v_RdL0_ComputeSectionName(sSection, sFile, M_InsertAlways, sIdent);
SCR_fn_v_SvL1_RegisterNotify(sSection, MLT_vSaveAlways, gs_hAlwaysInFile[i], SCR_EA_Ntfy_AddOrModifySection);
}
}