/*--------------------------------------------------------------------*
 * SnaNoScr.h  written by Guillaume Souchet (based on Michael Ryssen's code)
 *
 * Purpose : load binarized game desc scripts
 *           (game.dsc, game.mem, level.mem, level.dsc)
 *--------------------------------------------------------------------*/
 
#ifndef __SNANOSCR_H__
#define __SNANOSCR_H__
 
 
#ifdef  __cplusplus
extern "C" {
#endif
 
 
/* File containing game description (in the gamedata directory)*/
#define SNA_C_GameDscFileName           "Game.dsb"
 
/* File containing level description is named <NameOfLevel>.dsb (in the level directory)*/
 
 
/* Type of the file currently opened*/
typedef enum tdeDscFileType_
{
    SNA_C_NoDscFile = 0,
    SNA_C_GameDscFile = 1,
    SNA_C_LevelDscFile = 2
} tdeDscFileType;
 
/* File currently opened*/
extern enum tdeDscFileType_ SNA_g_eFileCurrentlyOpened;
 
 
/* Constants for SNA_fn_ucGetLoadDscType*/
/* and SNA_fn_vSetLoadDscType*/
#define SNA_C_LoadScriptDsc             0
#define SNA_C_LoadBinaryDsc             1
#define SNA_C_SaveBinaryDsc             2
 
 
 
/* Keyword constants in the dsb files.*/
 
    /* From Game.mem */
#define SNA_C_ul_MemoryDescTitle        0
#define SNA_C_ul_GAMFixMemory           1
#define SNA_C_ul_ACPFixMemory           2
#define SNA_C_ul_ACPTextMemory          3
#define SNA_C_ul_AIFixMemory            4
#define SNA_C_ul_TMPFixMemory           5
#define SNA_C_ul_IPTMemory              6
#define SNA_C_ul_SAIFixMemory           7
#define SNA_C_ul_FontMemory             8
#define SNA_C_ul_PositionMemory         9
 
    /* From level.mem */
#define SNA_C_ul_GAMLevelMemory         11
#define SNA_C_ul_AILevelMemory          12
#define SNA_C_ul_ACPLevelMemory         13
#define SNA_C_ul_SAILevelMemory         14
#define SNA_C_ul_TMPLevelMemory         15
 
    /* From both, but should not be present in final release */
#ifndef RETAIL
#define SNA_C_ul_ScriptMemory           16
#endif
 
 
   /* From game.dsc : level description */
#define SNA_C_ul_LevelNameTitle         30
#define SNA_C_ul_LevelName              31
 
    /* From game.dsc and game.rnd: random description */
#define SNA_C_ul_RandomDescTitle        32
#define SNA_C_ul_RandomComputeTable     33
#define SNA_C_ul_RandomReadTable        34
 
    /* From game.dsc : Directories description */
#define SNA_C_ul_DirectoryDescTitle         40
#define SNA_C_ul_DirectoryOfEngineDLL       41
#define SNA_C_ul_DirectoryOfGameData        42
#define SNA_C_ul_DirectoryOfTexts           43
#define SNA_C_ul_DirectoryOfWorld           44
#define SNA_C_ul_DirectoryOfLevels          45
#define SNA_C_ul_DirectoryOfFamilies        46
#define SNA_C_ul_DirectoryOfCharacters      47
#define SNA_C_ul_DirectoryOfAnimations      48
#define SNA_C_ul_DirectoryOfGraphicsClasses 49
#define SNA_C_ul_DirectoryOfGraphicsBanks   50
#define SNA_C_ul_DirectoryOfMechanics       51
#define SNA_C_ul_DirectoryOfSound           52
#define SNA_C_ul_DirectoryOfVisuals         53
#define SNA_C_ul_DirectoryOfEnvironment     54
#define SNA_C_ul_DirectoryOfMaterials       55
#define SNA_C_ul_DirectoryOfSaveGame        56
#define SNA_C_ul_DirectoryOfExtras          57
#define SNA_C_ul_DirectoryOfTexture         58
#define SNA_C_ul_DirectoryOfVignettes       59
#define SNA_C_ul_DirectoryOfOptions         60
#define SNA_C_ul_DirectoryOfLipsSync        61
#define SNA_C_ul_DirectoryOfZdx             62
#define SNA_C_ul_DirectoryOfEffects         63
 
	/* From game.dsc : big file  description */
#define SNA_C_ul_BigFileDescTitle			64
#define SNA_C_ul_BigFileVignettes			65
#define SNA_C_ul_BigFileTextures			66
 
    /* From game.pbg & level.pbg : Vignette description */
#define SNA_C_ul_VignetteDescTitle          70
#define SNA_C_ul_LoadVignette               71
#define SNA_C_ul_LoadLevelVignette          72
#define SNA_C_ul_InitVignette               73
#define SNA_C_ul_FreeVignette               74
#define SNA_C_ul_DisplayVignette            75
#define SNA_C_ul_InitBarOutlineColor        76
#define SNA_C_ul_InitBarInsideColor         77
#define SNA_C_ul_InitBarColor               78
#define SNA_C_ul_CreateBar                  79
#define SNA_C_ul_AddBar                     80
#define SNA_C_ul_MaxValueBar                81
 
 
    /* From level.dsc */
#define SNA_C_ul_LevelDscTitle              90
#define SNA_C_ul_NumberOfAlways             91
#define	SNA_C_ul_LevelDscLevelSoundBanks    92
#define SNA_C_ul_LevelLoadMap               93
#define SNA_C_ul_LevelLoadSoundBank         94
 
	/* From game.dsc : game options description */
#define SNA_C_ul_GameOptionDescTitle        100
#define SNA_C_ul_DefaultFile                101
#define SNA_C_ul_CurrentFile                102
#define SNA_C_ul_FrameSynchro               103
 
#ifdef USE_IPT_DX5

	/* from game.dsc, input description */
#define SNA_C_ul_InitInputDeviceManager		110

	/* from Device.ipt, active devices description */
#define SNA_C_ul_ActivateDeviceTitle		120
#define SNA_C_ul_ActivatePadAction          121
#define SNA_C_ul_ActivateJoystickAction     122
#define SNA_C_ul_ActivateKeyboardAction     123
#define SNA_C_ul_ActivateMouseAction        124

#endif /* USE_IPT_DX5 */

    /* To say: "no more entries" */
#define SNA_C_ulEndOfDescSection            0xffff
 
 
 
/*
 * public functions and macros
 */
 
/** - - - - - - - - - - - - - - - -  - - - - - - - - - - - - - - - - - - - - - - -
 * Functions an macros for getting and setting
 * Type of load and save and options
 * These functions use as parameters or return following values :
 * SNA_C_LoadScriptDsc (=0)
 * SNA_C_LoadBinaryDsc (=1)
 * SNA_C_SaveBinaryDsc (=2)
 */
extern CPA_EXPORT unsigned char SNA_fn_ucGetLoadDscType();
extern CPA_EXPORT void SNA_fn_vSetLoadDscType( unsigned char ucType );
 
 
/** - - - - - - - - - - - - - - - -  - - - - - - - - - - - - - - - - - - - - - - -
 * Macros for testing save and load options
 */
 
#define SNA_M_bTestSaveGameDesc() \
    ( (SNA_fn_ucGetLoadDscType() == SNA_C_SaveBinaryDsc) \
      && (SNA_g_eFileCurrentlyOpened == SNA_C_GameDscFile) )
 
#define SNA_M_bTestSaveLevelDesc() \
    ( (SNA_fn_ucGetLoadDscType() == SNA_C_SaveBinaryDsc) \
      && (SNA_g_eFileCurrentlyOpened == SNA_C_LevelDscFile) )
 
/*
#define SNA_M_bTestSaveLevelMemDesc() SNA_M_bTestSaveLevelDesc()
 
#define SNA_M_bTestSaveGameMemDesc() SNA_M_bTestSaveGameDesc()
*/
 
#define SNA_M_bTestSaveGameMemDesc() \
    ( (SNA_fn_ucGetLoadDscType() == SNA_C_SaveBinaryDsc) \
      && (SNA_g_eFileCurrentlyOpened != SNA_C_NoDscFile) )
 
#define SNA_M_bTestSaveLevelMemDesc() SNA_M_bTestSaveGameMemDesc()
 
 
/** - - - - - - - - - - - - - - - -  - - - - - - - - - - - - - - - - - - - - - - -
 * Macros for reading binarized dsc files 
 */
 
#define SNA_M_BeginReadFromDscFile( eDscFileType ) \
{ \
    SNA_fn_vOpenDscFileForReading( eDscFileType ); \
    SNA_g_eFileCurrentlyOpened = eDscFileType; \
}
 
#define SNA_M_ReadSingleSectionFromDscFile() \
    SNA_fn_vReadSectionFromDscFile( 1 )
 
#define SNA_M_ReadAllRemainingSectionsFromDscFile() \
    SNA_fn_vReadSectionFromDscFile( 0xffff )
 
#define SNA_M_EndReadFromCurrentDscFile() \
{ \
SNA_fn_vCloseDscFile(); \
SNA_g_eFileCurrentlyOpened = SNA_C_NoDscFile; \
}
 
 
/** - - - - - - - - - - - - - - - -  - - - - - - - - - - - - - - - - - - - - - - -
 * Functions for making binarized dsc files 
 */
/*#ifndef RETAIL*/
 
#define SNA_M_BeginWriteToDscFile( eDscFileType ) \
{  \
SNA_fn_vOpenDscFileForWriting( eDscFileType ); \
SNA_g_eFileCurrentlyOpened = eDscFileType; \
}
 
#define SNA_M_EndWriteToCurrentDscFile() \
{ \
SNA_fn_vCloseDscFile(); \
SNA_g_eFileCurrentlyOpened = SNA_C_NoDscFile; \
}
 
/* Functions for writing entries to a file*/
extern CPA_EXPORT void SNA_fn_vWriteNoParamEntryToCurrentDscFile( unsigned long ulEntryType );
extern CPA_EXPORT void SNA_fn_vWriteLongEntryToCurrentDscFile( unsigned long ulEntryType, unsigned long ulEntryParam );
extern CPA_EXPORT void SNA_fn_vWriteStringEntryToCurrentDscFile( unsigned long ulEntryType, char *szEntryParam );
extern CPA_EXPORT void SNA_fn_vWrite2LongEntryToCurrentDscFile( unsigned long ulEntryType, unsigned long, unsigned long);
extern CPA_EXPORT void SNA_fn_vWrite3StringsEntryToCurrentDscFile( unsigned long , char *, char *,char *);
 
extern CPA_EXPORT void SNA_fn_vWriteBlockToCurrentDscFile( char *d_cData, unsigned long ulSize );
extern CPA_EXPORT void SNA_fn_vWriteLongToCurrentDscFile( unsigned long ulLong );
extern CPA_EXPORT void SNA_fn_vWriteDoubleToCurrentDscFile( double _dfNumber );
extern CPA_EXPORT void SNA_fn_vWriteStringToCurrentDscFile( char *szString );
 
extern CPA_EXPORT void SNA_fn_vWriteIntArrayEntryToCurrentDscFile( unsigned long ulEntryType, int iEntryParam0, int *p_iArray );
 
/*#endif // RETAIL */
 
/*
 * Misc functions
 * Usually used through macros
 */
extern CPA_EXPORT void SNA_fn_vOpenDscFileForReading( enum tdeDscFileType_ _eFile );
extern CPA_EXPORT void SNA_fn_vReadSectionFromDscFile( unsigned short _usNumberOfSection );
extern CPA_EXPORT void SNA_fn_vOpenDscFileForWriting( enum tdeDscFileType_ _eFile );
extern CPA_EXPORT void SNA_fn_vOpenDscFile( enum tdeDscFileType_ _eFile, char *_szMode );
extern CPA_EXPORT void SNA_fn_vCloseDscFile();
 
 
#ifdef  __cplusplus
}/* extern "C" */
#endif
 
#endif /* __SNANOSCR_H__*/
