rnd-20020330-4-src
[rocksndiamonds.git] / src / cartoons.c
1 /***********************************************************
2 * Rocks'n'Diamonds -- McDuffin Strikes Back!               *
3 *----------------------------------------------------------*
4 * (c) 1995-2001 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_FPS       10
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_FPS      10
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_FPS       10
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_FPS        20
52 #define BIRD_STEPSIZE   4
53
54 #define GAMETOON_XSIZE          TILEX
55 #define GAMETOON_YSIZE          TILEY
56 #define GAMETOON_FRAMES_4       4
57 #define GAMETOON_FRAMES_8       8
58 #define GAMETOON_FPS            20
59 #define GAMETOON_STEPSIZE       4
60
61 struct ToonInfo toons[NUM_TOONS] =
62 {
63   {
64     PIX_TOONS,
65     DWARF_XSIZE, DWARF_YSIZE,
66     DWARF_X, DWARF_Y,
67     DWARF_FRAMES,
68     DWARF_FPS,
69     DWARF_STEPSIZE,
70     ANIM_NORMAL,
71     ANIMDIR_RIGHT,
72     ANIMPOS_DOWN
73   },
74   {
75     PIX_TOONS,
76     DWARF_XSIZE, DWARF_YSIZE,
77     DWARF_X, DWARF2_Y,
78     DWARF_FRAMES,
79     DWARF_FPS,
80     DWARF_STEPSIZE,
81     ANIM_NORMAL,
82     ANIMDIR_LEFT,
83     ANIMPOS_DOWN
84   },
85   {
86     PIX_TOONS,
87     JUMPER_XSIZE, JUMPER_YSIZE,
88     JUMPER_X, JUMPER_Y,
89     JUMPER_FRAMES,
90     JUMPER_FPS,
91     JUMPER_STEPSIZE,
92     ANIM_NORMAL,
93     ANIMDIR_RIGHT,
94     ANIMPOS_DOWN
95   },
96   {
97     PIX_TOONS,
98     CLOWN_XSIZE, CLOWN_YSIZE,
99     CLOWN_X, CLOWN_Y,
100     CLOWN_FRAMES,
101     CLOWN_FPS,
102     CLOWN_STEPSIZE,
103     ANIM_NORMAL,
104     ANIMDIR_UP,
105     ANIMPOS_ANY
106   },
107   {
108     PIX_TOONS,
109     BIRD_XSIZE, BIRD_YSIZE,
110     BIRD1_X, BIRD1_Y,
111     BIRD_FRAMES,
112     BIRD_FPS,
113     BIRD_STEPSIZE,
114     ANIM_OSCILLATE,
115     ANIMDIR_RIGHT,
116     ANIMPOS_UPPER
117   },
118   {
119     PIX_TOONS,
120     BIRD_XSIZE, BIRD_YSIZE,
121     BIRD2_X, BIRD2_Y,
122     BIRD_FRAMES,
123     BIRD_FPS,
124     BIRD_STEPSIZE,
125     ANIM_OSCILLATE,
126     ANIMDIR_LEFT,
127     ANIMPOS_UPPER
128   },
129   {
130     PIX_HEROES,
131     GAMETOON_XSIZE, GAMETOON_YSIZE,
132     ((GFX_SPIELER1_LEFT - GFX_START_ROCKSHEROES) % HEROES_PER_LINE)*TILEX,
133     ((GFX_SPIELER1_LEFT - GFX_START_ROCKSHEROES) / HEROES_PER_LINE)*TILEY,
134     GAMETOON_FRAMES_4,
135     GAMETOON_FPS,
136     GAMETOON_STEPSIZE,
137     ANIM_NORMAL,
138     ANIMDIR_LEFT,
139     ANIMPOS_DOWN
140   },
141   {
142     PIX_HEROES,
143     GAMETOON_XSIZE, GAMETOON_YSIZE,
144     ((GFX_SPIELER1_RIGHT - GFX_START_ROCKSHEROES) % HEROES_PER_LINE)*TILEX,
145     ((GFX_SPIELER1_RIGHT - GFX_START_ROCKSHEROES) / HEROES_PER_LINE)*TILEY,
146     GAMETOON_FRAMES_4,
147     GAMETOON_FPS,
148     GAMETOON_STEPSIZE,
149     ANIM_NORMAL,
150     ANIMDIR_RIGHT,
151     ANIMPOS_DOWN
152   },
153   {
154     PIX_HEROES,
155     GAMETOON_XSIZE, GAMETOON_YSIZE,
156     ((GFX_PINGUIN_LEFT - GFX_START_ROCKSHEROES) % HEROES_PER_LINE)*TILEX,
157     ((GFX_PINGUIN_LEFT - GFX_START_ROCKSHEROES) / HEROES_PER_LINE)*TILEY,
158     GAMETOON_FRAMES_4,
159     GAMETOON_FPS,
160     GAMETOON_STEPSIZE,
161     ANIM_NORMAL,
162     ANIMDIR_LEFT,
163     ANIMPOS_DOWN
164   },
165   {
166     PIX_HEROES,
167     GAMETOON_XSIZE, GAMETOON_YSIZE,
168     ((GFX_PINGUIN_RIGHT - GFX_START_ROCKSHEROES) % HEROES_PER_LINE)*TILEX,
169     ((GFX_PINGUIN_RIGHT - GFX_START_ROCKSHEROES) / HEROES_PER_LINE)*TILEY,
170     GAMETOON_FRAMES_4,
171     GAMETOON_FPS,
172     GAMETOON_STEPSIZE,
173     ANIM_NORMAL,
174     ANIMDIR_RIGHT,
175     ANIMPOS_DOWN
176   },
177   {
178     PIX_HEROES,
179     GAMETOON_XSIZE, GAMETOON_YSIZE,
180     ((GFX_MOLE_LEFT - GFX_START_ROCKSHEROES) % HEROES_PER_LINE)*TILEX,
181     ((GFX_MOLE_LEFT - GFX_START_ROCKSHEROES) / HEROES_PER_LINE)*TILEY,
182     GAMETOON_FRAMES_4,
183     GAMETOON_FPS,
184     GAMETOON_STEPSIZE,
185     ANIM_NORMAL,
186     ANIMDIR_LEFT,
187     ANIMPOS_DOWN
188   },
189   {
190     PIX_HEROES,
191     GAMETOON_XSIZE, GAMETOON_YSIZE,
192     ((GFX_MOLE_RIGHT - GFX_START_ROCKSHEROES) % HEROES_PER_LINE)*TILEX,
193     ((GFX_MOLE_RIGHT - GFX_START_ROCKSHEROES) / HEROES_PER_LINE)*TILEY,
194     GAMETOON_FRAMES_4,
195     GAMETOON_FPS,
196     GAMETOON_STEPSIZE,
197     ANIM_NORMAL,
198     ANIMDIR_RIGHT,
199     ANIMPOS_DOWN
200   },
201   {
202     PIX_HEROES,
203     GAMETOON_XSIZE, GAMETOON_YSIZE,
204     ((GFX_SCHWEIN_LEFT - GFX_START_ROCKSHEROES) % HEROES_PER_LINE)*TILEX,
205     ((GFX_SCHWEIN_LEFT - GFX_START_ROCKSHEROES) / HEROES_PER_LINE)*TILEY,
206     GAMETOON_FRAMES_4,
207     GAMETOON_FPS,
208     GAMETOON_STEPSIZE,
209     ANIM_NORMAL,
210     ANIMDIR_LEFT,
211     ANIMPOS_DOWN
212   },
213   {
214     PIX_HEROES,
215     GAMETOON_XSIZE, GAMETOON_YSIZE,
216     ((GFX_SCHWEIN_RIGHT - GFX_START_ROCKSHEROES) % HEROES_PER_LINE)*TILEX,
217     ((GFX_SCHWEIN_RIGHT - GFX_START_ROCKSHEROES) / HEROES_PER_LINE)*TILEY,
218     GAMETOON_FRAMES_4,
219     GAMETOON_FPS,
220     GAMETOON_STEPSIZE,
221     ANIM_NORMAL,
222     ANIMDIR_RIGHT,
223     ANIMPOS_DOWN
224   },
225   {
226     PIX_HEROES,
227     GAMETOON_XSIZE, GAMETOON_YSIZE,
228     ((GFX_DRACHE_LEFT - GFX_START_ROCKSHEROES) % HEROES_PER_LINE)*TILEX,
229     ((GFX_DRACHE_LEFT - GFX_START_ROCKSHEROES) / HEROES_PER_LINE)*TILEY,
230     GAMETOON_FRAMES_4,
231     GAMETOON_FPS,
232     GAMETOON_STEPSIZE,
233     ANIM_NORMAL,
234     ANIMDIR_LEFT,
235     ANIMPOS_DOWN
236   },
237   {
238     PIX_HEROES,
239     GAMETOON_XSIZE, GAMETOON_YSIZE,
240     ((GFX_DRACHE_RIGHT - GFX_START_ROCKSHEROES) % HEROES_PER_LINE)*TILEX,
241     ((GFX_DRACHE_RIGHT - GFX_START_ROCKSHEROES) / HEROES_PER_LINE)*TILEY,
242     GAMETOON_FRAMES_4,
243     GAMETOON_FPS,
244     GAMETOON_STEPSIZE,
245     ANIM_NORMAL,
246     ANIMDIR_RIGHT,
247     ANIMPOS_DOWN
248   },
249   {
250     PIX_HEROES,
251     GAMETOON_XSIZE, GAMETOON_YSIZE,
252     ((GFX_SONDE - GFX_START_ROCKSHEROES) % HEROES_PER_LINE)*TILEX,
253     ((GFX_SONDE - GFX_START_ROCKSHEROES) / HEROES_PER_LINE)*TILEY,
254     GAMETOON_FRAMES_8,
255     GAMETOON_FPS,
256     GAMETOON_STEPSIZE,
257     ANIM_NORMAL,
258     ANIMDIR_LEFT,
259     ANIMPOS_ANY
260   },
261   {
262     PIX_HEROES,
263     GAMETOON_XSIZE, GAMETOON_YSIZE,
264     ((GFX_SONDE - GFX_START_ROCKSHEROES) % HEROES_PER_LINE)*TILEX,
265     ((GFX_SONDE - GFX_START_ROCKSHEROES) / HEROES_PER_LINE)*TILEY,
266     GAMETOON_FRAMES_8,
267     GAMETOON_FPS,
268     GAMETOON_STEPSIZE,
269     ANIM_NORMAL,
270     ANIMDIR_RIGHT,
271     ANIMPOS_ANY
272   },
273 };
274
275 static void PrepareBackbuffer()
276 {
277   /* Fill empty backbuffer for animation functions */
278   if (setup.direct_draw && game_status == PLAYING)
279   {
280     int xx,yy;
281
282     SetDrawtoField(DRAW_BACKBUFFER);
283
284     for(xx=0; xx<SCR_FIELDX; xx++)
285       for(yy=0; yy<SCR_FIELDY; yy++)
286         DrawScreenField(xx,yy);
287     DrawAllPlayers();
288
289     SetDrawtoField(DRAW_DIRECT);
290   }
291
292   if (setup.soft_scrolling && game_status == PLAYING)
293   {
294     int fx = FX, fy = FY;
295
296     fx += (ScreenMovDir & (MV_LEFT|MV_RIGHT) ? ScreenGfxPos : 0);
297     fy += (ScreenMovDir & (MV_UP|MV_DOWN)    ? ScreenGfxPos : 0);
298
299     BlitBitmap(fieldbuffer, backbuffer, fx,fy, SXSIZE,SYSIZE, SX,SY);
300   }
301 }
302
303 boolean ToonNeedsRedraw()
304 {
305   return (game_status == HELPSCREEN ||
306           (game_status == MAINMENU &&
307            ((redraw_mask & REDRAW_MICROLEVEL) ||
308             (redraw_mask & REDRAW_MICROLABEL))));
309 }
310
311 void InitToons()
312 {
313   InitToonScreen(pix, pix[PIX_DB_DOOR],
314                  BackToFront, PrepareBackbuffer, ToonNeedsRedraw,
315                  toons, NUM_TOONS,
316                  REAL_SX, REAL_SY, FULL_SXSIZE, FULL_SYSIZE);
317 }