X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fobject%2Fplayer.hpp;h=0fecfef0a5f25dd5a32ff4a8720e0536f33786e6;hb=ab9eab4c870195c2b60ce76b77044c35b31e8806;hp=cc250cbe542cb150866c91ca469d434dfc53e0aa;hpb=07ddaed2a657e4d2a3d038fed223fc5827159caf;p=supertux.git diff --git a/src/object/player.hpp b/src/object/player.hpp index cc250cbe5..0fecfef0a 100644 --- a/src/object/player.hpp +++ b/src/object/player.hpp @@ -44,7 +44,7 @@ class Portable; static const float TUX_SAFE_TIME = 1.8; static const float TUX_INVINCIBLE_TIME = 10.0; static const float TUX_INVINCIBLE_TIME_WARNING = 2.0; -static const float GROWING_TIME = 1.0; +static const float GROWING_TIME = 0.35; static const int GROWING_FRAMES = 7; class Camera; @@ -81,24 +81,9 @@ extern TuxBodyParts* big_tux; extern TuxBodyParts* fire_tux; extern TuxBodyParts* ice_tux; -class FallingCoin : public GameObject -{ -public: - FallingCoin(const Vector& start_position, const int x_vel); - ~FallingCoin(); - - void draw(DrawingContext& context); - void update(float elapsed_time); -private: - Vector pos; - Sprite* sprite; - Physic physic; -}; - class Player : public MovingObject, public Scripting::Player, public ScriptInterface { public: - enum HurtMode { KILL, SHRINK }; enum FallMode { ON_GROUND, JUMPING, TRAMPOLINE_JUMP, FALLING }; Controller* controller; @@ -110,7 +95,9 @@ private: bool dying; bool backflipping; int backflip_direction; - + Direction peeking; + bool swimming; + public: Direction dir; Direction old_dir; @@ -133,18 +120,23 @@ public: Timer idle_timer; Timer backflip_timer; Physic physic; - + public: - Player(PlayerStatus* player_status); + Player(PlayerStatus* player_status, const std::string& name); virtual ~Player(); - virtual void expose(HSQUIRRELVM vm, int table_idx); - virtual void unexpose(HSQUIRRELVM vm, int table_idx); + virtual void expose(HSQUIRRELVM vm, SQInteger table_idx); + virtual void unexpose(HSQUIRRELVM vm, SQInteger table_idx); - void set_controller(Controller* controller); + void set_controller(Controller* controller); + Controller* get_controller() + { + return controller; + } virtual void update(float elapsed_time); virtual void draw(DrawingContext& context); + virtual void collision_solid(const CollisionHit& hit); virtual HitResponse collision(GameObject& other, const CollisionHit& hit); virtual void collision_tile(uint32_t tile_attributes); @@ -157,14 +149,30 @@ public: { return dying; } - - void kill(HurtMode mode); + Direction peeking_direction() const + { + return peeking; + } + + void kill(bool completely); void check_bounds(Camera* camera); void move(const Vector& vector); - virtual void set_bonus(const std::string& bonus); + virtual bool add_bonus(const std::string& bonus); virtual void add_coins(int count); - void set_bonus(BonusType type, bool animate = false); + + /** + * picks up a bonus, taking care not to pick up lesser bonus items than we already have + * + * @returns true if the bonus has been set (or was already good enough) + * false if the bonus could not be set (for example no space for big tux) + */ + bool add_bonus(BonusType type, bool animate = false); + /** + * like add_bonus, but can also downgrade the bonus items carried + */ + bool set_bonus(BonusType type, bool animate = false); + PlayerStatus* get_status() { return player_status; @@ -173,10 +181,43 @@ public: void kick(); /** + * play cheer animation. + * This might need some space and behave in an unpredictable way. Best to use this at level end. + */ + void do_cheer(); + + /** + * duck down if possible. + * this won't last long as long as input is enabled. + */ + void do_duck(); + + /** + * stand back up if possible. + */ + void do_standup(); + + /** + * do a backflip if possible. + */ + void do_backflip(); + + /** + * jump in the air if possible + * sensible values for yspeed are negative - unless we want to jump into the ground of course + */ + void do_jump(float yspeed); + + /** * Adds velocity to the player (be carefull when using this) */ void add_velocity(const Vector& velocity); + /** + * Adds velocity to the player until given end speed is reached + */ + void add_velocity(const Vector& velocity, const Vector& end_speed); + void bounce(BadGuy& badguy); bool is_dead() const @@ -188,12 +229,35 @@ public: bool on_ground(); + Portable* get_grabbed_object() const + { + return grabbed_object; + } + + /** + * Switches ghost mode on/off. + * Lets Tux float around and through solid objects. + */ + void set_ghost_mode(bool enable); + + /** + * Returns whether ghost mode is currently enabled + */ + bool get_ghost_mode() { return ghost_mode; } + + /** + * Changes height of bounding box. + * Returns true if successful, false otherwise + */ + bool adjust_height(float new_height); + private: void handle_input(); + void handle_input_ghost(); /**< input handling while in ghost mode */ bool deactivated; - + void init(); - + void handle_horizontal_input(); void handle_vertical_input(); @@ -201,16 +265,26 @@ private: void deactivate(); void walk(float speed); - bool visible; + /** + * slows Tux down a little, based on where he's standing + */ + void apply_friction(); - float adjust_height; + bool visible; Portable* grabbed_object; Sprite* smalltux_gameover; Sprite* smalltux_star; Sprite* bigtux_star; + Vector floor_normal; + bool try_grab; + Direction grab_dir; + + bool ghost_mode; /**< indicates if Tux should float around and through solid objects */ + + Timer unduck_hurt_timer; /**< if Tux wants to stand up again after ducking and cannot, this timer is started */ }; #endif /*SUPERTUX_PLAYER_H*/