#include "main.hpp"
#include "badguy/badguy.hpp"
#include "player_status.hpp"
+#include "msg.hpp"
static const int TILES_FOR_BUTTJUMP = 3;
static const float SHOOTING_TIME = .150;
: player_status(_player_status), grabbed_object(0)
{
controller = main_controller;
- smalltux_gameover = sprite_manager->create("smalltux-gameover");
- smalltux_star = sprite_manager->create("smalltux-star");
- bigtux_star = sprite_manager->create("bigtux-star");
+ smalltux_gameover = sprite_manager->create("images/creatures/tux_small/smalltux-gameover.sprite");
+ smalltux_star = sprite_manager->create("images/creatures/tux_small/smalltux-star.sprite");
+ bigtux_star = sprite_manager->create("images/creatures/tux_big/bigtux-star.sprite");
init();
}
deactivated = false;
backflipping = false;
backflip_direction = 0;
+ visible = true;
on_ground_flag = false;
grabbed_object = 0;
+ floor_normal = Vector(0,-1);
+
physic.reset();
}
void
Player::update(float elapsed_time)
{
+ // do we need to enable gravity again?
+ if(on_ground_flag) {
+ Rect lower = bbox;
+ lower.move(Vector(0, 4.0));
+ if(Sector::current()->is_free_space(lower)) {
+ physic.enable_gravity(true);
+ on_ground_flag = false;
+ }
+ }
+
if(dying && dying_timer.check()) {
dead = true;
return;
}
- // fixes the "affected even while blinking" bug
- if (safe_timer.started() && this->get_group() != COLGROUP_MOVING_ONLY_STATIC) {
- this->set_group(COLGROUP_MOVING_ONLY_STATIC);
- }
- else if (!safe_timer.started() && this->get_group() == COLGROUP_MOVING_ONLY_STATIC) {
- this->set_group(COLGROUP_MOVING);
- }
-
if(!controller->hold(Controller::ACTION) && grabbed_object) {
// move the grabbed object a bit away from tux
Vector pos = get_pos() +
if(moving_object) {
moving_object->set_pos(pos);
} else {
-#ifdef DEBUG
- std::cout << "Non MovingObjetc grabbed?!?\n";
-#endif
+ msg_debug("Non MovingObjetc grabbed?!?");
}
grabbed_object->ungrab(*this, dir);
grabbed_object = 0;
handle_input();
movement = physic.get_movement(elapsed_time);
- on_ground_flag = false;
#if 0
// special exception for cases where we're stuck under tiles after
// extend/shrink tux collision rectangle so that we fall through/walk over 1
// tile holes
if(fabsf(vx) > MAX_WALK_XM) {
- bbox.set_width(33);
+ bbox.set_width(34);
} else {
bbox.set_width(31.8);
}
+ // on downward slopes, adjust vertical velocity to match slope angle
+ if (on_ground()) {
+ if (floor_normal.y != 0) {
+ if ((floor_normal.x * vx) > 0) {
+ // we overdo it a little, just to be on the safe side
+ vy = vx * (floor_normal.x / floor_normal.y) * 2;
+ }
+ }
+ }
+
physic.set_velocity(vx, vy);
physic.set_acceleration(ax, ay);
}
}
void
+Player::set_visible(bool visible)
+{
+ this->visible = visible;
+}
+
+bool
+Player::get_visible()
+{
+ return visible;
+}
+
+void
Player::kick()
{
kick_timer.start(KICK_TIME);
void
Player::draw(DrawingContext& context)
{
+ if(!visible)
+ return;
+
TuxBodyParts* tux_body;
if (player_status->bonus == GROWUP_BONUS)
if(physic.get_velocity_y() < 0)
physic.set_velocity_y(0);
on_ground_flag = true;
+
+ // remember normal of this tile
+ if (hit.normal.y > -0.9) {
+ floor_normal.x = hit.normal.x;
+ floor_normal.y = hit.normal.y;
+ } else {
+ // slowly adjust to unisolid tiles.
+ // Necessary because our bounding box sometimes reaches through slopes and thus hits unisolid tiles
+ floor_normal.x = (floor_normal.x * 0.9) + (hit.normal.x * 0.1);
+ floor_normal.y = (floor_normal.y * 0.9) + (hit.normal.y * 0.1);
+ }
+
+ // disable gravity
+ physic.enable_gravity(false);
} else if(hit.normal.y > 0) { // bumped against the roof
physic.set_velocity_y(.1);
}
return CONTINUE;
}
- TriggerBase* trigger = dynamic_cast<TriggerBase*> (&other);
- if(trigger) {
- if(controller->pressed(Controller::UP))
- trigger->event(*this, TriggerBase::EVENT_ACTIVATE);
+#ifdef DEBUG
+ assert(dynamic_cast<MovingObject*> (&other) != NULL);
+#endif
+ MovingObject* moving_object = static_cast<MovingObject*> (&other);
+ if(moving_object->get_group() == COLGROUP_TOUCHABLE) {
+ TriggerBase* trigger = dynamic_cast<TriggerBase*> (&other);
+ if(trigger) {
+ if(controller->pressed(Controller::UP))
+ trigger->event(*this, TriggerBase::EVENT_ACTIVATE);
+ }
return FORCE_MOVE;
}
BadGuy* badguy = dynamic_cast<BadGuy*> (&other);
- if(badguy != NULL)
- return CONTINUE;
-
-#if 0
- MovingObject* moving_object = static_cast<MovingObject*> (&other);
- if(moving_object->get_group() == COLGROUP_TOUCHABLE)
- return FORCE_MOVE;
+ if(badguy != NULL) {
+ if(safe_timer.started())
+ return FORCE_MOVE;
- if(is_invincible())
- return FORCE_MOVE;
+ return CONTINUE;
+ }
- return CONTINUE;
-#endif
return FORCE_MOVE;
}
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;