rnd-20021129-2-src
[rocksndiamonds.git] / src / cartoons.c
1 /***********************************************************
2 * Rocks'n'Diamonds -- McDuffin Strikes Back!               *
3 *----------------------------------------------------------*
4 * (c) 1995-2002 Artsoft Entertainment                      *
5 *               Holger Schemel                             *
6 *               Detmolder Strasse 189                      *
7 *               33604 Bielefeld                            *
8 *               Germany                                    *
9 *               e-mail: info@artsoft.org                   *
10 *----------------------------------------------------------*
11 * cartoons.c                                               *
12 ***********************************************************/
13
14 #include "cartoons.h"
15 #include "main.h"
16 #include "tools.h"
17
18
19 /* values for toon definition */
20 #define NUM_TOONS       18
21
22 #define DWARF_XSIZE     40
23 #define DWARF_YSIZE     48
24 #define DWARF_X         2
25 #define DWARF_Y         72
26 #define DWARF2_Y        186
27 #define DWARF_FRAMES    8
28 #define DWARF_DELAY     5
29 #define DWARF_STEPSIZE  4
30 #define JUMPER_XSIZE    48
31 #define JUMPER_YSIZE    56
32 #define JUMPER_X        2
33 #define JUMPER_Y        125
34 #define JUMPER_FRAMES   8
35 #define JUMPER_DELAY    5
36 #define JUMPER_STEPSIZE 4
37 #define CLOWN_XSIZE     80
38 #define CLOWN_YSIZE     110
39 #define CLOWN_X         327
40 #define CLOWN_Y         10
41 #define CLOWN_FRAMES    1
42 #define CLOWN_DELAY     5
43 #define CLOWN_STEPSIZE  4
44 #define BIRD_XSIZE      32
45 #define BIRD_YSIZE      30
46 #define BIRD1_X         2
47 #define BIRD1_Y         2
48 #define BIRD2_X         2
49 #define BIRD2_Y         37
50 #define BIRD_FRAMES     8
51 #define BIRD_DELAY      2
52 #define BIRD_STEPSIZE   4
53
54 struct ToonInfo toons[NUM_TOONS] =
55 {
56   {
57     IMG_MENU_TOONS,
58     DWARF_XSIZE, DWARF_YSIZE,
59     DWARF_X, DWARF_Y,
60     DWARF_FRAMES,
61     DWARF_DELAY,
62     DWARF_STEPSIZE,
63     ANIM_LOOP,
64     ANIMDIR_RIGHT,
65     ANIMPOS_DOWN
66   },
67   {
68     IMG_MENU_TOONS,
69     DWARF_XSIZE, DWARF_YSIZE,
70     DWARF_X, DWARF2_Y,
71     DWARF_FRAMES,
72     DWARF_DELAY,
73     DWARF_STEPSIZE,
74     ANIM_LOOP,
75     ANIMDIR_LEFT,
76     ANIMPOS_DOWN
77   },
78   {
79     IMG_MENU_TOONS,
80     JUMPER_XSIZE, JUMPER_YSIZE,
81     JUMPER_X, JUMPER_Y,
82     JUMPER_FRAMES,
83     JUMPER_DELAY,
84     JUMPER_STEPSIZE,
85     ANIM_LOOP,
86     ANIMDIR_RIGHT,
87     ANIMPOS_DOWN
88   },
89   {
90     IMG_MENU_TOONS,
91     CLOWN_XSIZE, CLOWN_YSIZE,
92     CLOWN_X, CLOWN_Y,
93     CLOWN_FRAMES,
94     CLOWN_DELAY,
95     CLOWN_STEPSIZE,
96     ANIM_LOOP,
97     ANIMDIR_UP,
98     ANIMPOS_ANY
99   },
100   {
101     IMG_MENU_TOONS,
102     BIRD_XSIZE, BIRD_YSIZE,
103     BIRD1_X, BIRD1_Y,
104     BIRD_FRAMES,
105     BIRD_DELAY,
106     BIRD_STEPSIZE,
107     ANIM_PINGPONG,
108     ANIMDIR_RIGHT,
109     ANIMPOS_UPPER
110   },
111   {
112     IMG_MENU_TOONS,
113     BIRD_XSIZE, BIRD_YSIZE,
114     BIRD2_X, BIRD2_Y,
115     BIRD_FRAMES,
116     BIRD_DELAY,
117     BIRD_STEPSIZE,
118     ANIM_PINGPONG,
119     ANIMDIR_LEFT,
120     ANIMPOS_UPPER
121   },
122   {
123     IMG_PLAYER1_LEFT_MOVING,
124     -1, -1,
125     -1, -1,
126     -1,
127     -1,
128     -1,
129     -1,
130     ANIMDIR_LEFT,
131     ANIMPOS_DOWN
132   },
133   {
134     IMG_PLAYER1_RIGHT_MOVING,
135     -1, -1,
136     -1, -1,
137     -1,
138     -1,
139     -1,
140     -1,
141     ANIMDIR_RIGHT,
142     ANIMPOS_DOWN
143   },
144   {
145     IMG_PENGUIN_LEFT_MOVING,
146     -1, -1,
147     -1, -1,
148     -1,
149     -1,
150     -1,
151     -1,
152     ANIMDIR_LEFT,
153     ANIMPOS_DOWN
154   },
155   {
156     IMG_PENGUIN_RIGHT_MOVING,
157     -1, -1,
158     -1, -1,
159     -1,
160     -1,
161     -1,
162     -1,
163     ANIMDIR_RIGHT,
164     ANIMPOS_DOWN
165   },
166   {
167     IMG_MOLE_LEFT_MOVING,
168     -1, -1,
169     -1, -1,
170     -1,
171     -1,
172     -1,
173     -1,
174     ANIMDIR_LEFT,
175     ANIMPOS_DOWN
176   },
177   {
178     IMG_MOLE_RIGHT_MOVING,
179     -1, -1,
180     -1, -1,
181     -1,
182     -1,
183     -1,
184     -1,
185     ANIMDIR_RIGHT,
186     ANIMPOS_DOWN
187   },
188   {
189     IMG_PIG_LEFT_MOVING,
190     -1, -1,
191     -1, -1,
192     -1,
193     -1,
194     -1,
195     -1,
196     ANIMDIR_LEFT,
197     ANIMPOS_DOWN
198   },
199   {
200     IMG_PIG_RIGHT_MOVING,
201     -1, -1,
202     -1, -1,
203     -1,
204     -1,
205     -1,
206     -1,
207     ANIMDIR_RIGHT,
208     ANIMPOS_DOWN
209   },
210   {
211     IMG_DRAGON_LEFT_MOVING,
212     -1, -1,
213     -1, -1,
214     -1,
215     -1,
216     -1,
217     -1,
218     ANIMDIR_LEFT,
219     ANIMPOS_DOWN
220   },
221   {
222     IMG_DRAGON_RIGHT_MOVING,
223     -1, -1,
224     -1, -1,
225     -1,
226     -1,
227     -1,
228     -1,
229     ANIMDIR_RIGHT,
230     ANIMPOS_DOWN
231   },
232   {
233     IMG_SATELLITE_MOVING,
234     -1, -1,
235     -1, -1,
236     -1,
237     -1,
238     -1,
239     -1,
240     ANIMDIR_LEFT,
241     ANIMPOS_ANY
242   },
243   {
244     IMG_SATELLITE_MOVING,
245     -1, -1,
246     -1, -1,
247     -1,
248     -1,
249     -1,
250     -1,
251     ANIMDIR_RIGHT,
252     ANIMPOS_ANY
253   },
254 };
255
256 static void PrepareBackbuffer()
257 {
258   /* Fill empty backbuffer for animation functions */
259   if (setup.direct_draw && game_status == PLAYING)
260   {
261     int xx,yy;
262
263     SetDrawtoField(DRAW_BACKBUFFER);
264
265     for(xx=0; xx<SCR_FIELDX; xx++)
266       for(yy=0; yy<SCR_FIELDY; yy++)
267         DrawScreenField(xx,yy);
268     DrawAllPlayers();
269
270     SetDrawtoField(DRAW_DIRECT);
271   }
272
273   if (setup.soft_scrolling && game_status == PLAYING)
274   {
275     int fx = FX, fy = FY;
276
277     fx += (ScreenMovDir & (MV_LEFT|MV_RIGHT) ? ScreenGfxPos : 0);
278     fy += (ScreenMovDir & (MV_UP|MV_DOWN)    ? ScreenGfxPos : 0);
279
280     BlitBitmap(fieldbuffer, backbuffer, fx,fy, SXSIZE,SYSIZE, SX,SY);
281   }
282 }
283
284 boolean ToonNeedsRedraw()
285 {
286   return (game_status == HELPSCREEN ||
287           (game_status == MAINMENU &&
288            ((redraw_mask & REDRAW_MICROLEVEL) ||
289             (redraw_mask & REDRAW_MICROLABEL))));
290 }
291
292 void InitToons()
293 {
294   int i;
295
296   for (i=0; i<NUM_TOONS; i++)
297   {
298     int graphic = toons[i].graphic;
299
300     toons[i].bitmap = new_graphic_info[graphic].bitmap;
301
302     if (toons[i].src_x == -1 && toons[i].src_y == -1)
303     {
304       int anim_frames = new_graphic_info[graphic].anim_frames;
305       int anim_delay = new_graphic_info[graphic].anim_delay;
306       int anim_mode = new_graphic_info[graphic].anim_mode;
307       int start_frame = new_graphic_info[graphic].anim_start_frame;
308
309       toons[i].src_x = new_graphic_info[graphic].src_x;
310       toons[i].src_y = new_graphic_info[graphic].src_y;
311
312       toons[i].width = TILEX;
313       toons[i].height = TILEY;
314
315       toons[i].anim_frames = anim_frames;
316       toons[i].anim_delay = anim_delay;
317       toons[i].anim_mode = anim_mode;
318       toons[i].start_frame = start_frame;
319
320       toons[i].move_delay = 1;
321       toons[i].stepsize = TILEX / 8;
322     }
323     else
324     {
325       toons[i].anim_delay = 1;          /* no delay between frames */
326       toons[i].start_frame = 0;         /* always start with first */
327     }
328
329     toons[i].move_delay *= GAME_FRAME_DELAY;
330   }
331
332   InitToonScreen(bitmap_db_door,
333                  BackToFront, PrepareBackbuffer, ToonNeedsRedraw,
334                  toons, NUM_TOONS,
335                  REAL_SX, REAL_SY, FULL_SXSIZE, FULL_SYSIZE);
336 }