#ifdef D_USE_LIPSYNC #include "ToolsCPA.h" #include "Options/Options.h" #include "Macros.h" #include "Actions/AllActs.h" #include "Structur/3DOSLkTb.h" #include "Structur/Objects.h" #include "Structur/ErrGame.h" #include "Structur/GameScpt.h" #include "Structur/MemGame.h" #include "Structur/StdObjSt.h" #include "Structur/EngMode.h" #include "Basic.h" #include "Family.h" #include "ZeMem.h" #include "ObjType.h" #include "CHLLoad.h" #include "LipsSync.h" #include "LoadLSyn.h" /* MR0912*/ #include "LSMem.h" /* For BIN*/ #include "SNA.h" /* MR3006*/ tdxHandleOfLipsSynchroTable g_hLipsTable; #if defined(ACTIVE_EDITOR) SCR_tdst_Link_Table *fn_p_stGetLipsSynchroLinkTable() { return &g_st3DOSLinkTable.stLipsSynchroList; } #endif /* ACTIVE_EDITOR */ SCR_tde_Anl_ReturnValue fn_xLoadLSGeneral(SCR_tdst_File_Description *p_fFile, char *szAction, char *szParams[], SCR_tde_Anl_Action cType) { /* SCR_tdst_Cxt_Values *p_stValues;*/ tdxHandleOfLipsSynchroTable hLSTable; char szForScript[_MAX_PATH]; char szFileName[_MAX_PATH]; char szSectionName[_MAX_PATH]; SND_tdstBlockEvent *p_stSndEvent; #if defined(ACTIVE_EDITOR) char a255_cLinkKey[255]; #endif /* ACTIVE_EDITOR */ switch (cType) { case SCR_EA_Anl_BeginSection: hLSTable=fn_xAllocateLipsSynchroTable(); /* Fix the context*/ SCR_M_RdL0_SetSectionLong(0,0,(long)hLSTable); SCR_M_RdL0_SetContextLong(0,0,(long)hLSTable); /* Link table*/ strcpy(szSectionName,"*^"); strcat(szSectionName,C_SectionA3dLSData); fn_v_File_ComputeFileSectionName(szSectionName,szFileName,szForScript/*+strlen(szForScript)*/); #if defined(ACTIVE_EDITOR) SCR_M_RdL0_ComputeOpenSectionNameR(0,a255_cLinkKey); SCR_fnp_st_Link_CreateOrGetLinkFromKey( &g_st3DOSLinkTable.stLipsSynchroList, a255_cLinkKey); SCR_fnp_st_Link_SetValue(&g_st3DOSLinkTable.stLipsSynchroList, a255_cLinkKey,(unsigned long)hLSTable); #endif /* ACTIVE_EDITOR */ fn_vLSResetChannelSync(hLSTable); break; case SCR_EA_Anl_Entry: /* Read the entries*/ SCR_M_RdL0_GetContextLong(0,0,tdxHandleOfLipsSynchroTable,hLSTable); if (!stricmp(szAction,C_EntryNumberOfFrames)) { int i; hLSTable->lNumberOfFrames=(long)atoi(szParams[0]); hLSTable->p_stTable=fn_xAllocateLipsSynchroEvents(hLSTable->lNumberOfFrames); for (i=0;ilNumberOfFrames;i++) { hLSTable->p_stTable[i].ucPhoneme=255; hLSTable->p_stTable[i].ucIntensity=0; hLSTable->p_stTable[i].ucExpression=0; } } else if (!strcmp(szAction,C_EntryLSSpeed)) { fn_vLSSetSpeed(hLSTable,(long)atoi(szParams[0])); } else if(!strcmp(szAction,C_EntryLSSound)) /* MR0107*/ { SCR_tdst_Cxt_Values *p_stVal; p_stVal = SCR_fnp_st_RdL0_AnalyseSection(szParams[0], SCR_CDF_uw_Anl_Normal); p_stSndEvent=(SND_tdstBlockEvent*)SCR_M_ul_RdL0_ExtractLongValue(p_stVal,0); hLSTable->p_stSndEvent=p_stSndEvent; } else if(!strcmp(szAction,C_EntryLSStopSound)) /* MR0808*/ { p_stSndEvent=(SND_tdstBlockEvent*)SCR_M_ul_RdL0_ExtractLongValue(((SCR_tdst_Cxt_Values**)szParams[1])[0], 0); /* For BIN*/ if (SNA_fn_ucGetLoadType()==SNA_SAVE_SNAPSHOT) /* MR0912*/ /* we save the id of the sound event and the pointer on the structure that contains the id and the pointer of the sound event*/ SNA_fn_vWriteSoundEntryInSoundTableFile(SND_fn_ulGetEventBinIdFromPointer((SND_tdxHandleToSoundEvent)p_stSndEvent) ,(unsigned long)&(hLSTable->p_stSndEventStop)); hLSTable->p_stSndEventStop=p_stSndEvent; } else if(!strcmp(szAction,C_EntryLSChannelNumber)) /* MR0207*/ { char sz_ForLinkTable[MAX_PATH]; struct tdstFamilyList_ *p_stFamily = NULL; SCR_tdst_Link_Value * _p_stLinkValue; short wChannelNumber = 0; SCR_M_RdL0_GetContextLong(C_ThisContext,1,struct tdstFamilyList_ *,p_stFamily); strcpy(sz_ForLinkTable,fn_szFindFamilyTypeNameOfFamilyType(p_stFamily->otObjectFamilyType)); strcat(sz_ForLinkTable,"-"); strcat(sz_ForLinkTable,szParams[0]); _p_stLinkValue = SCR_fnp_st_Link_SearchKey(&CHL_g_stLinkTable,sz_ForLinkTable); if(_p_stLinkValue) { wChannelNumber = (unsigned short)SCR_M_ul_Link_GetValue(_p_stLinkValue); } fn_vLSAddChannelSync(hLSTable,(unsigned char)wChannelNumber); } else if(!strcmp(szAction,C_EntryNumberOfActings)) /* MR2008*/ { int i; hLSTable->lNumberOfActings=(long)atoi(szParams[0]); hLSTable->p_stActing=fn_xAllocateActing(hLSTable->lNumberOfActings); for (i=0;ilNumberOfActings;i++) { hLSTable->p_stActing[i].hNewState=NULL; hLSTable->p_stActing[i].lFrameNumber=-1; } } break; case SCR_EA_Anl_EndSection: break; } return SCR_ERV_Anl_NormalReturn; } SCR_tde_Anl_ReturnValue fn_xLoadLSData(SCR_tdst_File_Description *p_fFile, char *szAction, char *szParams[], SCR_tde_Anl_Action cType) { SCR_tdst_Cxt_Values *p_stValues; tdxHandleOfLipsSynchroTable hLSTable; char szSectionName[255]; unsigned char ucLastPhoneme = 0,ucLastIntensity = 0,ucLastExpression = 0; int i; switch (cType) { case SCR_EA_Anl_BeginSection: strcpy(szSectionName,p_fFile->a_szFileName); strcat(szSectionName,"^"); strcat(szSectionName,C_SectionA3dLSGeneral); p_stValues = SCR_fnp_st_RdL0_AnalyseSection(szSectionName, SCR_CDF_uw_Anl_Normal); hLSTable=(tdxHandleOfLipsSynchroTable)(p_stValues->a_ulValues[0]); SCR_M_RdL0_SetSectionLong(0,0,(long)hLSTable); SCR_M_RdL0_SetContextLong(0,0,(long)hLSTable); break; case SCR_EA_Anl_Entry: /* Read the entries*/ SCR_M_RdL0_GetContextLong(0,0,tdxHandleOfLipsSynchroTable,hLSTable); if (!stricmp(szAction,C_EntryLSMouth)) fn_vLSSetPhoneme(hLSTable,atoi(szParams[0]),(unsigned char)(szParams[1][0]-'A')); else if (!strcmp(szAction,C_EntryLSIntensity)) fn_vLSSetIntensity(hLSTable,atoi(szParams[0]),(unsigned char)atoi(szParams[1])); else if (!strcmp(szAction,C_EntryLSExpression)) if (!stricmp(szParams[1],"Neutral")) fn_vLSSetExpression(hLSTable,atoi(szParams[0]),0); break; case SCR_EA_Anl_EndSection: SCR_M_RdL0_GetContextLong(0,0,tdxHandleOfLipsSynchroTable,hLSTable); /* MR1908*/ if (hLSTable->lNumberOfTexts) SCR_fnp_st_RdL0_AnalyseSection("*^Text", SCR_CDF_uw_Anl_Normal); if (hLSTable->lNumberOfActings) SCR_fnp_st_RdL0_AnalyseSection("*^Acting", SCR_CDF_uw_Anl_Normal); for (i=0;ia_ulValues[0]); memcpy(&(hLSTable->p_stDialTexts[i]),p_stText,sizeof(struct tdstDialText_)); MMG_fn_vAddMemoryInfo( MMG_C_lTypeGAM , MMG_C_lSubTypeLipSynchro , 0 ); TMP_M_Free(p_stText); hLSTable->p_stDialTexts[i].lFrameNumber=atoi(szParams[0]); i++; } break; case SCR_EA_Anl_EndSection: i=0; break; } return SCR_ERV_Anl_NormalReturn; } SCR_tde_Anl_ReturnValue fn_xLoadLSActing(SCR_tdst_File_Description *p_fFile, char *szAction, char *szParams[], SCR_tde_Anl_Action cType) { SCR_tdst_Cxt_Values *p_stValues; tdxHandleOfLipsSynchroTable hLSTable; char szSectionName[255]; static int i=0; struct tdstActing_ *p_stActing; switch (cType) { case SCR_EA_Anl_Entry: /* Read the entries*/ SCR_M_RdL0_GetContextLong(0,0,tdxHandleOfLipsSynchroTable,hLSTable); if (!stricmp(szAction,C_EntryActingFlag)) { strcpy(szSectionName,fn_szGetSyncLipsDataPath()); strcat(szSectionName,"\\Acting\\"); strcat(szSectionName,szParams[1]); p_stValues = SCR_fnp_st_RdL0_AnalyseSection(szSectionName, SCR_CDF_uw_Anl_Normal); p_stActing=(struct tdstActing_ *)(p_stValues->a_ulValues[0]); memcpy(&(hLSTable->p_stActing[i]),p_stActing,sizeof(struct tdstActing_)); MMG_fn_vAddMemoryInfo( MMG_C_lTypeGAM , MMG_C_lSubTypeLipSynchro , 0 ); TMP_M_Free(p_stActing); hLSTable->p_stActing[i].lFrameNumber=atoi(szParams[0]); i++; } break; case SCR_EA_Anl_EndSection: i=0; break; } return SCR_ERV_Anl_NormalReturn; } SCR_tde_Anl_ReturnValue fn_xLoadTextDial(SCR_tdst_File_Description *p_fFile, char *szAction, char *szParams[], SCR_tde_Anl_Action cType) /* read the DIA files*/ { static int i=0; struct tdstDialText_ *p_stText; switch (cType) { case SCR_EA_Anl_BeginSection: MMG_fn_vAddMemoryInfo( MMG_C_lTypeGAM , MMG_C_lSubTypeLipSynchro , 0 ); p_stText=TMP_M_p_Malloc(sizeof(struct tdstDialText_)); /* Fix the context*/ SCR_M_RdL0_SetSectionLong(0,0,(long)p_stText); SCR_M_RdL0_SetContextLong(0,0,(long)p_stText); break; case SCR_EA_Anl_Entry: /* Read the entries*/ SCR_M_RdL0_GetContextLong(0,0,struct tdstDialText_ *,p_stText); if (!stricmp(szAction,C_EntryPosition)) { p_stText->xPosX=(MTH_tdxReal)atof(szParams[0]); p_stText->xPosY=(MTH_tdxReal)atof(szParams[1]); } break; } return SCR_ERV_Anl_NormalReturn; } /* End MR1908*/ SCR_tde_Anl_ReturnValue fn_xLoadActing(SCR_tdst_File_Description *p_fFile, char *szAction, char *szParams[], SCR_tde_Anl_Action cType) /* read the ACT files*/ { struct tdstActing_ *p_stActing; switch (cType) { case SCR_EA_Anl_BeginSection: MMG_fn_vAddMemoryInfo( MMG_C_lTypeGAM , MMG_C_lSubTypeLipSynchro , 0 ); p_stActing=TMP_M_p_Malloc(sizeof(struct tdstActing_)); /* Fix the context*/ SCR_M_RdL0_SetSectionLong(0,0,(long)p_stActing); SCR_M_RdL0_SetContextLong(0,0,(long)p_stActing); break; case SCR_EA_Anl_Entry: /* Read the entries*/ SCR_M_RdL0_GetContextLong(0,0,struct tdstActing_ *,p_stActing); if (!stricmp(szAction,C_EntryNewState)) { char szSectionName[255]; SCR_tdst_Link_Value * _p_stLinkValue; strcpy(szSectionName,fn_szGetFamiliesDataPath()); strcat(szSectionName,"\\"); strcat(szSectionName,szParams[0]); _p_stLinkValue = SCR_fnp_st_Link_SearchKey(&g_st3DOSLinkTable.stState,szSectionName); p_stActing->hNewState = (tdxHandleToState)SCR_M_ul_Link_GetValue(_p_stLinkValue); } break; } return SCR_ERV_Anl_NormalReturn; } void fn_vLipsSynchroLoadInit() { SCR_fn_v_RdL0_RegisterCallback(C_SectionA3dLSGeneral, fn_xLoadLSGeneral, SCR_CRC_c_RdL0_ForSection); SCR_fn_v_RdL0_RegisterCallback(C_SectionA3dLSData, fn_xLoadLSData, SCR_CRC_c_RdL0_ForSection); /* MR1908*/ SCR_fn_v_RdL0_RegisterCallback(C_SectionTextDial, fn_xLoadLSTextDial, SCR_CRC_c_RdL0_ForSection); SCR_fn_v_RdL0_RegisterCallback(C_SectionLSActing, fn_xLoadLSActing, SCR_CRC_c_RdL0_ForSection); SCR_fn_v_RdL0_RegisterCallback(C_SectionDialogue, fn_xLoadTextDial, SCR_CRC_c_RdL0_ForSection); SCR_fn_v_RdL0_RegisterCallback(C_SectionActing, fn_xLoadActing, SCR_CRC_c_RdL0_ForSection); } #endif /* D_USE_LIPSYNC*/