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)
26 pbad->it.alive = &pbad->alive;
27 pbad->it.x = &pbad->x;
28 pbad->it.y = &pbad->y;
29 pbad->it.width = &pbad->width;
30 pbad->it.height = &pbad->height;
31 pbad->it.updated = &pbad->updated;
33 pbad->updated = SDL_GetTicks();
42 void badguy_action(bad_guy_type* pbad)
45 double frame_ratio = get_frame_ratio(&pbad->it);
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->x = pbad->x + pbad->xm * frame_ratio;
62 else if (pbad->dir == LEFT)
63 pbad->x = pbad->x - pbad->xm * frame_ratio;
67 /* Move vertically: */
69 pbad->y = pbad->y + pbad->ym * frame_ratio;
72 /* Bump into things horizontally: */
76 if (issolid(pbad->x, pbad->y))
77 pbad->dir = !pbad->dir;
80 /* Fall if we get off the ground: */
82 if (pbad->dying != FALLING)
84 if (!issolid(pbad->x, pbad->y + 32) &&
87 pbad->ym = pbad->ym + GRAVITY;
95 pbad->y = (int)(pbad->y / 32) * 32;
101 pbad->ym = pbad->ym + GRAVITY;
103 if (pbad->y > screen->h)
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->x = pbad->x + pbad->xm * frame_ratio;
119 else if (pbad->dir == LEFT)
120 pbad->x = pbad->x - pbad->xm * frame_ratio;
123 else if (pbad->mode == KICK)
126 if (pbad->dir == RIGHT)
127 pbad->x = pbad->x + 16;
128 else if (pbad->dir == LEFT)
129 pbad->x = pbad->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->x = tux.x - 16;
137 pbad->y = tux.y - 8 - (tux.size*16);
139 else /* facing left */
141 pbad->x = tux.x - 16;
142 pbad->y = tux.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->y = pbad->y + pbad->ym * frame_ratio;
160 /* Bump into things horizontally: */
164 if (issolid(pbad->x, pbad->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 */
173 play_sound(sounds[SND_RICOCHET], SOUND_LEFT_SPEAKER);
174 else if (tux.x < pbad->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->x, pbad->y + 32) &&
190 if(pbad->mode != HELD)
191 pbad->ym = pbad->ym + GRAVITY;
199 pbad->y = (int)(pbad->y / 32) * 32;
205 pbad->ym = pbad->ym + GRAVITY;
207 if (pbad->y > screen->h)
210 else if (pbad->kind == BAD_MONEY)
212 /* --- MONEY BAGS: --- */
215 /* Move vertically: */
217 pbad->y = pbad->y + pbad->ym *frame_ratio;
220 /* Fall if we get off the ground: */
222 if (pbad->dying != FALLING)
224 if (!issolid(pbad->x, pbad->y + 32))
226 if (pbad->ym < MAX_YM)
228 pbad->ym = pbad->ym + GRAVITY;
237 pbad->y = (int)(pbad->y / 32) * 32;
243 pbad->ym = pbad->ym + GRAVITY;
245 if (pbad->y > screen->h)
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))
282 /* Remove if it's far off the screen: */
284 if (pbad->x < scroll_x - OFFSCREEN_DISTANCE)
288 /* Once it's on screen, it's activated! */
290 if (pbad->x <= scroll_x + screen->w + OFFSCREEN_DISTANCE)
296 void badguy_draw(bad_guy_type* pbad)
299 pbad->x > scroll_x - 32 &&
300 pbad->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],
319 texture_draw(&img_bsod_right[(frame / 5) % 4],
325 else if (pbad->dying == FALLING)
329 if (pbad->dir == LEFT)
331 texture_draw(&img_bsod_falling_left,
338 texture_draw(&img_bsod_falling_right,
344 else if (pbad->dying == SQUISHED)
346 /* Dying - Squished: */
348 if (pbad->dir == LEFT)
350 texture_draw(&img_bsod_squished_left,
357 texture_draw(&img_bsod_squished_right,
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],
385 texture_draw(&img_laptop_right[(frame / 5) % 3],
395 if (pbad->dir == LEFT)
397 texture_draw(&img_laptop_flat_left,
404 texture_draw(&img_laptop_flat_right,
411 else if (pbad->dying == FALLING)
415 if (pbad->dir == LEFT)
417 texture_draw(&img_laptop_falling_left,
424 texture_draw(&img_laptop_falling_right,
431 else if (pbad->kind == BAD_MONEY)
435 if (pbad->dir == LEFT)
437 texture_draw(&img_money_left[0],
444 texture_draw(&img_money_right[0],
452 if (pbad->dir == LEFT)
454 texture_draw(&img_money_left[1],
461 texture_draw(&img_money_right[1],
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->x - scroll_x, pbad->y,
488 50 * score_multiplier);
489 else if (pbad->kind == BAD_LAPTOP)
490 add_score(pbad->x - scroll_x, pbad->y,
491 25 * score_multiplier);
493 /* Play death sound: */
494 play_sound(sounds[SND_FALL], SOUND_CENTER_SPEAKER);
498 if (pbad->mode != KICK)
499 pbad->dir = !pbad->dir;
502 /* We're in kick mode, kill the other guy: */
504 pbad_c->dying = FALLING;
506 play_sound(sounds[SND_FALL], SOUND_CENTER_SPEAKER);
508 add_score(pbad->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->ym = -KILL_BOUNCE_YM;
521 add_score(pbad->x - scroll_x, pbad->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 != FLAT)
532 play_sound(sounds[SND_STOMP], SOUND_CENTER_SPEAKER);
536 timer_start(&pbad->timer,10000);
538 pplayer_c->y = pplayer_c->y - 32;
545 play_sound(sounds[SND_KICK], SOUND_CENTER_SPEAKER);
547 if (pplayer_c->x <= pbad->x)
552 timer_start(&pbad->timer,5000);
555 pplayer_c->ym = -KILL_BOUNCE_YM;
557 add_score(pbad->x - scroll_x,
559 25 * score_multiplier);
561 /* play_sound(sounds[SND_SQUISH]); */