#pragma once
#include <Text.h>

#define BOOLEAN _BOOLEAN
#define FLOAT _FLOAT

using namespace Framework;

enum VariableTyp
{
    NICHTS,
    INTEGER,
    BOOLEAN,
    STRING,
    RICHTUNG,
    FLOAT,
    TASTE,
    SPIELER,
    TIMER,
    TEAM,
    BARIERE,
    SCHALTER,
    BASE,
    DROP,
    GEGENSTAND,
    GEGENSTAND_TYP,
    GESCHOSS,
    GESCHOSS_TYP,
    SCHIENE,
    TUNNEL,
    UMLENKUNG,
    TRIGGER,
    FEUERBALL_TREFFER,
    AKTION,
    GAME_OBJEKT,
    ALLE
};

enum GeschossTyp
{
    GESCHOSS_PFEIL,
    GESCHOSS_KUGEL,
    GESCHOSS_DRACHENAUGE,
    GESCHOSS_FEUERBALL,
    GESCHOSS_MINE
};

GeschossTyp getGeschossTypFromString( Text str );

enum Richtung
{
    OBEN,
    RECHTS,
    UNTEN,
    LINKS,
    MITTE,
    RICHTUNG_ANZAHL
};

Richtung invert( Richtung r );

Richtung getRichtungFromString( Text str );

bool operator==( VariableTyp a, VariableTyp b );
bool operator!=( VariableTyp a, VariableTyp b );

class Variable
{
private:
    VariableTyp typ;
    int ref;

public:
    Variable( VariableTyp typ );
    virtual ~Variable();
    VariableTyp getVariableTyp() const;
    Variable *getThis();
    Variable *release();
};

bool isTrue( Variable *v );

class Integer : public Variable
{
private:
    int value;

public:
    Integer( int value, bool taste = 0 );
    void setValue( int value );
    int getValue() const;
};

class Boolean : public Variable
{
private:
    bool value;

public:
    Boolean( bool value );
    void setValue( bool value );
    bool getValue() const;
};

class String : public Variable
{
private:
    Text value;

public:
    String( const char *value );
    String( Richtung r );
    String( GeschossTyp typ );
    void setValue( Text value );
    const Text &getValue() const;
};

class Float : public Variable
{
private:
    float value;

public:
    Float( float value );
    void setValue( float value );
    float getValue() const;
};