#include "special/sprite_manager.h"
#include "player.h"
#include "tile.h"
-#include "player_status.h"
#include "special/sprite.h"
#include "sector.h"
#include "resources.h"
feet->draw(context, pos, layer-2, drawing_effect);
}
-Player::Player()
- : grabbed_object(0)
+Player::Player(PlayerStatus* _player_status)
+ : player_status(_player_status), grabbed_object(0)
{
smalltux_gameover = sprite_manager->create("smalltux-gameover");
smalltux_star = sprite_manager->create("smalltux-star");
void
Player::init()
{
- bbox.set_size(31.8, 31.8);
-
- size = SMALL;
- got_power = NONE_POWER;
+ if(is_big())
+ bbox.set_size(31.8, 63.8);
+ else
+ bbox.set_size(31.8, 31.8);
dir = RIGHT;
old_dir = dir;
flapping_velocity = 0;
// temporary to help player's choosing a flapping
- flapping_mode = MAREK_FLAP;
+ flapping_mode = NO_FLAP;
// Ricardo's flapping
flaps_nb = 0;
}
void
-Player::level_begin()
-{
- move(Vector(100, 170));
- duck = false;
-
- dying = false;
-
- input.reset();
-
- on_ground_flag = false;
-
- physic.reset();
-}
-
-PlayerStatus&
-Player::get_status()
-{
- return player_status;
-}
-
-void
Player::action(float elapsed_time)
{
if(dying && dying_timer.check()) {
return on_ground_flag;
}
+bool
+Player::is_big()
+{
+ if(player_status->bonus == NO_BONUS)
+ return false;
+
+ return true;
+}
+
void
Player::handle_horizontal_input()
{
can_jump = false;
can_flap = false;
flaps_nb = 0; // Ricardo's flapping
- if (size == SMALL)
- SoundManager::get()->play_sound(IDToSound(SND_JUMP));
- else
+ if (is_big())
SoundManager::get()->play_sound(IDToSound(SND_BIGJUMP));
+ else
+ SoundManager::get()->play_sound(IDToSound(SND_JUMP));
}
// Let go of jump key
else if(!input.jump)
}
}
-#if 0
/* In case the player has pressed Down while in a certain range of air,
enable butt jump action */
if (input.down && !butt_jump && !duck)
- if(tiles_on_air(TILES_FOR_BUTTJUMP) && jumping)
+ //if(tiles_on_air(TILES_FOR_BUTTJUMP) && jumping)
butt_jump = true;
-#endif
/* When Down is not held anymore, disable butt jump */
if(butt_jump && !input.down)
butt_jump = false;
+#if 0
// Do butt jump
- if (butt_jump && on_ground() && size == BIG)
+ if (butt_jump && on_ground() && is_big())
{
// Add a smoke cloud
if (duck)
butt_jump = false;
-#if 0
// Break bricks beneath Tux
if(Sector::current()->trybreakbrick(
Vector(base.x + 1, base.y + base.height), false)
physic.set_velocity_y(2);
butt_jump = true;
}
-#endif
-#if 0
// Kill nearby badguys
std::vector<GameObject*> gameobjects = Sector::current()->gameobjects;
for (std::vector<GameObject*>::iterator i = gameobjects.begin();
}
}
}
-#endif
}
+#endif
/** jumping is only allowed if we're about to touch ground soon and if the
* button has been up in between the last jump
handle_vertical_input();
/* Shoot! */
- if (input.fire && !input.old_fire && got_power != NONE_POWER) {
+ if (input.fire && !input.old_fire && player_status->bonus == FIRE_BONUS) {
if(Sector::current()->add_bullet(
// get_pos() + Vector(0, bbox.get_height()/2),
get_pos() + ((dir == LEFT)? Vector(0, bbox.get_height()/2)
}
/* Duck! */
- if (input.down && size == BIG && !duck
+ if (input.down && is_big() && !duck
&& physic.get_velocity_y() == 0 && on_ground())
{
duck = true;
bbox.move(Vector(0, 32));
bbox.set_height(31.8);
}
- else if(!input.down && size == BIG && duck)
+ else if(!input.down && is_big() && duck)
{
// try if we can really unduck
bbox.move(Vector(0, -32));
}
void
-Player::grow(bool animate)
+Player::set_bonus(BonusType type, bool animate)
{
- if(size == BIG)
+ if(player_status->bonus == type)
return;
- size = BIG;
- bbox.set_height(63.8);
- bbox.move(Vector(0, -32));
-
- if(animate)
- growing_timer.start(GROWING_TIME);
+ if(player_status->bonus == NO_BONUS) {
+ bbox.set_height(63.8);
+ bbox.move(Vector(0, -32));
+ if(animate)
+ growing_timer.start(GROWING_TIME);
+ }
+
+ player_status->bonus = type;
}
void
{
TuxBodyParts* tux_body;
- if (size == SMALL)
- tux_body = small_tux;
- else if (got_power == FIRE_POWER)
+ if (player_status->bonus == GROWUP_BONUS)
+ tux_body = big_tux;
+ else if (player_status->bonus == FIRE_BONUS)
tux_body = fire_tux;
- else if (got_power == ICE_POWER)
+ else if (player_status->bonus == ICE_BONUS)
tux_body = ice_tux;
else
- tux_body = big_tux;
+ tux_body = small_tux;
int layer = LAYER_OBJECTS + 10;
/* Set Tux sprite action */
- if (duck && size == BIG)
+ if (duck && is_big())
{
if(dir == LEFT)
tux_body->set_action("duck-left");
else // dir == RIGHT
tux_body->set_action("kick-right");
}
- else if (butt_jump && size == BIG)
+ else if (butt_jump && is_big())
{
if(dir == LEFT)
tux_body->set_action("buttjump-left");
if(idle_timer.check())
{
- if(size == BIG)
+ if(is_big())
{
if(dir == LEFT)
tux_body->head->set_action("idle-left", 1);
if(dying) {
smalltux_gameover->draw(context, get_pos(), layer);
} else if(growing_timer.get_timeleft() > 0) {
- if(size == SMALL)
+ if(!is_big())
{
if (dir == RIGHT)
context.draw_surface(growingtux_right[GROWING_FRAMES-1 -
|| size_t(global_time*20)%2)
&& !dying)
{
- if (size == SMALL || duck)
+ if (!is_big() || duck)
smalltux_star->draw(context, get_pos(), layer + 5);
else
bigtux_star->draw(context, get_pos(), layer + 5);
physic.set_velocity_x(0);
- if (mode == SHRINK && size == BIG)
+ if (mode == SHRINK && is_big())
{
- if (got_power != NONE_POWER)
+ if (player_status->bonus == FIRE_BONUS
+ || player_status->bonus == ICE_BONUS)
{
safe_timer.start(TUX_SAFE_TIME);
- got_power = NONE_POWER;
+ player_status->bonus = GROWUP_BONUS;
}
- else
+ else
{
growing_timer.start(GROWING_TIME);
safe_timer.start(TUX_SAFE_TIME + GROWING_TIME);
- size = SMALL;
bbox.set_height(31.8);
duck = false;
+ player_status->bonus = NO_BONUS;
}
}
else
physic.enable_gravity(true);
physic.set_acceleration(0, 0);
physic.set_velocity(0, 700);
- --player_status.lives;
+ player_status->lives -= 1;
+ player_status->bonus = NO_BONUS;
dying = true;
dying_timer.start(3.0);
flags |= FLAG_NO_COLLDET;
}
}
-/* Remove Tux's power ups */
-void
-Player::remove_powerups()
-{
- got_power = NONE_POWER;
- size = SMALL;
- bbox.set_height(31.8);
-}
-
void
Player::move(const Vector& vector)
{
bbox.set_pos(vector);
+ if(is_big())
+ bbox.set_size(31.8, 63.8);
+ else
+ bbox.set_size(31.8, 31.8);
+ on_ground_flag = false;
+ duck = false;
+ last_ground_y = vector.y;
+
+ input.reset();
+ physic.reset();
}
void
bbox.set_pos(Vector(camera->get_translation().x, get_pos().y));
adjust = true;
}
- if(get_pos().x >= camera->get_translation().x + screen->w - bbox.get_width())
+ if(get_pos().x >= camera->get_translation().x + SCREEN_WIDTH - bbox.get_width())
{
bbox.set_pos(Vector(
- camera->get_translation().x + screen->w - bbox.get_width(),
+ camera->get_translation().x + SCREEN_WIDTH - bbox.get_width(),
get_pos().y));
adjust = true;
}