rnd-20020324-2-src
[rocksndiamonds.git] / src / libgame / setup.h
1 /***********************************************************
2 * Artsoft Retro-Game Library                               *
3 *----------------------------------------------------------*
4 * (c) 1994-2002 Artsoft Entertainment                      *
5 *               Holger Schemel                             *
6 *               Detmolder Strasse 189                      *
7 *               33604 Bielefeld                            *
8 *               Germany                                    *
9 *               e-mail: info@artsoft.org                   *
10 *----------------------------------------------------------*
11 * setup.h                                                  *
12 ***********************************************************/
13
14 #ifndef SETUP_H
15 #define SETUP_H
16
17 #include "system.h"
18
19
20 /* values for setup file handling */
21 #define TYPE_BOOLEAN                    1
22 #define TYPE_SWITCH                     2
23 #define TYPE_KEY                        3
24 #define TYPE_INTEGER                    4
25 #define TYPE_STRING                     5
26
27 #define TOKEN_STR_FILE_IDENTIFIER       "file_identifier"
28
29 /* structures for setup file handling */
30 struct SetupFileList
31 {
32   char *token;
33   char *value;
34   struct SetupFileList *next;
35 };
36
37 struct TokenInfo
38 {
39   int type;
40   void *value;
41   char *text;
42 };
43
44 /* sort priorities of level series (also used as level series classes) */
45 #define LEVELCLASS_TUTORIAL_START       10
46 #define LEVELCLASS_TUTORIAL_END         99
47 #define LEVELCLASS_CLASSICS_START       100
48 #define LEVELCLASS_CLASSICS_END         199
49 #define LEVELCLASS_CONTRIBUTION_START   200
50 #define LEVELCLASS_CONTRIBUTION_END     299
51 #define LEVELCLASS_USER_START           300
52 #define LEVELCLASS_USER_END             399
53 #define LEVELCLASS_BD_START             400
54 #define LEVELCLASS_BD_END               499
55 #define LEVELCLASS_EM_START             500
56 #define LEVELCLASS_EM_END               599
57 #define LEVELCLASS_SP_START             600
58 #define LEVELCLASS_SP_END               699
59 #define LEVELCLASS_DX_START             700
60 #define LEVELCLASS_DX_END               799
61
62 #define LEVELCLASS_TUTORIAL             LEVELCLASS_TUTORIAL_START
63 #define LEVELCLASS_CLASSICS             LEVELCLASS_CLASSICS_START
64 #define LEVELCLASS_CONTRIBUTION         LEVELCLASS_CONTRIBUTION_START
65 #define LEVELCLASS_USER                 LEVELCLASS_USER_START
66 #define LEVELCLASS_BD                   LEVELCLASS_BD_START
67 #define LEVELCLASS_EM                   LEVELCLASS_EM_START
68 #define LEVELCLASS_SP                   LEVELCLASS_SP_START
69 #define LEVELCLASS_DX                   LEVELCLASS_DX_START
70
71 #define LEVELCLASS_UNDEFINED            999
72
73 #define IS_LEVELCLASS_TUTORIAL(p) \
74         ((p)->sort_priority >= LEVELCLASS_TUTORIAL_START && \
75          (p)->sort_priority <= LEVELCLASS_TUTORIAL_END)
76 #define IS_LEVELCLASS_CLASSICS(p) \
77         ((p)->sort_priority >= LEVELCLASS_CLASSICS_START && \
78          (p)->sort_priority <= LEVELCLASS_CLASSICS_END)
79 #define IS_LEVELCLASS_CONTRIBUTION(p) \
80         ((p)->sort_priority >= LEVELCLASS_CONTRIBUTION_START && \
81          (p)->sort_priority <= LEVELCLASS_CONTRIBUTION_END)
82 #define IS_LEVELCLASS_USER(p) \
83         ((p)->sort_priority >= LEVELCLASS_USER_START && \
84          (p)->sort_priority <= LEVELCLASS_USER_END)
85 #define IS_LEVELCLASS_BD(p) \
86         ((p)->sort_priority >= LEVELCLASS_BD_START && \
87          (p)->sort_priority <= LEVELCLASS_BD_END)
88 #define IS_LEVELCLASS_EM(p) \
89         ((p)->sort_priority >= LEVELCLASS_EM_START && \
90          (p)->sort_priority <= LEVELCLASS_EM_END)
91 #define IS_LEVELCLASS_SP(p) \
92         ((p)->sort_priority >= LEVELCLASS_SP_START && \
93          (p)->sort_priority <= LEVELCLASS_SP_END)
94 #define IS_LEVELCLASS_DX(p) \
95         ((p)->sort_priority >= LEVELCLASS_DX_START && \
96          (p)->sort_priority <= LEVELCLASS_DX_END)
97
98 #define LEVELCLASS(n)   (IS_LEVELCLASS_TUTORIAL(n) ? LEVELCLASS_TUTORIAL : \
99                          IS_LEVELCLASS_CLASSICS(n) ? LEVELCLASS_CLASSICS : \
100                          IS_LEVELCLASS_CONTRIBUTION(n) ? LEVELCLASS_CONTRIBUTION : \
101                          IS_LEVELCLASS_USER(n) ? LEVELCLASS_USER : \
102                          IS_LEVELCLASS_BD(n) ? LEVELCLASS_BD : \
103                          IS_LEVELCLASS_EM(n) ? LEVELCLASS_EM : \
104                          IS_LEVELCLASS_SP(n) ? LEVELCLASS_SP : \
105                          IS_LEVELCLASS_DX(n) ? LEVELCLASS_DX : \
106                          LEVELCLASS_UNDEFINED)
107
108
109 char *getLevelFilename(int);
110 char *getTapeFilename(int);
111 char *getScoreFilename(int);
112 char *getSetupFilename(void);
113 char *getImageFilename(char *);
114
115 void InitTapeDirectory(char *);
116 void InitScoreDirectory(char *);
117 void InitUserLevelDirectory(char *);
118 void InitLevelSetupDirectory(char *);
119
120 void ReadChunk_VERS(FILE *, int *, int *);
121 void WriteChunk_VERS(FILE *, int, int);
122
123 struct LevelDirInfo *newLevelDirInfo();
124 void pushLevelDirInfo(struct LevelDirInfo **, struct LevelDirInfo *);
125 int numLevelDirInfo(struct LevelDirInfo *);
126 boolean validLevelSeries(struct LevelDirInfo *);
127 struct LevelDirInfo *getFirstValidLevelSeries(struct LevelDirInfo *);
128 struct LevelDirInfo *getLevelDirInfoFirstGroupEntry(struct LevelDirInfo *);
129 int numLevelDirInfoInGroup(struct LevelDirInfo *);
130 int posLevelDirInfo(struct LevelDirInfo *);
131 struct LevelDirInfo *getLevelDirInfoFromPos(struct LevelDirInfo *, int);
132 struct LevelDirInfo *getLevelDirInfoFromFilename(char *);
133 void dumpLevelDirInfo(struct LevelDirInfo *, int);
134 void sortLevelDirInfo(struct LevelDirInfo **,
135                       int (*compare_function)(const void *, const void *));
136
137 char *getUserDataDir(void);
138 char *getSetupDir(void);
139 void createDirectory(char *, char *, int);
140 void InitUserDataDirectory(void);
141 void SetFilePermissions(char *, int);
142
143 char *getCookie(char *);
144 int getFileVersionFromCookieString(const char *);
145 boolean checkCookieString(const char *, const char *);
146
147 char *getFormattedSetupEntry(char *, char *);
148 void freeSetupFileList(struct SetupFileList *);
149 char *getTokenValue(struct SetupFileList *, char *);
150 struct SetupFileList *loadSetupFileList(char *);
151 void checkSetupFileListIdentifier(struct SetupFileList *, char *);
152 void setSetupInfo(struct TokenInfo *, int, char *);
153 char *getSetupLine(struct TokenInfo *, char *, int);
154
155 void LoadLevelInfo(void);
156 void LoadLevelSetup_LastSeries(void);
157 void SaveLevelSetup_LastSeries(void);
158 void LoadLevelSetup_SeriesInfo(void);
159 void SaveLevelSetup_SeriesInfo(void);
160
161 #endif /* MISC_H */