2 // Copyright (C) 2006 Matthias Braun <matze@braunis.de>
4 // This program is free software: you can redistribute it and/or modify
5 // it under the terms of the GNU General Public License as published by
6 // the Free Software Foundation, either version 3 of the License, or
7 // (at your option) any later version.
9 // This program is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 // GNU General Public License for more details.
14 // You should have received a copy of the GNU General Public License
15 // along with this program. If not, see <http://www.gnu.org/licenses/>.
17 #ifndef HEADER_SUPERTUX_OBJECT_PLAYER_HPP
18 #define HEADER_SUPERTUX_OBJECT_PLAYER_HPP
20 #include "scripting/player.hpp"
21 #include "sprite/sprite_ptr.hpp"
22 #include "supertux/direction.hpp"
23 #include "supertux/moving_object.hpp"
24 #include "supertux/physic.hpp"
25 #include "supertux/player_status.hpp"
26 #include "supertux/script_interface.hpp"
27 #include "supertux/timer.hpp"
38 static const float TUX_SAFE_TIME = 1.8f;
39 static const float TUX_INVINCIBLE_TIME = 14.0f;
40 static const float TUX_INVINCIBLE_TIME_WARNING = 2.0f;
41 static const float GROWING_TIME = 0.35f;
42 static const int GROWING_FRAMES = 7;
43 static const float TUX_BACKFLIP_TIME = 2.1f; // minimum air time that backflip results in a loss of control
48 class Player : public MovingObject,
49 public scripting::Player,
50 public ScriptInterface
53 enum FallMode { ON_GROUND, JUMPING, TRAMPOLINE_JUMP, FALLING };
54 //Tux can only go this fast. If set to 0 no special limit is used, only the default limits.
55 void set_speedlimit(float newlimit);
56 float get_speedlimit();
59 Player(PlayerStatus* player_status, const std::string& name);
62 virtual void expose(HSQUIRRELVM vm, SQInteger table_idx);
63 virtual void unexpose(HSQUIRRELVM vm, SQInteger table_idx);
65 void set_controller(Controller* controller);
67 * Level solved. Don't kill Tux any more.
75 Controller* get_controller()
80 void use_scripting_controller(bool use_or_release);
81 void do_scripting_controller(std::string control, bool pressed);
83 virtual void update(float elapsed_time);
84 virtual void draw(DrawingContext& context);
85 virtual void collision_solid(const CollisionHit& hit);
86 virtual HitResponse collision(GameObject& other, const CollisionHit& hit);
87 virtual void collision_tile(uint32_t tile_attributes);
89 void make_invincible();
90 bool is_invincible() const
92 return invincible_timer.started();
98 Direction peeking_direction_x() const
103 Direction peeking_direction_y() const
108 void kill(bool completely);
110 void move(const Vector& vector);
112 virtual bool add_bonus(const std::string& bonus);
113 virtual void add_coins(int count);
114 virtual int get_coins();
117 * picks up a bonus, taking care not to pick up lesser bonus items than we already have
119 * @returns true if the bonus has been set (or was already good enough)
120 * false if the bonus could not be set (for example no space for big tux)
122 bool add_bonus(BonusType type, bool animate = false);
124 * like add_bonus, but can also downgrade the bonus items carried
126 bool set_bonus(BonusType type, bool animate = false);
128 PlayerStatus* get_status()
130 return player_status;
132 // set kick animation
136 * play cheer animation.
137 * This might need some space and behave in an unpredictable way. Best to use this at level end.
142 * duck down if possible.
143 * this won't last long as long as input is enabled.
148 * stand back up if possible.
153 * do a backflip if possible.
158 * jump in the air if possible
159 * sensible values for yspeed are negative - unless we want to jump into the ground of course
161 void do_jump(float yspeed);
164 * Adds velocity to the player (be careful when using this)
166 void add_velocity(const Vector& velocity);
169 * Adds velocity to the player until given end speed is reached
171 void add_velocity(const Vector& velocity, const Vector& end_speed);
174 * Returns the current velocity of the player
176 Vector get_velocity();
178 void bounce(BadGuy& badguy);
184 void set_visible(bool visible);
189 Portable* get_grabbed_object() const
191 return grabbed_object;
195 grabbed_object = NULL;
199 * Switches ghost mode on/off.
200 * Lets Tux float around and through solid objects.
202 void set_ghost_mode(bool enable);
205 * Switches edit mode on/off.
206 * In edit mode, Tux will enter ghost_mode instead of dying.
208 void set_edit_mode(bool enable);
211 * Returns whether ghost mode is currently enabled
213 bool get_ghost_mode() { return ghost_mode; }
216 * Changes height of bounding box.
217 * Returns true if successful, false otherwise
219 bool adjust_height(float new_height);
222 * Orders the current GameSession to start a sequence
224 void trigger_sequence(std::string sequence_name);
227 * Requests that the player start climbing the given Climbable
229 void start_climbing(Climbable& climbable);
232 * Requests that the player stop climbing the given Climbable
234 void stop_climbing(Climbable& climbable);
236 Physic& get_physic() { return physic; }
240 void handle_input_ghost(); /**< input handling while in ghost mode */
241 void handle_input_climbing(); /**< input handling while climbing */
245 void handle_horizontal_input();
246 void handle_vertical_input();
250 void walk(float speed);
251 void set_dir(bool right);
254 void early_jump_apex();
257 * slows Tux down a little, based on where he's standing
259 void apply_friction();
264 Controller* controller;
265 std::unique_ptr<CodeController> scripting_controller; /**< This controller is used when the Player is controlled via scripting */
266 PlayerStatus* player_status;
274 int backflip_direction;
279 Controller* scripting_controller_old; /**< Saves the old controller while the scripting_controller is used */
280 bool jump_early_apex;
294 Timer jump_button_timer; /**< started when player presses the jump button; runs until Tux jumps or JUMP_GRACE_TIME runs out */
298 Timer invincible_timer;
299 Timer skidding_timer;
302 Timer shooting_timer; // used to show the arm when Tux is shooting
305 Timer backflip_timer;
311 Portable* grabbed_object;
313 SpritePtr sprite; /**< The main sprite representing Tux */
315 SurfacePtr airarrow; /**< arrow indicating Tux' position when he's above the camera */
318 void position_grabbed_object();
321 bool ghost_mode; /**< indicates if Tux should float around and through solid objects */
322 bool edit_mode; /**< indicates if Tux should switch to ghost mode rather than dying */
324 Timer unduck_hurt_timer; /**< if Tux wants to stand up again after ducking and cannot, this timer is started */
327 unsigned int idle_stage;
329 Climbable* climbing; /**< Climbable object we are currently climbing, null if none */
332 Player(const Player&);
333 Player& operator=(const Player&);
336 #endif /*SUPERTUX_PLAYER_H*/