reman3/Rayman_X/cpa/tempgrp/GAM/Locale/fonload.c

483 lines
15 KiB
C
Raw Blame History

/*=========================================================================
* mnuload.c : Script interpretation for the menus
*
* Version 1.0
* Creation date 2./05/97
* Revision date
*
* That file needs to be compatible for all platforms.
*
* (c) Ubi R&D 1997
*=======================================================================*/
/*
*=======================================================================
Modifications:
*=======================================================================*/
/*#include "fonhdls.h"*/
#include "ACP_Base.h"
#include "ToolsCPA.h"
/*#include "SCR.h"*/
/*#include "DPT.h"*/
/*#include "GEO.h"*/
/*#include "GLI.h"*/
/*#include "TEX.h"*/
/*#include "SCR.h"*/
/*#include "VIG.h"*/
#include "RND.h"
/*#include "LST.h"*/
#include "fonerm.h"
#include "fonmem.h"
#include "Structur/EngMode.h"
/*#include "fonpub.h"*/
/*#include "FON_Eff.h"*/
#include "fonfont.h"
#include "fonload.h"
/*#include "fontext.h"*/
static BOOL s_bIncoherenceInTxtFiles = FALSE;
/* Global array of fonts*/
#if !defined(U64)
/*SCR_tdst_Link_Table FON_g_stFontLinkTable; // For binarisation purpose only*/
SCR_tdst_Link_Table *FON_fn_p_stGetLinkTable()
{
return &FON_g_stTextLinkTable;
}
#endif /* U64 */
/*************************************************************************/
void FON_fn_vInitLoad()
{
#if !defined(U64)
SCR_fn_v_RdL0_RegisterCallback(FON_C_SectionAddNewStrings,FON_fn_eLoadTextString,SCR_CRC_c_RdL0_ForSection);
/*SCR_fn_v_Link_InitTable(&FON_g_stFontLinkTable); // for binarisation purposes only*/
#endif /* U64 */
}
/*************************************************************************/
#if !defined(U64)
#if 0
/* convert lowercase to uppercase, and accented characters to their unaccented version... */
void fn_vConvertStringChars ( char *_p_szString )
{
int j = strlen ( _p_szString ) , i ;
for ( i = 0 ; i < j ; i ++ )
{
#if 1
if ( _p_szString [ i ] >= 'a' && _p_szString [ i ] <= 'z' )
_p_szString [ i ] = toupper ( _p_szString [ i ] ) ;
#else
switch ( _p_szString [ i ] )
{
case '<27>':
_p_szString [ i ] = 'c' ;
break ;
case '<27>':
case '<27>':
case '<27>':
case '<27>':
_p_szString [ i ] = 'e' ;
break ;
case '<27>':
case '<27>':
case '<27>':
_p_szString [ i ] = 'a' ;
break ;
case '<27>':
case '<27>':
case '<27>':
_p_szString [ i ] = 'o' ;
break ;
case '<27>':
case '<27>':
_p_szString [ i ] = 'i' ;
break ;
case '<27>' :
case '<27>' :
case '<27>' :
case '<27>' :
_p_szString [ i ] = 'u' ;
break ;
}
#endif
}
}
#endif /* 0 */
/*************************************************************************/
#ifdef M_CheckScriptParamNumber
#undef M_CheckScriptParamNumber
#endif
#define M_CheckScriptParamNumber(ulNumber) \
{ \
if (SCR_fn_uc_RdL0_GetNumberOfParameters(szParams)!=ulNumber) \
M_FONFatalError(E_uwFontScriptBadNumberOfArg); \
}
SCR_tde_Anl_ReturnValue FON_fn_eLoadTextString(SCR_tdst_File_Description *p_fFile, char *szAction, char *szParams[], SCR_tde_Anl_Action cType)
{
/*enum FON_tdeTextEffect_ _eTextEffect = FON_e_Nothing;*/
/*static tdeLanguageDefinition wLanguageId;*/
static short s_wLanguageId ;
static tdstLanguage * s_p_stLoadedLanguage ;
switch (cType)
{
case SCR_EA_Anl_BeginSection:
{
/*allocate the pointer of lists of languages*/
register unsigned short uwLanguage = 0;
if ( !stricmp(szAction, "Common") )
{
/* special value for common language strings */
s_wLanguageId = -1 ;
if ( ! FON_g_stGeneral . p_stCommonLanguage )
{
FON_g_stGeneral.p_stCommonLanguage = (tdstLanguage *) FON_fn_p_vAllocInBloc (
E_ucFONTextMemoryBlock ,
sizeof ( tdstLanguage )
);
}
/* the subsequent loaded strings are to be associated with this language definition */
s_p_stLoadedLanguage = FON_g_stGeneral . p_stCommonLanguage ;
}
else
{
/* by default if any problem */
s_wLanguageId = 0;
do
{
if ( !stricmp(szAction, g_stEngineStructure.p_stLanguageTable[uwLanguage].szLanguageCode) )
{
s_wLanguageId = uwLanguage;
uwLanguage = g_stEngineStructure.ucNbLanguages;
}
} while ( uwLanguage ++ < g_stEngineStructure . ucNbLanguages ) ;
/*allocate a new language definition structure if necessary*/
if ( FON_g_stGeneral.uwNumberOfLanguages <= s_wLanguageId )
{
long lIndex;
if ( FON_g_stGeneral.d_sLanguageArray )
{
FON_g_stGeneral.d_sLanguageArray = (tdstLanguage *) FON_fn_p_vReallocInBloc(
E_ucFONTextMemoryBlock,
FON_g_stGeneral.d_sLanguageArray,
(s_wLanguageId + 1) * sizeof(tdstLanguage)
);
}
else
{
FON_g_stGeneral.d_sLanguageArray = (tdstLanguage *) FON_fn_p_vAllocInBloc(
E_ucFONTextMemoryBlock,
(s_wLanguageId + 1) * sizeof(tdstLanguage)
);
}
/*initialize all new allocated structures*/
for ( lIndex = FON_g_stGeneral.uwNumberOfLanguages; lIndex < s_wLanguageId + 1; lIndex ++ )
{
FON_g_stGeneral.d_sLanguageArray[lIndex].d_pTextsArray = NULL;
FON_g_stGeneral.d_sLanguageArray[lIndex].uwMaxNumberOfTexts = 0;
FON_g_stGeneral.d_sLanguageArray[lIndex].uwNumberOfTexts = 0;
}
FON_g_stGeneral.uwNumberOfLanguages = (unsigned short) (s_wLanguageId + 1);
}
/* the subsequent loaded strings are to be associated with this language definition */
s_p_stLoadedLanguage = FON_g_stGeneral . d_sLanguageArray + s_wLanguageId ;
}
/*update the size of the string pointers array*/
s_p_stLoadedLanguage -> uwMaxNumberOfTexts += (unsigned short) (atoi(szParams[0]));
if ( s_p_stLoadedLanguage -> d_pTextsArray )
{
s_p_stLoadedLanguage -> d_pTextsArray = (char/*struct FON_stText_*/ **) FON_fn_p_vReallocInBloc (
E_ucFONTextMemoryBlock,
s_p_stLoadedLanguage -> d_pTextsArray,
s_p_stLoadedLanguage -> uwMaxNumberOfTexts * sizeof(char/*struct FON_stText_*/ *)
);
}
else
{
s_p_stLoadedLanguage -> d_pTextsArray = (char/*struct FON_stText_*/ **) FON_fn_p_vAllocInBloc (
E_ucFONTextMemoryBlock,
s_p_stLoadedLanguage -> uwMaxNumberOfTexts * sizeof(char/*struct FON_stText_*/ *)
);
}
}
/*FON_g_stGeneral.d_stFontAndEffectArray = (struct FON_tdstFontAndEffect_ **)FON_fn_p_vReallocInBloc(E_ucFONMemoryBlock,FON_g_stGeneral.d_stFontAndEffectArray,FON_g_stGeneral.ulMaxNumberOfTexts*sizeof(struct FON_tdstFontAndEffect_ *));*/
break;
case SCR_EA_Anl_Entry :
if ( ! stricmp( szAction , FON_C_SectionNewString ) || !stricmp( szAction , FON_C_SectionNewUpperString ) )
{
char *hText = NULL;
if (s_p_stLoadedLanguage -> uwNumberOfTexts >= s_p_stLoadedLanguage -> uwMaxNumberOfTexts)
{
M_FONFatalError(E_uwFONNotEnoughStringSpace);
}
/* if the text is empty, try to find a non-empty version in any other language (the string is common to all)*/
if ( strlen(szParams[1]) == 0 )
{
long lIndex;
for (lIndex = 0; lIndex < FON_g_stGeneral.uwNumberOfLanguages; lIndex ++)
if ( FON_g_stGeneral.d_sLanguageArray[lIndex].d_pTextsArray )
{
/* get the text in the other language*/
hText = FON_g_stGeneral.d_sLanguageArray[lIndex].d_pTextsArray[s_p_stLoadedLanguage -> uwNumberOfTexts];
if ( hText )
break;
}
}
else
{
SCR_tdst_Link_Value * p_stRegisteredValue ;
char szRegisteredString [ 256 ] ;
long lSize = strlen ( szParams [ 1 ] ) ;
hText = FON_fn_p_vAllocInBloc(
E_ucFONTextMemoryBlock ,
lSize + 1
#ifdef ACTIVE_EDITOR
+ 2 /* 2 bytes for the string length */
#endif
) ;
#ifdef ACTIVE_EDITOR
/* for debug purposes (only for certain AI calls), store the size of the string after it */
* ( short * ) ( & hText [ lSize + 1 ] ) = ( short ) lSize ;
#endif
strcpy ( hText , szParams [ 1 ] ) ;
/* convert strange characters to more normal characters */
#if 0
fn_vConvertStringChars ( hText ) ;
#endif
/* upper ? */
if ( ! stricmp ( szAction , FON_C_SectionNewUpperString ) )
strupr ( hText ) ;
/* First we check if the string is already registered with a different index */
if (!s_bIncoherenceInTxtFiles)
{
p_stRegisteredValue = SCR_fnp_st_Link_SearchKey(&FON_g_stTextLinkTable, szParams[0]);
if ( p_stRegisteredValue != NULL )
{
long lRegisteredIndex = SCR_M_ul_Link_GetValue(p_stRegisteredValue);
/* common strings have special indexes to identify them */
if ( s_p_stLoadedLanguage == FON_g_stGeneral . p_stCommonLanguage )
lRegisteredIndex -= FON_C_HandleOffsetForCommonLanguage ;
if ( lRegisteredIndex != s_p_stLoadedLanguage -> uwNumberOfTexts )
{
char szMessage[256];
sprintf(szMessage, "There is an incoherence in the text file %s, at the string %s", p_fFile->a_szFileName, szParams[0]);
MessageBox(NULL,szMessage,"Incoherence in a TXT file",MB_OK|MB_ICONWARNING);
s_bIncoherenceInTxtFiles = TRUE;
#if defined ( ACTIVE_EDITOR )
fn_vForceEditor();
#endif /* ! ACTIVE_EDITOR */
}
}
}
/* Then we check if the index is already registered with a different string */
if ( ! s_bIncoherenceInTxtFiles )
{
long lRegisteredIndex = s_p_stLoadedLanguage -> uwNumberOfTexts ;
/* common strings have special indexes to identify them */
if ( s_p_stLoadedLanguage == FON_g_stGeneral . p_stCommonLanguage )
lRegisteredIndex += FON_C_HandleOffsetForCommonLanguage ;
p_stRegisteredValue = SCR_fnp_st_Link_SearchValue(&FON_g_stTextLinkTable, lRegisteredIndex ) ;
if ( p_stRegisteredValue != NULL )
{
strcpy(szRegisteredString, SCR_M_p_sz_Link_GetKey(p_stRegisteredValue));
if (stricmp(szRegisteredString, szParams[0]))
{
char szMessage[256];
sprintf(szMessage, "There is an incoherence in the text file %s, at the string %s", p_fFile->a_szFileName, szParams[0]);
MessageBox(NULL,szMessage,"Incoherence in a TXT file",MB_OK|MB_ICONWARNING);
s_bIncoherenceInTxtFiles = TRUE;
#if defined ( ACTIVE_EDITOR )
fn_vForceEditor();
#endif /* ! ACTIVE_EDITOR */
}
}
}
/* normally this line should occur once per text per language -> everything will be fine if a given text name*/
/* always has the same index in the section, because only one linktable entry may exist with a given name*/
SCR_fnp_st_Link_SetValue(
&FON_g_stTextLinkTable,
szParams[0],
s_p_stLoadedLanguage -> uwNumberOfTexts
+ (
( s_p_stLoadedLanguage == FON_g_stGeneral . p_stCommonLanguage )
? FON_C_HandleOffsetForCommonLanguage
: 0
)
) ;
}
s_p_stLoadedLanguage -> d_pTextsArray[ s_p_stLoadedLanguage -> uwNumberOfTexts ] = hText ;
s_p_stLoadedLanguage -> uwNumberOfTexts ++;
}
else if ( !stricmp(szAction, FON_C_SectionNewStringLength) )
{
char *hText = NULL;
if ( s_p_stLoadedLanguage -> uwNumberOfTexts >= s_p_stLoadedLanguage -> uwMaxNumberOfTexts )
{
M_FONFatalError(E_uwFONNotEnoughStringSpace);
}
/* if the text is empty, try to find a non-empty version in any other language (the string is common to all)*/
if ( atoi(szParams[1]) == 0 )
{
long lIndex;
for (lIndex = 0; lIndex < FON_g_stGeneral.uwNumberOfLanguages; lIndex ++)
if ( FON_g_stGeneral.d_sLanguageArray[lIndex].d_pTextsArray )
{
/* get the text in the other language*/
hText = FON_g_stGeneral.d_sLanguageArray[lIndex].d_pTextsArray[ s_p_stLoadedLanguage -> uwNumberOfTexts ] ;
if ( hText )
break;
}
}
else
{
SCR_tdst_Link_Value *p_stRegisteredValue;
char szRegisteredString[256];
long lRegisteredIndex;
long lSize;
lSize = atoi(szParams[1]);
/* allocate a string and fill it with whitespaces (so that strlen() is non-zero)*/
hText = FON_fn_p_vAllocInBloc(
E_ucFONTextMemoryBlock,
lSize + 1 /* string + zero terminator */
#ifdef ACTIVE_EDITOR
+ 2 /* 2 bytes for the string length */
#endif
);
/* fill with whitespaces for clarity */
memset(hText, ' ', lSize );
/* don't forget to set the zero terminator */
hText [ lSize ] = 0 ;
#ifdef ACTIVE_EDITOR
/* for debug purposes (only for certain AI calls), store the size of the string after it */
* ( short * ) ( & hText [ lSize + 1 ] ) = ( short ) lSize ;
#endif
/* First we check if the string is already registered with a different index */
if (!s_bIncoherenceInTxtFiles)
{
p_stRegisteredValue = SCR_fnp_st_Link_SearchKey(&FON_g_stTextLinkTable, szParams[0]);
if (p_stRegisteredValue!=NULL)
{
lRegisteredIndex = SCR_M_ul_Link_GetValue(p_stRegisteredValue);
/* common strings have special indexes to identify them */
if ( s_p_stLoadedLanguage == FON_g_stGeneral . p_stCommonLanguage )
lRegisteredIndex -= FON_C_HandleOffsetForCommonLanguage ;
if ( lRegisteredIndex != s_p_stLoadedLanguage -> uwNumberOfTexts )
{
char szMessage[256];
sprintf(szMessage, "There is an incoherence in the text file %s, at the string %s", p_fFile->a_szFileName, szParams[0]);
MessageBox(NULL,szMessage,"Incoherence in a TXT file",MB_OK|MB_ICONWARNING);
s_bIncoherenceInTxtFiles = TRUE;
#if defined ( ACTIVE_EDITOR )
fn_vForceEditor();
#endif /* ! ACTIVE_EDITOR */
}
}
}
/* Then we check if the index is already registered with a different string */
if (!s_bIncoherenceInTxtFiles)
{
long lRegisteredIndex = s_p_stLoadedLanguage -> uwNumberOfTexts ;
/* common strings have special indexes to identify them */
if ( s_p_stLoadedLanguage == FON_g_stGeneral . p_stCommonLanguage )
lRegisteredIndex += FON_C_HandleOffsetForCommonLanguage ;
p_stRegisteredValue = SCR_fnp_st_Link_SearchValue(&FON_g_stTextLinkTable, lRegisteredIndex ) ;
if ( p_stRegisteredValue != NULL )
{
strcpy(szRegisteredString, SCR_M_p_sz_Link_GetKey(p_stRegisteredValue));
if (stricmp(szRegisteredString, szParams[0]))
{
char szMessage[256];
sprintf(szMessage, "There is an incoherence in the text file %s, at the string %s", p_fFile->a_szFileName, szParams[0]);
MessageBox(NULL,szMessage,"Incoherence in a TXT file",MB_OK|MB_ICONWARNING);
s_bIncoherenceInTxtFiles = TRUE;
#if defined ( ACTIVE_EDITOR )
fn_vForceEditor();
#endif /* ! ACTIVE_EDITOR */
}
}
}
/* normally this line should occur once per text per language -> everything will be fine if a given text name*/
/* always has the same index in the section, because only one linktable entry may exist with a given name*/
SCR_fnp_st_Link_SetValue(
&FON_g_stTextLinkTable,
szParams[0],
s_p_stLoadedLanguage -> uwNumberOfTexts
+ (
( s_p_stLoadedLanguage == FON_g_stGeneral . p_stCommonLanguage )
? FON_C_HandleOffsetForCommonLanguage
: 0
)
);
}
s_p_stLoadedLanguage -> d_pTextsArray[ s_p_stLoadedLanguage -> uwNumberOfTexts ] = hText ;
s_p_stLoadedLanguage -> uwNumberOfTexts ++ ;
}
break;
case SCR_EA_Anl_EndSection:
break;
}
return SCR_ERV_Anl_NormalReturn;
}
#endif /* U64 */
/*************************************************************************/
/* Binarisation functions*/
/* See with Alain Robin for any problem or question*/
/*char* FON_fn_p_cAlloc(unsigned long _ulSize)
{
return (char*)FON_fn_p_vAllocInBloc(E_ucFONMemoryBlock,_ulSize);
}*/