reman3/Rayman_X/cpa/tempgrp/GAM/GameEng.c

2513 lines
83 KiB
C

/*=========================================================================
* GameEng.cpp : Engine of Game
* It is in this file that the SuperObject Tree is explored.
* This is a part of the Game project.
*
* Version 1.0
* Creation date 22/08/96
* Revision date
*
* That file needs to be compatible for all platforms.
*
* (c) Ubi Studios 1996
*====d==============================================u======dd======d=========*/
/*
*=======================================================================
Modifications: New LST_M_??? Macros / Michaël / 070297
*=======================================================================*/
#define D_CineInfo_StructureDefine
#include "ToolsCPA.h"
/* Oliv' - Portage v14 - ah ah ah... - vous n'avez jamais pensé au #ifdef PC ??*/
#ifndef U64
#include "X:\cpa\tempgrp\GLIGLOU\MULTIDRV\inc\PvObj_st.h"
#include "X:\CPA\tempgrp\GLIGLOU\MULTIDRV\inc\linear.h"
#endif
/* EndOfOliv'*/
#include "input.h"
#include "gli.h"
#include "tex.h"
/* SOUND*/
#include "SND.h"
/* SOUND fin*/
#include "Options/LightOpt.h"
#include "Macros.h"
#include "Structur/Input_s.h"
#include "Ai\AiBase\WPEngDsp.h"
#include "safe.h" /*BART*/
#include "SCT.h"
#include "GAM.h"
#include "Main.h"
#include "DspFix.h"
#include "ToolCam.h"
#include "ToolMatr.h"
#include "ZdxStuff.h"
#include "PhysiCol.h"
#include "MainChar.h"
#include "Effect.h"
#include "AlwAct.h"
/*#include "GamExtra.h"*/
/*XB980824*/
#ifndef D_THROW_MGT
#include "Mgt.h"
#endif /* D_THROW_MGT */
/*End XB*/
#include "DspFix.h"
#if defined(U64)
#include "rcptask.h"
#endif /* U64 */
#include "PRF.h"
#if defined(USE_PROFILER) && !defined(PRESS_DEMO)
extern void GAM_fn_vPrepareShowRasters (unsigned long);
extern void GAM_fn_vShowRasters();
extern void GAM_fn_vSlowDownEngine (unsigned long);
extern void GLI_fn_vShowFrameRate( GLD_tdstViewportAttributes *_p_stViewport );
#else
#define GLI_fn_vShowFrameRate(V)
#endif /* USE_PROFILER && PRESS_DEMO */
#if defined(_DEBUG)
/* ANNECY AV DEMO {*/
#ifndef U64
#include "Specif/Demos.h"
#endif
/* END ANNECY AV }*/
/*--- For displaying Waypoints and Sector infos ---*/
extern unsigned char g_ucWhatDoIDisplay;
extern unsigned char g_ucZDCVisible;
extern char * g_szZoneTypes[5];
extern char * g_szDisplayTypes[2];
extern unsigned char g_ucDisplayWaypoints;
extern unsigned char g_ucSCTDisplaySectors;
extern void SECT_vDisplaySectorInfos(void);
extern unsigned char g_ucDisplayBoundingVolumes;
/* ANNECY CG KEY 4 ACTIVATED GENDOORS 18/06/98 {*/
extern unsigned char g_ucDisplayActivatedGendoors;
#if !defined(U64) && defined(_DEBUG)
extern unsigned char g_ucDisplayRayTraceSegments;
extern MTH3D_tdstVector g_stRayTraceSegmentOrigin[30];
extern MTH3D_tdstVector g_stRayTraceSegmentEnd[30];
extern short g_wRayTraceSegmentLife[30];
unsigned char g_ucSlowDownEngine;
unsigned char g_ucSlowDownTime;
#endif /* !U64 && _DEBUG */
/* } ENDANNECY CG*/
#endif /*_DEBUG*/
/* Oliv' - 19/05/1999 - I want to see Zdx too */
#if defined(_U64_GLI_BENCH_)
extern unsigned char g_ucZDCVisible;
extern char * g_szZoneTypes[5];
extern ACP_tdxBool GLIBENCH_g_bWireFrame;
#endif /* _U64_GLI_BENCH_ */
/* EndOfOliv' */
#if defined(WIN32) && !defined(RETAIL) && !defined(PRESS_DEMO)
int GAM_g_iStepMode = -1 ;
#define M_IfCanDoFullStep() if ( GAM_g_iStepMode != 0 )
#define M_FullStepDone() ( ( void ) ( ( GAM_g_iStepMode > 0 ) ? ( -- GAM_g_iStepMode ) : GAM_g_iStepMode ) )
#define M_bIfIsNotStepping() if ( GAM_g_iStepMode == -1 )
#define M_bIfIsStepping() if ( GAM_g_iStepMode != -1 )
#else
#define M_IfCanDoFullStep() if ( 1 )
#define M_FullStepDone()
#define M_bIfIsNotStepping() if ( 1 )
#define M_bIfIsStepping() if ( 0 )
#endif /* WIN32 && !RETAIL */
#ifndef RETAIL
/*--- for displaying choice of level*/
extern char g_cChooseLevel;
#endif /* !RETAIL */
extern void GLI_fnv_DrawRectangle( struct GLD_tdstViewportAttributes_ *p_stVpt, MTH3D_tdstVector *p_stFirstPoint, MTH3D_tdstVector *p_stLastPoint, long lColor );
/* XB 05/05/99 */
#ifdef U64
extern void MOR_fn_vUnLockAllMorphTasks(void);
extern void fn_vDisplaySky( GLD_tdstViewportAttributes *_p_stViewport);
extern void GLI_vPrintGuruError( int Y, char *p_szErrorString );
#include "INO\Specif\u_cont.h"
#endif /* U64 */
#ifdef WIN32
extern ACP_tdxBool fn_bDisplaySky( HIE_tdxHandleToSuperObject hSOSector, HIE_tdxHandleToSuperObject hSOCamera, GLD_tdstViewportAttributes *_p_stViewport );
#endif
/* End XB 05/05/99 */
/****************************/
/* functions declarations*/
/* See Olivier for details and comments*/
/****************************/
#if !defined(PRESS_DEMO)
ACP_tdxBool fn_bEdNOCLIP(HIE_tdxHandleToSuperObject hCharacter);
#endif /* PRESS_DEMO */
void fn_vTreatCharactersInSector(HIE_tdxHandleToSuperObject hCharacter);
extern void GEO_fn_vMorphAddInMainLoop();
void fn_vUpdateDynamicHierarchy();
/****************************/
/* ANNECY MT - 14/09/98 { to display info on Wnd screen*/
#if defined(USE_PROFILER) && !defined(PRESS_DEMO)
extern void DisplayPolices (char * _szText , long _lX , long _lY);
#define GLI_vDisplayPolices(Text,X,Y) DisplayPolices((char*)(Text),X,Y)
#if !defined(U64)
extern void GAM_fn_vRasterDump();
extern void GAM_fn_vRasterDumpUpdate(unsigned long,unsigned long,unsigned long,unsigned long,unsigned long);
extern void GAM_fn_vRasterDumpBeginLoop();
extern void GAM_fn_vRasterDumpEndLoop();
#endif
#endif
/* END ANNECY MT }*/
/****************************/
#ifdef ACTIVE_EDITOR
extern void PLA_fn_vUpdateFrameCounterForModules(HIE_tdxHandleToSuperObject p_stSuperObject);
#endif
/* Oliv' - Enable loading once of all Maps - 08/06/1999 */
// #define TEST_LOAD_ALL_MAPS
/* EndOfOliv' */
/****************************/
/* Init the dynam structure for a character*/
/* See Olivier for details and comments*/
/****************************/
void fn_vInitBehaviourOfACharacter(
HIE_tdxHandleToSuperObject _hCharacter)
{
tdstEngineObject * p_stObject = HIE_fn_hGetSuperObjectObject(_hCharacter);
/* DYNAM -> CINEINFO MT 26/08/98 {
if( p_stObject->h_Dynam )
{
fn_vUpdateDynamicsMS(p_stObject);
}
DYNAM -> CINEINFO } */
if( p_stObject->h_Brain )
{
fn_vReinitAI(M_pstGetMindOfBrain(p_stObject->h_Brain));
}
if( p_stObject->h_3dData )
{
PLA_fn_vInitNewState(_hCharacter,fn_h3dDataGetInitialState(M_GetMSHandle(_hCharacter,3dData)));
}
}
/****************************/
/* Special function to teleport a character on the map*/
/* See Olivier for details and comments*/
/****************************/
#if !defined(PRESS_DEMO)
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */
ACP_tdxBool fn_bMoveCharacterAtPosition(
HIE_tdxHandleToSuperObject _hCharacter,
MTH_tdxReal _xX,MTH_tdxReal _xY,MTH_tdxReal _xZ)
{
MTH3D_tdstVector stV;
ACP_tdxBool bTmp;
HIE_tdxHandleToSuperObject hMainCamera = CAM_fn_hGetActiveCamera(CAM_e_MainViewport);
if( _hCharacter == MC_fn_hGetCharacterInMainCharacterNode(MC_fn_hGetFirstMainCharNode()) )
{
fn_vReputCharacterSuperObjectAtTheWorld(_hCharacter);
fn_vReputCharacterSuperObjectAtTheWorld(hMainCamera);
MTH3D_M_vSetVectorElements(&stV,_xX,_xY,_xZ);
POS_fn_vSetTranslationVector(HIE_fn_hGetSuperObjectMatrix(_hCharacter),&stV);
POS_fn_vMulMatrixMatrix(HIE_fn_hGetSuperObjectGlobalMatrix(_hCharacter),HIE_fn_hGetSuperObjectGlobalMatrix(HIE_fn_hGetSuperObjectFather(_hCharacter)),HIE_fn_hGetSuperObjectMatrix(_hCharacter));
POS_fn_vSetTranslationVector(HIE_fn_hGetSuperObjectMatrix(hMainCamera),&stV);
POS_fn_vMulMatrixMatrix(HIE_fn_hGetSuperObjectGlobalMatrix(hMainCamera),HIE_fn_hGetSuperObjectGlobalMatrix(HIE_fn_hGetSuperObjectFather(hMainCamera)),HIE_fn_hGetSuperObjectMatrix(hMainCamera));
bTmp = fn_bEdNOCLIP(_hCharacter);
fn_bEdNOCLIP(hMainCamera);
}
else
{
fn_vReputCharacterSuperObjectAtTheWorld(_hCharacter);
MTH3D_M_vSetVectorElements(&stV,_xX,_xY,_xZ);
POS_fn_vSetTranslationVector(HIE_fn_hGetSuperObjectMatrix(_hCharacter),&stV);
POS_fn_vMulMatrixMatrix(HIE_fn_hGetSuperObjectGlobalMatrix(_hCharacter),HIE_fn_hGetSuperObjectGlobalMatrix(HIE_fn_hGetSuperObjectFather(_hCharacter)),HIE_fn_hGetSuperObjectMatrix(_hCharacter));
bTmp = fn_bEdNOCLIP(_hCharacter);
}
return bTmp;
}
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */
#endif /* PRESS_DEMO */
/****************************/
/* Special function For updating the sector of camera*/
/* See Olivier for details and comments*/
/****************************/
void fn_vUpdateSectorInfoAfterNOCLIP(HIE_tdxHandleToSuperObject hCamera)
{
MS_tdxHandleToCineinfo hCineinfo = M_GetMSHandle(hCamera,Cineinfo);
HIE_tdxHandleToSuperObject hTarget;
hTarget = CAM_fn_hCineInfoGetSuperObjectTargeted(hCineinfo->hInit);
fn_vSectInfoSetCurrentSector(M_GetMSHandle(hCamera,SectInfo),fn_h_SectInfoGetCurrentSector(M_GetMSHandle(hTarget,SectInfo)));
fn_vInsertObjectInSectorList(fn_h_SectInfoGetCurrentSector(M_GetMSHandle(hCamera,SectInfo)),hCamera);
fn_vInsertObjectInSectorList(fn_h_SectInfoGetCurrentSector(M_GetMSHandle(hTarget,SectInfo)),hTarget);
}
/****************************/
/* Special function to move quickly Ed on map*/
/* See Olivier for details and comments*/
/****************************/
#if !defined(PRESS_DEMO)
ACP_tdxBool fn_bEdNOCLIP(HIE_tdxHandleToSuperObject hCharacter)
{
#if !defined(FINAL_VERSION) || defined(FINAL_VERSION_FOR_TESTERS)
MTH3D_tdstVector stV,stAdd,stCumul;
GLI_tdxValue xAngle,/*xX,xY,xZ,*/xAngle2;
/* ANNECY AV {*/
static MTH_tdxReal xSpeed = MTH_C_ONE;
/* END ANNECY AV }*/
MTH_tdxReal xCurrentSpeed;
MTH_tdxReal xAlpha = MTH_M_xFloatToReal(0.15f);
ACP_tdxBool bTmp;
bTmp = TRUE;
xAngle=fn_xComputeAngleOfPerso(hCharacter);
xAngle2=0.0;
MTH3D_M_vSetVectorElements(&stCumul,0.0,0.0,0.0);
xCurrentSpeed = xSpeed;
if (IPT_fn_bIsValidated(g_st_3DOS_EntryActions.hFlyingModeDoubleSpeed)==IPT_C_TRUE)
{
xAlpha *= 2.0;
xCurrentSpeed = 2.0f*xSpeed;
}
M_bIfIsStepping()
{
xCurrentSpeed = MTH_M_xMul(xCurrentSpeed, MTH_M_xFloatToReal(0.1f)) ;
xAlpha = MTH_M_xMul(xAlpha, MTH_M_xFloatToReal(0.1f)) ;
}
if (IPT_fn_bIsValidated(g_st_3DOS_EntryActions.hFlyingModeForward)==IPT_C_TRUE)
{
/* Straight away*/
MTH3D_M_vSetVectorElements(&stAdd,0.0,-xCurrentSpeed,0.0);
MTH3D_M_vAddVector(&stCumul,&stAdd,&stCumul);
}
if (IPT_fn_bIsValidated(g_st_3DOS_EntryActions.hFlyingModeBackward)==IPT_C_TRUE)
{
/* Rear*/
MTH3D_M_vSetVectorElements(&stAdd,0.0,xCurrentSpeed,0.0);
MTH3D_M_vAddVector(&stCumul,&stAdd,&stCumul);
}
if (IPT_fn_bIsValidated(g_st_3DOS_EntryActions.hFlyingModeStrafeLeft)==IPT_C_TRUE)
{
/* Strafe left*/
MTH3D_M_vSetVectorElements(&stAdd,xCurrentSpeed,0.0,0.0);
MTH3D_M_vAddVector(&stCumul,&stAdd,&stCumul);
}
if (IPT_fn_bIsValidated(g_st_3DOS_EntryActions.hFlyingModeStrafeRight)==IPT_C_TRUE)
{
/* Strafe right*/
MTH3D_M_vSetVectorElements(&stAdd,-xCurrentSpeed,0.0,0.0);
MTH3D_M_vAddVector(&stCumul,&stAdd,&stCumul);
}
if (IPT_fn_bIsValidated(g_st_3DOS_EntryActions.hFlyingModeLeft)==IPT_C_TRUE)
{
/* Left*/
xAngle2+=(MTH_tdxReal)xAlpha;
}
if (IPT_fn_bIsValidated(g_st_3DOS_EntryActions.hFlyingModeRight)==IPT_C_TRUE)
{
/* Right*/
xAngle2-=(MTH_tdxReal)xAlpha;
}
if (IPT_fn_bIsValidated(g_st_3DOS_EntryActions.hFlyingModeDown)==IPT_C_TRUE)
{
/* Down*/
MTH3D_M_vSetVectorElements(&stAdd,0.0,0.0,-xCurrentSpeed);
MTH3D_M_vAddVector(&stCumul,&stAdd,&stCumul);
}
if (IPT_fn_bIsValidated(g_st_3DOS_EntryActions.hFlyingModeUp)==IPT_C_TRUE)
{
/* Up*/
MTH3D_M_vSetVectorElements(&stAdd,0.0,0.0,xCurrentSpeed);
MTH3D_M_vAddVector(&stCumul,&stAdd,&stCumul);
}
/* ANNECY AV {*/
/*
if (IPT_fn_bIsValidated(g_st_3DOS_EntryActions.hFlyingModeSpeedIncrease)==IPT_C_TRUE)
{
if( xSpeed <= 6.0 )
xSpeed += 0.1f;
}
if (IPT_fn_bIsValidated(g_st_3DOS_EntryActions.hFlyingModeSpeedDecrease)==IPT_C_TRUE)
{
if( xSpeed > 0.1 )
xSpeed -= 0.1f;
}
*/
/* END ANNECY AV }*/
fn_vSetRotationMatrixZ(HIE_fn_hGetSuperObjectMatrix(hCharacter),(xAngle+xAngle2-MTH_C_PiBy2));
POS_fn_vGetTranslationVector(HIE_fn_hGetSuperObjectMatrix(hCharacter),&stV);
POS_fn_vMulMatrixVector(&stCumul,HIE_fn_hGetSuperObjectMatrix(hCharacter),&stCumul);
MTH3D_M_vAddVector(&stV,&stV,&stCumul);
POS_fn_vSetTranslationVector(HIE_fn_hGetSuperObjectMatrix(hCharacter),&stV);
POS_fn_vSetTranslationVector(HIE_fn_hGetSuperObjectGlobalMatrix(hCharacter),&stV);
/* MEC_vInitTranslation(fn_p_stDynamGetDynamics(M_GetMSHandle(hCharacter,Dynam)),hCharacter,&stV);*/
DNM_M_vDynamicsSetInit ( fn_p_stDynamGetDynamics(M_GetMSHandle(hCharacter,Dynam)), TRUE );
return bTmp;
#else /* !defined(FINAL_VERSION) || defined(FINAL_VERSION_FOR_TESTERS) */
return FALSE;
#endif /* !defined(FINAL_VERSION) || defined(FINAL_VERSION_FOR_TESTERS) */
}
#endif /* PRESS_DEMO */
/****************************/
/* Deal with a character.*/
/* See Olivier for details and comments*/
/* 20/04/98 Carlos Torres call PLA_fn_vOverWriteMatrixWithUCC*/
/* when frmae is skip to update UCC matrix*/
/****************************/
void fn_vTreatCharactersInSector(HIE_tdxHandleToSuperObject hCharacter)
{
/*tdstEngineObject *p_stEngObj;*/
MTH3D_tdstVector stOldV;
MS_tdxHandleToDynam h_Dynam;
struct DNM_stDynamics *p_stDynamic;
ACP_tdxBool bSectorChange=TRUE;
#if (defined(USE_PROFILER) && !defined(PRESS_DEMO) && !defined(U64))
long lDuration;
#endif
/* equivalent a M_TreatObject */
fn_vStandardGameSetLastTrame(M_GetMSHandle(hCharacter,StandardGame), g_stEngineStructure.stEngineTimer.ulTrameNumber);
POS_fn_vGetTranslationVector(HIE_fn_hGetSuperObjectGlobalMatrix(hCharacter),&stOldV);
/* fly mode is handled somewhere else, so don't handle main character when in fly mode here */
if ( ( hCharacter != MC_fn_hGetCharacterInMainCharacterNode( MC_fn_hGetFirstMainCharNode()) ) || !g_ucIsEdInGhostMode )
{
/*p_stEngObj=(tdstEngineObject *)HIE_fn_hGetSuperObjectObject(hCharacter);
M_TreatObject(p_stEngObj);*/
/* ANNECY AV DEMO {*/
#ifndef U64
if(g_DEMO_KeybTest != DEMO_PLAY)
{
#endif
/* END ANNECY AV }*/
MS_tdxHandleTo3dData h_Current3dData;
h_Current3dData = M_GetMSHandle(hCharacter,3dData);
/* Play anims*/
if (h_Current3dData)
{
ACP_tdxBool bSkip,bNoDisplay;
unsigned long ulCurrentBits;
struct tdstState_ *p_stCurrentState;
struct tdstAnim3d_ *p_stCurrentAnim;
ulCurrentBits = fn_ulStandardGameGetCustomBits(M_GetMSHandle(hCharacter,StandardGame));
p_stCurrentState = fn_h3dDataGetCurrentState(h_Current3dData);
p_stCurrentAnim = p_stCurrentState ? fn_p_stGetAnimInState(p_stCurrentState): NULL;
/* GAM_C_CustBitNoAnimPlayer => no player*/
/* GAM_C_CustBitUnseenFrozen => nothing if actor not displayed*/
/* GAM_C_CustBitUnseenFrozenAnimPlayer => no player if actor not displayed*/
/* GAM_C_CustBitNoAnimPlayerWhenTooFar => no player if actor too far from Rayman*/
bNoDisplay = (ACP_tdxBool) (
(p_stCurrentAnim == NULL)
|| ((ulCurrentBits & GAM_C_CustBitNoAnimPlayer) && (HIE_M_lGetNumberOfChildren(hCharacter) > 0))
|| ((ulCurrentBits & GAM_C_CustBitOutOfVisibility) && (ulCurrentBits & (GAM_C_CustBitUnseenFrozen|GAM_C_CustBitUnseenFrozenAnimPlayer)))
|| ((ulCurrentBits & GAM_C_CustBitNoAnimPlayerWhenTooFar) && fn_bStandardGameIsTooFar(M_GetMSHandle(hCharacter,StandardGame)))
);
if (!bNoDisplay || ulCurrentBits & GAM_C_CustBitSoundWhenInvisible)
{
PRF_fn_vStartChrono( PRF_C_ulFctAnimPlayer, hCharacter );
#if (defined(USE_PROFILER) && !defined(PRESS_DEMO) && !defined(U64))
#pragma warning (disable : 4146)
lDuration = -TMR_fn_ulFastGetInternalCounter();
#pragma warning (default : 4146)
#endif
bSkip = PLA_fn_bSkipCurrentFrame(hCharacter);
/* ANNECY MT - 07/12/98 {*/
/* if AI changes something which need to do frame, no skip*/
bSkip &= !fn_b3dDataHasAnimMatrixChanged(h_Current3dData);
/* END ANNECY MT }*/
/* if current state is finished and next state is NULL, then stop playing the anim, skip it*/
bSkip |= fn_uc3dDataGetFlagEndState(h_Current3dData);
if (bSkip)
{
PRF_fn_lIncIndependantVariable(PRF_C_ulIdpNbSkippedAnims,1);
#ifdef ACTIVE_EDITOR
/* update modules SO frame number*/
PLA_fn_vUpdateFrameCounterForModules(hCharacter);
#endif
}
/* if anim is not skipped, play it */
if ( ! bSkip )
PLA_fn_bDoAnimPlayerForCharacter ( hCharacter , bNoDisplay , ( ACP_tdxBool ) FALSE ) ;
#if (defined(USE_PROFILER) && !defined(PRESS_DEMO) && !defined(U64))
lDuration += TMR_fn_ulFastGetInternalCounter();
if(M_GetMSHandle(hCharacter,StandardGame))
{
GAM_fn_vRasterDumpUpdate((unsigned long)fn_otStandardGameGetModelType(M_GetMSHandle(hCharacter,StandardGame)),0,lDuration,0,0);
}
#endif
PRF_fn_vStopChrono( PRF_C_ulFctAnimPlayer, hCharacter );
}
else
{
#ifdef ACTIVE_EDITOR
/* update modules SO frame number*/
PLA_fn_vUpdateFrameCounterForModules(hCharacter);
#endif
bSkip = TRUE;
}
/* ANNECY MT - 23/10/98 {*/
#if (defined(USE_PROFILER) && !defined(PRESS_DEMO) && !defined(U64))
GAM_fn_vRasterDumpUpdate((unsigned long)fn_otStandardGameGetModelType(M_GetMSHandle(hCharacter,StandardGame)),0,0,0,1);
#endif
/* END ANNECY MT }*/
/* Do treatment*/
fn_vMakeCharacterReact(hCharacter);
/* JO 01/07/97*/
if( !M_GetMSHandle(hCharacter,StandardGame) )
return;
/* JO fin*/
}
/* ANNECY AV DEMO {*/
#ifndef U64
}
else
{
DEMO_fn_vGetACompleteCharacterPosition(hCharacter);
}
#ifndef RETAIL
if (g_DEMO_KeybTest == DEMO_RECORD && ! CAM_fn_bSuperObjectIsACamera (hCharacter)) DEMO_SaveInfo (hCharacter);
#endif /* RETAIL */
#endif
/* END ANNECY AV }*/
PRF_fn_vStartChrono( PRF_C_ulFctIADNMPLAMisc, NULL );
/* water streak effect */
fn_vWaterStreakEffect(&g_stEngineStructure.stViewportAttr,hCharacter,
g_stEngineStructure.ulDisplayMode);
#ifndef D_THROW_PRT
/* New particles generation */
fn_vMSPrtSrcSourceGenerateParticles(hCharacter);
#endif /* D_THROW_PRT */
/* MR2002*/
#ifdef __3DOSLIGHTS
fn_vUpdateLight(hCharacter);
#endif
/* Deal with changes of sector*/
if( g_ucIsEdInGhostMode && CAM_fn_bSuperObjectIsACamera(hCharacter) )
{
fn_vSectInfoSetCurrentSector(
M_GetMSHandle(hCharacter,SectInfo),
fn_h_SectInfoGetCurrentSector(M_GetMSHandle(MC_fn_hGetCharacterInMainCharacterNode( MC_fn_hGetFirstMainCharNode()),SectInfo)));
fn_vInsertObjectInSectorList(fn_h_SectInfoGetCurrentSector(M_GetMSHandle(hCharacter,SectInfo)),hCharacter);
}
else
{
/* Do not update sector for fix objects and camera without collisions */
if
(!(
HIE_fn_SO_bIsSuperimposed(hCharacter)
||
(
CAM_fn_bSuperObjectIsACamera(hCharacter) /* camera without collision */
&& (g_stEngineStructure.cCameraMode == 1)
&& ( M_GetMSHandle(hCharacter,Cineinfo)->hWork->uwDNMFlags & DNM_CAM_C_NoObstacle )
)
))
{
h_Dynam = M_GetMSHandle(hCharacter,Dynam);
if (h_Dynam)
{
p_stDynamic = fn_p_stDynamGetDynamics(h_Dynam);
if (p_stDynamic)
{
if ((DNM_M_bDynamicsIsAdvancedSize(p_stDynamic)) && (DNM_M_bDynamicsIsCollide(p_stDynamic)))
bSectorChange = (ACP_tdxBool)(DNM_M_cDynamicsGetCollideCounter (p_stDynamic)==0);
else
bSectorChange = TRUE;
}
}
if (bSectorChange)
{
GAM_fn_vSectInfoTestChangeSectorForCharacter(hCharacter);
}
}
}
PRF_fn_vStopChrono( PRF_C_ulFctIADNMPLAMisc, NULL );
}
}
/*********************************************************************************************************************/
/****************************/
/* Deal with the Dynamic Hierarchy*/
/* See Olivier for details and comments*/
/* new : update TooFar Flag (MT 11/03/99) */
/****************************/
void fn_vTreatDynamicHierarchy(HIE_tdxHandleToSuperObject hSuperObj, HIE_tdxHandleToSuperObject hMainChar, MTH3D_tdstVector *p_stMainCharTranslation)
{
HIE_tdxHandleToSuperObject hChild,hNextChild,hPrevChild;
tdstEngineObject * p_stObj;
long i;
unsigned long ulCustomBits;
MTH3D_tdstVector stDist;
if(HIE_fn_ulGetSuperObjectType(hSuperObj) == HIE_C_ulActor)
{
/* here we are an actor*/
MS_tdxHandleToStandardGame hStdGame = M_GetMSHandle(hSuperObj, StandardGame);
p_stObj = (tdstEngineObject *) HIE_fn_hGetSuperObjectObject(hSuperObj);
if( !hStdGame /* if it is a dead always*/
||
( /* or a non-platform that we already handled or which is inactive*/
(fn_ucStandardGameGetPlatFormType(hStdGame) == 0)
&&
(!M_ObjectIsActive(p_stObj) || M_ObjectIsAlreadyTreated(p_stObj))
)
)
{
/* do nothing*/
return;
}
/* here we have either a platform, or a non-handled live normal actor that is not a camera*/
HIE_fn_vPushMatrix(hSuperObj);
if ( fn_ucStandardGameGetPlatFormType(hStdGame) == 0 ) /* if a normal actor*/
{
/* if the actor is protected from freeze, or the engine is no frozen -> lets do it!*/
if ( !g_stEngineStructure.bEngineFrozen || (fn_ulStandardGameGetCustomBits(hStdGame) & GAM_C_CustBitUnfreezable) )
{
/* Update TooFar Flag */
if ( hSuperObj == hMainChar )
{
fn_vStandardGameSetTooFar(hStdGame,FALSE);
}
else
{
ulCustomBits = fn_ulStandardGameGetCustomBits(hStdGame);
if ( ulCustomBits & (GAM_C_CustBitNoAnimPlayerWhenTooFar|GAM_C_CustBitNoAIWhenTooFar|GAM_C_CustBitNoMecaWhenTooFar) )
{
MTH3D_M_vSubVector( &stDist,
POS_fn_p_stGetTranslationVector(HIE_fn_hGetSuperObjectGlobalMatrix(hSuperObj)),
p_stMainCharTranslation);
if( MTH_M_bLess(MTH3D_M_xNorm1Vector(&stDist) , MTH_M_xLongToReal(fn_ucStandardGameGetTooFarLimit(hStdGame))) )
{
fn_vStandardGameSetTooFar(hStdGame,FALSE);
}
else
{
fn_vStandardGameSetTooFar(hStdGame,TRUE);
}
}
}
fn_vTreatCharactersInSector(hSuperObj);
}
#ifdef ACTIVE_EDITOR /* { */
else
{
/* update modules SO frame number*/
PLA_fn_vUpdateFrameCounterForModules(hSuperObj);
}
#endif /* } */
HIE_fn_vPopMatrix();
HIE_fn_vPushMatrix(hSuperObj);
if( hSuperObj == MC_fn_hGetCharacterInMainCharacterNode( MC_fn_hGetFirstMainCharNode()) )
{
/* The Main actor can have children, when carrying another one.*/
HIE_M_ForEachMovingChildOf(hSuperObj,hChild,hNextChild,i)
{
if ((HIE_fn_ulGetSuperObjectType(hChild) == HIE_C_ulActor) && !CAM_fn_bSuperObjectIsACamera(hChild))
fn_vTreatDynamicHierarchy(hChild, hMainChar, p_stMainCharTranslation);
}
}
}
else
{
/* hSuperObj is a platform : treat child actors, even if the platform is frozen,*/
/* because the children have to be handled to have valid global matrixes*/
HIE_M_InvForEachMovingChildOf(hSuperObj,hChild,hPrevChild,i)
{
if ((HIE_fn_ulGetSuperObjectType(hChild) == HIE_C_ulActor) && !CAM_fn_bSuperObjectIsACamera(hSuperObj))
{
fn_vTreatDynamicHierarchy(hChild, hMainChar, p_stMainCharTranslation);
}
}
}
}
else /*not an actor*/
{
HIE_fn_vPushMatrix(hSuperObj);
HIE_M_ForEachMovingChildOf(hSuperObj,hChild,hNextChild,i)
{
if ( (HIE_fn_ulGetSuperObjectType(hChild) == HIE_C_ulActor) && !CAM_fn_bSuperObjectIsACamera(hChild) )
fn_vTreatDynamicHierarchy(hChild, hMainChar, p_stMainCharTranslation);
}
}
HIE_fn_vPopMatrix();
}
/*----------------------------------------------------------------------
* The same things, but for PlatForms
* new : update TooFar Flag (MT 11/03/99)
*----------------------------------------------------------------------*/
void fn_vTreatDynamicHierarchyOfPlatForms(HIE_tdxHandleToSuperObject hSuperObj)
{
HIE_tdxHandleToSuperObject hChild,hNextChild;
MS_tdxHandleToStandardGame hStdGame;
tdstEngineObject * p_stObj;
long lI;
HIE_tdxHandleToSuperObject hMainChar;
unsigned long ulCustomBits;
MTH3D_tdstVector stDist , *p_stMainCharTranslation;
/* get main character*/
hMainChar = MC_fn_hGetCharacterInMainCharacterNode( MC_fn_hGetFirstMainCharNode());
p_stMainCharTranslation = POS_fn_p_stGetTranslationVector(HIE_fn_hGetSuperObjectGlobalMatrix(hMainChar));
HIE_fn_vPushMatrix(hSuperObj);
/*
* treat platforms
*/
HIE_M_ForEachMovingChildOf(hSuperObj,hChild,hNextChild,lI)
{
/* Add on for editors*/
if ( HIE_fn_ulGetSuperObjectType(hChild) == HIE_C_ulActor )
{
hStdGame = M_GetMSHandle(hChild, StandardGame);
p_stObj = (tdstEngineObject *) HIE_fn_hGetSuperObjectObject(hChild);
if(
!hStdGame /* if it is a dead always (because a platform can be an always too...)*/
|| !M_ObjectIsActive(p_stObj)
|| (g_stEngineStructure.bEngineFrozen && (fn_ulStandardGameGetCustomBits(hStdGame) ^ GAM_C_CustBitUnfreezable)) /* or an unprotected actor while the engine is frozen*/
)
{
/* skip this one and proceed to the next platform*/
#ifdef ACTIVE_EDITOR /* { */
if(g_stEngineStructure.bEngineFrozen && (fn_ulStandardGameGetCustomBits(hStdGame) ^ GAM_C_CustBitUnfreezable))
{
/* update modules SO frame number*/
PLA_fn_vUpdateFrameCounterForModules(hChild);
}
#endif /* } */
continue;
}
/* Is character a platform ?*/
if ( fn_ucStandardGameGetPlatFormType(hStdGame) != 0 )
{
if ( !M_ObjectIsAlreadyTreated(p_stObj) )
{
/* JT PLA_fn_vDesInitAllChildOfCharacter(hChild);*/
/* Update TooFar Flag */
if ( hChild == hMainChar )
{
fn_vStandardGameSetTooFar(hStdGame,FALSE);
}
else
{
ulCustomBits = fn_ulStandardGameGetCustomBits(hStdGame);
if ( ulCustomBits & (GAM_C_CustBitNoAnimPlayerWhenTooFar|GAM_C_CustBitNoAIWhenTooFar|GAM_C_CustBitNoMecaWhenTooFar) )
{
MTH3D_M_vSubVector( &stDist,
POS_fn_p_stGetTranslationVector(HIE_fn_hGetSuperObjectGlobalMatrix(hChild)),
p_stMainCharTranslation);
if( MTH_M_bLess(MTH3D_M_xNorm1Vector(&stDist) , MTH_M_xLongToReal(fn_ucStandardGameGetTooFarLimit(hStdGame))) )
{
fn_vStandardGameSetTooFar(hStdGame,FALSE);
}
else
{
fn_vStandardGameSetTooFar(hStdGame,TRUE);
}
}
}
/* */
HIE_fn_vPushMatrix( hChild );
fn_vTreatCharactersInSector( hChild );
HIE_fn_vPopMatrix();
}
}
else /*the hierarchy is built so that all platforms are before the other actors*/
{
break; /* -> when we encounter a non-platform, we know there are no other platform left to process, so break the loop*/
}
}
}
HIE_fn_vPopMatrix();
}
/*----------------------------------------------------------------------
* The same things, but for Cameras
*----------------------------------------------------------------------*/
void fn_vTreatCameraHierarchy(HIE_tdxHandleToSuperObject hSuperObj,
ACP_tdxBool bForcedActivity)
{
HIE_tdxHandleToSuperObject hChild;
tdstEngineObject * p_stObj;
ACP_tdxBool bTmp = FALSE;
long i;
HIE_fn_vPushMatrix(hSuperObj);
if(
(HIE_fn_ulGetSuperObjectType(hSuperObj) == HIE_C_ulActor)
&&
( /* if the actor is protected from freezing, orthe engine is not in frozen mode, we can continue*/
!g_stEngineStructure.bEngineFrozen
|| (fn_ulStandardGameGetCustomBits(M_GetMSHandle(hSuperObj, StandardGame)) & GAM_C_CustBitUnfreezable)
)
)
{
p_stObj = (tdstEngineObject*) HIE_fn_hGetSuperObjectObject(hSuperObj);
if ( bForcedActivity )
{
bTmp = TRUE;
}
if ( M_ObjectIsActivable(p_stObj) && (!M_ObjectIsAlreadyTreated(p_stObj)) )
{
HIE_tdxHandleToSuperObject hMainChar;
unsigned long ulCustomBits;
MTH3D_tdstVector stDist , *p_stMainCharTranslation;
MS_tdxHandleToStandardGame hStdGame;
/* get main character*/
hMainChar = MC_fn_hGetCharacterInMainCharacterNode( MC_fn_hGetFirstMainCharNode());
p_stMainCharTranslation = POS_fn_p_stGetTranslationVector(HIE_fn_hGetSuperObjectGlobalMatrix(hMainChar));
/* Update tooFar Flag */
hStdGame = M_GetMSHandle(hSuperObj, StandardGame);
if (hStdGame)
{
ulCustomBits = fn_ulStandardGameGetCustomBits(hStdGame);
if ( ulCustomBits & (GAM_C_CustBitNoAnimPlayerWhenTooFar|GAM_C_CustBitNoAIWhenTooFar|GAM_C_CustBitNoMecaWhenTooFar) )
{
MTH3D_M_vSubVector( &stDist,
POS_fn_p_stGetTranslationVector(HIE_fn_hGetSuperObjectGlobalMatrix(hSuperObj)),
p_stMainCharTranslation);
if( MTH_M_bLess(MTH3D_M_xNorm1Vector(&stDist) , MTH_M_xLongToReal(fn_ucStandardGameGetTooFarLimit(hStdGame))) )
{
fn_vStandardGameSetTooFar(hStdGame,FALSE);
}
else
{
fn_vStandardGameSetTooFar(hStdGame,TRUE);
}
}
}
fn_vTreatCharactersInSector(hSuperObj);
bTmp=TRUE;
}
HIE_fn_vPopMatrix();
HIE_fn_vPushMatrix(hSuperObj);
}
#ifdef ACTIVE_EDITOR /* { */
else if(g_stEngineStructure.bEngineFrozen && (fn_ulStandardGameGetCustomBits(M_GetMSHandle(hSuperObj, StandardGame)) ^ GAM_C_CustBitUnfreezable))
{
/* update modules SO frame number*/
PLA_fn_vUpdateFrameCounterForModules(hSuperObj);
}
#endif /* } */
HIE_M_ForEachChildOf(hSuperObj,hChild,i)
{
fn_vTreatCameraHierarchy(hChild,bTmp);
}
HIE_fn_vPopMatrix();
}
/*----------------------------------------------------------------------
*----------------------------------------------------------------------*/
void fn_vSendBackGroundColor(HIE_tdxHandleToSuperObject _hSprObjSector)
{
ACP_tdxIndex xI;
SECT_tdxHandleOfSectorObject hSectorObject;
SECT_tdxHandleOfElementLstStaticLights hStaticLightsElement;
hSectorObject=(SECT_tdxHandleOfSectorObject)HIE_fn_hGetSuperObjectObject(_hSprObjSector);
LST2_M_StaticForEachElementOf
(
&(hSectorObject->stListOfStaticLights),
hStaticLightsElement,
xI
)
{
if (GLI_lGetLightType(hStaticLightsElement->hStaticLights) == GLI_C_lFogLight)
{
struct GEO_tdstColor_ stColor;
GLI_xGetLightBackgroundColor(hStaticLightsElement->hStaticLights, &stColor);
GLD_bSetBackgroundColorForDevice
(
/* XB 23/06/99 */
#ifndef U64
fn_hGetGLDDevice(0),
#else /* U64 */
NULL,
#endif /* U64 */
/* End XB 23/06/99 */
RGB
(
(char) (stColor.xR*255),
(char) (stColor.xG*255),
(char) (stColor.xB*255)
)
);
break;
}
}
}
/* Oliv' - We NEED the default flag too, - 25/02/1999
'coz sometimes the function SendCharacterToViewport which set or not the CustBitOutOfVisibility
is not called (actor is not in a visible sector) */
/*#ifndef U64*/
/* this call is not necessary for U64, because there are no mirrors for them*/
/* -> only one camera at a time can see an actor, which means that no camera can*/
/* override the outofvisisibity flag set by another camera*/
/* EndOfOliv' */
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC 04/06/99 */
void fn_vSetOutOfVisibilityCustomBitOfAllActiveActors()
{
HIE_tdxHandleToSuperObject hCharacter1, hCharacter2;
MS_tdxHandleToStandardGame hStdGame;
long i,j;
unsigned long ulCustomBits;
/* for each actor in the active hierarchy*/
HIE_M_ForEachChildOf(gp_stDynamicWorld, hCharacter1, i)
{
/* assume it is not out of visibility*/
hStdGame = M_GetMSHandle(hCharacter1, StandardGame);
ulCustomBits = fn_ulStandardGameGetCustomBits(hStdGame) | GAM_C_CustBitOutOfVisibility;
fn_vStandardGameSetCustomBits(hStdGame, ulCustomBits);
/* if it is rayman of a platform, check the children actors*/
if ( (fn_ucStandardGameGetPlatFormType(hStdGame) == C_ucPlatFormType_StandardPlatForm) || (ulCustomBits & GAM_C_CustBitRayman) )
{
HIE_M_ForEachChildOf(hCharacter1, hCharacter2, j)
{
if ( HIE_fn_ulGetSuperObjectType(hCharacter2) == HIE_C_ulActor )
{
hStdGame = M_GetMSHandle(hCharacter2, StandardGame);
fn_vStandardGameSetCustomBits(hStdGame, fn_ulStandardGameGetCustomBits(hStdGame) | GAM_C_CustBitOutOfVisibility);
}
}
}
}
}
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC 04/06/99 */
/* Oliv' - We NEED the default flag too, - 25/02/1999 */
/* #endif */
/* EndOfOliv' */
/*-----------------------------------------------------------------------------
* Description : Game Engine Function
*-----------------------------------------------------------------------------
* Input : None
* Output :
*-----------------------------------------------------------------------------
* Creation date : 22/08/96 Author : Christophe
*-----------------------------------------------------------------------------
* Modification date : 13/10/97 Modification Author : Gilles
* Modifications : Cleaning
*---------------------------------------------------------------------------*/
#ifdef U64
/* FQ LIGHTVIS*/
#ifndef RETAIL
extern int g_LightDrawnThisFrame;
#endif /* RETAIL*/
//Declare these globals variables in gameeng.c because of overlay
// do not erase by default on u64
char gc_EraseBackground=0;
//End XB 22/06/99
#else /* u64 */
// erase by default on PC
char gc_EraseBackground=1;
#endif
void fn_vEngine()
{
/* XB 23/06/99 */
#ifndef U64
GLD_tdhDevice mhDisplayDevice3D=g_stEngineStructure.hGLDDevice;
GLD_tdhViewport mhDisplayViewport3D=g_stEngineStructure.hGLDViewport;
#else /* U64 */
GLD_tdhDevice mhDisplayDevice3D=NULL;
GLD_tdhViewport mhDisplayViewport3D=NULL;
#endif /* U64 */
/* End XB 23/06/99 */
BOOL bEnabledWrite ;
/* tdxHandleToAlwaysActiveCharacterNode hCharAlwaysActiveNode;*/
/* short i;*/
/* ACP_tdxIndex xIndex, xIndexMax ;*/
#if defined(USE_PROFILER) && !defined(PRESS_DEMO)
HIE_tdxHandleToSuperObject hSOCurrentSector;
SECT_tdxHandleOfSectorObject hSECTCurrentSector;
long ulRasterDuration;
#endif /* USE_PROFILER && PRESS_DEMO */
#if defined(ACTIVE_EDITOR)
PRF_fn_vStartChrono( PRF_C_ulFctEditor, NULL );
fn_vCheckEditor();
fn_vCheckEnd();
PRF_fn_vStopChrono( PRF_C_ulFctEditor, NULL );
if (g_stEngineStructure.eEngineMode==EM_ModeStoppingProgram)
return;
#endif /* ACTIVE_EDITOR */
/******************/
/* Miscellaneous */
/******************/
/* sound */
#ifdef U64
PRF_fn_vStartChrono( PRF_C_ulFctSound, PRF_C_pvSoundInit );
#else
PRF_fn_vStartChrono( PRF_C_ulFctSoundInit, NULL );
#endif
SND_fn_vSynchroSound();
#ifdef U64
PRF_fn_vStopChrono( PRF_C_ulFctSound, PRF_C_pvSoundInit );
#else
PRF_fn_vStopChrono( PRF_C_ulFctSoundInit, NULL );
#endif
PRF_fn_vStartChrono( PRF_C_ulFctMainMisc, NULL );
#if !defined(PRESS_DEMO)
#if (!defined( FINAL_VERSION ) && !defined(RETAIL) ) || defined(FINAL_VERSION_FOR_TESTERS)
/* cheat code, ghost mode */
if (IPT_fn_bIsJustValidated(g_st_3DOS_EntryActions.hFlyingMode)==IPT_C_TRUE)
{
/* All these functions must be done
either when you enter the ghost mode or when you quit this mode*/
g_ucIsEdInGhostMode=(unsigned char)(1-g_ucIsEdInGhostMode);
if (g_ucIsEdInGhostMode)
{
fn_v3dDataSetDrawMask(
M_GetMSHandle(MC_fn_hGetCharacterInMainCharacterNode(MC_fn_hGetFirstMainCharNode()),3dData),
HIE_fn_lGetSuperObjectDrawMask(MC_fn_hGetCharacterInMainCharacterNode(MC_fn_hGetFirstMainCharNode())) & ~GLI_C_lIsNotWired
);
HIE_fn_vSetSuperObjectDrawMask(
MC_fn_hGetCharacterInMainCharacterNode(MC_fn_hGetFirstMainCharNode()),
HIE_fn_lGetSuperObjectDrawMask(MC_fn_hGetCharacterInMainCharacterNode(MC_fn_hGetFirstMainCharNode())) & ~GLI_C_lIsNotWired
);
}
else
{
fn_v3dDataSetDrawMask(
M_GetMSHandle(MC_fn_hGetCharacterInMainCharacterNode(MC_fn_hGetFirstMainCharNode()),3dData),
HIE_fn_lGetSuperObjectDrawMask(MC_fn_hGetCharacterInMainCharacterNode(MC_fn_hGetFirstMainCharNode())) | GLI_C_lIsNotWired
);
HIE_fn_vSetSuperObjectDrawMask(
MC_fn_hGetCharacterInMainCharacterNode(MC_fn_hGetFirstMainCharNode()),
HIE_fn_lGetSuperObjectDrawMask(MC_fn_hGetCharacterInMainCharacterNode(MC_fn_hGetFirstMainCharNode())) | GLI_C_lIsNotWired
);
}
fn_vUpdateSectorInfoAfterNOCLIP(CAM_fn_hGetActiveCamera(CAM_e_MainViewport));
CAM_fn_vUpdateTargetPosition(M_GetMSHandle(CAM_fn_hGetActiveCamera(CAM_e_MainViewport),Cineinfo));
fn_vInitBehaviourOfACharacter(MC_fn_hGetCharacterInMainCharacterNode( MC_fn_hGetFirstMainCharNode()));
#if !defined( U64 )
fn_vReputCharacterSuperObjectAtTheWorld(MC_fn_hGetCharacterInMainCharacterNode( MC_fn_hGetFirstMainCharNode()));
#endif /* U64 */
fn_vTakeControlOfChannel((tdstEngineObject *)HIE_fn_hGetSuperObjectObject(MC_fn_hGetCharacterInMainCharacterNode( MC_fn_hGetFirstMainCharNode())), (unsigned short) -1, FALSE);
}
#endif /* (!defined( FINAL_VERSION ) && !defined(RETAIL) ) || defined(FINAL_VERSION_FOR_TESTERS) */
#endif /* PRESS_DEMO */
/* ANNECY MT - 25/06/99 { */
#if !defined(U64) && defined(_DEBUG)
if ( !g_ucIsEdInGhostMode && g_ucSlowDownEngine )
Sleep(g_ucSlowDownTime);
#endif
/* END ANNECY MT } */
/* shadow init ??? */
SHW_fn_vInitShadowCounter();
#if (!defined ( RETAIL ) && !defined(PRESS_DEMO)) || defined(FINAL_VERSION_FOR_TESTERS)
/* we want to use fly mode even when the engine is stepped! */
if( g_ucIsEdInGhostMode )
{
HIE_tdxHandleToSuperObject hCharacter = MC_fn_hGetCharacterInMainCharacterNode ( MC_fn_hGetFirstMainCharNode() ) ;
tdstEngineObject * p_stEngObj = (tdstEngineObject *) HIE_fn_hGetSuperObjectObject ( hCharacter );
fn_bEdNOCLIP(hCharacter);
M_TreatObject(p_stEngObj);
#ifdef __3DOSLIGHTS
fn_vUpdateLight(hCharacter);
#endif
GAM_fn_vSectInfoTestChangeSectorForCharacter(hCharacter);
}
#endif /* (!defined ( RETAIL ) && !defined(PRESS_DEMO)) || defined(FINAL_VERSION_FOR_TESTERS) */
M_IfCanDoFullStep()
{
if (!fn_bIsEngineInPause())
{
HIE_fn_vInvalidateAllGlobalMatrices();
/* HIE_fn_vValidateGlobalMatrix(gp_stDynamicWorld);*/
#ifdef U64
MOR_fn_vUnLockAllMorphTasks();
#endif
/* Trame counter and timer */
/*fn_vActualizeEngineClock();*/
/* Mangement of Changing Main Character.*/
if (MC_fn_hGetNewMainCharacter(MC_fn_hGetFirstMainCharNode()) != NULL)
{
MC_fn_vSetCharacterInMainCharacterNode(
MC_fn_hGetFirstMainCharNode(),
MC_fn_hGetNewMainCharacter(MC_fn_hGetFirstMainCharNode())
);
MC_fn_vSetNewMainCharacter(MC_fn_hGetFirstMainCharNode(), NULL);
}
fn_vUpdateDynamicHierarchy();
#if defined(USE_PROFILER) && !defined(PRESS_DEMO)
hSOCurrentSector = fn_h_SectInfoGetCurrentSector(M_GetMSHandle(MC_fn_hGetCharacterInMainCharacterNode( MC_fn_hGetFirstMainCharNode()),SectInfo));
hSECTCurrentSector = (SECT_tdxHandleOfSectorObject)HIE_fn_hGetSuperObjectObject(hSOCurrentSector);
PRF_fn_vIncreaseVariable( PRF_C_ulVarCurrentSector, PRF_C_pvMainCharCurrentSector, (unsigned long)hSOCurrentSector);
#endif /* USE_PROFILER && PRESS_DEMO */
/* ANNECY MT - 01/10/98 {*/
#ifndef U64
if(g_DEMO_KeybTest != DEMO_PLAY)
#endif U64
/* END ANNECY MT }*/
fn_vKillAllAlwaysInNonActiveSectors();
#ifndef U64
else
fn_vClearUnusedAlwaysInDemoMode();
#endif U64
HIE_fn_vInitMatrixStack();
/*XB980824*/
#ifndef D_THROW_MGT
if(bEnabledWrite)
MGT_fn_vTreatMagnets();
#endif /* D_THROW_MGT */
/*End XB*/
PRF_fn_vStopChrono( PRF_C_ulFctMainMisc, NULL );
PRF_fn_vStartChrono( PRF_C_ulFctHIE, NULL );
SAF_M_Try /*BART*/
/* ANNECY MT - 03/11/98 {*/
#if (defined(USE_PROFILER) && !defined(PRESS_DEMO) && !defined(U64))
GAM_fn_vRasterDumpBeginLoop();
#endif
/* END ANNECY MT }*/
/* ANNECY AV DEMO {*/
#ifndef U64
if(g_DEMO_KeybTest == DEMO_PLAY)
{
if(DEMO_fn_bUpdateDynamicHierarchy () == FALSE)
return;
}
else
#endif U64
/* END ANNECY AV }*/
{
HIE_tdxHandleToSuperObject hMainChar = MC_fn_hGetCharacterInMainCharacterNode( MC_fn_hGetFirstMainCharNode());
fn_vTreatDynamicHierarchyOfPlatForms(gp_stDynamicWorld);
fn_vTreatDynamicHierarchy(gp_stDynamicWorld, hMainChar, POS_fn_p_stGetTranslationVector(HIE_fn_hGetSuperObjectGlobalMatrix(hMainChar)));
}
CAM_fn_vCameraManagement();
/* Oliv' - Enable loading once of all Maps - 08/06/1999 */
#if defined(TEST_LOAD_ALL_MAPS)
{
#define TEST_LOAD_TIME 100
static unsigned long s_ulWaitFrame = 0L;
static unsigned long s_ulLoadAllLevel = 0L;
if( (++s_ulWaitFrame) >= TEST_LOAD_TIME )
{
s_ulLoadAllLevel = (s_ulLoadAllLevel + 1) % (unsigned long)g_stEngineStructure.ucNumberOfLevels;
GAM_fn_vAskToChangeLevel( g_stEngineStructure.a_szLevelName[ s_ulLoadAllLevel ] , TRUE );
osSyncPrintf( "Change to level %s\n", g_stEngineStructure.a_szLevelName[s_ulLoadAllLevel] );
s_ulWaitFrame = 0L;
}
}
#endif /* TEST_LOAD_ALL_MAPS */
/* EndOfOliv' */
/* ANNECY MT - 03/11/98 {*/
#if (defined(USE_PROFILER) && !defined(PRESS_DEMO) && !defined(U64))
GAM_fn_vRasterDumpEndLoop();
#endif
/* END ANNECY MT }*/
SAF_M_Catch /* BART: in case of ça marche pas => stop everything just après !*/
PRF_fn_vReinitAllChrono();
SAF_M_EndCatch /* BART*/
PRF_fn_vStopChrono( PRF_C_ulFctHIE, NULL );
PRF_fn_vStartChrono( PRF_C_ulFctMainMisc, NULL );
/*********************/
/* Special treatment */
/*********************/
/* Real-Time for cycling textures */
GLI_vRefreshAllCyclingTextures(
MTH_M_xDiv(
MTH_M_xLongToReal(g_stEngineStructure.stEngineTimer.ulUsefulDeltaTime),
MTH_M_xMul(M_xGetFrameLength(g_stEngineStructure.stEngineTimer), MTH_M_xFloatToReal(1000.0f))
)
);
#ifndef D_THROW_PRT
/* New particles mechanics */
/*fn_vMSPrtSysTreatAllParticlesSystemsForCharacter(g_stEngineStructure.h_WorldCaracter);*/
#endif /* D_THROW_PRT */
} /* !fn_bIsEngineInPause() */
} /* M_IfcanDoFullStep() */
/**************************/
/* Cheat code ! for debug */
/**************************/
#if !defined(PRESS_DEMO)
/* Oliv' - 19/05/1999 - I want to see Zdx too */
#if defined(_DEBUG) || defined(_U64_GLI_BENCH_)
if (IPT_fn_bIsJustValidated(g_st_3DOS_EntryActions.hDisplayZDC)==IPT_C_TRUE)
{
g_ucZDCVisible = (unsigned char)( (g_ucZDCVisible + 1) % 6);
}
#endif /* _DEBUG || _U64_GLI_BENCH_ */
#endif /* PRESS_DEMO */
/* EndOfOliv' */
#if !defined(PRESS_DEMO)
#if defined(_DEBUG)
if (IPT_fn_bIsJustValidated(g_st_3DOS_EntryActions.hDisplayOnlyStatic)==IPT_C_TRUE)
{
unsigned long ulRasterDisplayMode = PRF_fn_lGetIndependantVariable(PRF_C_ulIdpRasterDisplayMode);
ulRasterDisplayMode &= ~PRF_C_ulShowAll; /* unset all bits*/
g_ucWhatDoIDisplay = (unsigned char)( (g_ucWhatDoIDisplay + 1) % 3);
switch(g_ucWhatDoIDisplay)
{
case 0: ulRasterDisplayMode |= PRF_C_ulShowAll; break;/* all*/
case 1: ulRasterDisplayMode |= PRF_C_ulShowStatic; break;/* static*/
case 2: ulRasterDisplayMode |= PRF_C_ulShowDynamic; break;/* dynamic*/
}
PRF_fn_vSetIndependantVariable( PRF_C_ulIdpRasterDisplayMode , ulRasterDisplayMode );
}
if (IPT_fn_bIsJustValidated(g_st_3DOS_EntryActions.hDisplayBoundingVolumes)==IPT_C_TRUE)
{
g_ucDisplayBoundingVolumes =(unsigned char)(1 - g_ucDisplayBoundingVolumes);
}
#endif /*_DEBUG*/
#endif /* PRESS_DEMO */
PRF_fn_vStopChrono( PRF_C_ulFctMainMisc, NULL );
/**************************/
/* Display */
/**************************/
PRF_fn_vStartChrono( PRF_C_ulFctDisplay, PRF_C_pvRest );
PRF_fn_vStopChrono( PRF_C_ulFctDisplay, PRF_C_pvRest );
PRF_fn_vStartChrono( PRF_C_ulFctDisplaySpecific, PRF_C_pvRest );
#if defined(WIN32)
WaitForSingleObject(g_stEngineStructure.hDrawSem,INFINITE);
#endif /* WIN32 */
PRF_fn_vStopChrono( PRF_C_ulFctDisplaySpecific, PRF_C_pvRest );
/* XB 23/06/99 */
#ifndef U64
if (!GLD_bFlipDeviceWithSynchro(g_stEngineStructure.hGLDDevice,C_DefaultSynchro))
#else /* U64 */
if (!GLD_bFlipDeviceWithSynchro(NULL,C_DefaultSynchro))
#endif /* U64 */
/* End XB 23/06/99 */
M_GameFatalError(E_uwGameCantFlipDevice);
/* Trame counter and timer, right after the VBL synchro! */
M_bIfIsNotStepping()
{
fn_vActualizeEngineClock();
}
#if defined(USE_PROFILER) && !defined(PRESS_DEMO)
{
PRF_fn_vStopChrono( PRF_C_ulFctMainLoop, NULL );
ulRasterDuration = PRF_fn_lGetIndependantVariable( PRF_C_ulIdpRasterTime );
#pragma warning (disable : 4146)
PRF_fn_vSetIndependantVariable( PRF_C_ulIdpRasterTime, -TMR_fn_ulFastGetInternalCounter() );
#pragma warning (default : 4146)
PRF_fn_vComputeAllChrono ();
PRF_fn_lIncIndependantVariable( PRF_C_ulIdpRasterTime, TMR_fn_ulFastGetInternalCounter() );
GAM_fn_vSlowDownEngine (PRF_fn_ulTimerCount2Duration( ulRasterDuration ));
#pragma warning (disable : 4146)
PRF_fn_lIncIndependantVariable( PRF_C_ulIdpRasterTime, -TMR_fn_ulFastGetInternalCounter() );
#pragma warning (default : 4146)
GAM_fn_vPrepareShowRasters( PRF_fn_ulTimerCount2Duration( ulRasterDuration ) );
PRF_fn_vResetAllChrono ();
PRF_fn_vSetIndependantVariable(PRF_C_ulIdpNbSkippedAnims,0);
PRF_fn_lIncIndependantVariable( PRF_C_ulIdpRasterTime, TMR_fn_ulFastGetInternalCounter() );
PRF_fn_vStartChrono( PRF_C_ulFctMainLoop, NULL );
PRF_fn_vStartChrono( PRF_C_ulFctDisplaySpecific, PRF_C_pvRest );
}
#endif /* USE_PROFILER && PRESS_DEMO */
#ifdef U64
PRF_fn_vStartChrono( PRF_C_ulFctDisplay, PRF_C_pvDisplayClearVP );
#endif
/* FQ HIGHRES*/
#ifdef U64
#if defined(_U64_GLI_BENCH_)
if(gc_EraseBackground || GLIBENCH_g_bWireFrame)
#else
if(gc_EraseBackground)
#endif /* _U64_GLI_BENCH_ */
{
if (!GLD_bClearViewportWithChoice(NULL,g_stEngineStructure.hGLDFixViewport,GLD_C_CLEAR_BACKBUF | GLD_C_CLEAR_ZBUF))
M_GameFatalError(E_uwGameCantClearViewPort);
}
else
{
if (!GLD_bClearViewportWithChoice(NULL,g_stEngineStructure.hGLDFixViewport,GLD_C_CLEAR_ZBUF))
M_GameFatalError(E_uwGameCantClearViewPort);
}
#else /* !U64 */
if(gc_EraseBackground)
{
if (!GLD_bClearViewportWithChoice(g_stEngineStructure.hGLDDevice,g_stEngineStructure.hGLDFixViewport,GLD_C_CLEAR_BACKBUF | GLD_C_CLEAR_ZBUF))
M_GameFatalError(E_uwGameCantClearViewPort);
}
else
{
if (!GLD_bClearViewportWithChoice(g_stEngineStructure.hGLDDevice,g_stEngineStructure.hGLDFixViewport,GLD_C_CLEAR_ZBUF))
M_GameFatalError(E_uwGameCantClearViewPort);
}
#endif /* U64 */
GLI_xClearViewingList();
#ifdef U64
PRF_fn_vStopChrono( PRF_C_ulFctDisplay, PRF_C_pvDisplayClearVP);
#endif
#if defined(WIN32)
/* GuS : We tell the device we are going to do the rendering.
Must be called before any rendering !*/
GLD_bBeginWriteToDevice( mhDisplayDevice3D );
#endif /*WIN32*/
#ifndef U64
GLI_vUpdateEffectData( g_stEngineStructure.stEngineTimer.ulUsefulDeltaTime );
#endif
PRF_fn_vStopChrono( PRF_C_ulFctDisplaySpecific, PRF_C_pvRest);
PRF_fn_vStartChrono( PRF_C_ulFctMainMisc, NULL );
#if !defined(PRESS_DEMO)
#if !defined(U64) && defined(USE_PROFILER) && !defined(PRESS_DEMO)
if (GetAsyncKeyState ('M') && GetAsyncKeyState (VK_CONTROL) && GetAsyncKeyState (VK_SHIFT))
{
MMG_fn_vDumpMemory ();
fn_vGameTestMemory();
GAM_fn_vRasterDump();
}
#endif
#endif /* PRESS_DEMO */
/******************************/
/* Saving Game and Extra Game */
/******************************/
#if !defined(ACTIVE_EDITOR)
/*if (g_stSavedGame.bSaveAsked)
{
fn_bPlayerSaveGameAll();
}*/
/*if (g_stExtrasGame.bSaveAsked)
{
fn_bSaveCurrentExtrasGame();
}*/
#endif /* ACTIVE_EDITOR */
if (!GLD_bRequestWriteToViewport(mhDisplayDevice3D, mhDisplayViewport3D, &g_stEngineStructure.stViewportAttr, &bEnabledWrite))
M_GameFatalError(E_uwGameCantWriteToViewPort);
if (bEnabledWrite)
{
HIE_tdxHandleToSuperObject hSprObjCamera;
MTH3D_tdstVector stAbsolutePositionOfCamera;
HIE_tdxHandleToSuperObject hCamCurrentSector;
GEO_fn_vMorphAddInMainLoop();
/* Oliv' - 19/05/1999 - I want to see Zdx too */
#if defined(_DEBUG) || defined(_U64_GLI_BENCH_)
/* EndOfOliv' */
/* Zones display */
if(g_ucZDCVisible)
{
HIE_fn_vInitMatrixStack();
HIE_fn_bInitCameraMatrixStack(&g_stEngineStructure.stViewportAttr);
ZDX_fn_vDisplayAllZdx(&g_stEngineStructure.stViewportAttr,
fn_h_SectInfoGetCurrentSector(
M_GetMSHandle(CAM_fn_hGetActiveCamera(CAM_e_MainViewport),SectInfo)));
}
/* Oliv' - 19/05/1999 - I want to see Zdx too */
#endif /* _DEBUG || _U64_GLI_BENCH_ */
/* EndOfOliv' */
#if defined(_DEBUG)
/*ANNECY TQ 11/03/98{*/
if(g_ucDisplayBoundingVolumes)
{
HIE_fn_vInitMatrixStack();
HIE_fn_bInitCameraMatrixStack(&g_stEngineStructure.stViewportAttr);
ZDX_fn_vDisplayAllBoundingVolumes(&g_stEngineStructure.stViewportAttr,
fn_h_SectInfoGetCurrentSector(
M_GetMSHandle(CAM_fn_hGetActiveCamera(CAM_e_MainViewport),SectInfo)));
}
/*ENDANNECY TQ}*/
/*ANNECY TQ 27/04/98{*/
#endif /*_DEBUG*/
/*ENDANNECY TQ}*/
PRF_fn_vStopChrono( PRF_C_ulFctMainMisc, NULL );
PRF_fn_vStartChrono( PRF_C_ulFctDisplay, PRF_C_pvMisc );
PRF_fn_vStartChrono( PRF_C_ulFctDisplayCommon, PRF_C_pvSendToViewPort );
/* total display */
#ifdef __3DOSLIGHTS
hSprObjCamera = CAM_fn_hGetActiveCamera(CAM_e_MainViewport);
/* ANNECY AV DEMO {*/
#ifndef U64
#ifndef RETAIL
if (g_DEMO_KeybTest == DEMO_RECORD ) DEMO_SaveInfo (hSprObjCamera);
#endif /* RETAIL */
#endif
/* END ANNECY AV }*/
POS_fn_vGetTranslationVector(HIE_fn_hGetSuperObjectGlobalMatrix ( hSprObjCamera), &stAbsolutePositionOfCamera);
hCamCurrentSector = fn_h_SectInfoGetCurrentSector(M_GetMSHandle(hSprObjCamera,SectInfo));
fn_vSendBackGroundColor(hCamCurrentSector);
/*FQ : Here we display the Sky... of course ;-)*/
/*/////////////////////////////////////////////*/
#ifdef U64
#ifndef RETAIL
/* FQ LIGHTVIS*/
g_LightDrawnThisFrame=0;
#endif /* RETAIL*/
fn_vDisplaySky(&g_stEngineStructure.stViewportAttr);
#endif /*U64*/
PRF_fn_vIncreaseVariable( PRF_C_ulVarCurrentSector, PRF_C_pvCameraCurrentSector, (unsigned long)hCamCurrentSector);
/* Oliv' - We NEED the default flag too, - 25/02/1999 */
/*#ifndef U64*/
/* this call is not necessary for U64, because there are no mirrors for them*/ /* YES WE WANT IT TOO ON U64 !!*/
/* ANNECY MT - 11/03/99 { */
/* fn_vSetOutOfVisibilityCustomBitOfAllActiveActors(); */
/* END ANNECY MT } */
/*#endif*/
/* EndOfOliv' */
/* XB 23/06/99 */
#ifndef U64
SCT_fn_vSendSectorWhereIAmToViewportWithMirror(
&stAbsolutePositionOfCamera,
g_stEngineStructure.hGLDDevice,
g_stEngineStructure.hGLDViewport,
&g_stEngineStructure.stViewportAttr,
hCamCurrentSector,
g_stEngineStructure.ulDisplayMode
);
#else /* U64 */
SCT_fn_vSendSectorWhereIAmToViewportWithMirror(
&stAbsolutePositionOfCamera,
NULL,
NULL,
&g_stEngineStructure.stViewportAttr,
hCamCurrentSector,
g_stEngineStructure.ulDisplayMode
);
#endif /* U64 */
/* End XB 23/06/99 */
#ifdef WIN32
fn_bDisplaySky(hCamCurrentSector, hSprObjCamera, &g_stEngineStructure.stViewportAttr);
#endif
#endif /* __3DOSLIGHTS*/
#ifndef D_THROW_PRT
/* New particles display */
/*if( g_stEngineStructure.h_WorldCaracter!=NULL )
fn_vMSPrtSysPreDrawAllParticlesSystemsForCharacter(g_stEngineStructure.h_WorldCaracter);*/
#endif /* D_THROW_PRT */
PRF_fn_vStopChrono( PRF_C_ulFctDisplayCommon, PRF_C_pvSendToViewPort );
PRF_fn_vStopChrono( PRF_C_ulFctDisplay, PRF_C_pvMisc );
}
else
PRF_fn_vStopChrono( PRF_C_ulFctMainMisc, NULL );
M_FullStepDone() ;
#if defined(WIN32) && !defined(RETAIL) && !defined(PRESS_DEMO)
if (IPT_fn_bIsJustValidated(g_st_3DOS_EntryActions.hStartStopStep) == IPT_C_TRUE)
{
if ( GAM_g_iStepMode >= 0 )
{
GAM_g_iStepMode = -1 ;
/* fake a 1 VBL frame rate */
fn_vLoadEngineClock ( ) ;
#if !defined(U64) && defined(_DEBUG)
Sleep ( ( g_ucSlowDownEngine && g_ucSlowDownTime ) ? g_ucSlowDownTime : 16 ) ;
#else
Sleep ( 16 ) ;
#endif
fn_vActualizeEngineClock() ;
}
else
{
GAM_g_iStepMode = 0 ;
/* remember the date when the step mode is engaged */
fn_vSaveEngineClock ( ) ;
}
}
if (IPT_fn_bIsJustValidated(g_st_3DOS_EntryActions.hPulseStep) == IPT_C_TRUE)
{
if ( GAM_g_iStepMode >= 0 )
{
GAM_g_iStepMode = 1 ;
/* fake a 1 VBL frame rate */
fn_vLoadEngineClock ( ) ;
#if !defined(U64) && defined(_DEBUG)
Sleep ( ( g_ucSlowDownEngine && g_ucSlowDownTime ) ? g_ucSlowDownTime : 16 ) ;
#else
Sleep ( 16 ) ;
#endif
fn_vActualizeEngineClock() ;
fn_vSaveEngineClock ( ) ;
}
}
#endif /* WIN32 && !RETAIL && !PRESS_DEMO */
}
/*-----------------------------------------------------------------------------
* Description : reput the character at root
*-----------------------------------------------------------------------------
* Input : Super-Object
* Output : void
*-----------------------------------------------------------------------------
* Creation date : 14/10/96 Author : François
*-----------------------------------------------------------------------------
* Modification date : Modification Author :
* Modifications :
*---------------------------------------------------------------------------*/
void fn_vReputCharacterSuperObjectAtTheWorld(HIE_tdxHandleToSuperObject h_SupObject)
{
HIE_fn_vChangeFather(h_SupObject,gp_stDynamicWorld, fn_ucStandardGameGetPlatFormType(M_GetMSHandle(h_SupObject,StandardGame)));
}
/*-----------------------------------------------------------------------------
* Description : Search all character's super object, and link to the root
* recurse function.
*-----------------------------------------------------------------------------
* Input : void
* Output : void
*-----------------------------------------------------------------------------
* Creation date : 07/06/97 Author : Olivier Jourdan
*-----------------------------------------------------------------------------
* Modification date : Modification Author :
* Modifications :
*---------------------------------------------------------------------------*/
/*
void fn_vRecursivePartOfFatherSonLinksDestruction(
HIE_tdxHandleToSuperObject _hSuperObj,
ACP_tdxBool _bFather)
{
HIE_tdxHandleToSuperObject hChild, hSon;
if( HIE_fn_ulGetSuperObjectType(_hSuperObj)==C_ucCharacter )
{
//hChild = _hSuperObj->hFirstElementSta;
hChild = HIE_M_hFirstChild(_hSuperObj);
while(hChild)
{
//hSon = hChild->hNextBrotherSta;
hSon = HIE_M_hNextChild(hChild);
fn_vRecursivePartOfFatherSonLinksDestruction(hChild,TRUE);
hChild = hSon;
}
// if(_hSuperObj->hFatherSta != gp_stDynamicWorld)
if(HIE_M_hGetSuperObjectFather(_hSuperObj) != gp_stDynamicWorld)
fn_vReputCharacterSuperObjectAtTheWorld(_hSuperObj);
}
else
{
//hChild = _hSuperObj->hFirstElementSta;
hChild = HIE_M_hFirstChild(_hSuperObj);
while(hChild)
{
//hSon = hChild->hNextBrotherSta;
hSon = HIE_M_hNextChild(hChild);
fn_vRecursivePartOfFatherSonLinksDestruction(hChild,FALSE);
hChild = hSon;
}
}
}
*/
void fn_vRecurseDestructChildLink(HIE_tdxHandleToSuperObject _hSuperObjRoot)
{
HIE_tdxHandleToSuperObject hChild,hNextChild,hPlatformChild,hPlatformNextChild;
long xI, xJ;
HIE_M_ForEachMovingChildOf(_hSuperObjRoot,hChild,hNextChild,xI)
{
if( HIE_fn_ulGetSuperObjectType(hChild)==HIE_C_ulActor )
{
if( fn_ucStandardGameGetPlatFormType(M_GetMSHandle(hChild,StandardGame))!=0 )
{
/* Destruct child Links*/
HIE_M_ForEachMovingChildOf(hChild,hPlatformChild,hPlatformNextChild,xJ)
{
if( HIE_fn_ulGetSuperObjectType(hPlatformChild)==HIE_C_ulActor )
{
/*since we handle the children of a platform, they cannot be platform themselves!*/
HIE_fn_vChangeFather(hPlatformChild,_hSuperObjRoot, FALSE);
}
}
}
else
{
break;
}
}
}
}
void fn_vDestructAllFatherSonLinks(void)
{
HIE_tdxHandleToSuperObject hChild,hNextChild,hMainCharacter;
long xI;
hMainCharacter = MC_fn_hGetCharacterInMainCharacterNode( MC_fn_hGetFirstMainCharNode());
HIE_M_ForEachMovingChildOf(hMainCharacter,hChild,hNextChild,xI)
{
if( HIE_fn_ulGetSuperObjectType(hChild)==HIE_C_ulActor )
{
HIE_fn_vChangeFather(hChild,gp_stDynamicWorld, fn_ucStandardGameGetPlatFormType(M_GetMSHandle(hChild,StandardGame)));
}
}
/*fn_vRecursivePartOfFatherSonLinksDestruction(gp_stDynamicWorld,FALSE);*/
fn_vRecurseDestructChildLink(gp_stDynamicWorld);
fn_vRecurseDestructChildLink(gp_stInactiveDynamicWorld);
}
/*ANNECY CG DISPLAY ACTIVATED GENDOORS 16/06/98 {*/
#ifndef U64
static GEO_tdstGeometricObject * p_stGeoModel4Gendoors;
static GEO_tdstGeometricObject * p_stGeoCurr4Gendoors;
/*static*/ unsigned char ucIsInitDone4Gendoors = 0;
BOOL bDisplayCenterInitIsDone = FALSE;
/***********************************************************************************************/
/* Name : InitGeoModel4Gendoors*/
/* Description : Loads the Geo Obj used to display the Gendoors from .mod file*/
/* Author : Christophe Giraud*/
/* Date : 18/06/98*/
/***********************************************************************************************/
GEO_tdstGeometricObject * InitGeoModel4Gendoors()
{
GEO_tdstGeometricObject * p_stLoaded;
p_stLoaded = (GEO_tdstGeometricObject *) SCR_M_ul_RdL0_ExtractLongValue(
SCR_fnp_st_RdL0_AnalyseSection( "GameData\\World\\Graphics\\Objects\\Banks\\KeyGendoor\\KeyGendoor.mod^Geometric:KeyGendoor", SCR_CDF_uw_Anl_ForceAnalyse ), 0 );
/*
p_stLoaded = (GEO_tdstGeometricObject *) SCR_M_ul_RdL0_ExtractLongValue(
SCR_fnp_st_RdL0_AnalyseSection( "GameData\\World\\Graphics\\Objects\\Banks\\Waypoints\\wp.mod^Geometric:Box01", SCR_CDF_uw_Anl_ForceAnalyse ), 0 );
*/
return p_stLoaded;
}
/***********************************************************************************************/
/* Name : fn_vDisplayActivatedGendoors*/
/* Description : Displays Activated Gendoors*/
/* Author : Christophe Giraud*/
/* Date : 18/06/98*/
/***********************************************************************************************/
#if !defined(PRESS_DEMO)
#ifndef RETAIL
void fn_vDisplayActivatedGendoors( GLD_tdstViewportAttributes * p_stViewport, unsigned long ulDrawMask )
{
tdxHandleToObjectsTablesList hObjetTable;
ACP_tdxIndex xNbVertices;
MTH3D_tdstVector stVector;
HIE_tdxHandleToSuperObject hCurrentSector,
hPersoPrincipal,
hCharacterSO;
SECT_tdxHandleOfElementLstCharacter hCharacterElement;
char szText[255];
int i;
/****** ONLY FOR DEBUG ****************************/
/**/ char *cName;
/**/ MS_tdxHandleToBrain hBrain;
/****** ONLY FOR DEBUG ****************************/
/*--- First time we are here ??? ---*/
if( !ucIsInitDone4Gendoors )
{
/*--- Loading Geo Objs from file ---*/
p_stGeoModel4Gendoors = InitGeoModel4Gendoors();
p_stGeoCurr4Gendoors = InitGeoModel4Gendoors();
ucIsInitDone4Gendoors = 1;
GLI_vEndofGeometricLoad();
}
sprintf( szText, "[G] Display Gendoors" );
GLI_vDisplayPolices( (unsigned char *)szText, 450, 435 );
/* Point to the current sector where is the character*/
hPersoPrincipal = MC_fn_hGetCharacterInMainCharacterNode(MC_fn_hGetFirstMainCharNode());
hCurrentSector = fn_h_SectInfoGetCurrentSector(M_GetMSHandle(hPersoPrincipal, SectInfo));
/* Find all characters in the current sector of the list*/
SECT_M_ForEachCharListInSector(hCurrentSector, hCharacterElement, i)
{
/* Get character in the list*/
hCharacterSO = SECT_GetCharacterInList( hCharacterElement );
hObjetTable = fn_vGetDefaultObjectsTableOfFamily( fn_h3dDataGetFamily(M_GetMSHandle(hCharacterSO,3dData)) );
/****** ONLY FOR DEBUG ****************************/
/**/ hBrain = M_GetMSHandle(hCharacterSO,Brain);
/**/ if (hBrain)
/**/ cName = AI_M_szGetPersoName(AI_M_stGetMindOfSuperObj(hCharacterSO));
/****** ONLY FOR DEBUG ****************************/
if ( hObjetTable== NULL )
{
/* Coordinates of the character*/
POS_fn_vGetTranslationVector( HIE_fn_hGetSuperObjectGlobalMatrix( hCharacterSO ), &stVector );
for(xNbVertices=0; xNbVertices<p_stGeoCurr4Gendoors->xNbPoints ; xNbVertices++)
{
/*--- Translates the current object at the waypoint position*/
MTH3D_M_vAddVector(
&(p_stGeoCurr4Gendoors->d_stListOfPoints[ xNbVertices ]),
&(p_stGeoModel4Gendoors->d_stListOfPoints[ xNbVertices ]),
&stVector
);
}
/*--- Translates the current object bounding sphere center at the gendoor position*/
MTH3D_M_vAddVector( &(p_stGeoCurr4Gendoors->xBoudingSphereCenter),&(p_stGeoModel4Gendoors->xBoudingSphereCenter),&stVector);
/*--- Sends the object to the Display Routines*/
GLI_xSendObjectToViewportWithLights( p_stViewport, p_stGeoCurr4Gendoors, ulDrawMask );
}
}
}
#endif /*RETAI*/
#endif /* PRESS_DEMO */
#ifndef RETAIL
void fn_vDisplayCenterOfPersos( GLD_tdstViewportAttributes *p_stViewport, unsigned long ulDrawMask )
{
static ACP_tdxHandleOfMaterial hCenterMaterial;
ACP_tdxHandleOfTexture pCenterTexture;
HIE_tdxHandleToSuperObject hCurrentSector,
hPersoPrincipal,
hCharacterSO;
SECT_tdxHandleOfElementLstCharacter hCharacterElement;
GEO_tdxHandleToMatrix hGlobalMatrix;
GLI_tdstSpecificAttributesFor3D *p_st3DAtributes;
POS_tdstCompletePosition matrix;
GLI_tdstAligned2DVector a2_st2DVertex;
GLI_tdstAligned3DVector a2_stVertex;
MTH3D_tdstVector p;
register int i;
register float near1;
/**** First time ****/
if(!bDisplayCenterInitIsDone)
{
GLI_xCreateMaterial(&hCenterMaterial);
GLI_xLoadTexture(&pCenterTexture, NULL, "center.bmp", 0, 0);
if (pCenterTexture)
{
TEX_vSetTextureQualityLevel(pCenterTexture,(char)TEX_C_QHIGH);
}
GLI_vEndofGeometricLoad();
GLI_xSetMaterialTexture(hCenterMaterial,pCenterTexture);
bDisplayCenterInitIsDone = TRUE;
}
/* Point to the current sector where is the character*/
hCurrentSector = fn_h_SectInfoGetCurrentSector( M_GetMSHandle( MC_fn_hGetCharacterInMainCharacterNode(MC_fn_hGetFirstMainCharNode() ), SectInfo ) );
hPersoPrincipal = MC_fn_hGetCharacterInMainCharacterNode(MC_fn_hGetFirstMainCharNode() );
/* Find all characters in the current sector of the list*/
SECT_M_ForEachCharListInSector(hCurrentSector, hCharacterElement, i)
{
/* Get character in the list*/
hCharacterSO = SECT_GetCharacterInList( hCharacterElement );
hGlobalMatrix = HIE_fn_hGetSuperObjectGlobalMatrix(hCharacterSO);
POS_fn_vGetTranslationVector(hGlobalMatrix, &p);
p_st3DAtributes = (GLI_tdstSpecificAttributesFor3D*)(p_stViewport->p_vSpecificToXD);
GLI_xGetCameraMatrix(p_st3DAtributes->p_stCam, &matrix);
GLI_xSerialLinearOp(1, &p, &a2_stVertex, &matrix);
GLI_xSerialProjection(p_st3DAtributes->p_stCam, 1, &a2_stVertex, &a2_st2DVertex);
near1 = (float)p_st3DAtributes->p_stCam->xNear;
p_st3DAtributes->p_stCam->xNear += 0.01f;
GLI_vDraw2DSprite(p_stViewport, a2_st2DVertex.xX-5, a2_st2DVertex.xX + 5, a2_st2DVertex.xY-5, a2_st2DVertex.xY + 5, hCenterMaterial);
p_st3DAtributes->p_stCam->xNear = near1;
}
}
#endif /* RETAIL */
#endif
/* }ENDANNECY CG*/
/*-----------------------------------------------------------------------------
* Description : Display All Objects in Main Viewport
*-----------------------------------------------------------------------------
* Input : none
* Output : none
*-----------------------------------------------------------------------------
* Creation date : 26/08/96 Author : Christophe
*-----------------------------------------------------------------------------
* Modification date : Modification Author :
* Modifications :
*---------------------------------------------------------------------------*/
#ifdef U64
extern int SCREEN_HT;
#endif
void fn_vDisplayAll()
{
PRF_fn_vStartChrono( PRF_C_ulFctDisplaySpecific, PRF_C_pvSendToList );
#ifdef U64
PRF_fn_vStartChrono( PRF_C_ulFctDisplay, PRF_C_pvDisplaySendToList );
#endif
#if !defined(PRESS_DEMO)
#if !defined(U64) && defined(_DEBUG)
if (g_ucSlowDownEngine)
{
char szText[255];
sprintf( szText, "[A] Slowdown engine : %d" , g_ucSlowDownTime);
DisplayPolices( (char *)szText, 280, 450 );
}
#endif
#if defined(_DEBUG)
/*--- Displaying Waypoints ---*/
if( g_ucDisplayWaypoints == 1 )
WP_SendWaypointsToViewport( &g_stEngineStructure.stViewportAttr, g_stEngineStructure.ulDisplayMode );
/*ANNECY CG DISPLAY ACTIVATED GENDOORS 16/06/98 {*/
/*--- Displaying Activated Gendoors ---*/
#ifndef RETAIL
if(g_ucDisplayActivatedGendoors)
{
fn_vDisplayActivatedGendoors( &g_stEngineStructure.stViewportAttr, g_stEngineStructure.ulDisplayMode );
}
#endif
/* } ENDANNECY CG 16/06/98*/
/*--- Display center of perso ---*/
#ifndef RETAIL
if(g_ucDisplayCenters)
{
fn_vDisplayCenterOfPersos( &g_stEngineStructure.stViewportAttr, g_stEngineStructure.ulDisplayMode );
}
#endif
#endif /*_DEBUG*/
#endif /* PRESS_DEMO */
GLI_xSendListToViewport(&g_stEngineStructure.stViewportAttr);
#ifndef U64
if (!GLD_bWriteToViewportFinished(g_stEngineStructure.hGLDDevice, g_stEngineStructure.hGLDViewport))
M_GameFatalError(E_uwGameCantWriteToViewPortFinished);
#endif
#if !defined(PRESS_DEMO)
#if !defined(U64) && defined(_DEBUG)
if ( g_ucDisplayRayTraceSegments )
{
int i;
/* push the camera matrix*/
POS_tdstCompletePosition stMatrix;
GLI_xGetCameraMatrix(((GLI_tdstSpecificAttributesFor3D*)(g_stEngineStructure.stViewportAttr.p_vSpecificToXD))->p_stCam,&stMatrix);
GLI_xLoadMatrix(&stMatrix);
/*loop over the recorded segments and draw them, then clear the segment list!*/
for ( i = 0; i < 30; i ++ )
if ( g_wRayTraceSegmentLife[i] )
{
g_wRayTraceSegmentLife[i] --;
GLI_xDraw3DLine16(
&g_stEngineStructure.stViewportAttr,
&g_stRayTraceSegmentOrigin[i],
&g_stRayTraceSegmentEnd[i],
0xFFFFFFFF
);
}
GLI_xPopMatrix();
GLI_vDisplayPolices( "[H] Display Raytrace", 450, 420 );
}
#endif /* !U64 && _DEBUG */
#endif /* PRESS_DEMO */
fn_vDisplayFix();
#if !defined(PRESS_DEMO)
#ifdef WIN32
#ifndef RETAIL
{
static MTH3D_tdstVector stTopLeft = { 0.0685f, 0.125f, 0 };/* = { 0.067f, 0.067f, 0 };*/
static MTH3D_tdstVector stBottomRight = { 1.0f-0.0684f, 1.0f-0.0625f, 0 };/*= { 0.934f, 0.937f, 0 };*/
static char cDisplayRectangle = 0;
static char cColor = 0;
static unsigned long aul_Color[5] = { 0xFFFFFFFF , 0xFF0000, 0xFF00, 0xFF, 0 };
if (IPT_fn_bIsJustValidated(g_st_3DOS_EntryActions.hDisplayTextOverScanLimit)==IPT_C_TRUE)
{
if (IPT_fn_bIsJustValidated(g_st_3DOS_EntryActions.hAltDisplayTextOverScanLimit)==IPT_C_TRUE)
cColor = (char) ((cColor + 1) % 5);
else
cDisplayRectangle = (char) ~cDisplayRectangle;
}
if (cDisplayRectangle)
GLI_fnv_DrawRectangle( &g_stEngineStructure.stViewportAttr, &stTopLeft, &stBottomRight, aul_Color[cColor] );
}
#endif /* RETAIL */
#endif /* WIN32 */
#endif /* PRESS_DEMO */
#if defined(U64) && ( (defined(USE_PROFILER) && !defined(PRESS_DEMO)) || defined(_U64_GLI_BENCH_) )
GLD_bDisplayRastersForDeviceWithNoLock(&g_stEngineStructure.stViewportAttr, /*g_stEngineStructure.hGLDDevice*/NULL);
#endif
/*--- Infos display ---*/
#if !defined(PRESS_DEMO)
CAM_vDisplayInfo();
PRF_fn_vStopChrono( PRF_C_ulFctDisplaySpecific, PRF_C_pvSendToList );
PRF_fn_vStartChrono( PRF_C_ulFctMainMisc, NULL );
#endif /* PRESS_DEMO */
#if !defined(RETAIL) || defined(FINAL_VERSION_FOR_TESTERS)
if ( g_cChooseLevel > -1 )
{
char szString[100];
sprintf( szString, "Change To Map : %s", g_stEngineStructure.a_szLevelName[ g_cChooseLevel ] );
#if !defined(U64)
#ifndef RETAIL
GLI_vDisplayPolices( (unsigned char *) szString, 0, 0 );
#endif
#else
GLI_vPrintGuruError( SCREEN_HT-40 ,(unsigned char *)szString );
#endif /* U64 */
}
#endif /* !defined(RETAIL) || defined(FINAL_VERSION_FOR_TESTERS) */
/* Oliv' - 01/07/1998 - Who moved this ???? Arrrggg !!!*/
#if defined(U64)
PRF_fn_vStopChrono( PRF_C_ulFctMainMisc, NULL );
if (!GLD_bWriteToViewportFinished(NULL,NULL))
M_GameFatalError(E_uwGameCantWriteToViewPortFinished);
PRF_fn_vStartChrono( PRF_C_ulFctMainMisc, NULL );
#endif /* U64 */
/* EndOfOliv'*/
/* Oliv' - 19/05/1999 - I want to see Zdx too */
#if defined(_U64_GLI_BENCH_)
if( g_ucZDCVisible )
GLI_vPrintGuruError( SCREEN_HT-60, (unsigned char *) g_szZoneTypes[g_ucZDCVisible-1] );
#endif /* _U64_GLI_BENCH_ */
/* EndOfOliv'*/
#if !defined(PRESS_DEMO)
#if defined(_DEBUG)
#ifndef RETAIL
if( g_ucZDCVisible )
GLI_vDisplayPolices( (unsigned char *) g_szZoneTypes[g_ucZDCVisible-1], 560, 10);
#endif /*RETAIL*/
/*
if( g_ucWhatDoIDisplay )
GLI_vDisplayPolices( (unsigned char *) g_szDisplayTypes[g_ucWhatDoIDisplay-1], 260, 10);
*/
#ifndef RETAIL
if( g_ucSCTDisplaySectors )
{
SECT_vDisplaySectorInfos();
#if defined(GAM_USE_SCRIPT)
if( g_ucSCTDisplaySectors == 3 )
{
unsigned int Pos = 0;
struct tdstEngineObject_ *Pointer;
long j = 0;
char szInfos[ 255 ];
while(Pos < g_st3DOSLinkTable.stCharacter.stLinkArray.uiNumValues)
{
if(g_st3DOSLinkTable.stCharacter.stLinkArray.d_stDynArray[Pos].eState != SCR_EDAS_DyAr_Free)
{
Pointer = (struct tdstEngineObject_ *) ((SCR_tdst_Link_Value *)(g_st3DOSLinkTable.stCharacter.stLinkArray.d_stDynArray[Pos].d_vElement))->ulValue;
if(Pointer->h_StandardGame)
{
if(/*M_ObjectIsActive(Pointer) || */M_ObjectIsAlreadyTreated(Pointer))
{
sprintf( szInfos, "[%i] %s", j+1, 1+strrchr( ((SCR_tdst_Link_Value *) (g_st3DOSLinkTable.stCharacter.stLinkArray.d_stDynArray[Pos].d_vElement))->p_szKey ,':'));
GLI_vDisplayPolices( (unsigned char *) szInfos, 150, 50 + 20*j);
j++;
}
}
}
(Pos)++;
}
}
#endif
}
#endif /* RETAIL */
#endif /*_DEBUG*/
PRF_fn_vStopChrono( PRF_C_ulFctMainMisc, NULL );
PRF_fn_vStartChrono( PRF_C_ulFctDisplaySpecific, PRF_C_pvSendToList );
#endif /* PRESS_DEMO */
#if defined(WIN32)
GLI_fn_vShowFrameRate( &g_stEngineStructure.stViewportAttr );
ReleaseSemaphore(g_stEngineStructure.hDrawSem,1,NULL);
GLD_bEndWriteToDevice( g_stEngineStructure.hGLDDevice );
#endif ./* WIN32 */
PRF_fn_vStopChrono( PRF_C_ulFctDisplaySpecific, PRF_C_pvSendToList );
}
/*-----------------------------------------------------------------------------
* Description : get nb perso activable in the sector
*-----------------------------------------------------------------------------
* Input : Sector
* Output : Nb Perso Activable
*-----------------------------------------------------------------------------
* Creation date : 04/03/98 Author : Carlos Torres
*---------------------------------------------------------------------------*/
long GAM_fn_lGetNbPersoActivableInSector(HIE_tdxHandleToSuperObject hSector)
{
long lNbPerso=0;
SECT_tdxHandleOfElementLstCharacter hCharacterList;
int i;
/* Look in character list*/
SECT_M_ForEachCharListInSector(hSector,hCharacterList,i) {
if( M_ObjectIsActivable((struct tdstEngineObject_*)HIE_fn_hGetSuperObjectObject(SECT_GetCharacterInList(hCharacterList))) )
lNbPerso++;
}
return lNbPerso;
}
/*-----------------------------------------------------------------------------
* Description : get nb perso active
* a Perso is active if it is in an active(or associated) sector and
* if it is activable
*-----------------------------------------------------------------------------
* Output : Nb Perso Active
*-----------------------------------------------------------------------------
* Creation date : 04/03/98 Author : Carlos Torres
*---------------------------------------------------------------------------*/
long GAM_fn_lGetNbPersoActive()
{
long lNbPerso;
HIE_tdxHandleToSuperObject hActiveSector;
SECT_tdxHandleOfElementLstActivityInteraction hActivityList;
int i;
/* Get Active Sector*/
hActiveSector=fn_h_SectInfoGetCurrentSector(M_GetMSHandle(MC_fn_hGetCharacterInMainCharacterNode( MC_fn_hGetFirstMainCharNode()),SectInfo));
/* get nb perso in active sector*/
lNbPerso = GAM_fn_lGetNbPersoActivableInSector(hActiveSector);
/* get nb perso in associated sector*/
SECT_M_ForEachActivityNodeInActivityInteractionList(hActiveSector,hActivityList,i) {
lNbPerso += GAM_fn_lGetNbPersoActivableInSector(SECT_GetSectorInActivityList(hActivityList));
}
return lNbPerso;
}
/*-----------------------------------------------------------------------------
* Description : check if a character is active
* a Perso is active if it is active or already treated
*-----------------------------------------------------------------------------
* Output : Boolean
*-----------------------------------------------------------------------------
* Creation date : 04/03/98 Author : Carlos Torres
*---------------------------------------------------------------------------*/
unsigned char GAM_fn_bIsCharacterActive(HIE_tdxHandleToSuperObject hSuperObj)
{
/*return (unsigned char)(M_ObjectIsActive(M_GetEngineObject(hSuperObj)) ||
M_ObjectIsAlreadyTreated(M_GetEngineObject(hSuperObj)));*/
return (unsigned char)
( ((HIE_fn_hGetSuperObjectFather(hSuperObj)==gp_stDynamicWorld) ||
(HIE_fn_hGetSuperObjectFather(HIE_fn_hGetSuperObjectFather(hSuperObj))==gp_stDynamicWorld))
&& M_ObjectIsActive(M_GetEngineObject(hSuperObj))
);
}
/*-----------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------
* Description :
*
*-----------------------------------------------------------------------------
* Output :
*-----------------------------------------------------------------------------
* Creation date : 04/03/98 Author :
*---------------------------------------------------------------------------*/
void fn_vClearDynamicHierarchy(HIE_tdxHandleToSuperObject _hSOCurrentSector)
{
HIE_tdxHandleToSuperObject hCharacter,hNextCharacter;
HIE_tdxHandleToSuperObject hChildSector;
SECT_tdxHandleOfElementLstActivityInteraction hActivityList;
long i;
char cCounter;
HIE_M_ForEachMovingChildOf(gp_stDynamicWorld,hCharacter,hNextCharacter,i)
{
if( ( HIE_fn_ulGetSuperObjectType(hCharacter)==HIE_C_ulActor ) &&
!CAM_fn_bSuperObjectIsACamera(hCharacter) )
{
HIE_fn_vIsolate(hCharacter);
if( fn_ucStandardGameGetPlatFormType(M_GetMSHandle(hCharacter,StandardGame))!=0 )
{
HIE_fn_vSuperObjectAddHead(gp_stInactiveDynamicWorld,hCharacter);
}
else
{
HIE_fn_vSuperObjectAddTail(gp_stInactiveDynamicWorld,hCharacter);
}
/*M_UnactivateObject((struct tdstEngineObject_*)HIE_fn_hGetSuperObjectObject(hCharacter));*/
}
}
/**/
if(_hSOCurrentSector)
{
cCounter = (char)g_stEngineStructure.stEngineTimer.ulTrameNumber;
SECT_vSetCounterInSector( _hSOCurrentSector , cCounter );
/**/
SECT_M_ForEachActivityNodeInActivityInteractionList(_hSOCurrentSector,hActivityList,i)
{
hChildSector = SECT_GetSectorInActivityList(hActivityList);
SECT_vSetCounterInSector( hChildSector , cCounter );
}
}
}
/*-----------------------------------------------------------------------------
* Description :
*
*-----------------------------------------------------------------------------
* Output :
*-----------------------------------------------------------------------------
* Creation date : 04/03/98 Author :
* Modif 19/11/98 : stop sound when perso is desactivated - Carlos Torres
*---------------------------------------------------------------------------*/
void fn_vDesinitInactivePerso()
{
HIE_tdxHandleToSuperObject hCharacter,hChild;
long i,j;
HIE_M_ForEachChildOf(gp_stInactiveDynamicWorld,hCharacter,i)
{
if (M_ObjectIsActive((struct tdstEngineObject_*)HIE_fn_hGetSuperObjectObject(hCharacter)))
{
if( fn_ucStandardGameGetPlatFormType(M_GetMSHandle(hCharacter,StandardGame))!=0 )
{
HIE_M_ForEachChildOf(hCharacter,hChild,j)
{
if (HIE_fn_ulGetSuperObjectType(hChild) == HIE_C_ulActor)
{
PLA_fn_vDesInitAllChildOfCharacter(hChild,(struct tdstEngineObject_*)HIE_fn_hGetSuperObjectObject(hChild));
M_UnactivateObject((struct tdstEngineObject_*)HIE_fn_hGetSuperObjectObject(hChild));
SND_fn_vKillObjectSound2((long)hChild,g_lSoundObjectTypeAnim);
}
}
}
PLA_fn_vDesInitAllChildOfCharacter(hCharacter,(struct tdstEngineObject_*)HIE_fn_hGetSuperObjectObject(hCharacter));
M_UnactivateObject((struct tdstEngineObject_*)HIE_fn_hGetSuperObjectObject(hCharacter));
SND_fn_vKillObjectSound2((long)hCharacter,g_lSoundObjectTypeAnim);
}
}
}
/*-----------------------------------------------------------------------------
* Description :
*
*-----------------------------------------------------------------------------
* Output :
*-----------------------------------------------------------------------------
* Creation date : 04/03/98 Author :
*---------------------------------------------------------------------------*/
void fn_vInsertActorInDynamicHierarchy(HIE_tdxHandleToSuperObject _hCharacter, ACP_tdxBool _bNewInsert)
{
/*unsigned long ulCurrentBits;*/
struct tdstEngineObject_* p_stObject;
p_stObject = (struct tdstEngineObject_*)HIE_fn_hGetSuperObjectObject(_hCharacter);
/* ANNECY MT - 18/09/98 {*/
if( M_ObjectIsActivable(p_stObject)
&&
(
( _bNewInsert /* sector becomes active*/
&&
(
!fn_bf1StandardGameGetIsDesactivateAtAll(p_stObject->h_StandardGame) /* actor alive*/
||
(fn_eStandardGameGetInitFlagWhenDeadOrTaken(p_stObject->h_StandardGame) < OI_WhenPlayerIsDead) /* reinit 'always' or 'OutOfzone'*/
)
)
|| /* sector already active*/
(
!fn_bf1StandardGameGetIsDesactivateAtAll(p_stObject->h_StandardGame) /* actor alive*/
)
)
)
/* END ANNECY MT }*/
{
if( HIE_fn_hGetSuperObjectFather(_hCharacter) == gp_stInactiveDynamicWorld )
{
if( fn_ucStandardGameGetPlatFormType(M_GetMSHandle(_hCharacter,StandardGame))!=0 )
{
HIE_fn_vSuperObjectAddHead(gp_stDynamicWorld,_hCharacter);
}
else
{
HIE_fn_vSuperObjectAddTail(gp_stDynamicWorld,_hCharacter);
}
M_ActivateObject(p_stObject);
if( _bNewInsert )
{
MS_tdxHandleToStandardGame hStdGame = M_GetMSHandle(_hCharacter,StandardGame);
/* ANNECY MT - 11/03/99 { */
/* fn_vStandardGameSetCustomBits(hStdGame, fn_ulStandardGameGetCustomBits(hStdGame) & ~GAM_C_CustBitOutOfVisibility); */
fn_vStandardGameSetCustomBits(hStdGame, fn_ulStandardGameGetCustomBits(hStdGame) | GAM_C_CustBitOutOfVisibility);
/* END ANNECY MT } */
}
}
}
}
/*-----------------------------------------------------------------------------
* Description :
*
*-----------------------------------------------------------------------------
* Output :
*-----------------------------------------------------------------------------
* Creation date : 04/03/98 Author :
*---------------------------------------------------------------------------*/
void fn_vFillDynamicHierarchy(HIE_tdxHandleToSuperObject _hSOCurrentSector, ACP_tdxBool _bInit)
{
long i,j;
SECT_tdxHandleOfElementLstCharacter hCharacterList;
SECT_tdxHandleOfElementLstActivityInteraction hActivityList;
HIE_tdxHandleToSuperObject hCharacter;
HIE_tdxHandleToSuperObject hChildSector;
tdxHandleToAlwaysActiveCharacterNode hCharAlwaysActiveNode;
HIE_tdxHandleToSuperObject *p_hGenerator;
HIE_tdxHandleToSuperObject *p_hLastGenerator;
ACP_tdxIndex xIndex , xIndexMax;
char cCounter;
ACP_tdxBool bNewSector;
cCounter = (char)g_stEngineStructure.stEngineTimer.ulTrameNumber;
/* add actors on actived sectors*/
bNewSector = (ACP_tdxBool) (_bInit || ( SECT_cGetCounterInSector(_hSOCurrentSector) != cCounter ));
SECT_M_ForEachCharListInSector(_hSOCurrentSector,hCharacterList,i)
{
hCharacter = SECT_GetCharacterInList(hCharacterList);
fn_vInsertActorInDynamicHierarchy(hCharacter , bNewSector);
}
/* treat actived sectors*/
SECT_M_ForEachActivityNodeInActivityInteractionList(_hSOCurrentSector,hActivityList,i)
{
hChildSector = SECT_GetSectorInActivityList(hActivityList);
bNewSector = (ACP_tdxBool) (_bInit || ( SECT_cGetCounterInSector(hChildSector) != cCounter ));
SECT_M_ForEachCharListInSector(hChildSector,hCharacterList,j)
{
hCharacter = SECT_GetCharacterInList(hCharacterList);
fn_vInsertActorInDynamicHierarchy(hCharacter , bNewSector);
}
}
/* add always actived actors*/
M_ForEachAlwaysActiveCharacterNode(hCharAlwaysActiveNode,i)
{
hCharacter = fn_hGetCharacterInAlwaysActiveCharacterNode(hCharAlwaysActiveNode);
fn_vInsertActorInDynamicHierarchy(hCharacter , _bInit);
}
/* add always*/
hCharacter = g_stAlways.d_stAlwaysSuperObject;
p_hGenerator = g_stAlways.d_hAlwaysGenerator;
p_hLastGenerator = p_hGenerator + g_stAlways.ulMaxNumberOfAlways;
for( ; p_hGenerator < p_hLastGenerator; hCharacter++, p_hGenerator++ )
{
if( M_GetMSHandle(hCharacter, StandardGame) )
{
bNewSector = (ACP_tdxBool) (_bInit ||
( M_GetMSHandle(hCharacter,SectInfo) &&
fn_h_SectInfoGetCurrentSector(M_GetMSHandle(hCharacter,SectInfo)) &&
(SECT_cGetCounterInSector(fn_h_SectInfoGetCurrentSector(M_GetMSHandle(hCharacter,SectInfo))) != cCounter) ));
fn_vInsertActorInDynamicHierarchy(hCharacter , bNewSector);
}
}
/* add fix*/
xIndexMax = HIE_fn_xGetNumberOfElementInFixViewport () ;
for ( xIndex=0 ; xIndex<xIndexMax ; xIndex++)
{
HIE_tdxHandleToSuperObject hFixSPO ;
hFixSPO = HIE_fn_hGetElementFormFixViewport (xIndex) ;
fn_vInsertActorInDynamicHierarchy(hFixSPO , _bInit);
}
}
void fn_vUpdateDynamicHierarchy()
{
HIE_tdxHandleToSuperObject hActualSector;
hActualSector = fn_h_SectInfoGetCurrentSector(M_GetMSHandle(MC_fn_hGetCharacterInMainCharacterNode( MC_fn_hGetFirstMainCharNode()),SectInfo));
if( hActualSector != g_hSOCurrentMainSector )
{
ACP_tdxBool bInit;
bInit = (ACP_tdxBool)(g_hSOCurrentMainSector == NULL);
g_hSOPreviousMainSector = g_hSOCurrentMainSector;
g_hSOCurrentMainSector = hActualSector;
fn_vClearDynamicHierarchy(g_hSOPreviousMainSector);
fn_vFillDynamicHierarchy(g_hSOCurrentMainSector,bInit);
fn_vDesinitInactivePerso();
}
}
#ifdef ACTIVE_EDITOR
/*-----------------------------------------------------------------------------
* Description :
*
*-----------------------------------------------------------------------------
* Output :
*-----------------------------------------------------------------------------
* Creation date : 04/03/98 Author :
*---------------------------------------------------------------------------*/
void GAM_fn_vFillHierarchyBeforeEditor(void)
{
/* add all actors in the hierarchy*/
HIE_tdxHandleToSuperObject hCharacter,hNextCharacter;
long i;
HIE_M_ForEachMovingChildOf(gp_stInactiveDynamicWorld,hCharacter,hNextCharacter,i)
{
if( fn_ucStandardGameGetPlatFormType(M_GetMSHandle(hCharacter,StandardGame))!=0 )
{
HIE_fn_vSuperObjectAddHead(gp_stDynamicWorld,hCharacter);
}
else
{
HIE_fn_vSuperObjectAddTail(gp_stDynamicWorld,hCharacter);
}
}
}
/*-----------------------------------------------------------------------------
* Description :
*
*-----------------------------------------------------------------------------
* Output :
*-----------------------------------------------------------------------------
* Creation date : 04/03/98 Author :
*---------------------------------------------------------------------------*/
void GAM_fn_vFillHierarchyAfterEditor(void)
{
HIE_tdxHandleToSuperObject hActualSector;
hActualSector = fn_h_SectInfoGetCurrentSector(M_GetMSHandle(MC_fn_hGetCharacterInMainCharacterNode( MC_fn_hGetFirstMainCharNode()),SectInfo));
fn_vClearDynamicHierarchy(hActualSector);
fn_vFillDynamicHierarchy(hActualSector,TRUE);
TFMT_vInitTextAfficheStructure();
}
#endif