#ifndef SUPERTUX_BADGUY_H
#define SUPERTUX_BADGUY_H
#include "SDL.h"
#include "defines.h"
#include "bitmask.h"
#include "type.h"
#include "timer.h"
#include "texture.h"
#include "physic.h"
#include "collision.h"
#include "sprite.h"
enum BadGuyKind {
BAD_MRICEBLOCK,
BAD_JUMPY,
BAD_MRBOMB,
BAD_BOMB,
BAD_STALACTITE,
BAD_FLAME,
BAD_FISH,
BAD_BOUNCINGSNOWBALL,
BAD_FLYINGSNOWBALL,
BAD_SPIKY,
BAD_SNOWBALL,
NUM_BadGuyKinds
};
BadGuyKind badguykind_from_string(const std::string& str);
std::string badguykind_to_string(BadGuyKind kind);
void load_badguy_gfx();
void free_badguy_gfx();
class Player;
class BadGuy : public GameObject
{
public:
enum BadGuyMode {
NORMAL=0,
FLAT,
KICK,
HELD,
JUMPY_JUMP,
BOMB_TICKING,
BOMB_EXPLODE,
STALACTITE_SHAKING,
STALACTITE_FALL,
FISH_WAIT,
FLY_UP,
FLY_DOWN
};
public:
DyingType dying;
BadGuyKind kind;
BadGuyMode mode;
bool stay_on_platform;
Direction dir;
private:
bool removable;
bool seen;
int squishcount;
Timer timer;
Physic physic;
Sprite* sprite_left;
Sprite* sprite_right;
int animation_offset;
public:
BadGuy(float x, float y, BadGuyKind kind, bool stay_on_platform);
void action(double frame_ratio);
void draw();
std::string type() { return "BadGuy"; };
void explode(BadGuy* badguy);
void collision(void* p_c_object, int c_object,
CollisionType type = COLLISION_NORMAL);
void kill_me(int score);
void remove_me();
bool is_removable() const { return removable; }
private:
void action_mriceblock(double frame_ratio);
void action_jumpy(double frame_ratio);
void action_bomb(double frame_ratio);
void action_mrbomb(double frame_ratio);
void action_stalactite(double frame_ratio);
void action_flame(double frame_ratio);
void action_fish(double frame_ratio);
void action_bouncingsnowball(double frame_ratio);
void action_flyingsnowball(double frame_ratio);
void action_spiky(double frame_ratio);
void action_snowball(double frame_ratio);
void fall();
void make_player_jump(Player* player);
void check_horizontal_bump(bool checkcliff = false);
void bump();
void squish(Player* player);
void squish_me(Player* player);
void set_sprite(Sprite* left, Sprite* right);
};
struct BadGuyData
{
BadGuyKind kind;
int x;
int y;
bool stay_on_platform;
BadGuyData(BadGuy* pbadguy) : kind(pbadguy->kind), x((int)pbadguy->base.x), y((int)pbadguy->base.y), stay_on_platform(pbadguy->stay_on_platform) {};
BadGuyData(BadGuyKind kind_, int x_, int y_, bool stay_on_platform_)
: kind(kind_), x(x_), y(y_), stay_on_platform(stay_on_platform_) {}
BadGuyData()
: kind(BAD_SNOWBALL), x(0), y(0), stay_on_platform(false) {}
};
#endif