reman3/Rayman_X/cpa/tempgrp/TIA/Src/EdIRBELs.cpp

489 lines
15 KiB
C++

// EdIRBELs.cpp : implementation file
//
#include "stdafx.h"
#include "Defines.hpp"
#ifdef D_ED_IR_ACTIVE
#include "EdIRBELs.hpp"
#include "EdIRBeEn.hpp"
#include "EdIRBeha.hpp"
#include "EdIR2Eng.hpp"
#include "EdIRBis.hpp"
#include "EdIRDVLs.hpp"
#include "EdIRDvVw.hpp"
#include "EdIRFrm.hpp"
#include "EdIRIRD.hpp"
#include "EdIRStrg.hpp"
#include "ACP_Base.h"
#include "ITF.h"
#include "IncMEC.h"
#include "incAI.h"
// Shaitan => optimisation lists in the level
#include "TFA.h"
// End Shaitan => optimisation lists in the level
#include "_Actors.hpp"
#include "EDACModl.hpp"
/*#include "ai_intf.hpp"
#include "EDACInst.hpp"
#include "EDACDoc.hpp"*/
#include "x:\cpa\main\inc\_EditID.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
//////////////////////////////////////////////////////////////////
// class CPA_EdIR_MainBehaviourList
//////////////////////////////////////////////////////////////////
/****************************************************************************/
CPA_EdIR_MainBehaviourList::CPA_EdIR_MainBehaviourList()
{
m_pclOldActiveMainBehaviour =NULL;
m_bHasBeenModified =FALSE;
}
/****************************************************************************/
CPA_EdIR_MainBehaviourList::CPA_EdIR_MainBehaviourList(CPA_Actor *pclModel,CPA_EdIR_MainBehaviourList *p_clMainBehaviourList)
{
m_pclOldActiveMainBehaviour =p_clMainBehaviourList->m_pclOldActiveMainBehaviour;
m_bHasBeenModified =FALSE;
POSITION pos=p_clMainBehaviourList->GetHeadPosition();
while(pos!=NULL)
{
CPA_EdIR_MainBehaviour *pclMainBehaviour=p_clMainBehaviourList->GetNext(pos);
AddTail(new CPA_EdIR_MainBehaviour(pclModel,*(pclMainBehaviour)));
}
}
/****************************************************************************/
CPA_EdIR_MainBehaviourList::~CPA_EdIR_MainBehaviourList()
{
}
/****************************************************************************/
void CPA_EdIR_MainBehaviourList::m_fn_vDeleteAllMainBehaviours()
{
POSITION pos=GetHeadPosition();
while(pos!=NULL)
delete GetNext(pos);
}
/****************************************************************************/
long CPA_EdIR_MainBehaviourList::m_fn_lGetNbPages(long lLineHeight,
long lPageHeight,
BOOL bOneBehaviourOnAPage)
{
long lNbPages=0;
if(bOneBehaviourOnAPage)
{
POSITION pos=GetHeadPosition();
while(pos!=NULL)
{
CPA_EdIR_MainBehaviour *pclMainBehaviour=GetNext(pos);
//Gets nb pages for this behaviour and adds to the total nb pages
lNbPages+=pclMainBehaviour->m_fn_lGetNbPages(lLineHeight,lPageHeight);
}
}
else
{
//Computes nb lines required for printing all behaviours
POSITION pos=GetHeadPosition();
long lNbLines=0;
while(pos!=NULL)
{
CPA_EdIR_MainBehaviour *pclMainBehaviour=GetNext(pos);
lNbLines+=pclMainBehaviour->m_fn_lGetNbLines();
}
//Computes nb pages for printing lNbLines
long lNbLinesInAPage=lPageHeight/lLineHeight;
while(lNbLines>=0)
{
lNbLines-=lNbLinesInAPage;
lNbPages++;
}
}
return lNbPages;
}
/****************************************************************************/
void CPA_EdIR_MainBehaviourList::m_fn_vPrint(long lLineHeight,
long lPageHeight,
BOOL bOneBehaviourOnAPage,
long lCurrentPage,
CDC *pDC,CPrintInfo *pInfo)
{
if(bOneBehaviourOnAPage)
{
POSITION pos=GetHeadPosition();
long lCurStartPage=0;
long lCurEndPage=0;
BOOL bEnd=FALSE;
while(pos!=NULL && !bEnd)
{
CPA_EdIR_MainBehaviour *pclMainBehaviour=GetNext(pos);
lCurEndPage=lCurStartPage+pclMainBehaviour->m_fn_lGetNbPages(lLineHeight,lPageHeight);
//Checks if this behaviour must be printed on this page
if(lCurrentPage>=lCurStartPage &&
lCurrentPage<=lCurEndPage)
{
//Prints this behaviour
//Substracts 5 mm to increase printer's margins
long lDPI=pDC->GetDeviceCaps(LOGPIXELSY);
long lFiveMmInDPI=long(double(5*lDPI)/25.4);
CString csText=pclMainBehaviour->m_fn_csGetTextToPrint(lLineHeight,pDC->GetDeviceCaps(VERTRES)-lFiveMmInDPI,lCurrentPage-lCurStartPage);
pDC->DrawText(csText,pInfo->m_rectDraw,DT_LEFT);
bEnd=TRUE;
}
lCurStartPage=lCurEndPage;
}
}
else
{
//Computes start line number and end line number for the current page (lCurrentPage)
long lNbLinesInAPage=lPageHeight/lLineHeight;
long lStartLineNumber=(lCurrentPage-1)*lNbLinesInAPage;
long lEndLineNumber=lStartLineNumber+lNbLinesInAPage-1;
POSITION pos=GetHeadPosition();
long lCurStartLine=0;
long lCurEndLine=0;
while(pos!=NULL)
{
CPA_EdIR_MainBehaviour *pclMainBehaviour=GetNext(pos);
lCurEndLine=lCurStartLine+pclMainBehaviour->m_fn_lGetNbLines();
//Checks if this behaviour must be printed on this page
long lCurStartPrintLine=lCurStartLine;
long lCurEndPrintLine=lCurEndLine;
if(lCurStartLine<=lStartLineNumber &&
lCurEndLine>=lStartLineNumber)
lCurStartPrintLine=lStartLineNumber;
if(lCurEndLine>=lEndLineNumber &&
lCurStartLine<=lEndLineNumber)
lCurEndPrintLine=lEndLineNumber;
if(lCurStartPrintLine>=lStartLineNumber &&
lCurEndPrintLine<=lEndLineNumber)
{
//Prints this behaviour
CString csText;
csText=pclMainBehaviour->m_fn_csGetTextBetweenLines(lCurStartPrintLine-lCurStartLine,
lCurEndPrintLine-lCurStartLine);
//Computes printable rect
CRect crRect(0,0,pDC->GetDeviceCaps(HORZRES),0);
crRect.top=(lCurStartPrintLine-lStartLineNumber)*lLineHeight;
crRect.bottom=(lCurEndPrintLine-lStartLineNumber+1)*lLineHeight;
pDC->DrawText(csText,crRect,DT_LEFT);
}
lCurStartLine=lCurEndLine;
}
}
}
/****************************************************************************/
BOOL CPA_EdIR_MainBehaviourList::m_fn_bIsInList(CString csBehaviourName)
{
POSITION pos=GetHeadPosition();
BOOL bFound=FALSE;
while(pos!=NULL && !bFound)
{
bFound=(GetNext(pos)->GetName().CompareNoCase(csBehaviourName)==0);
}
return bFound;
}
/****************************************************************************/
long CPA_EdIR_MainBehaviourList::m_fn_lGetIndexOfABehaviour(CString csBehaviourName)
{
POSITION pos=GetHeadPosition();
long lIndex=0;
BOOL bFound=FALSE;
while(pos!=NULL && !bFound)
{
bFound=(GetNext(pos)->GetName().CompareNoCase(csBehaviourName)==0);
lIndex++;
}
return lIndex-1;
}
/****************************************************************************/
CPA_EdIR_MainBehaviour *CPA_EdIR_MainBehaviourList::m_fn_pclGetMainBehaviour(CString csBehaviourName)
{
POSITION pos=GetHeadPosition();
CPA_EdIR_MainBehaviour *pclMainBehaviour=NULL;
while(pos!=NULL && pclMainBehaviour==NULL)
{
if(GetAt(pos)->GetName().CompareNoCase(csBehaviourName)==0)
pclMainBehaviour=GetAt(pos);
GetNext(pos);
}
return pclMainBehaviour;
}
/****************************************************************************/
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Method : CPA_EdIR_MainBehaviourList::m_fn_csGetRules
// Date : 98.03
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Description :
// Author : Cristi Petrescu
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Modification :
// Date :
// By :
//////////////////////////////////////////////////////////////////////////////////////////////////////
CString CPA_EdIR_MainBehaviourList::m_fn_csGetRules(CString csBehaviourName)
{
CPA_EdIR_MainBehaviour *pclMainBehaviour = m_fn_pclGetMainBehaviour (csBehaviourName);
return pclMainBehaviour -> m_pclBehaviour -> m_fn_csGetRules ();
}
/****************************************************************************/
BOOL CPA_EdIR_MainBehaviourList::m_fn_bCheckIA(tdeTypeText eTypeText, BOOL ForProcess)
{
POSITION pos=GetHeadPosition();
BOOL bNoError=TRUE;
while(pos!=NULL && bNoError)
{
CPA_EdIR_MainBehaviour *pclMainBehaviour=GetNext(pos);
CPA_EdIR_Behaviour *pclBehaviour=pclMainBehaviour->m_pclBehaviour;
bNoError= (pclBehaviour ? pclBehaviour->m_fn_bCheckIA(eTypeText) : TRUE);
}
return bNoError;
}
/****************************************************************************/
BOOL CPA_EdIR_MainBehaviourList::m_fn_bProcessIA(BOOL bProcessAll,BOOL bCreateControl,
AI_tdstMind *pstMind,tdstComport *pstComport,
tdeTypeText eTypeText,CPA_EdIR_DebugInfoList *pclDebugInfoList)
{
POSITION pos=GetHeadPosition();
BOOL bNoError=TRUE;
long lCurrentBehaviour=0;
if(eTypeText == CRRGeneration)
{
while(pos!=NULL)
{
CPA_EdIR_MainBehaviour *pclMainBehaviour=GetNext(pos);
CPA_EdIR_Behaviour *pclBehaviour=pclMainBehaviour->m_pclBehaviour;
pclBehaviour->m_fn_bProcessIA(TRUE,FALSE,NULL,NULL,NULL,CRRGeneration, pclDebugInfoList);
}
}
//BEGIN ROMTEAM Cristi Petrescu 98-04-
struct tdstMacro_ *pstSubr;
if (eTypeText == SubrText)
{
pstSubr = ((tdstListOfMacro *) pstComport) -> p_stMacro;
}
//END ROMTEAM Cristi Petrescu 98-04-
while(pos!=NULL && bNoError)
{
CPA_EdIR_MainBehaviour *pclMainBehaviour=GetNext(pos);
// Shaitan => optimisation lists in the level
CList<CPA_BaseObject *,CPA_BaseObject *> clListOfOldDependencies;
clListOfOldDependencies.RemoveAll();
BOOL bMustCheckDependancies = pclMainBehaviour->m_fn_bHasBeenModified();
// End Shaitan => optimisation lists in the level
//Remove old dependences
POSITION p=pclMainBehaviour->m_clListOfDependencies.GetHeadPosition();
while(p!=NULL)
{
CPA_BaseObject *pclChild=pclMainBehaviour->m_clListOfDependencies.GetNext(p);
g_oCoherenceManager.m_fn_vRemoveALink(pclMainBehaviour,pclChild);
// Shaitan => optimisation lists in the level
clListOfOldDependencies.AddTail(pclChild);
// End Shaitan => optimisation lists in the level
}
pclMainBehaviour->m_clListOfDependencies.RemoveAll();
//BEGIN ROMTEAM Cristi Petrescu 98-05-
CPA_EdIR_DebugInfoList *pclGlobalDebugInfoList = pclDebugInfoList;
pclDebugInfoList = & pclMainBehaviour -> m_clDebugInfoList;
// do not destroy because this is just a duplicate list.
// destroyng is done for the whole Brain list
pclDebugInfoList -> RemoveAll ();
//END ROMTEAM Cristi Petrescu 98-05-
//Applies IA
CPA_EdIR_Behaviour *pclBehaviour=pclMainBehaviour->m_pclBehaviour;
//BEGIN ROMTEAM Cristi Petrescu 98-04-
if (eTypeText == SubrText)
{
CPA_Actor *pclModel=(CPA_Actor *)pclMainBehaviour->GetOwner();
CString csFamilyName=pclModel->m_fn_csGetFamilyName();
CString csModelName=pclModel->GetName();
CString csBehaviourName=pclMainBehaviour->GetName();
CString csBehaviourRefName=csFamilyName+"\\"+csModelName+"\\"+csModelName+g_c_csAIRulFileExtension+"^"+
g_c_csRulSectionName+"^"+g_c_csBehavSectionName+":"+csBehaviourName;
strcpy(M_GetNameMacro(pstSubr),M_MAKECHAR(csBehaviourRefName));
// perhaps some debug integration here... do it later.
bNoError=pclBehaviour->m_fn_bProcessIA(bProcessAll,bCreateControl,pstMind,pstComport,(tdstTreeInterpret *) pstSubr,eTypeText,pclDebugInfoList);
pstSubr ++;
}
else if(!pclBehaviour->m_bDeclaration && eTypeText != Macro_2_Text)
//END ROMTEAM Cristi Petrescu 98-04-
{
long lNbRules=fn_lGetNbRules(pclBehaviour->m_fn_csGetRules());
tdstTreeInterpret *pstRule;
pstRule=fn_p_stAllocRule((unsigned char)lNbRules);
M_GetComportRules(pstComport)=pstRule;
M_GetComportNbRules(pstComport)=(unsigned char)lNbRules;
//Sets behaviour name (debug information for engine)
CPA_Actor *pclModel=(CPA_Actor *)pclMainBehaviour->GetOwner();
CString csFamilyName=pclModel->m_fn_csGetFamilyName();
CString csModelName=pclModel->GetName();
CString csBehaviourName=pclMainBehaviour->GetName();
CString csBehaviourRefName=csFamilyName+"\\"+csModelName+"\\"+csModelName+g_c_csAIRulFileExtension+"^"+
g_c_csRulSectionName+"^"+g_c_csBehavSectionName+":"+csBehaviourName;
strcpy(M_GetNameComport(pstComport),M_MAKECHAR(csBehaviourRefName));
bNoError=pclBehaviour->m_fn_bProcessIA(bProcessAll,bCreateControl,pstMind,pstComport,pstRule,eTypeText,pclDebugInfoList);
pstComport++;
}
else
{
bNoError=pclBehaviour->m_fn_bProcessIA(bProcessAll,bCreateControl,pstMind,NULL,NULL,eTypeText,pclDebugInfoList);
}
//BEGIN ROMTEAM Cristi Petrescu 98-05-
//Update the global debug list
POSITION pos = pclDebugInfoList -> GetHeadPosition ();
CPA_EdIR_DebugInfo *pclDebugInfo;
while (pos)
{
pclDebugInfo = pclDebugInfoList -> GetNext (pos);
pclGlobalDebugInfoList -> AddTail (pclDebugInfo);
}
pclDebugInfoList = pclGlobalDebugInfoList;
//END ROMTEAM Cristi Petrescu 98-05-
// Shaitan => optimisation lists in the level
if (bMustCheckDependancies)
{
// first check if there are new dependancies in the behaviour
POSITION pos1 = pclMainBehaviour->m_clListOfDependencies.GetHeadPosition();
while (pos1)
{
CPA_BaseObject *pclChild = pclMainBehaviour->m_clListOfDependencies.GetNext(pos1);
if (pclChild->GetType() == C_szActionTypeName)
{
if (!clListOfOldDependencies.Find(pclChild))
((CPA_Family *) pclChild->GetOwner())->mfn_vSetModifiedStateList();
}
else if (pclChild->GetType() == C_szObjectTableTypeName)
{
if (!clListOfOldDependencies.Find(pclChild))
((CPA_Family *) pclChild->GetOwner())->mfn_vSetModifiedPOList();
}
}
// then check if the old dependancies are still valid
pos1 = clListOfOldDependencies.GetHeadPosition();
while (pos1)
{
CPA_BaseObject *pclChild = clListOfOldDependencies.GetNext(pos1);
if (pclChild->GetType() == C_szActionTypeName)
{
if (!pclMainBehaviour->m_clListOfDependencies.Find(pclChild))
((CPA_Family *) pclChild->GetOwner())->mfn_vSetModifiedStateList();
}
else if (pclChild->GetType() == C_szObjectTableTypeName)
{
if (!pclMainBehaviour->m_clListOfDependencies.Find(pclChild))
((CPA_Family *) pclChild->GetOwner())->mfn_vSetModifiedPOList();
}
}
}
// End Shaitan => optimisation lists in the level
lCurrentBehaviour++;
}
if (bCreateControl)
{
// update control list
CPA_DLLBase *pclActorDLL =(CPA_DLLBase*)(g_pclAIInterface->GetMainWorld()->GetObjectDLLWithName(C_szDLLActorName));
CPA_EdIR_DesignerVariablesView *pclDsgVarView =(CPA_EdIR_DesignerVariablesView *)pclActorDLL->OnQueryAction(g_pclAIInterface,C_uiActor_GetDesignerVariablesView,0);
CPA_EdIR_Frame *pclIRMainFrame =g_pclAIInterface->m_pclIRMainFrame;
CPA_Actor *pclModel =pclIRMainFrame->m_fn_pclGetModel();
CTL_Editor_ControlList *pclListOfDesignerVariableControl =&(((EdActors_EditorActorModel *)pclModel->m_fn_pclGetEditorActor())->m_clListOfDesignerVariableControl);
pclDsgVarView->m_fn_vUpdateControls(pclListOfDesignerVariableControl);
}
return bNoError;
}
/****************************************************************************/
BOOL CPA_EdIR_MainBehaviourList::m_fn_bHasBeenModified()
{
POSITION pos=GetHeadPosition();
BOOL bHasBeenModified=FALSE;
while(pos!=NULL && !bHasBeenModified)
bHasBeenModified=bHasBeenModified || GetNext(pos)->m_fn_bHasBeenModified();
return (m_bHasBeenModified||bHasBeenModified);
}
/****************************************************************************/
void CPA_EdIR_MainBehaviourList::m_fn_vSetModified(BOOL bIsModified)
{
POSITION pos=GetHeadPosition();
while(pos!=NULL)
GetNext(pos)->m_fn_vSetModified(bIsModified);
m_bHasBeenModified=bIsModified;
}
#endif //D_ED_IR_ACTIVE