4c98623de60b0a7b9e1291909e03a0d9b868a97b
[rocksndiamonds.git] / src / game_mm / export.h
1 #ifndef GAME_MM_EXPORT_H
2 #define GAME_MM_EXPORT_H
3
4 // ============================================================================
5 // functions and definitions exported from game_mm to main program
6 // ============================================================================
7
8 // ----------------------------------------------------------------------------
9 // constant definitions
10 // ----------------------------------------------------------------------------
11
12 #define MM_MAX_PLAYFIELD_WIDTH          MAX_PLAYFIELD_WIDTH
13 #define MM_MAX_PLAYFIELD_HEIGHT         MAX_PLAYFIELD_HEIGHT
14
15 #define MM_STD_PLAYFIELD_WIDTH          16
16 #define MM_STD_PLAYFIELD_HEIGHT         12
17
18 #define MM_MAX_PLAYFIELD_SIZE           (MM_MAX_PLAYFIELD_WIDTH *       \
19                                          MM_MAX_PLAYFIELD_HEIGHT)
20
21 #define MAX_NUM_AMOEBA                  100
22 #define MAX_NUM_BEAMERS                 8
23
24 #define MAX_LASER_LEN                   256
25 #define MAX_LASER_ENERGY                100
26 #define MAX_LASER_OVERLOAD              100
27
28 #define MM_LEVEL_SCORE_ELEMENTS         16
29
30 #define MM_MAX_BALL_CONTENTS            16
31
32 #define MM_MAX_LEVEL_NAME_LEN           32
33 #define MM_MAX_LEVEL_AUTHOR_LEN         32
34
35
36 #define EL_MM_START_1_NATIVE            0
37 #define EL_MM_END_1_NATIVE              159
38
39 #define EL_MM_CHAR_START_NATIVE         160
40 #define EL_MM_CHAR_END_NATIVE           239
41
42 #define EL_MM_START_2_NATIVE            240
43 #define EL_MM_END_2_NATIVE              430
44
45 #define EL_MM_RUNTIME_START_NATIVE      500
46 #define EL_MM_RUNTIME_END_NATIVE        504
47
48 // elements to be specially mapped
49 #define EL_MM_EMPTY_NATIVE              0
50 #define EL_DF_EMPTY_NATIVE              304
51
52 // sounds
53 #define SND_MM_GAME_LEVELTIME_CHARGING  0
54 #define SND_MM_GAME_HEALTH_CHARGING     1
55
56
57 // ----------------------------------------------------------------------------
58 // data structure definitions
59 // ----------------------------------------------------------------------------
60
61 struct CycleList
62 {
63   int x, y;
64   int steps;
65 };
66
67 struct MovingList
68 {
69   int x, y;
70   int dir;
71 };
72
73 struct DamageList
74 {
75   int x, y;
76   int edge, angle;
77   boolean is_mirror;
78 };
79
80 struct BeamerInfo
81 {
82   int x, y;
83   int num;
84 };
85
86 struct PacMan
87 {
88   int XP, YP;
89   int Dr;
90 };
91
92 struct LaserInfo
93 {
94   struct XY start_edge;
95   int start_angle;
96
97   int current_angle;
98
99   struct DamageList damage[MAX_LASER_LEN + 10];
100   int num_damages;
101
102   struct XY edge[MAX_LASER_LEN + 10];
103   int num_edges;
104
105   struct BeamerInfo beamer[MAX_NUM_BEAMERS][2];
106   int beamer_edge[MAX_NUM_BEAMERS];
107   int beamer_nr[MAX_NUM_BEAMERS];
108   int num_beamers;
109
110   boolean overloaded;
111   int overload_value;
112
113   boolean fuse_off;
114   int fuse_x, fuse_y;
115
116   int dest_element;
117   int dest_element_last;
118   int dest_element_last_x;
119   int dest_element_last_y;
120   boolean stops_inside_element;
121
122   boolean redraw;
123
124   int wall_mask;
125 };
126
127 struct GameInfo_MM
128 {
129   boolean LevelSolved;
130   boolean GameOver;
131
132   struct CycleList cycle[MM_MAX_PLAYFIELD_SIZE];
133   int num_cycle;
134
135   struct MovingList pacman[MM_MAX_PLAYFIELD_SIZE];
136   int num_pacman;
137
138   int score;
139   int energy_left;
140   int kettles_still_needed;
141   int lights_still_needed;
142   int num_keys;
143   int ball_choice_pos;          // current content element choice position
144   boolean laser_red, laser_green, laser_blue;
145
146   boolean has_mcduffin;
147   boolean level_solved;
148   boolean game_over;
149   int game_over_cause;
150   char *game_over_message;
151
152   boolean cheat_no_overload;
153   boolean cheat_no_explosion;
154
155   int laser_overload_value;
156   boolean laser_enabled;
157 };
158
159 struct LevelInfo_MM
160 {
161   int file_version;             // version of file the level was stored with
162   int game_version;             // version of game engine to play this level
163   boolean encoding_16bit_field;         // level contains 16-bit elements
164
165   int fieldx;
166   int fieldy;
167   int time;
168   int kettles_needed;
169   boolean auto_count_kettles;
170   boolean mm_laser_red, mm_laser_green, mm_laser_blue;
171   boolean df_laser_red, df_laser_green, df_laser_blue;
172   char name[MM_MAX_LEVEL_NAME_LEN + 1];
173   char author[MM_MAX_LEVEL_AUTHOR_LEN + 1];
174   int score[MM_LEVEL_SCORE_ELEMENTS];
175   int amoeba_speed;
176   int time_fuse;
177   int time_bomb;
178   int time_ball;
179   int time_block;
180
181   int num_ball_contents;
182   int ball_choice_mode;
183   int ball_content[MM_MAX_BALL_CONTENTS];
184   boolean rotate_ball_content;
185   boolean explode_ball;
186
187   short field[MAX_PLAYFIELD_WIDTH][MAX_PLAYFIELD_HEIGHT];
188 };
189
190 struct EngineSnapshotInfo_MM
191 {
192   struct GameInfo_MM game_mm;
193
194   struct LaserInfo laser;
195
196   short Ur[MAX_PLAYFIELD_WIDTH][MAX_PLAYFIELD_HEIGHT];
197   short Hit[MAX_PLAYFIELD_WIDTH][MAX_PLAYFIELD_HEIGHT];
198   short Box[MAX_PLAYFIELD_WIDTH][MAX_PLAYFIELD_HEIGHT];
199   short Angle[MAX_PLAYFIELD_WIDTH][MAX_PLAYFIELD_HEIGHT];
200
201   short LX,LY, XS,YS, ELX,ELY;
202   short CT,Ct;
203
204   int last_LX, last_LY, last_hit_mask;
205   int hold_x, hold_y;
206   int pacman_nr;
207
208   DelayCounter rotate_delay;
209   DelayCounter pacman_delay;
210   DelayCounter energy_delay;
211   DelayCounter overload_delay;
212 };
213
214
215 // ----------------------------------------------------------------------------
216 // exported functions
217 // ----------------------------------------------------------------------------
218
219 extern struct GameInfo_MM game_mm;
220 extern struct LevelInfo_MM native_mm_level;
221 extern struct EngineSnapshotInfo_MM engine_snapshot_mm;
222
223 extern short Ur[MM_MAX_PLAYFIELD_WIDTH][MM_MAX_PLAYFIELD_HEIGHT];
224
225 void mm_open_all(void);
226
227 void InitElementProperties_MM(void);
228
229 void InitGfxBuffers_MM(void);
230
231 void InitGameEngine_MM(void);
232 void InitGameActions_MM(void);
233 void GameActions_MM(struct MouseActionInfo);
234
235 void DrawLaser_MM(void);
236 void DrawTileCursor_MM(int, boolean);
237
238 boolean ClickElement(int, int, int);
239
240 unsigned int InitEngineRandom_MM(int);
241
242 void setLevelInfoToDefaults_MM(void);
243 void copyInternalEngineVars_MM(void);
244 boolean LoadNativeLevel_MM(char *, boolean);
245 void SaveNativeLevel_MM(char *);
246
247 int getFieldbufferOffsetX_MM(void);
248 int getFieldbufferOffsetY_MM(void);
249
250 void BlitScreenToBitmap_MM(Bitmap *);
251 void RedrawPlayfield_MM(void);
252
253 void LoadEngineSnapshotValues_MM(void);
254 void SaveEngineSnapshotValues_MM(void);
255
256 int getButtonFromTouchPosition(int, int, int, int);
257
258 #endif  // GAME_MM_EXPORT_H