// $Id$
//
-// SuperTux - A Jump'n Run
-// Copyright (C) 2003 Tobias Glaesser <tobi.web@gmx.de>
+// SuperTux
+// Copyright (C) 2006 Matthias Braun <matze@braunis.de>
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
#include "sprite/sprite.hpp"
#include "sector.hpp"
#include "resources.hpp"
-#include "video/screen.hpp"
#include "statistics.hpp"
#include "game_session.hpp"
#include "object/tilemap.hpp"
#include "object/bullet.hpp"
#include "trigger/trigger_base.hpp"
#include "control/joystickkeyboardcontroller.hpp"
-#include "scripting/wrapper_util.hpp"
+#include "scripting/squirrel_util.hpp"
#include "main.hpp"
#include "platform.hpp"
#include "badguy/badguy.hpp"
#include "player_status.hpp"
#include "log.hpp"
+#include "falling_coin.hpp"
static const int TILES_FOR_BUTTJUMP = 3;
static const float SHOOTING_TIME = .150;
if(body != NULL)
body->draw(context, pos, layer-3);
if(arms != NULL)
- arms->draw(context, pos, layer);
+ arms->draw(context, pos, layer+10);
if(feet != NULL)
feet->draw(context, pos, layer-2);
}
-FallingCoin::FallingCoin(const Vector& start_position, const int vel_x)
-{
- pos = start_position;
- sprite = sprite_manager->create("images/objects/coin/coin.sprite");
- physic.set_velocity_y(800);
- physic.set_velocity_x(vel_x);
-}
-
-FallingCoin::~FallingCoin()
-{
- delete sprite;
-}
-
-void
-FallingCoin::draw(DrawingContext& context)
-{
- sprite->draw(context, pos, LAYER_OBJECTS + 5);
-}
-
-void
-FallingCoin::update(float elapsed_time)
-{
- pos += physic.get_movement(elapsed_time);
- if (pos.y > SCREEN_HEIGHT)
- remove_me();
-}
-
Player::Player(PlayerStatus* _player_status)
: player_status(_player_status), grabbed_object(0)
{
}
void
-Player::set_bonus(BonusType type, bool animate)
+Player::add_coins(int count)
{
- if(player_status->bonus >= type)
- return;
+ player_status->add_coins(count);
+}
+
+void
+Player::add_bonus(const std::string& bonustype)
+{
+ if(bonustype == "grow")
+ add_bonus(GROWUP_BONUS);
+ else if(bonustype == "fireflower")
+ add_bonus(FIRE_BONUS);
+ else if(bonustype == "iceflower")
+ add_bonus(ICE_BONUS);
+ else if(bonustype == "none")
+ add_bonus(NO_BONUS);
+
+ std::ostringstream msg;
+ msg << "Unknown bonus type " << bonustype;
+ throw std::runtime_error(msg.str());
+}
+
+void
+Player::add_bonus(BonusType type, bool animate)
+{
+ // always ignore NO_BONUS
+ if (type == NO_BONUS) {
+ return;
+ }
+
+ // ignore GROWUP_BONUS if we're already big
+ if (type == GROWUP_BONUS) {
+ if (player_status->bonus == GROWUP_BONUS) return;
+ if (player_status->bonus == FIRE_BONUS) return;
+ if (player_status->bonus == ICE_BONUS) return;
+ }
+
+ set_bonus(type, animate);
+}
+
+void
+Player::set_bonus(BonusType type, bool animate)
+{
if(player_status->bonus == NO_BONUS) {
adjust_height = 62.8;
if(animate)
growing_timer.start(GROWING_TIME);
}
-
+
+ if ((type == NO_BONUS) || (type == GROWUP_BONUS)) {
+ player_status->max_fire_bullets = 0;
+ player_status->max_ice_bullets = 0;
+ }
+ if (type == FIRE_BONUS) player_status->max_fire_bullets++;
+ if (type == ICE_BONUS) player_status->max_ice_bullets++;
+
player_status->bonus = type;
}
else
tux_body = small_tux;
- int layer = LAYER_OBJECTS + 10;
+ int layer = LAYER_OBJECTS + 1;
/* Set Tux sprite action */
if (duck && is_big())
|| player_status->bonus == ICE_BONUS)
{
safe_timer.start(TUX_SAFE_TIME);
- player_status->bonus = GROWUP_BONUS;
+ set_bonus(GROWUP_BONUS);
}
else
{
safe_timer.start(TUX_SAFE_TIME /* + GROWING_TIME */);
adjust_height = 30.8;
duck = false;
- player_status->bonus = NO_BONUS;
+ set_bonus(NO_BONUS);
}
}
else
physic.set_acceleration(0, 0);
physic.set_velocity(0, 700);
player_status->coins -= 25;
- player_status->bonus = NO_BONUS;
+ set_bonus(NO_BONUS);
dying = true;
dying_timer.start(3.0);
set_group(COLGROUP_DISABLED);