2 // C Implementation: badguy
7 // Author: Tobias Glaesser <tobi.web@gmx.de>, (C) 2004
9 // Copyright: See COPYING file that comes with this distribution
19 void badguy_create_bitmasks()
21 /*bm_bsod = img_bsod_left[0];*/
24 void badguy_init(bad_guy_type* pbad, float x, float y, int kind)
26 pbad->base.updated = SDL_GetTicks();
27 pbad->base.width = 32;
28 pbad->base.height = 32;
29 pbad->base.alive = YES;
39 timer_init(&pbad->timer);
42 void badguy_action(bad_guy_type* pbad)
45 double frame_ratio = get_frame_ratio(&pbad->base);
51 if (pbad->kind == BAD_BSOD)
53 /* --- BLUE SCREEN OF DEATH MONSTER: --- */
55 /* Move left/right: */
57 if (pbad->dying == NO ||
58 pbad->dying == FALLING)
60 if (pbad->dir == RIGHT)
61 pbad->base.x = pbad->base.x + pbad->base.xm * frame_ratio;
62 else if (pbad->dir == LEFT)
63 pbad->base.x = pbad->base.x - pbad->base.xm * frame_ratio;
67 /* Move vertically: */
69 pbad->base.y = pbad->base.y + pbad->base.ym * frame_ratio;
72 /* Bump into things horizontally: */
76 if (issolid(pbad->base.x, pbad->base.y))
77 pbad->dir = !pbad->dir;
80 /* Fall if we get off the ground: */
82 if (pbad->dying != FALLING)
84 if (!issolid(pbad->base.x, pbad->base.y + 32) &&
85 pbad->base.ym < MAX_YM)
87 pbad->base.ym = pbad->base.ym + GRAVITY;
93 if (pbad->base.ym > 0)
95 pbad->base.y = (int)(pbad->base.y / 32) * 32;
101 pbad->base.ym = pbad->base.ym + GRAVITY;
103 if (pbad->base.y > screen->h)
104 pbad->base.alive = NO;
106 else if (pbad->kind == BAD_LAPTOP)
108 /* --- LAPTOP MONSTER: --- */
110 /* Move left/right: */
112 if (pbad->mode != KICK && pbad->mode != HELD)
114 if (pbad->dying == NO ||
115 pbad->dying == FALLING)
117 if (pbad->dir == RIGHT)
118 pbad->base.x = pbad->base.x + pbad->base.xm * frame_ratio;
119 else if (pbad->dir == LEFT)
120 pbad->base.x = pbad->base.x - pbad->base.xm * frame_ratio;
123 else if (pbad->mode == KICK)
126 if (pbad->dir == RIGHT)
127 pbad->base.x = pbad->base.x + 16;
128 else if (pbad->dir == LEFT)
129 pbad->base.x = pbad->base.x - 16;*/
131 else if (pbad->mode == HELD)
132 { /* FIXME: The pbad object shouldn't know about pplayer objects. */
133 /* If we're holding the laptop */
136 pbad->base.x = tux.base.x - 16;
137 pbad->base.y = tux.base.y - 8 - (tux.size*16);
139 else /* facing left */
141 pbad->base.x = tux.base.x - 16;
142 pbad->base.y = tux.base.y - 8 - (tux.size*16);
145 if(tux.input.fire != DOWN) /* SHOOT! */
150 play_sound(sounds[SND_KICK],SOUND_CENTER_SPEAKER);
155 /* Move vertically: */
157 if(pbad->mode != HELD)
158 pbad->base.y = pbad->base.y + pbad->base.ym * frame_ratio;
160 /* Bump into things horizontally: */
164 if (issolid(pbad->base.x, pbad->base.y))
166 pbad->dir = !pbad->dir;
168 if (pbad->mode == KICK)
170 /* handle stereo sound */
171 /* FIXME: In theory a badguy object doesn't know anything about player objects */
172 if (tux.base.x > pbad->base.x)
173 play_sound(sounds[SND_RICOCHET], SOUND_LEFT_SPEAKER);
174 else if (tux.base.x < pbad->base.x)
175 play_sound(sounds[SND_RICOCHET], SOUND_RIGHT_SPEAKER);
177 play_sound(sounds[SND_RICOCHET], SOUND_CENTER_SPEAKER);
183 /* Fall if we get off the ground: */
185 if (pbad->dying != FALLING)
187 if (!issolid(pbad->base.x, pbad->base.y + 32) &&
188 pbad->base.ym < MAX_YM)
190 if(pbad->mode != HELD)
191 pbad->base.ym = pbad->base.ym + GRAVITY;
197 if (pbad->base.ym > 0)
199 pbad->base.y = (int)(pbad->base.y / 32) * 32;
205 pbad->base.ym = pbad->base.ym + GRAVITY;
207 if (pbad->base.y > screen->h)
208 pbad->base.alive = NO;
210 else if (pbad->kind == BAD_MONEY)
212 /* --- MONEY BAGS: --- */
215 /* Move vertically: */
217 pbad->base.y = pbad->base.y + pbad->base.ym *frame_ratio;
220 /* Fall if we get off the ground: */
222 if (pbad->dying != FALLING)
224 if (!issolid(pbad->base.x, pbad->base.y + 32))
226 if (pbad->base.ym < MAX_YM)
228 pbad->base.ym = pbad->base.ym + GRAVITY;
235 if (pbad->base.ym > 0)
237 pbad->base.y = (int)(pbad->base.y / 32) * 32;
238 pbad->base.ym = -MAX_YM;
243 pbad->base.ym = pbad->base.ym + GRAVITY;
245 if (pbad->base.y > screen->h)
246 pbad->base.alive = NO;
248 else if (pbad->kind == -1)
252 else if (pbad->kind == -1)
258 /* Handle mode timer: */
260 if (pbad->mode == FLAT /* && bad_guys[1].mode != HELD*/)
262 if(!timer_check(&pbad->timer))
265 /* else if (pbad->mode == KICK)
272 /* Handle dying timer: */
274 if (pbad->dying == SQUISHED)
276 /* Remove it if time's up: */
277 if(!timer_check(&pbad->timer))
278 pbad->base.alive = NO;
282 /* Remove if it's far off the screen: */
284 if (pbad->base.x < scroll_x - OFFSCREEN_DISTANCE)
285 pbad->base.alive = NO;
288 /* Once it's on screen, it's activated! */
290 if (pbad->base.x <= scroll_x + screen->w + OFFSCREEN_DISTANCE)
296 void badguy_draw(bad_guy_type* pbad)
298 if (pbad->base.alive &&
299 pbad->base.x > scroll_x - 32 &&
300 pbad->base.x < scroll_x + screen->w)
302 if (pbad->kind == BAD_BSOD)
304 /* --- BLUE SCREEN OF DEATH MONSTER: --- */
306 if (pbad->dying == NO)
310 if (pbad->dir == LEFT)
312 texture_draw(&img_bsod_left[(frame / 5) % 4],
313 pbad->base.x - scroll_x,
319 texture_draw(&img_bsod_right[(frame / 5) % 4],
320 pbad->base.x - scroll_x,
325 else if (pbad->dying == FALLING)
329 if (pbad->dir == LEFT)
331 texture_draw(&img_bsod_falling_left,
332 pbad->base.x - scroll_x,
338 texture_draw(&img_bsod_falling_right,
339 pbad->base.x - scroll_x,
344 else if (pbad->dying == SQUISHED)
346 /* Dying - Squished: */
348 if (pbad->dir == LEFT)
350 texture_draw(&img_bsod_squished_left,
351 pbad->base.x - scroll_x,
357 texture_draw(&img_bsod_squished_right,
358 pbad->base.x - scroll_x,
364 else if (pbad->kind == BAD_LAPTOP)
366 /* --- LAPTOP MONSTER: --- */
368 if (pbad->dying == NO)
372 if (pbad->mode == NORMAL)
376 if (pbad->dir == LEFT)
378 texture_draw(&img_laptop_left[(frame / 5) % 3],
379 pbad->base.x - scroll_x,
385 texture_draw(&img_laptop_right[(frame / 5) % 3],
386 pbad->base.x - scroll_x,
395 if (pbad->dir == LEFT)
397 texture_draw(&img_laptop_flat_left,
398 pbad->base.x - scroll_x,
404 texture_draw(&img_laptop_flat_right,
405 pbad->base.x - scroll_x,
411 else if (pbad->dying == FALLING)
415 if (pbad->dir == LEFT)
417 texture_draw(&img_laptop_falling_left,
418 pbad->base.x - scroll_x,
424 texture_draw(&img_laptop_falling_right,
425 pbad->base.x - scroll_x,
431 else if (pbad->kind == BAD_MONEY)
433 if (pbad->base.ym > -16)
435 if (pbad->dir == LEFT)
437 texture_draw(&img_money_left[0],
438 pbad->base.x - scroll_x,
444 texture_draw(&img_money_right[0],
445 pbad->base.x - scroll_x,
452 if (pbad->dir == LEFT)
454 texture_draw(&img_money_left[1],
455 pbad->base.x - scroll_x,
461 texture_draw(&img_money_right[1],
462 pbad->base.x - scroll_x,
468 else if (pbad->kind == -1)
473 void badguy_collision(bad_guy_type* pbad, void *p_c_object, int c_object)
475 bad_guy_type* pbad_c = NULL;
476 player_type* pplayer_c = NULL;
481 pbad->dying = FALLING;
484 /* Gain some points: */
486 if (pbad->kind == BAD_BSOD)
487 add_score(pbad->base.x - scroll_x, pbad->base.y,
488 50 * score_multiplier);
489 else if (pbad->kind == BAD_LAPTOP)
490 add_score(pbad->base.x - scroll_x, pbad->base.y,
491 25 * score_multiplier);
493 /* Play death sound: */
494 play_sound(sounds[SND_FALL], SOUND_CENTER_SPEAKER);
498 if (pbad->mode != FLAT)
499 pbad->dir = !pbad->dir;
502 /* We're in kick mode, kill the other guy: */
504 pbad_c->dying = FALLING;
505 pbad_c->base.ym = -8;
506 play_sound(sounds[SND_FALL], SOUND_CENTER_SPEAKER);
508 add_score(pbad->base.x - scroll_x,
511 pbad->dir = !pbad->dir;
514 pplayer_c = p_c_object;
515 if (pbad->kind == BAD_BSOD)
517 pbad->dying = SQUISHED;
518 timer_start(&pbad->timer,4000);
519 pplayer_c->base.ym = -KILL_BOUNCE_YM;
521 add_score(pbad->base.x - scroll_x, pbad->base.y,
522 50 * score_multiplier);
524 play_sound(sounds[SND_SQUISH], SOUND_CENTER_SPEAKER);
526 else if (pbad->kind == BAD_LAPTOP)
528 if (pbad->mode != KICK)
532 play_sound(sounds[SND_STOMP], SOUND_CENTER_SPEAKER);
536 timer_start(&pbad->timer,10000);
538 pplayer_c->base.y = pplayer_c->base.y - 32;
545 play_sound(sounds[SND_KICK], SOUND_CENTER_SPEAKER);
547 if (pplayer_c->base.x <= pbad->base.x)
552 timer_start(&pbad->timer,5000);
555 pplayer_c->base.ym = -KILL_BOUNCE_YM;
557 add_score(pbad->base.x - scroll_x,
559 25 * score_multiplier);
561 /* play_sound(sounds[SND_SQUISH]); */