added support for level sketch copy/paste using Ctrl-c/v in level editor
[rocksndiamonds.git] / src / game_em / export.h
1 #ifndef EXPORT_H
2 #define EXPORT_H
3
4 // ============================================================================
5 // functions and definitions exported from game_em to main program
6 // ============================================================================
7
8 // ----------------------------------------------------------------------------
9 // constant definitions
10 // ----------------------------------------------------------------------------
11
12 /* define these for backwards compatibility */
13 #define EM_ENGINE_BAD_ROLL
14 #define EM_ENGINE_BAD_SPRING
15
16 /* define these to use additional elements */
17 #define EM_ENGINE_USE_ADDITIONAL_ELEMENTS
18
19 /* internal definitions for EM engine */
20 #ifdef EM_ENGINE_BAD_ROLL
21 #define BAD_ROLL
22 #endif
23
24 #ifdef EM_ENGINE_BAD_SPRING
25 #define BAD_SPRING
26 #endif
27
28 /* one border for ZBORDER elements, one border for steelwall, if needed */
29 #define EM_MAX_CAVE_WIDTH               (MAX_PLAYFIELD_WIDTH  + 2 + 2)
30 #define EM_MAX_CAVE_HEIGHT              (MAX_PLAYFIELD_HEIGHT + 2 + 2)
31
32 /*
33   -----------------------------------------------------------------------------
34   definition of elements used in the Emerald Mine Club engine;
35   the element names have the following properties:
36   - elements that start with 'X' can be stored in a level file
37   - elements that start with 'Y' indicate moving elements
38   - elements that end with 'B' are the "backside" of moving elements
39   -----------------------------------------------------------------------------
40 */
41
42 enum
43 {
44   Xblank = 0,           /* still */
45   Yacid_splash_eB,      /* hmm */
46   Yacid_splash_wB,      /* hmm */
47
48 #ifdef EM_ENGINE_BAD_ROLL
49   Xstone_force_e,       /* only use these in eater */
50   Xstone_force_w,
51   Xnut_force_e,
52   Xnut_force_w,
53   Xspring_force_e,
54   Xspring_force_w,
55   Xemerald_force_e,
56   Xemerald_force_w,
57   Xdiamond_force_e,
58   Xdiamond_force_w,
59   Xbomb_force_e,
60   Xbomb_force_w,
61 #endif
62
63   Xstone,
64   Xstone_pause,
65   Xstone_fall,
66   Ystone_s,
67   Ystone_sB,
68   Ystone_e,
69   Ystone_eB,
70   Ystone_w,
71   Ystone_wB,
72   Xnut,
73   Xnut_pause,
74   Xnut_fall,
75   Ynut_s,
76   Ynut_sB,
77   Ynut_e,
78   Ynut_eB,
79   Ynut_w,
80   Ynut_wB,
81   Xbug_n,
82   Xbug_e,
83   Xbug_s,
84   Xbug_w,
85   Xbug_gon,
86   Xbug_goe,
87   Xbug_gos,
88   Xbug_gow,
89   Ybug_n,
90   Ybug_nB,
91   Ybug_e,
92   Ybug_eB,
93   Ybug_s,
94   Ybug_sB,
95   Ybug_w,
96   Ybug_wB,
97   Ybug_w_n,
98   Ybug_n_e,
99   Ybug_e_s,
100   Ybug_s_w,
101   Ybug_e_n,
102   Ybug_s_e,
103   Ybug_w_s,
104   Ybug_n_w,
105   Ybug_stone,
106   Ybug_spring,
107   Xtank_n,
108   Xtank_e,
109   Xtank_s,
110   Xtank_w,
111   Xtank_gon,
112   Xtank_goe,
113   Xtank_gos,
114   Xtank_gow,
115   Ytank_n,
116   Ytank_nB,
117   Ytank_e,
118   Ytank_eB,
119   Ytank_s,
120   Ytank_sB,
121   Ytank_w,
122   Ytank_wB,
123   Ytank_w_n,
124   Ytank_n_e,
125   Ytank_e_s,
126   Ytank_s_w,
127   Ytank_e_n,
128   Ytank_s_e,
129   Ytank_w_s,
130   Ytank_n_w,
131   Ytank_stone,
132   Ytank_spring,
133   Xandroid,
134   Xandroid_1_n,
135   Xandroid_2_n,
136   Xandroid_1_e,
137   Xandroid_2_e,
138   Xandroid_1_w,
139   Xandroid_2_w,
140   Xandroid_1_s,
141   Xandroid_2_s,
142   Yandroid_n,
143   Yandroid_nB,
144   Yandroid_ne,
145   Yandroid_neB,
146   Yandroid_e,
147   Yandroid_eB,
148   Yandroid_se,
149   Yandroid_seB,
150   Yandroid_s,
151   Yandroid_sB,
152   Yandroid_sw,
153   Yandroid_swB,
154   Yandroid_w,
155   Yandroid_wB,
156   Yandroid_nw,
157   Yandroid_nwB,
158   Xspring,
159   Xspring_pause,
160   Xspring_e,
161   Xspring_w,
162   Xspring_fall,
163   Yspring_s,
164   Yspring_sB,
165   Yspring_e,
166   Yspring_eB,
167   Yspring_w,
168   Yspring_wB,
169   Yspring_kill_e,
170   Yspring_kill_eB,
171   Yspring_kill_w,
172   Yspring_kill_wB,
173   Xeater_n,
174   Xeater_e,
175   Xeater_w,
176   Xeater_s,
177   Yeater_n,
178   Yeater_nB,
179   Yeater_e,
180   Yeater_eB,
181   Yeater_s,
182   Yeater_sB,
183   Yeater_w,
184   Yeater_wB,
185   Yeater_stone,
186   Yeater_spring,
187   Xalien,
188   Xalien_pause,
189   Yalien_n,
190   Yalien_nB,
191   Yalien_e,
192   Yalien_eB,
193   Yalien_s,
194   Yalien_sB,
195   Yalien_w,
196   Yalien_wB,
197   Yalien_stone,
198   Yalien_spring,
199   Xemerald,
200   Xemerald_pause,
201   Xemerald_fall,
202   Xemerald_shine,
203   Yemerald_s,
204   Yemerald_sB,
205   Yemerald_e,
206   Yemerald_eB,
207   Yemerald_w,
208   Yemerald_wB,
209   Yemerald_eat,
210   Yemerald_stone,
211   Xdiamond,
212   Xdiamond_pause,
213   Xdiamond_fall,
214   Xdiamond_shine,
215   Ydiamond_s,
216   Ydiamond_sB,
217   Ydiamond_e,
218   Ydiamond_eB,
219   Ydiamond_w,
220   Ydiamond_wB,
221   Ydiamond_eat,
222   Ydiamond_stone,
223   Xdrip_fall,
224   Xdrip_stretch,
225   Xdrip_stretchB,
226   Xdrip_eat,
227   Ydrip_s1,
228   Ydrip_s1B,
229   Ydrip_s2,
230   Ydrip_s2B,
231   Xbomb,
232   Xbomb_pause,
233   Xbomb_fall,
234   Ybomb_s,
235   Ybomb_sB,
236   Ybomb_e,
237   Ybomb_eB,
238   Ybomb_w,
239   Ybomb_wB,
240   Ybomb_eat,
241   Xballoon,
242   Yballoon_n,
243   Yballoon_nB,
244   Yballoon_e,
245   Yballoon_eB,
246   Yballoon_s,
247   Yballoon_sB,
248   Yballoon_w,
249   Yballoon_wB,
250   Xgrass,
251   Ygrass_nB,
252   Ygrass_eB,
253   Ygrass_sB,
254   Ygrass_wB,
255   Xdirt,
256   Ydirt_nB,
257   Ydirt_eB,
258   Ydirt_sB,
259   Ydirt_wB,
260   Xacid_ne,
261   Xacid_se,
262   Xacid_s,
263   Xacid_sw,
264   Xacid_nw,
265   Xacid_1,
266   Xacid_2,
267   Xacid_3,
268   Xacid_4,
269   Xacid_5,
270   Xacid_6,
271   Xacid_7,
272   Xacid_8,
273   Xball_1,
274   Xball_1B,
275   Xball_2,
276   Xball_2B,
277   Yball_eat,
278
279 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
280   Ykey_1_eat,
281   Ykey_2_eat,
282   Ykey_3_eat,
283   Ykey_4_eat,
284   Ykey_5_eat,
285   Ykey_6_eat,
286   Ykey_7_eat,
287   Ykey_8_eat,
288   Ylenses_eat,
289   Ymagnify_eat,
290   Ygrass_eat,
291   Ydirt_eat,
292 #endif
293
294   Xgrow_ns,
295   Ygrow_ns_eat,
296   Xgrow_ew,
297   Ygrow_ew_eat,
298   Xwonderwall,
299   XwonderwallB,
300   Xamoeba_1,
301   Xamoeba_2,
302   Xamoeba_3,
303   Xamoeba_4,
304   Xamoeba_5,
305   Xamoeba_6,
306   Xamoeba_7,
307   Xamoeba_8,
308   Xdoor_1,
309   Xdoor_2,
310   Xdoor_3,
311   Xdoor_4,
312   Xdoor_5,
313   Xdoor_6,
314   Xdoor_7,
315   Xdoor_8,
316   Xkey_1,
317   Xkey_2,
318   Xkey_3,
319   Xkey_4,
320   Xkey_5,
321   Xkey_6,
322   Xkey_7,
323   Xkey_8,
324   Xwind_n,
325   Xwind_e,
326   Xwind_s,
327   Xwind_w,
328   Xwind_nesw,
329   Xwind_stop,
330   Xexit,
331   Xexit_1,
332   Xexit_2,
333   Xexit_3,
334   Xdynamite,
335   Ydynamite_eat,
336   Xdynamite_1,
337   Xdynamite_2,
338   Xdynamite_3,
339   Xdynamite_4,
340   Xbumper,
341   XbumperB,
342   Xwheel,
343   XwheelB,
344   Xswitch,
345   XswitchB,
346   Xsand,
347   Xsand_stone,
348   Xsand_stonein_1,
349   Xsand_stonein_2,
350   Xsand_stonein_3,
351   Xsand_stonein_4,
352   Xsand_stonesand_1,
353   Xsand_stonesand_2,
354   Xsand_stonesand_3,
355   Xsand_stonesand_4,
356
357 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
358   Xsand_stonesand_quickout_1,
359   Xsand_stonesand_quickout_2,
360 #endif
361
362   Xsand_stoneout_1,
363   Xsand_stoneout_2,
364   Xsand_sandstone_1,
365   Xsand_sandstone_2,
366   Xsand_sandstone_3,
367   Xsand_sandstone_4,
368   Xplant,
369   Yplant,
370   Xlenses,
371   Xmagnify,
372   Xdripper,
373   XdripperB,
374   Xfake_blank,
375   Xfake_blankB,
376   Xfake_grass,
377   Xfake_grassB,
378   Xfake_door_1,
379   Xfake_door_2,
380   Xfake_door_3,
381   Xfake_door_4,
382   Xfake_door_5,
383   Xfake_door_6,
384   Xfake_door_7,
385   Xfake_door_8,
386
387 #ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
388   Xfake_acid_1,
389   Xfake_acid_2,
390   Xfake_acid_3,
391   Xfake_acid_4,
392   Xfake_acid_5,
393   Xfake_acid_6,
394   Xfake_acid_7,
395   Xfake_acid_8,
396 #endif
397
398   Xsteel_1,
399   Xsteel_2,
400   Xsteel_3,
401   Xsteel_4,
402   Xwall_1,
403   Xwall_2,
404   Xwall_3,
405   Xwall_4,
406   Xround_wall_1,
407   Xround_wall_2,
408   Xround_wall_3,
409   Xround_wall_4,
410   Xdecor_1,
411   Xdecor_2,
412   Xdecor_3,
413   Xdecor_4,
414   Xdecor_5,
415   Xdecor_6,
416   Xdecor_7,
417   Xdecor_8,
418   Xdecor_9,
419   Xdecor_10,
420   Xdecor_11,
421   Xdecor_12,
422   Xalpha_0,
423   Xalpha_1,
424   Xalpha_2,
425   Xalpha_3,
426   Xalpha_4,
427   Xalpha_5,
428   Xalpha_6,
429   Xalpha_7,
430   Xalpha_8,
431   Xalpha_9,
432   Xalpha_excla,
433   Xalpha_quote,
434   Xalpha_comma,
435   Xalpha_minus,
436   Xalpha_perio,
437   Xalpha_colon,
438   Xalpha_quest,
439   Xalpha_a,
440   Xalpha_b,
441   Xalpha_c,
442   Xalpha_d,
443   Xalpha_e,
444   Xalpha_f,
445   Xalpha_g,
446   Xalpha_h,
447   Xalpha_i,
448   Xalpha_j,
449   Xalpha_k,
450   Xalpha_l,
451   Xalpha_m,
452   Xalpha_n,
453   Xalpha_o,
454   Xalpha_p,
455   Xalpha_q,
456   Xalpha_r,
457   Xalpha_s,
458   Xalpha_t,
459   Xalpha_u,
460   Xalpha_v,
461   Xalpha_w,
462   Xalpha_x,
463   Xalpha_y,
464   Xalpha_z,
465   Xalpha_arrow_e,
466   Xalpha_arrow_w,
467   Xalpha_copyr,
468
469   Xboom_bug,            /* passed from explode to synchro (linked explosion);
470                            transition to explode_normal */
471   Xboom_bomb,           /* passed from explode to synchro (linked explosion);
472                            transition to explode_normal */
473   Xboom_android,        /* passed from explode to synchro;
474                            transition to boom_2 */
475   Xboom_1,              /* passed from explode to synchro;
476                            transition to boom_2 */
477   Xboom_2,              /* transition to boom[] */
478
479   Znormal,              /* passed from synchro to explode, only in next[];
480                            no picture */
481   Zdynamite,            /* passed from synchro to explode, only in next[];
482                            no picture */
483   Zplayer,              /* special code to indicate player;
484                            no picture */
485   ZBORDER,              /* special code to indicate border;
486                            no picture */
487
488   TILE_MAX
489 };
490
491 /* other definitions */
492
493 enum
494 {
495   SPR_still = 0,
496   SPR_walk  = 1,
497   SPR_push  = 5,
498   SPR_spray = 9,
499
500   SPR_MAX   = 13
501 };
502
503 enum
504 {
505   SAMPLE_blank = 0,     /* player walks on blank */
506   SAMPLE_roll,          /* player pushes stone/bomb/nut/spring */
507   SAMPLE_stone,         /* stone hits ground */
508   SAMPLE_nut,           /* nut hits ground */
509   SAMPLE_crack,         /* stone hits nut */
510   SAMPLE_bug,           /* bug moves */
511   SAMPLE_tank,          /* tank moves */
512   SAMPLE_android_clone, /* android places something */
513   SAMPLE_android_move,  /* android moves */
514   SAMPLE_spring,        /* spring hits ground/wall/bumper, stone hits spring */
515   SAMPLE_slurp,         /* spring kills alien */
516   SAMPLE_eater,         /* eater sits */
517   SAMPLE_eater_eat,     /* eater eats diamond */
518   SAMPLE_alien,         /* alien moves */
519   SAMPLE_collect,       /* player collects object */
520   SAMPLE_diamond,       /* diamond/emerald hits ground */
521   SAMPLE_squash,        /* stone squashes diamond */
522   SAMPLE_wonderfall,    /* object falls thru wonderwall */
523   SAMPLE_drip,          /* drip hits ground */
524   SAMPLE_push,          /* player pushes balloon/android */
525   SAMPLE_dirt,          /* player walks on dirt */
526   SAMPLE_acid,          /* acid splashes */
527   SAMPLE_ball,          /* ball places something */
528   SAMPLE_grow,          /* growing wall grows */
529   SAMPLE_wonder,        /* wonderwall is active */
530   SAMPLE_door,          /* player goes thru door (gate) */
531   SAMPLE_exit_open,     /* exit opens */
532   SAMPLE_exit_leave,    /* player goes into exit */
533   SAMPLE_dynamite,      /* player places dynamite */
534   SAMPLE_tick,          /* dynamite ticks */
535   SAMPLE_press,         /* player presses wheel/wind/switch */
536   SAMPLE_wheel,         /* wheel moves */
537   SAMPLE_boom,          /* explosion */
538   SAMPLE_time,          /* time runs out */
539   SAMPLE_die,           /* player dies */
540
541   SAMPLE_MAX
542 };
543
544
545 // ----------------------------------------------------------------------------
546 // data structure definitions
547 // ----------------------------------------------------------------------------
548
549 struct LEVEL
550 {
551   int home_initial;             /* number of players (initial) */
552   int home;                     /* number of players not yet at home */
553                                 /* 0 == all players at home */
554
555   int width;                    /* playfield width */
556   int height;                   /* playfield height */
557
558   int time_seconds;             /* available time (seconds) */
559   int time_initial;             /* available time (initial) */
560   int time;                     /* time remaining (runtime) */
561
562   boolean killed_out_of_time;   /* kill player due to time out */
563
564   int required_initial;         /* emeralds needed (initial) */
565   int required;                 /* emeralds needed (runtime) */
566
567   int score;                    /* score */
568
569   /* all below entries must be filled every time a level is read */
570
571   int alien_score;              /* score for killing alien */
572   int amoeba_time;              /* amoeba speed */
573   int android_move_cnt_initial; /* android move counter (initial) */
574   int android_move_cnt;         /* android move counter */
575   int android_move_time;        /* android move reset time */
576   int android_clone_cnt_initial;/* android clone counter (initial) */
577   int android_clone_cnt;        /* android clone counter */
578   int android_clone_time;       /* android clone reset time */
579   int ball_cnt;                 /* ball counter */
580   int ball_pos;                 /* ball array pos counter */
581   int ball_random;              /* ball is random flag */
582   int ball_state_initial;       /* ball active flag (initial) */
583   int ball_state;               /* ball active flag */
584   int ball_time;                /* ball reset time */
585   int bug_score;                /* score for killing bug */
586   int diamond_score;            /* score for collecting diamond */
587   int dynamite_score;           /* score for collecting dynamite */
588   int eater_pos;                /* eater array pos */
589   int eater_score;              /* score for killing eater */
590   int emerald_score;            /* score for collecting emerald */
591   int exit_score;               /* score for entering exit */
592   int key_score;                /* score for colleting key */
593   int lenses_cnt_initial;       /* lenses counter (initial) */
594   int lenses_cnt;               /* lenses counter */
595   int lenses_score;             /* score for collecting lenses */
596   int lenses_time;              /* lenses reset time */
597   int magnify_cnt_initial;      /* magnify counter (initial) */
598   int magnify_cnt;              /* magnify counter */
599   int magnify_score;            /* score for collecting magnifier */
600   int magnify_time;             /* magnify reset time */
601   int nut_score;                /* score for cracking nut */
602   int shine_cnt;                /* shine counter for emerald/diamond */
603   int slurp_score;              /* score for slurping alien */
604   int tank_score;               /* score for killing tank */
605   int wheel_cnt_initial;        /* wheel counter (initial) */
606   int wheel_cnt;                /* wheel counter */
607   int wheel_x_initial;          /* wheel x pos (initial) */
608   int wheel_x;                  /* wheel x pos */
609   int wheel_y_initial;          /* wheel y pos (initial) */
610   int wheel_y;                  /* wheel y pos */
611   int wheel_time;               /* wheel reset time */
612   int wind_cnt_initial;         /* wind counter (initial) */
613   int wind_cnt;                 /* wind time counter */
614   int wind_direction_initial;   /* wind direction (initial) */
615   int wind_direction;           /* wind direction */
616   int wind_time;                /* wind reset time */
617   int wonderwall_state_initial; /* wonderwall active flag (initial) */
618   int wonderwall_state;         /* wonderwall active flag */
619   int wonderwall_time_initial;  /* wonderwall time (initial) */
620   int wonderwall_time;          /* wonderwall time */
621   short eater_array[8][9];      /* eater data */
622   short ball_array[8][8];       /* ball data */
623   short android_array[TILE_MAX];/* android clone table */
624   int num_ball_arrays;          /* number of ball data arrays used */
625
626   int exit_x, exit_y;           /* kludge for playing player exit sound */
627 };
628
629 struct PLAYER
630 {
631   int num;
632   int exists;
633   int alive_initial;
634   int alive;
635
636   int dynamite;
637   int dynamite_cnt;
638   int keys;
639   int anim;
640
641   int x_initial;
642   int y_initial;
643   int x;
644   int y;
645   int oldx;
646   int oldy;
647
648   int last_move_dir;
649
650   int joy_n:1;
651   int joy_e:1;
652   int joy_s:1;
653   int joy_w:1;
654   int joy_snap:1;
655   int joy_drop:1;
656   int joy_stick:1;
657   int joy_spin:1;
658 };
659
660 struct GlobalInfo_EM
661 {
662   Bitmap *screenbuffer;
663 };
664
665 struct GameInfo_EM
666 {
667   boolean level_solved;
668   boolean game_over;
669
670   boolean any_player_moving;
671   boolean any_player_snapping;
672
673   boolean use_single_button;
674   boolean use_snap_key_bug;
675
676   int last_moving_player;
677   int last_player_direction[MAX_PLAYERS];
678 };
679
680 struct LevelInfo_EM
681 {
682   int file_version;
683
684   short cave[EM_MAX_CAVE_WIDTH][EM_MAX_CAVE_HEIGHT];
685
686   struct LEVEL *lev;
687   struct PLAYER *ply[MAX_PLAYERS];
688
689   /* used for runtime values */
690   struct GameInfo_EM *game_em;
691 };
692
693 struct GraphicInfo_EM
694 {
695   Bitmap *bitmap;
696   int src_x, src_y;
697   int src_offset_x, src_offset_y;
698   int dst_offset_x, dst_offset_y;
699   int width, height;
700
701   Bitmap *crumbled_bitmap;
702   int crumbled_src_x, crumbled_src_y;
703   int crumbled_border_size;
704   int crumbled_tile_size;
705
706   boolean has_crumbled_graphics;
707   boolean preserve_background;
708
709   int unique_identifier;        /* used to identify needed screen updates */
710 };
711
712 struct EngineSnapshotInfo_EM
713 {
714   struct GameInfo_EM game_em;
715   unsigned int RandomEM;
716   struct LEVEL lev;
717   struct PLAYER ply[MAX_PLAYERS];
718   short Array[4][EM_MAX_CAVE_HEIGHT][EM_MAX_CAVE_WIDTH];
719   int screen_x;
720   int screen_y;
721   int frame;
722   short **Boom;
723   short **Cave;
724   short **Next;
725   short **Draw;
726 };
727
728
729 // ----------------------------------------------------------------------------
730 // exported functions
731 // ----------------------------------------------------------------------------
732
733 extern struct GlobalInfo_EM global_em_info;
734 extern struct GameInfo_EM game_em;
735 extern struct LevelInfo_EM native_em_level;
736 extern struct GraphicInfo_EM graphic_info_em_object[TILE_MAX][8];
737 extern struct GraphicInfo_EM graphic_info_em_player[MAX_PLAYERS][SPR_MAX][8];
738 extern struct EngineSnapshotInfo_EM engine_snapshot_em;
739
740 void em_open_all(void);
741 void em_close_all(void);
742
743 void InitGfxBuffers_EM(void);
744
745 void InitGameEngine_EM(void);
746 void GameActions_EM(byte *, boolean);
747
748 unsigned int InitEngineRandom_EM(int);
749
750 void setLevelInfoToDefaults_EM(void);
751 boolean LoadNativeLevel_EM(char *, boolean);
752
753 int getFieldbufferOffsetX_EM(void);
754 int getFieldbufferOffsetY_EM(void);
755
756 void BackToFront_EM(void);
757 void BlitScreenToBitmap_EM(Bitmap *);
758 void RedrawPlayfield_EM(boolean);
759
760 void LoadEngineSnapshotValues_EM(void);
761 void SaveEngineSnapshotValues_EM(void);
762
763 boolean checkIfAllPlayersFitToScreen(void);
764
765 void tab_generate(void);
766 void tab_generate_graphics_info_em(void);
767
768 #endif  // EXPORT_H