#ifndef MARIO_H #define MARIO_H #include "../sdlpp/sdlpp_rectrenderer.hpp" #include "sprites.hpp" #include "blocks.hpp" #define BIG_FLAG 0x0001 #define FIRE_FLAG 0x0002 #define STAR_FLAG 0x0004 class Mario : public MarioBlock { public: Mario(int x, int y, const std::shared_ptr &renderer); Mario(const std::shared_ptr &renderer); void walkLeft(); void walkRight(); void setStanding(); void handleVisitor(SDLPP::Visitor &visitor) override; void jump(); void stopJump(); void custom_move(int ticks) override; void visit(SDLPP::Visitor &visitor) override; bool isDead() { return _death; } void handleDeath(); void setBig(); void unsetBig(); void setStar() { setStarFlag(); } void unsetStar() { unsetStarFlag(); } bool isBig() const { return special_flags & BIG_FLAG; } bool hasFire() const { return special_flags & FIRE_FLAG; } bool hasStar() const { return special_flags & STAR_FLAG; } bool isJumping() const { return jumping; } private: void setDeath(bool dead = true) { _death = dead; } bool _death = false; bool controllable = true; bool faces_right = true; double side_movement = 0.3; double jump_movement = 1.0; bool jumping = false; bool stop_jump = false; double max_jump = 0; double min_jump = 0; double slow_jump = 0; bool on_ground = true; int ticks_till_gravity = 0; int ticks_till_vulnurable = 0; // gravity should be added every frame in 60fps game const int base_gravity_ticks = 1000 / 60; const int base_vulnurable_ticks = 1000; const double gravity_add_jumping = jump_movement / 32.0; const double gravity_add_falling = jump_movement / (64.0 / 7.0); std::shared_ptr top_collision = nullptr; void setWorldTypeSrc(LandType::Value world) override; void stopMovement(); uint8_t special_flags = 0; // SRCs const SDL_Rect *standing_src = &MARIO_STANDING_SRC; const SDL_Rect *death_src = &MARIO_DEATH_SRC; const SDL_Rect *change_dir_src = &MARIO_CHANGE_DIR_SRC; const SDL_Rect *jump_src = &MARIO_JUMP_SRC; const std::vector *walk_anim = &MARIO_WALK_ANIM; void setBigFlag() { special_flags = special_flags | BIG_FLAG; } void setFireFlag() { special_flags = special_flags | FIRE_FLAG; } void setStarFlag() { special_flags = special_flags | STAR_FLAG; } void unsetBigFlag() { special_flags = special_flags & ~BIG_FLAG; } void unsetFireFlag() { special_flags = special_flags & ~FIRE_FLAG; } void unsetStarFlag() { special_flags = special_flags & ~STAR_FLAG; } }; #endif