#include "screen.h"
Surface* tux_life;
-std::vector<Surface*> tux_right;
-std::vector<Surface*> tux_left;
-Surface* smalltux_jump_left;
-Surface* smalltux_jump_right;
-Surface* smalltux_stand_left;
-Surface* smalltux_stand_right;
-Sprite* smalltux_gameover;
-Sprite* smalltux_skid_left;
-Sprite* smalltux_skid_right;
-Sprite* largetux_stand_left;
-Sprite* largetux_stand_right;
-
-Sprite* bigtux_right;
-Sprite* bigtux_left;
-Sprite* bigtux_right_jump;
-Sprite* bigtux_left_jump;
-Sprite* ducktux_right;
-Sprite* ducktux_left;
-Surface* skidtux_right;
-Surface* skidtux_left;
-Surface* firetux_right[3];
-Surface* firetux_left[3];
-Surface* bigfiretux_right[3];
-Surface* bigfiretux_left[3];
-Surface* bigfiretux_right_jump;
-Surface* bigfiretux_left_jump;
-Surface* duckfiretux_right;
-Surface* duckfiretux_left;
-Surface* skidfiretux_right;
-Surface* skidfiretux_left;
-Surface* cape_right[2];
-Surface* cape_left[2];
-Surface* bigcape_right[2];
-Surface* bigcape_left[2];
+
+Sprite* smalltux_gameover;
+Sprite* smalltux_star;
+Sprite* largetux_star;
+
+PlayerSprite smalltux;
+PlayerSprite largetux;
+PlayerSprite firetux;
PlayerKeymap keymap;
{
Level* plevel = World::current()->get_level();
+ holding_something = false;
+
base.width = 32;
base.height = 32;
skidding_timer.init(true);
safe_timer.init(true);
frame_timer.init(true);
+ kick_timer.init(true);
physic.reset();
}
}
else if(key == keymap.fire)
{
+ if (state == UP)
+ input.old_fire = UP;
input.fire = state;
return true;
}
{
bool jumped_in_solid = false;
+ if (input.fire == UP)
+ holding_something = false;
+
/* Move tux: */
previous_base = base;
skidding_timer.check();
invincible_timer.check();
safe_timer.check();
+ kick_timer.check();
}
bool
if (input.fire == DOWN && input.old_fire == UP && got_coffee)
{
World::current()->add_bullet(base.x, base.y, physic.get_velocity_x(), dir);
+ input.old_fire = DOWN;
}
/* tux animations: */
}
/* Duck! */
- if (input.down == DOWN && size == BIG && !duck && physic.get_velocity_y() == 0)
+ if (input.down == DOWN && size == BIG && !duck && physic.get_velocity_y() == 0 && on_ground())
{
duck = true;
base.height = 32;
// changing base size confuses collision otherwise
old_base = previous_base = base;
}
- else if(input.down == UP && size == BIG && duck && physic.get_velocity_y() == 0)
+ else if(input.down == UP && size == BIG && duck && physic.get_velocity_y() == 0 && on_ground())
{
duck = false;
base.y -= 32;
}
else
{
+ PlayerSprite* sprite;
+
if (size == SMALL)
+ sprite = &smalltux;
+ else if (got_coffee)
+ sprite = &firetux;
+ else
+ sprite = &largetux;
+
+ if (duck && size != SMALL)
{
- if (invincible_timer.started())
+ if (dir == RIGHT)
+ sprite->duck_right->draw(base.x - scroll_x, base.y);
+ else
+ sprite->duck_left->draw(base.x - scroll_x, base.y);
+ }
+ else if (skidding_timer.started())
+ {
+ if (dir == RIGHT)
+ sprite->skid_right->draw(base.x - scroll_x, base.y);
+ else
+ sprite->skid_left->draw(base.x - scroll_x, base.y);
+ }
+ else if (kick_timer.started())
+ {
+ if (dir == RIGHT)
+ sprite->kick_right->draw(base.x - scroll_x, base.y);
+ else
+ sprite->kick_left->draw(base.x - scroll_x, base.y);
+ }
+ else if (physic.get_velocity_y() != 0)
+ {
+ if (dir == RIGHT)
+ sprite->jump_right->draw(base.x - scroll_x, base.y);
+ else
+ sprite->jump_left->draw(base.x - scroll_x, base.y);
+ }
+ else
+ {
+ if (fabsf(physic.get_velocity_x()) < 1.0f) // standing
{
if (dir == RIGHT)
- cape_right[global_frame_counter % 2]->draw(base.x- scroll_x, base.y);
+ sprite->stand_right->draw( base.x - scroll_x, base.y);
else
- cape_left[global_frame_counter % 2]->draw(base.x- scroll_x, base.y);
+ sprite->stand_left->draw( base.x - scroll_x, base.y);
}
-
- if (!got_coffee)
- {
- if (!skidding_timer.started())
- {
- if (physic.get_velocity_y() != 0)
- {
- if (dir == RIGHT)
- smalltux_jump_right->draw( base.x - scroll_x, base.y - 10);
- else
- smalltux_jump_left->draw( base.x - scroll_x, base.y - 10);
- }
- else
- {
- if (fabsf(physic.get_velocity_x()) < 1.0f) // standing
- {
- if (dir == RIGHT)
- smalltux_stand_right->draw( base.x - scroll_x, base.y - 9);
- else
- smalltux_stand_left->draw( base.x - scroll_x, base.y - 9);
- }
- else // moving
- {
- if (dir == RIGHT)
- tux_right[(global_frame_counter/2) % tux_right.size()]->draw(base.x - scroll_x, base.y - 9);
- else
- tux_left[(global_frame_counter/2) % tux_left.size()]->draw(base.x - scroll_x, base.y - 9);
- }
- }
- }
- else
- {
- if (dir == RIGHT)
- smalltux_skid_right->draw(base.x - scroll_x, base.y);
- else
- smalltux_skid_left->draw(base.x - scroll_x, base.y);
- }
- }
- else
+ else // moving
{
- /* Tux got coffee! */
-
if (dir == RIGHT)
- {
- firetux_right[frame_]->draw( base.x- scroll_x, base.y);
- }
+ sprite->walk_right->draw(base.x - scroll_x, base.y);
else
- {
- firetux_left[frame_]->draw( base.x- scroll_x, base.y);
- }
+ sprite->walk_left->draw(base.x - scroll_x, base.y);
}
}
- else // Large Tux
+
+ // Draw arm overlay graphics when Tux is holding something
+ if (holding_something && physic.get_velocity_y() == 0)
{
- if (invincible_timer.started())
- {
- float capex = base.x + (base.width - bigcape_right[0]->w) / 2;
- capex -= scroll_x;
- float capey = base.y + (base.height - bigcape_right[0]->h) / 2;
-
- /* Draw cape (just not in ducked mode since that looks silly): */
- if (dir == RIGHT)
- bigcape_right[global_frame_counter % 2]->draw(capex, capey);
- else
- bigcape_left[global_frame_counter % 2]->draw(capex, capey);
- }
+ if (dir == RIGHT)
+ sprite->grab_right->draw(base.x - scroll_x, base.y);
+ else
+ sprite->grab_left->draw(base.x - scroll_x, base.y);
+ }
- if (!got_coffee)
- {
- if (!duck)
- {
- if (!skidding_timer.started())
- {
- if (physic.get_velocity_y() == 0)
- {
- if (fabsf(physic.get_velocity_x()) < 1.0f) // standing
- {
- if (dir == RIGHT)
- largetux_stand_right->draw(base.x - scroll_x, base.y);
- else
- largetux_stand_left->draw(base.x - scroll_x, base.y);
- }
- else // walking
- {
- if (dir == RIGHT)
- bigtux_right->draw(base.x - scroll_x, base.y);
- else
- bigtux_left->draw(base.x - scroll_x, base.y);
- }
- }
- else
- {
- if (dir == RIGHT)
- bigtux_right_jump->draw(base.x - scroll_x, base.y);
- else
- bigtux_left_jump->draw(base.x - scroll_x, base.y);
- }
- }
- else
- {
- if (dir == RIGHT)
- skidtux_right->draw(base.x - scroll_x - 8, base.y);
- else
- skidtux_left->draw(base.x - scroll_x - 8, base.y);
- }
- }
- else
- {
- if (dir == RIGHT)
- ducktux_right->draw(base.x - scroll_x, base.y);
- else
- ducktux_left->draw(base.x - scroll_x, base.y);
- }
- }
+ // Draw blinking star overlay
+ if (invincible_timer.started())
+ {
+ if (size == SMALL || duck)
+ smalltux_star->draw(base.x - scroll_x, base.y);
else
- {
- /* Tux has coffee! */
- if (!duck)
- {
- if (!skidding_timer.started())
- {
- if (!jumping || physic.get_velocity_y() > 0)
- {
- if (dir == RIGHT)
- bigfiretux_right[frame_]->draw(base.x- scroll_x - 8, base.y);
- else
- bigfiretux_left[frame_]->draw(base.x- scroll_x - 8, base.y);
- }
- else
- {
- if (dir == RIGHT)
- bigfiretux_right_jump->draw(base.x- scroll_x - 8, base.y);
- else
- bigfiretux_left_jump->draw(base.x- scroll_x - 8, base.y);
- }
- }
- else
- {
- if (dir == RIGHT)
- skidfiretux_right->draw(base.x- scroll_x - 8, base.y);
- else
- skidfiretux_left->draw(base.x- scroll_x - 8, base.y);
- }
- }
- else
- {
- if (dir == RIGHT)
- duckfiretux_right->draw( base.x- scroll_x - 8, base.y - 16);
- else
- duckfiretux_left->draw( base.x- scroll_x - 8, base.y - 16);
- }
- }
+ largetux_star->draw(base.x - scroll_x, base.y);
}
}
- }
-
+ }
+
if (debug_mode)
- fillrect(base.x - scroll_x, base.y, 32, 32, 75,75,75, 150);
+ fillrect(base.x - scroll_x, base.y,
+ base.width, base.height, 75,75,75, 150);
}
void
!safe_timer.started() &&
pbad_c->mode != BadGuy::HELD)
{
- if (pbad_c->mode == BadGuy::FLAT && input.fire == DOWN)
+ if (pbad_c->mode == BadGuy::FLAT && input.fire == DOWN
+ && !holding_something)
{
+ holding_something = true;
pbad_c->mode = BadGuy::HELD;
pbad_c->base.y-=8;
}
/* Kill Player! */
void
-Player::kill(int mode)
+Player::kill(HurtMode mode)
{
play_sound(sounds[SND_HURT], SOUND_CENTER_SPEAKER);
if (mode == SHRINK && size == BIG)
{
if (got_coffee)
- got_coffee = false;
-
- size = SMALL;
- base.height = 32;
- duck = false;
-
+ {
+ got_coffee = false;
+ }
+ else
+ {
+ size = SMALL;
+ base.height = 32;
+ duck = false;
+ }
safe_timer.start(TUX_SAFE_TIME);
}
else