2 // C Implementation: badguy
7 // Author: Tobias Glaesser <tobi.web@gmx.de> & Bill Kendrick, (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.width = 32;
27 pbad->base.height = 32;
28 pbad->base.alive = YES;
38 timer_init(&pbad->timer);
41 void badguy_action(bad_guy_type* pbad)
48 if (pbad->kind == BAD_BSOD)
50 /* --- BLUE SCREEN OF DEATH MONSTER: --- */
52 /* Move left/right: */
54 if (pbad->dying == NO ||
55 pbad->dying == FALLING)
57 if (pbad->dir == RIGHT)
58 pbad->base.x = pbad->base.x + pbad->base.xm * frame_ratio;
59 else if (pbad->dir == LEFT)
60 pbad->base.x = pbad->base.x - pbad->base.xm * frame_ratio;
64 /* Move vertically: */
66 pbad->base.y = pbad->base.y + pbad->base.ym * frame_ratio;
69 /* Bump into things horizontally: */
73 if (issolid(pbad->base.x, pbad->base.y))
74 pbad->dir = !pbad->dir;
77 /* Fall if we get off the ground: */
79 if (pbad->dying != FALLING)
81 if (!issolid(pbad->base.x, pbad->base.y + 32) &&
82 pbad->base.ym < MAX_YM)
84 pbad->base.ym = pbad->base.ym + GRAVITY;
90 if (pbad->base.ym > 0)
92 pbad->base.y = (int)(pbad->base.y / 32) * 32;
98 pbad->base.ym = pbad->base.ym + GRAVITY;
100 if (pbad->base.y > screen->h)
101 pbad->base.alive = NO;
103 else if (pbad->kind == BAD_LAPTOP)
105 /* --- LAPTOP MONSTER: --- */
107 /* Move left/right: */
109 if (pbad->mode != KICK && pbad->mode != HELD)
111 if (pbad->dying == NO ||
112 pbad->dying == FALLING)
114 if (pbad->dir == RIGHT)
115 pbad->base.x = pbad->base.x + pbad->base.xm * frame_ratio;
116 else if (pbad->dir == LEFT)
117 pbad->base.x = pbad->base.x - pbad->base.xm * frame_ratio;
120 else if (pbad->mode == KICK)
123 if (pbad->dir == RIGHT)
124 pbad->base.x = pbad->base.x + 16;
125 else if (pbad->dir == LEFT)
126 pbad->base.x = pbad->base.x - 16;*/
128 else if (pbad->mode == HELD)
129 { /* FIXME: The pbad object shouldn't know about pplayer objects. */
130 /* If we're holding the laptop */
133 pbad->base.x = tux.base.x - 16;
134 pbad->base.y = tux.base.y - 8 - (tux.size*16);
136 else /* facing left */
138 pbad->base.x = tux.base.x - 16;
139 pbad->base.y = tux.base.y - 8 - (tux.size*16);
142 if(tux.input.fire != DOWN) /* SHOOT! */
147 play_sound(sounds[SND_KICK],SOUND_CENTER_SPEAKER);
152 /* Move vertically: */
154 if(pbad->mode != HELD)
155 pbad->base.y = pbad->base.y + pbad->base.ym * frame_ratio;
157 /* Bump into things horizontally: */
161 if (issolid(pbad->base.x, pbad->base.y))
163 pbad->dir = !pbad->dir;
165 if (pbad->mode == KICK)
167 /* handle stereo sound */
168 /* FIXME: In theory a badguy object doesn't know anything about player objects */
169 if (tux.base.x > pbad->base.x)
170 play_sound(sounds[SND_RICOCHET], SOUND_LEFT_SPEAKER);
171 else if (tux.base.x < pbad->base.x)
172 play_sound(sounds[SND_RICOCHET], SOUND_RIGHT_SPEAKER);
174 play_sound(sounds[SND_RICOCHET], SOUND_CENTER_SPEAKER);
180 /* Fall if we get off the ground: */
182 if (pbad->dying != FALLING)
184 if (!issolid(pbad->base.x, pbad->base.y + 32) &&
185 pbad->base.ym < MAX_YM)
187 if(pbad->mode != HELD)
188 pbad->base.ym = pbad->base.ym + GRAVITY;
194 if (pbad->base.ym > 0)
196 pbad->base.y = (int)(pbad->base.y / 32) * 32;
202 pbad->base.ym = pbad->base.ym + GRAVITY;
204 if (pbad->base.y > screen->h)
205 pbad->base.alive = NO;
207 else if (pbad->kind == BAD_MONEY)
209 /* --- MONEY BAGS: --- */
212 /* Move vertically: */
214 pbad->base.y = pbad->base.y + pbad->base.ym * frame_ratio;
217 /* Fall if we get off the ground: */
219 if (pbad->dying != FALLING)
221 if (!issolid(pbad->base.x, pbad->base.y + 32))
223 if (pbad->base.ym < MAX_YM)
225 pbad->base.ym = pbad->base.ym + GRAVITY * frame_ratio;
232 if (pbad->base.ym > 0)
234 pbad->base.y = (int)(pbad->base.y / 32) * 32;
235 pbad->base.ym = -MAX_YM;
240 pbad->base.ym = pbad->base.ym + GRAVITY * frame_ratio;
242 if (pbad->base.y > screen->h)
243 pbad->base.alive = NO;
245 else if (pbad->kind == -1)
249 else if (pbad->kind == -1)
255 /* Handle mode timer: */
257 if (pbad->mode == FLAT /* && bad_guys[1].mode != HELD*/)
259 if(!timer_check(&pbad->timer))
262 /* else if (pbad->mode == KICK)
269 /* Handle dying timer: */
271 if (pbad->dying == SQUISHED)
273 /* Remove it if time's up: */
274 if(!timer_check(&pbad->timer))
275 pbad->base.alive = NO;
279 /* Remove if it's far off the screen: */
281 if (pbad->base.x < scroll_x - OFFSCREEN_DISTANCE)
282 pbad->base.alive = NO;
285 /* Once it's on screen, it's activated! */
287 if (pbad->base.x <= scroll_x + screen->w + OFFSCREEN_DISTANCE)
293 void badguy_draw(bad_guy_type* pbad)
295 if (pbad->base.alive &&
296 pbad->base.x > scroll_x - 32 &&
297 pbad->base.x < scroll_x + screen->w)
299 if (pbad->kind == BAD_BSOD)
301 /* --- BLUE SCREEN OF DEATH MONSTER: --- */
303 if (pbad->dying == NO)
307 if (pbad->dir == LEFT)
309 texture_draw(&img_bsod_left[(frame / 5) % 4],
310 pbad->base.x - scroll_x,
316 texture_draw(&img_bsod_right[(frame / 5) % 4],
317 pbad->base.x - scroll_x,
322 else if (pbad->dying == FALLING)
326 if (pbad->dir == LEFT)
328 texture_draw(&img_bsod_falling_left,
329 pbad->base.x - scroll_x,
335 texture_draw(&img_bsod_falling_right,
336 pbad->base.x - scroll_x,
341 else if (pbad->dying == SQUISHED)
343 /* Dying - Squished: */
345 if (pbad->dir == LEFT)
347 texture_draw(&img_bsod_squished_left,
348 pbad->base.x - scroll_x,
354 texture_draw(&img_bsod_squished_right,
355 pbad->base.x - scroll_x,
361 else if (pbad->kind == BAD_LAPTOP)
363 /* --- LAPTOP MONSTER: --- */
365 if (pbad->dying == NO)
369 if (pbad->mode == NORMAL)
373 if (pbad->dir == LEFT)
375 texture_draw(&img_laptop_left[(frame / 5) % 3],
376 pbad->base.x - scroll_x,
382 texture_draw(&img_laptop_right[(frame / 5) % 3],
383 pbad->base.x - scroll_x,
392 if (pbad->dir == LEFT)
394 texture_draw(&img_laptop_flat_left,
395 pbad->base.x - scroll_x,
401 texture_draw(&img_laptop_flat_right,
402 pbad->base.x - scroll_x,
408 else if (pbad->dying == FALLING)
412 if (pbad->dir == LEFT)
414 texture_draw(&img_laptop_falling_left,
415 pbad->base.x - scroll_x,
421 texture_draw(&img_laptop_falling_right,
422 pbad->base.x - scroll_x,
428 else if (pbad->kind == BAD_MONEY)
430 if (pbad->base.ym > -16)
432 if (pbad->dir == LEFT)
434 texture_draw(&img_money_left[0],
435 pbad->base.x - scroll_x,
441 texture_draw(&img_money_right[0],
442 pbad->base.x - scroll_x,
449 if (pbad->dir == LEFT)
451 texture_draw(&img_money_left[1],
452 pbad->base.x - scroll_x,
458 texture_draw(&img_money_right[1],
459 pbad->base.x - scroll_x,
465 else if (pbad->kind == -1)
470 void badguy_collision(bad_guy_type* pbad, void *p_c_object, int c_object)
472 bad_guy_type* pbad_c = NULL;
473 player_type* pplayer_c = NULL;
478 pbad->dying = FALLING;
481 /* Gain some points: */
483 if (pbad->kind == BAD_BSOD)
484 add_score(pbad->base.x - scroll_x, pbad->base.y,
485 50 * score_multiplier);
486 else if (pbad->kind == BAD_LAPTOP)
487 add_score(pbad->base.x - scroll_x, pbad->base.y,
488 25 * score_multiplier);
490 /* Play death sound: */
491 play_sound(sounds[SND_FALL], SOUND_CENTER_SPEAKER);
495 if (pbad->mode != FLAT)
496 pbad->dir = !pbad->dir;
499 /* We're in kick mode, kill the other guy: */
501 pbad_c->dying = FALLING;
502 pbad_c->base.ym = -8;
503 play_sound(sounds[SND_FALL], SOUND_CENTER_SPEAKER);
505 add_score(pbad->base.x - scroll_x,
508 pbad->dir = !pbad->dir;
511 pplayer_c = p_c_object;
512 if (pbad->kind == BAD_BSOD)
514 pbad->dying = SQUISHED;
515 timer_start(&pbad->timer,4000);
516 pplayer_c->base.ym = -KILL_BOUNCE_YM;
518 add_score(pbad->base.x - scroll_x, pbad->base.y,
519 50 * score_multiplier);
521 play_sound(sounds[SND_SQUISH], SOUND_CENTER_SPEAKER);
523 else if (pbad->kind == BAD_LAPTOP)
525 if (pbad->mode != KICK)
529 play_sound(sounds[SND_STOMP], SOUND_CENTER_SPEAKER);
533 timer_start(&pbad->timer,10000);
535 pplayer_c->base.y = pplayer_c->base.y - 32;
542 play_sound(sounds[SND_KICK], SOUND_CENTER_SPEAKER);
544 if (pplayer_c->base.x <= pbad->base.x)
549 timer_start(&pbad->timer,5000);
552 pplayer_c->base.ym = -KILL_BOUNCE_YM;
554 add_score(pbad->base.x - scroll_x,
556 25 * score_multiplier);
558 /* play_sound(sounds[SND_SQUISH]); */