reman3/Rayman_X/cpa/tempgrp/SNA/snasyn.c

407 lines
12 KiB
C

/*=========================================================================
* Snasyn.c : Save & Read the lips synchro pointers
*
* Version 1.0
* Creation date 03/09/97
* Revision date
*
* (c) Ubi R&D 1997
*=======================================================================*/
#ifdef D_USE_LIPSYNC
#include "ACP_Base.h"
#include "ToolsCPA.h"
#include "GAM\LipsSync.h"
#include "GAM\LoadLSyn.h"
#include "GAM\LSMem.h"
#include "SCR.h"
#include "SNA.h"
#include "SNA\snasyn.h"
#include "acp_opfi.h"
#include "AI\AIBase\StrIntel.h"
FILE *g_xLipsSynchFile; // LipsSynch pointers file
struct tdstRelocTable_ *g_p_stGPointerRelocTableLS;
FILE *g_p_xLipsSynchroBlocFile;
tdstLipsSynchroBinTable *g_a_p_stLSBinTable;
long g_lNumberOfLSTable;
#ifndef U64
extern int g_iComplete;
#endif
/*-----------------------------------------------------------------------------
* Description : Open LipsSynch pointers file
*-----------------------------------------------------------------------------
* Input : Name of the file
* Output : None
*-----------------------------------------------------------------------------
* Creation date : 09/12/97 Author : Michaël
*-----------------------------------------------------------------------------
* Modification date : Modification Author :
* Modifications :
*---------------------------------------------------------------------------*/
void SNA_fn_xWriteOpenLipsSynchTableFile(char *szFileName)
{
SNA_fn_vInitArrays();
g_xLipsSynchFile=fopen(szFileName,"wb");
}
unsigned long fn_ulGetFileSize(char *szFilename)
{ unsigned long ulFileSize;
LPWIN32_FIND_DATA lpFFD=(LPWIN32_FIND_DATA)malloc(sizeof(WIN32_FIND_DATA));
if (FindFirstFile(szFilename,lpFFD) == INVALID_HANDLE_VALUE)
{
free(lpFFD);
return 0;
}
ulFileSize=lpFFD->nFileSizeHigh * MAXDWORD + lpFFD->nFileSizeLow;
free(lpFFD);
return ulFileSize;
}
ACP_tdxBool SNA_fn_xReadOpenLipsSynchTableFile(char *szFileName)
{
unsigned long ulFileSize;
SNA_fn_vInitArrays();
if (!g_iComplete)
{
ACP_M_OPENLANGFILE(fn_ulGetFileSize,ulFileSize,0,szFileName,(szFileName));
if (!ulFileSize)
return FALSE;
}
else
{
if (!fn_ulGetFileSize(szFileName))
return FALSE;
}
//g_xLipsSynchFile=fopen(szFileName,"rb"); Multi-install and multi-language
ACP_M_OPENLANGFILE(fopen,g_xLipsSynchFile,NULL,szFileName,(szFileName,"rb"));
/*
szFileName[strlen(szFileName)-3]=0;
strcat(szFileName,"rtl");
g_p_stGPointerRelocTableLS=SNA_fn_pLoadRelocationTable(szFileName); // Modifier le filename...
*/
g_p_stGPointerRelocTableLS=SNA_fn_pLoadRelocationTable();
return TRUE;
}
/*-----------------------------------------------------------------------------
* Description : Close LipsSynch pointers file
*-----------------------------------------------------------------------------
* Input : Name of the file
* Output : None
*-----------------------------------------------------------------------------
* Creation date : 09/12/97 Author : Michaël
*-----------------------------------------------------------------------------
* Modification date : Modification Author :
* Modifications :
*---------------------------------------------------------------------------*/
void SNA_fn_vCloseLipsSynchTableFile()
{
SNA_fn_pFreeRelocationTable(g_p_stGPointerRelocTableLS);
fclose(g_xLipsSynchFile);
}
/*-----------------------------------------------------------------------------
* Description : Write a LS filename/IA node pointer couple in file
*-----------------------------------------------------------------------------
* Input : Name of the file
* Output : None
*-----------------------------------------------------------------------------
* Creation date : 09/12/97 Author : Michaël
*-----------------------------------------------------------------------------
* Modification date : Modification Author :
* Modifications :
*---------------------------------------------------------------------------*/
void SNA_fn_vWriteLipsSynchEntryInLipsSynchTableFile(char *szLSFilename,unsigned long ulNodeAdr)
{ char szLSFilename255[255];
strcpy(szLSFilename255,szLSFilename);
if (SNA_fn_ucGetLoadType()==SNA_SAVE_SNAPSHOT)
{
fwrite(szLSFilename255,255,1,g_xLipsSynchFile);
fwrite(&ulNodeAdr,4,1,g_xLipsSynchFile);
}
}
// MR0912
void fn_vInitNodeLipSynchroRefWithSNA(tdstNodeInterpret *p_stNode,char *szLipsFileName)
{
tdstLipsSynchroTable *p_stLSTable;
p_stLSTable=fn_p_stReturnLipsSynchTable(szLipsFileName);
M_hLipSynchroHandleIdInterpret(p_stNode) = p_stLSTable;
}
void fn_vUpdateSoundPointersForLipsSynch()
{ ACP_tdxIndex xJ;
for (xJ=0;xJ<g_lNumberOfLSTable;xJ++)
{
g_a_p_stLSBinTable[xJ].p_stLSTable->p_stSndEvent=SND_fn_pGetBinEvent((unsigned long)g_a_p_stLSBinTable[xJ].p_stLSTable->p_stSndEvent);
}
}
/*-----------------------------------------------------------------------------
* Description : Read and update all LipsSynch pointers
*-----------------------------------------------------------------------------
* Input : Name of the file
* Output : None
*-----------------------------------------------------------------------------
* Creation date : 09/12/97 Author : Michaël
*-----------------------------------------------------------------------------
* Modification date : Modification Author :
* Modifications :
*---------------------------------------------------------------------------*/
void SNA_fn_vReadAndUpdateLipsSynchPointers()
{
char szLSFileName[255];
unsigned long ulOldAdrPointer;
unsigned long *p_ulLipsSynch;
unsigned long j;
while (!feof(g_xLipsSynchFile))
{
if(!fread(szLSFileName,255,1,g_xLipsSynchFile))
{
OutputDebugString("\n End of LipsSynchFile !!!");
break;
}
if(!fread(&ulOldAdrPointer,4,1,g_xLipsSynchFile))
{
OutputDebugString("\n End of LipsSynchFile !!!");
break;
}
p_ulLipsSynch=(unsigned long *)ulOldAdrPointer;
for (j=0;j<g_p_stGPointerRelocTableLS->p_stBloc[0].ulSize;j++)
{
unsigned char ucModuleNumber,ucBlocNumber;
ucModuleNumber=g_p_stGPointerRelocTableLS->p_stBloc[0].p_stPtr[j].ucModuleNumber;
ucBlocNumber=g_p_stGPointerRelocTableLS->p_stBloc[0].p_stPtr[j].ucBlocNumber;
if (((unsigned long)p_ulLipsSynch==g_p_stGPointerRelocTableLS->p_stBloc[0].p_stPtr[j].p_vPtr)&&(g_a_bIsBlocRelocated[ucModuleNumber][ucBlocNumber]))
{
((unsigned long)p_ulLipsSynch)+=g_a_ulOffset[ucModuleNumber][ucBlocNumber];
}
}
fn_vInitNodeLipSynchroRefWithSNA((tdstNodeInterpret *)p_ulLipsSynch,szLSFileName);
}
fclose(g_xLipsSynchFile);
fn_vUpdateSoundPointersForLipsSynch();
}
/**************************************************************************************/
// SNASHOTISATION (MR0912)
/**************************************************************************************/
void fn_vOpenWriteLipsSynchroBloc(char *szFileName)
{
g_p_xLipsSynchroBlocFile=fopen(szFileName,"wb");
g_lNumberOfLSTable=0;
}
void fn_vCloseWriteLipsSynchroBloc()
{
fwrite(&g_lNumberOfLSTable,4,1,g_p_xLipsSynchroBlocFile);
fclose(g_p_xLipsSynchroBlocFile);
}
void fn_vWriteLipsSynchroBloc(tdstLipsSynchroTable *p_stLSTable, char *szSectionName)
{
tdstLipsSynchroTable* hLST=p_stLSTable;
ACP_tdxIndex xI;
unsigned long BinId;
g_lNumberOfLSTable++;
// Write section name
fwrite(szSectionName,1,255,g_p_xLipsSynchroBlocFile);
fwrite(&hLST->lNumberOfFrames,4,1,g_p_xLipsSynchroBlocFile);
fwrite(&hLST->lSpeed,4,1,g_p_xLipsSynchroBlocFile);
BinId=SND_fn_ulGetEventBinIdFromPointer(hLST->p_stSndEvent);
fwrite(&BinId,4,1,g_p_xLipsSynchroBlocFile);
for(xI=0;xI<MAX_NUM_CHAN_SYN;++xI)
fwrite(&(hLST->ucChannelAffected[xI]),1,1,g_p_xLipsSynchroBlocFile);
fwrite(&hLST->ucNumberOfChannelAffected,1,1,g_p_xLipsSynchroBlocFile);
fwrite(&hLST->iIndex,4,1,g_p_xLipsSynchroBlocFile);
fwrite(&hLST->lNumberOfTexts,4,1,g_p_xLipsSynchroBlocFile);
if(hLST->p_stDialTexts==NULL)
{
BinId=0L;
fwrite(&BinId,4,1,g_p_xLipsSynchroBlocFile);
}
else
{
BinId=1L;
fwrite(&BinId,4,1,g_p_xLipsSynchroBlocFile);
}
fwrite(&hLST->lNumberOfActings,4,1,g_p_xLipsSynchroBlocFile);
if(hLST->p_stActing==NULL)
{
BinId=0L;
fwrite(&BinId,4,1,g_p_xLipsSynchroBlocFile);
}
else
{
BinId=1L;
fwrite(&BinId,4,1,g_p_xLipsSynchroBlocFile);
}
// Now the table of synchro events
for(xI=0;xI<hLST->lNumberOfFrames;++xI)
{
fwrite(&(hLST->p_stTable[xI].ucPhoneme),4,1,g_p_xLipsSynchroBlocFile);
fwrite(&(hLST->p_stTable[xI].ucIntensity),4,1,g_p_xLipsSynchroBlocFile);
fwrite(&(hLST->p_stTable[xI].ucExpression),4,1,g_p_xLipsSynchroBlocFile);
}
// Then the dial texts
if(hLST->p_stDialTexts!=NULL)
{
for(xI=0;xI<hLST->lNumberOfTexts;++xI)
{
fwrite(&(hLST->p_stDialTexts[xI].lFrameNumber),4,1,g_p_xLipsSynchroBlocFile);
fwrite(&(hLST->p_stDialTexts[xI].xPosX),4,1,g_p_xLipsSynchroBlocFile);
fwrite(&(hLST->p_stDialTexts[xI].xPosY),4,1,g_p_xLipsSynchroBlocFile);
}
}
// Finally the acting pointer
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// !!!!!!!!!!!!!!! NE MARCHERA PAS !!!!!!!!!!!!!!!!!!!!
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
if(hLST->p_stActing!=NULL)
{
for(xI=0;xI<hLST->lNumberOfActings;++xI)
{
fwrite(&(hLST->p_stActing[xI].lFrameNumber),4,1,g_p_xLipsSynchroBlocFile);
fwrite(&(hLST->p_stActing[xI].hNewState),4,1,g_p_xLipsSynchroBlocFile);
}
}
}
void fn_vReadAllLipsSynchroBlocs(char *szFileName)
{
tdstLipsSynchroTable* hLST;
ACP_tdxIndex xI,xJ;
unsigned long BinId;
LSY_fn_vFreeLipsSynchroBlock();
ACP_M_OPENLANGFILE(fopen,g_p_xLipsSynchroBlocFile,NULL,szFileName,(szFileName,"rb"));
fseek(g_p_xLipsSynchroBlocFile,-4,SEEK_END);
fread(&g_lNumberOfLSTable,4,1,g_p_xLipsSynchroBlocFile);
fseek(g_p_xLipsSynchroBlocFile,0,SEEK_SET);
g_a_p_stLSBinTable=fn_xAllocateLipsSynchroBinTable(g_lNumberOfLSTable);
//while (!feof(g_p_xLipsSynchroBlocFile))
for (xJ=0;xJ<g_lNumberOfLSTable;xJ++)
{
fread(g_a_p_stLSBinTable[xJ].szSectionName,1,255,g_p_xLipsSynchroBlocFile);
hLST=fn_xAllocateLipsSynchroTable();
g_a_p_stLSBinTable[xJ].p_stLSTable=hLST;
fread(&hLST->lNumberOfFrames,4,1,g_p_xLipsSynchroBlocFile);
fread(&hLST->lSpeed,4,1,g_p_xLipsSynchroBlocFile);
// A voir...
fread(&hLST->p_stSndEvent,4,1,g_p_xLipsSynchroBlocFile);
for(xI=0;xI<MAX_NUM_CHAN_SYN;++xI)
fread(&(hLST->ucChannelAffected[xI]),1,1,g_p_xLipsSynchroBlocFile);
fread(&hLST->ucNumberOfChannelAffected,1,1,g_p_xLipsSynchroBlocFile);
fread(&hLST->iIndex,4,1,g_p_xLipsSynchroBlocFile);
fread(&hLST->lNumberOfTexts,4,1,g_p_xLipsSynchroBlocFile);
fread(&BinId,4,1,g_p_xLipsSynchroBlocFile);
if (!BinId)
hLST->p_stDialTexts=NULL;
else
hLST->p_stDialTexts=fn_xAllocateDialTexts(hLST->lNumberOfTexts);
fread(&hLST->lNumberOfActings,4,1,g_p_xLipsSynchroBlocFile);
fread(&BinId,4,1,g_p_xLipsSynchroBlocFile);
if (!BinId)
hLST->p_stActing=NULL;
else
hLST->p_stActing=fn_xAllocateActing(hLST->lNumberOfActings);
// Now the table of synchro events
hLST->p_stTable=fn_xAllocateLipsSynchroEvents(hLST->lNumberOfFrames);
for(xI=0;xI<hLST->lNumberOfFrames;++xI)
{
fread(&(hLST->p_stTable[xI].ucPhoneme),4,1,g_p_xLipsSynchroBlocFile);
fread(&(hLST->p_stTable[xI].ucIntensity),4,1,g_p_xLipsSynchroBlocFile);
fread(&(hLST->p_stTable[xI].ucExpression),4,1,g_p_xLipsSynchroBlocFile);
}
// Then the dial texts
if(hLST->p_stDialTexts!=NULL)
{
for(xI=0;xI<hLST->lNumberOfTexts;++xI)
{
fread(&(hLST->p_stDialTexts[xI].lFrameNumber),4,1,g_p_xLipsSynchroBlocFile);
fread(&(hLST->p_stDialTexts[xI].xPosX),4,1,g_p_xLipsSynchroBlocFile);
fread(&(hLST->p_stDialTexts[xI].xPosY),4,1,g_p_xLipsSynchroBlocFile);
}
}
// Finally the acting pointer
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// !!!!!!!!!!!!!!! NE MARCHERA PAS !!!!!!!!!!!!!!!!!!!!
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
if(hLST->p_stActing!=NULL)
{
for(xI=0;xI<hLST->lNumberOfActings;++xI)
{
fread(&(hLST->p_stActing[xI].lFrameNumber),4,1,g_p_xLipsSynchroBlocFile);
fread(&(hLST->p_stActing[xI].hNewState),4,1,g_p_xLipsSynchroBlocFile);
}
}
//xJ++;
}
fclose(g_p_xLipsSynchroBlocFile);
}
tdstLipsSynchroTable *fn_p_stReturnLipsSynchTable(char *szSectionName)
{ ACP_tdxIndex xJ;
for (xJ=0;xJ<g_lNumberOfLSTable;xJ++)
if (!strcmp(szSectionName,g_a_p_stLSBinTable[xJ].szSectionName))
return g_a_p_stLSBinTable[xJ].p_stLSTable;
return NULL;
}
#endif // D_USE_LIPSYNC