+ if (tux_invincible_time > 0)
+ tux_invincible_time--;
+ }
+
+
+ /* Handle upgrades: */
+
+ for (i = 0; i < NUM_UPGRADES; i++)
+ {
+ if (upgrades[i].alive)
+ {
+ if (upgrades[i].height < 32)
+ {
+ /* Rise up! */
+
+ upgrades[i].height++;
+ }
+ else
+ {
+ /* Move around? */
+
+ if (upgrades[i].kind == UPGRADE_MINTS ||
+ upgrades[i].kind == UPGRADE_HERRING)
+ {
+ upgrades[i].x = upgrades[i].x + upgrades[i].xm;
+ upgrades[i].y = upgrades[i].y + upgrades[i].ym;
+
+ if (issolid(upgrades[i].x, upgrades[i].y + 31, 0) ||
+ issolid(upgrades[i].x + 31, upgrades[i].y + 31, 0))
+ {
+ if (upgrades[i].ym > 0)
+ {
+ if (upgrades[i].kind == UPGRADE_MINTS)
+ {
+ upgrades[i].ym = 0;
+ }
+ else if (upgrades[i].kind == UPGRADE_HERRING)
+ {
+ upgrades[i].ym = -24;
+ }
+
+ upgrades[i].y = (upgrades[i].y / 32) * 32;
+ }
+ }
+ else
+ upgrades[i].ym = upgrades[i].ym + GRAVITY;
+
+ if (issolid(upgrades[i].x, upgrades[i].y, 0))
+ {
+ upgrades[i].xm = -upgrades[i].xm;
+ }
+ }
+
+
+ /* Off the screen? Kill it! */
+
+ if (upgrades[i].x < scroll_x)
+ upgrades[i].alive = NO;
+
+
+ /* Did the player grab it? */
+
+ if (tux_x + scroll_x >= upgrades[i].x - 32 &&
+ tux_x + scroll_x <= upgrades[i].x + 32 &&
+ tux_y >= upgrades[i].y - 32 &&
+ tux_y <= upgrades[i].y + 32)
+ {
+ /* Remove the upgrade: */
+
+ upgrades[i].alive = NO;
+
+
+ /* Affect the player: */
+
+ if (upgrades[i].kind == UPGRADE_MINTS)
+ {
+ play_sound(sounds[SND_EXCELLENT]);
+ tux_size = BIG;
+ super_bkgd_time = 8;
+ }
+ else if (upgrades[i].kind == UPGRADE_COFFEE)
+ {
+ play_sound(sounds[SND_COFFEE]);
+ tux_got_coffee = YES;
+ super_bkgd_time = 4;
+ }
+ else if (upgrades[i].kind == UPGRADE_HERRING)
+ {
+ play_sound(sounds[SND_HERRING]);
+ tux_invincible_time = TUX_INVINCIBLE_TIME;
+ super_bkgd_time = 4;
+ /* play the herring song ^^ */
+ current_music = HERRING_MUSIC;
+ if (playing_music())
+ halt_music();
+ play_music( herring_song, 1 );
+ }
+ }
+ }
+ }
+ }
+
+
+ /* Handle bad guys: */
+
+ for (i = 0; i < NUM_BAD_GUYS; i++)
+ {
+ if (bad_guys[i].alive)
+ {
+ if (bad_guys[i].seen)
+ {
+ if (bad_guys[i].kind == BAD_BSOD)
+ {
+ /* --- BLUE SCREEN OF DEATH MONSTER: --- */
+
+ /* Move left/right: */
+
+ if (bad_guys[i].dying == NO ||
+ bad_guys[i].dying == FALLING)
+ {
+ if (bad_guys[i].dir == RIGHT)
+ bad_guys[i].x = bad_guys[i].x + 4;
+ else if (bad_guys[i].dir == LEFT)
+ bad_guys[i].x = bad_guys[i].x - 4;
+ }
+
+
+ /* Move vertically: */
+
+ bad_guys[i].y = bad_guys[i].y + bad_guys[i].ym;
+
+
+ /* Bump into things horizontally: */
+
+ if (!bad_guys[i].dying)
+ {
+ if (issolid(bad_guys[i].x, bad_guys[i].y, 0))
+ bad_guys[i].dir = !bad_guys[i].dir;
+ }
+
+
+ /* Bump into other bad guys: */
+
+ for (j = 0; j < NUM_BAD_GUYS; j++)
+ {
+ if (j != i && bad_guys[j].alive &&
+ !bad_guys[j].dying && !bad_guys[i].dying &&
+ bad_guys[i].x >= bad_guys[j].x - 32 &&
+ bad_guys[i].x <= bad_guys[j].x + 32 &&
+ bad_guys[i].y >= bad_guys[j].y - 32 &&
+ bad_guys[i].y <= bad_guys[j].y + 32)
+ {
+ bad_guys[i].dir = !bad_guys[i].dir;
+ }
+ }
+
+
+ /* Fall if we get off the ground: */
+
+ if (bad_guys[i].dying != FALLING)
+ {
+ if (!issolid(bad_guys[i].x, bad_guys[i].y + 32, 0) &&
+ bad_guys[i].ym < MAX_YM)
+ {
+ bad_guys[i].ym = bad_guys[i].ym + GRAVITY;
+ }
+ else
+ {
+ /* Land: */
+
+ if (bad_guys[i].ym > 0)
+ {
+ bad_guys[i].y = (bad_guys[i].y / 32) * 32;
+ bad_guys[i].ym = 0;
+ }
+ }
+ }
+ else
+ bad_guys[i].ym = bad_guys[i].ym + GRAVITY;
+
+ if (bad_guys[i].y > 480)
+ bad_guys[i].alive = NO;
+ }
+ else if (bad_guys[i].kind == BAD_LAPTOP)
+ {
+ /* --- LAPTOP MONSTER: --- */
+
+ /* Move left/right: */
+
+ if (bad_guys[i].mode != FLAT && bad_guys[i].mode != KICK)
+ {
+ if (bad_guys[i].dying == NO ||
+ bad_guys[i].dying == FALLING)
+ {
+ if (bad_guys[i].dir == RIGHT)
+ bad_guys[i].x = bad_guys[i].x + 4;
+ else if (bad_guys[i].dir == LEFT)
+ bad_guys[i].x = bad_guys[i].x - 4;
+ }
+ }
+ else if (bad_guys[i].mode == KICK)
+ {
+ if (bad_guys[i].dir == RIGHT)
+ bad_guys[i].x = bad_guys[i].x + 16;
+ else if (bad_guys[i].dir == LEFT)
+ bad_guys[i].x = bad_guys[i].x - 16;
+ }
+
+
+ /* Move vertically: */
+
+ bad_guys[i].y = bad_guys[i].y + bad_guys[i].ym;
+
+
+ /* Bump into things horizontally: */
+
+ if (!bad_guys[i].dying)
+ {
+ if (issolid(bad_guys[i].x, bad_guys[i].y, 0))
+ {
+ bad_guys[i].dir = !bad_guys[i].dir;
+
+ if (bad_guys[i].mode == KICK)
+ play_sound(sounds[SND_RICOCHET]);
+ }
+ }
+
+
+ /* Bump into other bad guys: */
+
+ for (j = 0; j < NUM_BAD_GUYS; j++)
+ {
+ if (j != i && bad_guys[j].alive &&
+ !bad_guys[j].dying && !bad_guys[i].dying &&
+ bad_guys[i].x >= bad_guys[j].x - 32 &&
+ bad_guys[i].x <= bad_guys[j].x + 32 &&
+ bad_guys[i].y >= bad_guys[j].y - 32 &&
+ bad_guys[i].y <= bad_guys[j].y + 32)
+ {
+ if (bad_guys[i].mode != KICK)
+ bad_guys[i].dir = !bad_guys[i].dir;
+ else
+ {
+ /* We're in kick mode, kill the other guy: */
+
+ bad_guys[j].dying = FALLING;
+ bad_guys[j].ym = -8;
+ play_sound(sounds[SND_FALL]);
+
+ add_score(bad_guys[i].x - scroll_x,
+ bad_guys[i].y, 100);
+ }
+ }
+ }
+
+
+ /* Fall if we get off the ground: */
+
+ if (bad_guys[i].dying != FALLING)
+ {
+ if (!issolid(bad_guys[i].x, bad_guys[i].y + 32, 0) &&
+ bad_guys[i].ym < MAX_YM)
+ {
+ bad_guys[i].ym = bad_guys[i].ym + GRAVITY;
+ }
+ else
+ {
+ /* Land: */
+
+ if (bad_guys[i].ym > 0)
+ {
+ bad_guys[i].y = (bad_guys[i].y / 32) * 32;
+ bad_guys[i].ym = 0;
+ }
+ }
+ }
+ else
+ bad_guys[i].ym = bad_guys[i].ym + GRAVITY;
+
+ if (bad_guys[i].y > 480)
+ bad_guys[i].alive = NO;
+ }
+ else if (bad_guys[i].kind == BAD_MONEY)
+ {
+ /* --- MONEY BAGS: --- */
+
+
+ /* Move vertically: */
+
+ bad_guys[i].y = bad_guys[i].y + bad_guys[i].ym;
+
+
+ /* Fall if we get off the ground: */
+
+ if (bad_guys[i].dying != FALLING)
+ {
+ if (!issolid(bad_guys[i].x, bad_guys[i].y + 32, 0))
+ {
+ if (bad_guys[i].ym < MAX_YM)
+ {
+ bad_guys[i].ym = bad_guys[i].ym + GRAVITY;
+ }
+ }
+ else
+ {
+ /* Land: */
+
+ if (bad_guys[i].ym > 0)
+ {
+ bad_guys[i].y = (bad_guys[i].y / 32) * 32;
+ bad_guys[i].ym = -MAX_YM;
+ }
+ }
+ }
+ else
+ bad_guys[i].ym = bad_guys[i].ym + GRAVITY;
+
+ if (bad_guys[i].y > 480)
+ bad_guys[i].alive = NO;
+ }
+ else if (bad_guys[i].kind == -1)
+ {}
+
+
+ /* Kill it if the player jumped on it: */
+
+ if (!bad_guys[i].dying && !tux_dying && !tux_safe &&
+ tux_x + scroll_x >= bad_guys[i].x - 32 &&
+ tux_x + scroll_x <= bad_guys[i].x + 32 &&
+ tux_y >= bad_guys[i].y - 32 &&
+ tux_y <= bad_guys[i].y - 8
+ /* &&
+ tux_ym >= 0 */)
+ {
+ if (bad_guys[i].kind == BAD_BSOD)
+ {
+ bad_guys[i].dying = SQUISHED;
+ bad_guys[i].timer = 16;
+ tux_ym = -KILL_BOUNCE_YM;
+
+ add_score(bad_guys[i].x - scroll_x, bad_guys[i].y,
+ 50 * score_multiplier);
+
+ play_sound(sounds[SND_SQUISH]);
+ }
+ else if (bad_guys[i].kind == BAD_LAPTOP)
+ {
+ if (bad_guys[i].mode != FLAT)
+ {
+ /* Flatten! */
+
+ bad_guys[i].mode = FLAT;
+
+ bad_guys[i].timer = 64;
+
+ tux_y = tux_y - 32;
+ }
+ else
+ {
+ /* Kick! */
+
+ bad_guys[i].mode = KICK;
+
+ if (tux_x + scroll_x <= bad_guys[i].x)
+ bad_guys[i].dir = RIGHT;
+ else
+ bad_guys[i].dir = LEFT;
+
+ bad_guys[i].timer = 8;
+ }
+
+ tux_ym = -KILL_BOUNCE_YM;
+
+ add_score(bad_guys[i].x - scroll_x,
+ bad_guys[i].y,
+ 25 * score_multiplier);
+
+ /* play_sound(sounds[SND_SQUISH]); */
+ }
+ else if (bad_guys[i].kind == -1)
+ {}
+
+ score_multiplier++;
+ }
+
+
+ /* Hurt the player if he just touched it: */
+
+ if (!bad_guys[i].dying && !tux_dying &&
+ !tux_safe &&
+ tux_x + scroll_x >= bad_guys[i].x - 32 &&
+ tux_x + scroll_x <= bad_guys[i].x + 32 &&
+ tux_y >= bad_guys[i].y - 32 &&
+ tux_y <= bad_guys[i].y + 32)
+ {
+ if (bad_guys[i].mode == FLAT)
+ {
+ /* Kick: */
+
+ bad_guys[i].mode = KICK;
+
+ if (tux_x + scroll_x <= bad_guys[i].x)
+ {
+ bad_guys[i].dir = RIGHT;
+ bad_guys[i].x = bad_guys[i].x + 16;
+ }
+ else
+ {
+ bad_guys[i].dir = LEFT;
+ bad_guys[i].x = bad_guys[i].x - 16;
+ }
+
+ bad_guys[i].timer = 8;
+ }
+ else if (bad_guys[i].mode == KICK)
+ {
+ if (tux_y < bad_guys[i].y - 16 &&
+ bad_guys[i].timer == 0)
+ {
+ /* Step on (stop being kicked) */
+
+ bad_guys[i].mode = FLAT;
+ bad_guys[i].timer = 64;
+ }
+ else
+ {
+ /* Hurt if you get hit by kicked laptop: */
+
+ if (bad_guys[i].timer == 0)
+ {
+ if (tux_invincible_time == 0)
+ {
+ killtux(SHRINK);
+ }
+ else
+ {
+ bad_guys[i].dying = FALLING;
+ bad_guys[i].ym = -8;
+ play_sound(sounds[SND_FALL]);
+ }
+ }
+ }
+ }
+ else
+ {
+ if (tux_invincible_time == 0)
+ {
+ killtux(SHRINK);
+ }
+ else
+ {
+ bad_guys[i].dying = FALLING;
+ bad_guys[i].ym = -8;
+ play_sound(sounds[SND_FALL]);
+ }
+ }
+ }
+
+
+ /* Handle mode timer: */
+
+ if (bad_guys[i].mode == FLAT)
+ {
+ bad_guys[i].timer--;
+
+ if (bad_guys[i].timer <= 0)
+ bad_guys[i].mode = NORMAL;
+ }
+ else if (bad_guys[i].mode == KICK)
+ {
+ if (bad_guys[i].timer > 0)
+ bad_guys[i].timer--;
+ }
+
+
+ /* Handle dying timer: */
+
+ if (bad_guys[i].dying == SQUISHED)
+ {
+ bad_guys[i].timer--;
+
+
+ /* Remove it if time's up: */
+
+ if (bad_guys[i].timer <= 0)
+ bad_guys[i].alive = NO;
+ }
+
+
+ /* Remove if it's far off the screen: */
+
+ if (bad_guys[i].x < scroll_x - OFFSCREEN_DISTANCE)
+ bad_guys[i].alive = NO;
+ }
+ else /* !seen */
+ {
+ /* Once it's on screen, it's activated! */
+
+ if (bad_guys[i].x <= scroll_x + 640 + OFFSCREEN_DISTANCE)
+ bad_guys[i].seen = YES;
+ }
+ }
+ }
+
+
+ /* Handle skidding: */
+
+ if (tux_skidding > 0)
+ {
+ tux_skidding--;
+ }
+
+ return -1;
+}
+
+/* --- GAME DRAW! --- */
+
+void game_draw()
+{
+ int x, y, i;
+
+ /* Draw screen: */
+
+ if (tux_dying && (frame % 4) == 0)
+ clearscreen(255, 255, 255);
+ else
+ {
+ if (super_bkgd_time == 0)
+ clearscreen(bkgd_red, bkgd_green, bkgd_blue);
+ else
+ drawimage(img_super_bkgd, 0, 0, NO_UPDATE);
+ }
+
+
+ /* Draw background: */
+
+ for (y = 0; y < 15; y++)
+ {
+ for (x = 0; x < 21; x++)
+ {
+ drawshape(x * 32 - (scroll_x % 32), y * 32,
+ tiles[y][x + (scroll_x / 32)]);
+ }
+ }
+
+
+ /* (Bouncy bricks): */
+
+ for (i = 0; i < NUM_BOUNCY_BRICKS; i++)
+ {
+ if (bouncy_bricks[i].alive)
+ {
+ if (bouncy_bricks[i].x >= scroll_x - 32 &&
+ bouncy_bricks[i].x <= scroll_x + 640)
+ {
+ dest.x = bouncy_bricks[i].x - scroll_x;
+ dest.y = bouncy_bricks[i].y;
+ dest.w = 32;
+ dest.h = 32;
+
+ SDL_FillRect(screen, &dest, SDL_MapRGB(screen->format,
+ bkgd_red,
+ bkgd_green,
+ bkgd_blue));
+
+ drawshape(bouncy_bricks[i].x - scroll_x,
+ bouncy_bricks[i].y + bouncy_bricks[i].offset,
+ bouncy_bricks[i].shape);
+ }
+ }
+ }
+
+
+ /* (Bad guys): */
+
+ for (i = 0; i < NUM_BAD_GUYS; i++)
+ {
+ if (bad_guys[i].alive &&
+ bad_guys[i].x > scroll_x - 32 &&
+ bad_guys[i].x < scroll_x + 640)
+ {
+ if (bad_guys[i].kind == BAD_BSOD)
+ {
+ /* --- BLUE SCREEN OF DEATH MONSTER: --- */
+
+ if (bad_guys[i].dying == NO)
+ {
+ /* Alive: */
+
+ if (bad_guys[i].dir == LEFT)
+ {
+ drawimage(img_bsod_left[(frame / 5) % 4],
+ bad_guys[i].x - scroll_x,
+ bad_guys[i].y,
+ NO_UPDATE);
+ }
+ else
+ {
+ drawimage(img_bsod_right[(frame / 5) % 4],
+ bad_guys[i].x - scroll_x,
+ bad_guys[i].y,
+ NO_UPDATE);
+ }
+ }
+ else if (bad_guys[i].dying == FALLING)
+ {
+ /* Falling: */
+
+ if (bad_guys[i].dir == LEFT)
+ {
+ drawimage(img_bsod_falling_left,
+ bad_guys[i].x - scroll_x,
+ bad_guys[i].y,
+ NO_UPDATE);
+ }
+ else
+ {
+ drawimage(img_bsod_falling_right,
+ bad_guys[i].x - scroll_x,
+ bad_guys[i].y,
+ NO_UPDATE);
+ }
+ }
+ else if (bad_guys[i].dying == SQUISHED)
+ {
+ /* Dying - Squished: */
+
+ if (bad_guys[i].dir == LEFT)
+ {
+ drawimage(img_bsod_squished_left,
+ bad_guys[i].x - scroll_x,
+ bad_guys[i].y + 24,
+ NO_UPDATE);
+ }
+ else
+ {
+ drawimage(img_bsod_squished_right,
+ bad_guys[i].x - scroll_x,
+ bad_guys[i].y + 24,
+ NO_UPDATE);
+ }
+ }
+ }
+ else if (bad_guys[i].kind == BAD_LAPTOP)
+ {
+ /* --- LAPTOP MONSTER: --- */
+
+ if (bad_guys[i].dying == NO)
+ {
+ /* Alive: */
+
+ if (bad_guys[i].mode == NORMAL)
+ {
+ /* Not flat: */
+
+ if (bad_guys[i].dir == LEFT)
+ {
+ drawimage(img_laptop_left[(frame / 5) % 3],
+ bad_guys[i].x - scroll_x,
+ bad_guys[i].y,
+ NO_UPDATE);
+ }
+ else
+ {
+ drawimage(img_laptop_right[(frame / 5) % 3],
+ bad_guys[i].x - scroll_x,
+ bad_guys[i].y,
+ NO_UPDATE);
+ }
+ }
+ else
+ {
+ /* Flat: */
+
+ if (bad_guys[i].dir == LEFT)
+ {
+ drawimage(img_laptop_flat_left,
+ bad_guys[i].x - scroll_x,
+ bad_guys[i].y,
+ NO_UPDATE);
+ }
+ else
+ {
+ drawimage(img_laptop_flat_right,
+ bad_guys[i].x - scroll_x,
+ bad_guys[i].y,
+ NO_UPDATE);
+ }
+ }
+ }
+ else if (bad_guys[i].dying == FALLING)
+ {
+ /* Falling: */
+
+ if (bad_guys[i].dir == LEFT)
+ {
+ drawimage(img_laptop_falling_left,
+ bad_guys[i].x - scroll_x,
+ bad_guys[i].y,
+ NO_UPDATE);
+ }
+ else
+ {
+ drawimage(img_laptop_falling_right,
+ bad_guys[i].x - scroll_x,
+ bad_guys[i].y,
+ NO_UPDATE);
+ }
+ }
+ }
+ else if (bad_guys[i].kind == BAD_MONEY)
+ {
+ if (bad_guys[i].ym > -16)
+ {
+ if (bad_guys[i].dir == LEFT)
+ {
+ drawimage(img_money_left[0],
+ bad_guys[i].x - scroll_x,
+ bad_guys[i].y,
+ NO_UPDATE);
+ }
+ else
+ {
+ drawimage(img_money_right[0],
+ bad_guys[i].x - scroll_x,
+ bad_guys[i].y,
+ NO_UPDATE);
+ }
+ }
+ else
+ {
+ if (bad_guys[i].dir == LEFT)
+ {
+ drawimage(img_money_left[1],
+ bad_guys[i].x - scroll_x,
+ bad_guys[i].y,
+ NO_UPDATE);
+ }
+ else
+ {
+ drawimage(img_money_right[1],
+ bad_guys[i].x - scroll_x,
+ bad_guys[i].y,
+ NO_UPDATE);
+ }
+ }
+ }
+ else if (bad_guys[i].kind == -1)
+ {}
+ }
+ }
+
+
+ /* (Tux): */
+
+ if (right == UP && left == UP)
+ {
+ tux_frame_main = 1;
+ tux_frame = 1;
+ }
+ else
+ {
+ if ((fire == DOWN && (frame % 2) == 0) ||
+ (frame % 4) == 0)
+ tux_frame_main = (tux_frame_main + 1) % 4;
+
+ tux_frame = tux_frame_main;
+
+ if (tux_frame == 3)
+ tux_frame = 1;
+ }
+
+
+ if (tux_got_coffee && (frame % 2) == 1)
+ {
+ /* Coffee glow: */
+
+ drawimage(img_red_glow, tux_x - 8, tux_y - 32, NO_UPDATE);
+ }
+
+
+ if (tux_safe == 0 || (frame % 2) == 0)
+ {
+ if (tux_size == SMALL)
+ {
+ if (tux_invincible_time)
+ {
+ /* Draw cape: */
+
+ if (tux_dir == RIGHT)
+ {
+ drawimage(cape_right[frame % 2],
+ tux_x, tux_y,
+ NO_UPDATE);
+ }
+ else
+ {
+ drawimage(cape_left[frame % 2],
+ tux_x, tux_y,
+ NO_UPDATE);
+ }
+ }
+
+
+ if (tux_dir == RIGHT)
+ {
+ drawimage(tux_right[tux_frame], tux_x, tux_y, NO_UPDATE);
+ }
+ else
+ {
+ drawimage(tux_left[tux_frame], tux_x, tux_y, NO_UPDATE);
+ }
+ }
+ else
+ {
+ if (tux_invincible_time)
+ {
+ /* Draw cape: */
+
+ if (tux_dir == RIGHT)
+ {
+ drawimage(bigcape_right[frame % 2],
+ tux_x - 8 - 16, tux_y - 32,
+ NO_UPDATE);
+ }
+ else
+ {
+ drawimage(bigcape_left[frame % 2],
+ tux_x - 8, tux_y - 32,
+ NO_UPDATE);
+ }
+ }
+
+ if (!tux_duck)
+ {
+ if (!tux_skidding)
+ {
+ if (!jumping || tux_ym > 0)
+ {
+ if (tux_dir == RIGHT)
+ {
+ drawimage(bigtux_right[tux_frame],
+ tux_x - 8, tux_y - 32,
+ NO_UPDATE);
+ }
+ else
+ {
+ drawimage(bigtux_left[tux_frame],
+ tux_x - 8, tux_y - 32,
+ NO_UPDATE);
+ }
+ }
+ else
+ {
+ if (tux_dir == RIGHT)
+ {
+ drawimage(bigtux_right_jump,
+ tux_x - 8, tux_y - 32,
+ NO_UPDATE);
+ }
+ else
+ {
+ drawimage(bigtux_left_jump,
+ tux_x - 8, tux_y - 32,
+ NO_UPDATE);
+ }
+ }
+ }
+ else
+ {
+ if (tux_dir == RIGHT)
+ {
+ drawimage(skidtux_right,
+ tux_x - 8, tux_y - 32,
+ NO_UPDATE);
+ }
+ else
+ {
+ drawimage(skidtux_left,
+ tux_x - 8, tux_y - 32,
+ NO_UPDATE);
+ }
+ }
+ }
+ else
+ {
+ if (tux_dir == RIGHT)
+ {
+ drawimage(ducktux_right, tux_x - 8, tux_y - 16,
+ NO_UPDATE);
+ }
+ else
+ {
+ drawimage(ducktux_left, tux_x - 8, tux_y - 16,
+ NO_UPDATE);
+ }
+ }
+ }
+ }
+
+
+ /* (Bullets): */
+
+ for (i = 0; i < NUM_BULLETS; i++)
+ {
+ if (bullets[i].alive &&
+ bullets[i].x >= scroll_x - 4 &&
+ bullets[i].x <= scroll_x + 640)
+ {
+ drawimage(img_bullet, bullets[i].x - scroll_x, bullets[i].y,
+ NO_UPDATE);
+ }
+ }
+
+
+ /* (Floating scores): */
+
+ for (i = 0; i < NUM_FLOATING_SCORES; i++)
+ {
+ if (floating_scores[i].alive)
+ {
+ sprintf(str, "%d", floating_scores[i].value);
+ drawtext(str,
+ floating_scores[i].x + 16 - strlen(str) * 8,
+ floating_scores[i].y,
+ letters_gold, NO_UPDATE);
+ }
+ }
+
+
+ /* (Upgrades): */
+
+ for (i = 0; i < NUM_UPGRADES; i++)
+ {
+ if (upgrades[i].alive)
+ {
+ if (upgrades[i].height < 32)
+ {
+ /* Rising up... */
+
+ dest.x = upgrades[i].x - scroll_x;
+ dest.y = upgrades[i].y + 32 - upgrades[i].height;
+ dest.w = 32;
+ dest.h = upgrades[i].height;
+
+ src.x = 0;
+ src.y = 0;
+ src.w = 32;
+ src.h = upgrades[i].height;
+
+ if (upgrades[i].kind == UPGRADE_MINTS)
+ SDL_BlitSurface(img_mints, &src, screen, &dest);
+ else if (upgrades[i].kind == UPGRADE_COFFEE)
+ SDL_BlitSurface(img_coffee, &src, screen, &dest);
+ else if (upgrades[i].kind == UPGRADE_HERRING)
+ SDL_BlitSurface(img_golden_herring, &src, screen, &dest);
+ }
+ else
+ {
+ if (upgrades[i].kind == UPGRADE_MINTS)
+ {
+ drawimage(img_mints,
+ upgrades[i].x - scroll_x, upgrades[i].y,
+ NO_UPDATE);
+ }
+ else if (upgrades[i].kind == UPGRADE_COFFEE)
+ {
+ drawimage(img_coffee,
+ upgrades[i].x - scroll_x, upgrades[i].y,
+ NO_UPDATE);
+ }
+ else if (upgrades[i].kind == UPGRADE_HERRING)
+ {
+ drawimage(img_golden_herring,
+ upgrades[i].x - scroll_x, upgrades[i].y,
+ NO_UPDATE);
+ }
+ }
+ }
+ }
+
+
+ /* (Bouncy distros): */
+
+ for (i = 0; i < NUM_BOUNCY_DISTROS; i++)
+ {
+ if (bouncy_distros[i].alive)
+ {
+ drawimage(img_distro[0],
+ bouncy_distros[i].x - scroll_x,
+ bouncy_distros[i].y,
+ NO_UPDATE);
+ }
+ }
+
+
+ /* (Broken bricks): */
+
+ for (i = 0; i < NUM_BROKEN_BRICKS; i++)
+ {
+ if (broken_bricks[i].alive)
+ {
+ src.x = rand() % 16;
+ src.y = rand() % 16;
+ src.w = 16;
+ src.h = 16;
+
+ dest.x = broken_bricks[i].x - scroll_x;
+ dest.y = broken_bricks[i].y;
+ dest.w = 16;
+ dest.h = 16;
+
+ SDL_BlitSurface(img_brick[0], &src, screen, &dest);
+ }
+ }
+
+
+ /* (Status): */
+
+ sprintf(str, "%d", score);
+ drawtext("SCORE", 0, 0, letters_blue, NO_UPDATE);
+ drawtext(str, 96, 0, letters_gold, NO_UPDATE);
+
+ sprintf(str, "%d", highscore);
+ drawtext("HIGH", 0, 20, letters_blue, NO_UPDATE);
+ drawtext(str, 96, 20, letters_gold, NO_UPDATE);
+
+ if (time_left >= TIME_WARNING || (frame % 10) < 5)
+ {
+ sprintf(str, "%d", time_left);
+ drawtext("TIME", 224, 0, letters_blue, NO_UPDATE);
+ drawtext(str, 304, 0, letters_gold, NO_UPDATE);
+ }
+
+ sprintf(str, "%d", distros);
+ drawtext("DISTROS", 480, 0, letters_blue, NO_UPDATE);
+ drawtext(str, 608, 0, letters_gold, NO_UPDATE);
+
+ drawtext("LIVES", 480, 20, letters_blue, NO_UPDATE);
+
+ for(i=0; i < lives; ++i)
+ {
+ drawimage(tux_life,565+(18*i),20,NO_UPDATE);
+ }