reman3/Rayman_X/cpa/tempgrp/GAM/P5/LoadAni.c

231 lines
8.8 KiB
C

/*=========================================================================
* LoadAni.c : Loading Animations Files
* This is a part of the Game project.
*
* Version 1.0
* Creation date 18/10/96
* Revision date
*
* That file needs to be compatible for all platforms.
*
* (c) Ubi Studios 1996
*=======================================================================*/
#define D_ObjsTbls_Define
#include "ToolsCPA.h"
#include "Main.h"
#include "Options/Def_Snd.h"
#include "Options/Options.h"
#include "Macros.h"
#include "Structur/Anim_s.h"
#include "Structur/ErrGame.h"
#include "Structur/GameScpt.h"
#include "Structur/MemGame.h"
#include "Structur/StdObjSt.h"
#include "Structur/EngMode.h"
#include "Structur/3DOSLkTb.h"
/* For interpolated animations*/
#include "ChanList.h"
#include "PlayAnim/Interpol/a3x_intn.h"
#include "PlayAnim/playevts.h"
#include "Family.h"
#include "ObjType.h"
#include "Basic.h"
#include "LoadAni.h"
#include "playanim/playanim.h"
#include "Macros.h"
#include "ZeMem.h"
#include "Physicol.h"
#include "PO.h"
#include "Structur/ObjsTbls.h"
#include "CHLLoad.h"
/* current animation file version*/
#define C_AnimationFileVersion 6
unsigned short g_uwCurrentFrame; /* MR2307*/
BOOL g_abActiveStatus[255]; /* MR2307*/
tdstAnim3d *g_p_stCurrentAnim; /* MR2908*/
ACP_tdxBool GAM_g_bIsFirstAnim=TRUE;
/*-----------------------------------------------------------------------------
* Description : initialize link table that will contain all link between
* animation name and pointer to animation
*-----------------------------------------------------------------------------
* Input : none
* Output : void
*-----------------------------------------------------------------------------
* Creation date : 25/02/97 Author : VL
*-----------------------------------------------------------------------------
* Modification date : Modification Author :
* Modifications :
*---------------------------------------------------------------------------*/
void fn_vInitAnimationLinkTable( void )
{
SCR_fn_v_Link_InitTable(&g_st3DOSLinkTable.stAnimation);
}
/*-----------------------------------------------------------------------------
* Description : Close link table
* animation name and pointer to animation
*-----------------------------------------------------------------------------
* Input : none
* Output : void
*-----------------------------------------------------------------------------
* Creation date : 29/05/97 Author : SD
*-----------------------------------------------------------------------------
* Modification date : Modification Author :
* Modifications :
*---------------------------------------------------------------------------*/
void fn_vCloseAnimationLinkTable( void )
{
SCR_fn_v_Link_CloseTable(&g_st3DOSLinkTable.stAnimation);
}
void fn_vDeleteAnimationLinkTable(unsigned char ucMin,unsigned char ucMax)
{
SCR_fn_v_Link_DeleteEntryWithPriority(&g_st3DOSLinkTable.stAnimation,ucMin,ucMax);
}
/*-----------------------------------------------------------------------------
* Description : return Animation link table for use outside this module
*-----------------------------------------------------------------------------
* Input : none
* Output : SCR_tdst_Link_Table *
*-----------------------------------------------------------------------------
* Creation date : 25/02/97 Author : VL
*-----------------------------------------------------------------------------
* Modification date : Modification Author :
* Modifications :
*---------------------------------------------------------------------------*/
SCR_tdst_Link_Table *fnp_stGetAnimationLinkTable( void )
{
return (&g_st3DOSLinkTable.stAnimation);
}
/*-----------------------------------------------------------------------------
* Description : Update the pointers into array of events of an animation
* Must be called after the load process of an A3i
* Sort Event to have Never Play at the beginning
*-----------------------------------------------------------------------------
* Input : _p_stAnim : The animation to process
* _h_ObjectsTablesListElement : The objects table containing
* the events
* Output :
*-----------------------------------------------------------------------------
* Creation date : Feb 98 Author : Al1
* Modif 08/10/98 : Sort Event - Carlos Torres
*-----------------------------------------------------------------------------*/
void GAM_fn_vUpdateEventArrayOfAnimation(struct tdstAnim3d_* _p_stAnim, tdxHandleToObjectsTablesList _h_ObjectsTablesListElement) {
int i;
tdstEvent * p_stEvent, * p_stEventNeverPlay;
/* set TBL Event & put Never Play Event at the beggining*/
for(i=0,p_stEvent=NULL,p_stEventNeverPlay=_p_stAnim->d_stAnimEvent;i<_p_stAnim->ucNumberOfEvents;++i,p_stEventNeverPlay++) {
/* set the tbl event*/
p_stEventNeverPlay->p_stfEventInTBL=
(tdstEventInTable*)_h_ObjectsTablesListElement->d_stObjectsTable[p_stEventNeverPlay->usEventNumberInTBL].h_Target;
/* blindage*/
#ifdef _DEBUG
if (!p_stEventNeverPlay->p_stfEventInTBL) {
char szMessage[50];
sprintf(szMessage,"Problem with event (element %d in TBL) - try to rebuild A3i file",p_stEventNeverPlay->usEventNumberInTBL+1);
Erm_M_UpdateLastError( Game, C_ucErmDefaultChannel, E_uwGameErrorWhileLoadingAnimation,
C_lErmNoDebugData,C_ucErmOpenInfoWindow, C_ucAllowStopForDebug,szMessage);
}
#endif
/* found first non never play event*/
if (!p_stEvent && (GAM_fn_ucGetFirstCallOfEvent(p_stEventNeverPlay) != C_ucNeverPlay))
p_stEvent = p_stEventNeverPlay;
/* found a never play */
else if (GAM_fn_ucGetFirstCallOfEvent(p_stEventNeverPlay) == C_ucNeverPlay) {
/* set the frame & channel to 0*/
p_stEventNeverPlay->uwChannelNumber = p_stEventNeverPlay->uwFrameNumber = 0;
/* there is a non never play before*/
if (p_stEvent) {
tdstEvent * p_stTmpEvent;
/* we move up the never play event until the first non never play*/
for(p_stTmpEvent = p_stEventNeverPlay-1;p_stTmpEvent >= p_stEvent;p_stTmpEvent--) {
/* permute Event*/
tdstEvent stEvent = *(p_stTmpEvent+1);
*(p_stTmpEvent+1) = *p_stTmpEvent;
*p_stTmpEvent = stEvent;
}
/* now the fisrt non never play has moved 1 place down*/
p_stEvent++;
}
}
}
}
/*----------------------------------------------------------------------------
// Description : fn_vAddAnimIntoA3bLinkTable
----------------------------------------------------------------------------//
// Methods : None
----------------------------------------------------------------------------//
// Input : _p_stAnim : pointer to the animation loaded
// _szAnimFileName : Name of the animation file
// Output :
----------------------------------------------------------------------------//
// Creation date : Jun 97 Author: Alain Robin
----------------------------------------------------------------------------//
// Modifications :
// Modification date : Modification author :
----------------------------------------------------------------------------*/
void fn_vAddAnimIntoA3bLinkTable(tdstAnim3d* _p_stAnim, char* _szAnimFileName)
{
char szCompleteName[256];
SCR_tdst_Link_Table* p_stAnimationLinkTable=NULL;
p_stAnimationLinkTable=fnp_stGetAnimationLinkTable();
strcpy(szCompleteName,_szAnimFileName);
szCompleteName[strlen(szCompleteName)-1]='d';
SCR_fnp_st_Link_SetValue(p_stAnimationLinkTable,szCompleteName,(unsigned long)_p_stAnim);
}
/*----------------------------------------------------------------------------
// Description : fn_p_stGetAnimIntoA3bLinkTable
----------------------------------------------------------------------------//
// Methods : None
----------------------------------------------------------------------------//
// Input : _szAnimFileName : Name of the animation file
// Output : NULL if the anim isn't already loaded the pointer instead
----------------------------------------------------------------------------//
// Creation date : Jun 97 Author: Alain Robin
----------------------------------------------------------------------------//
// Modifications :
// Modification date : Modification author :
----------------------------------------------------------------------------*/
tdstAnim3d* fn_p_stGetAnimIntoA3bLinkTable(char* _szAnimFileName)
{
SCR_tdst_Link_Value *p_stLinkValue;
SCR_tdst_Link_Table* p_stAnimationLinkTable=NULL;
char szCompleteName[256];
strcpy(szCompleteName,_szAnimFileName);
szCompleteName[strlen(szCompleteName)-1]='d';
p_stAnimationLinkTable=fnp_stGetAnimationLinkTable();
p_stLinkValue=SCR_fnp_st_Link_SearchKey(p_stAnimationLinkTable,szCompleteName);
if(p_stLinkValue!=NULL)
return (tdstAnim3d*)(p_stLinkValue->ulValue);
else
return NULL;
}