#pragma once

#include "Variablen.h"

class Spiel;
class Ereignis;

enum AktionTyp
{
    BARIERE_BEWEGUNG,
    BARIERE_SET_EINGESCHALTET,
    BARIERE_SET_POSITION,
    BARIERE_SET_TEAM,
    BARIERE_ZUFALL,
    BARIERE_ZULETZT_AUSGESCHALTET,
    BARIERE_ZULETZT_BEWEGT,
    BARIERE_ZULETZT_EINGESCHALTET,
    BASE_SET_POSITION,
    BASE_SET_TEAM,
    BASE_ZUFALL,
    BASE_ZULETZT_BESITZER_GEWECHSELT,
    BOOLEAN_AUS_TEXT,
    BOOLEAN_BARIERE_BEWEGT_SICH,
    BOOLEAN_BARIERE_IST_AKTIV,
    BOOLEAN_BARIERE_IST_SCHALTEND,
    BOOLEAN_BASE_IST_NEUTRAL,
    BOOLEAN_GLEICH,
    BOOLEAN_NICHT,
    BOOLEAN_ODER,
    BOOLEAN_SCHALTER_IST_AKTIV,
    BOOLEAN_SPIELER_AM_LEBEN,
    BOOLEAN_SPIELER_HAT_GEGENSTAND,
    BOOLEAN_SPIELER_IN_TEAM,
    BOOLEAN_SPIELER_IST_VERWUNDBAR,
    BOOLEAN_SPIELER_KANN_ITEM_BENUTZEN,
    BOOLEAN_SPIEL_PAUSIERT,
    BOOLEAN_TIMER_IS_RUNNING,
    BOOLEAN_TIMER_IST_SICHTBAR,
    BOOLEAN_TRIGGER_IST_AKTIV,
    BOOLEAN_TUNNEL_IST_AKTIV,
    BOOLEAN_UMLENKUNG_HAT_ABK,
    BOOLEAN_UMLENKUNG_IST_DREHEND,
    BOOLEAN_UND,
    BOOLEAN_ZUFALL,
    DISPLAY_TEXT,
    DROP_DO_DROP,
    DROP_SET_AREA,
    DROP_SET_MAX_TIME,
    DROP_SET_TIME,
    DROP_ZUFALL,
    DROP_ZULETZT_GEDROPT,
    GESCHOSS_NEU,
    GESCHOSS_SET_PLAYER,
    GESCHOSS_SET_POSITION,
    GESCHOSS_SET_RICHTUNG,
    GESCHOSS_SET_SPEED,
    GESCHOSS_SET_TYPE,
    GESCHOSS_ZUFALL,
    GESCHOSS_ZULETZT_ABGEFEUERT,
    GESCHOSS_ZULETZT_BARIERE_GETROFFEN,
    GESCHOSS_ZULETZT_GESCHOSS_GETROFFEN,
    GESCHOSS_ZULETZT_TUNNEL_BENUTZT,
    GESCHOSS_ZULETZT_UMGELENKT,
    INTEGER_AUS_TEXT,
    INTEGER_BARIERE_BREITE,
    INTEGER_BARIERE_HEIGHT,
    INTEGER_BARIERE_SCHALTUNGEN,
    INTEGER_BARIERE_VERSCHIEBUNGEN,
    INTEGER_DROP_MAX_ZEIT,
    INTEGER_DROP_ZEIT,
    INTEGER_MAX_X_VON_DROP,
    INTEGER_MAX_Y_VON_DROP,
    INTEGER_MIN_X_VON_DROP,
    INTEGER_MIN_Y_VON_DROP,
    INTEGER_RECHNEN,
    INTEGER_SCHALTER_AKTIVIERUNGEN,
    INTEGER_SPIELER_ABKLINGZEITVERRINGERUNG,
    INTEGER_SPIELER_ARMOR,
    INTEGER_SPIELER_ERFAHRUNG,
    INTEGER_SPIELER_ERLITTENER_SCHADEN,
    INTEGER_SPIELER_GEHEILTES_LEBEN,
    INTEGER_SPIELER_GESCHOSSEN,
    INTEGER_SPIELER_GESCHOSS_TEMPO,
    INTEGER_SPIELER_GETROFFEN,
    INTEGER_SPIELER_ITEMS_AUFGEHOBEN,
    INTEGER_SPIELER_ANZAHL_ITEMS_IN_INVENTAR,
    INTEGER_SPIELER_ANZAHL_ITEMS_VON_TYP,
    INTEGER_SPIELER_ITEMS_VERWENDET,
    INTEGER_SPIELER_KILLS,
    INTEGER_SPIELER_LEBEN,
    INTEGER_SPIELER_LEBENSRAUB,
    INTEGER_SPIELER_LEBENSREGENERATION,
    INTEGER_SPIELER_LEVEL,
    INTEGER_SPIELER_MAX_ERFAHRUNG,
    INTEGER_SPIELER_MAX_LEBEN,
    INTEGER_SPIELER_SCHADEN,
    INTEGER_SPIELER_SCHADEN_BONUS,
    INTEGER_SPIELER_SCHALTER_AKTIVIERT,
    INTEGER_SPIELER_TEMPO,
    INTEGER_SPIELER_TODE,
    INTEGER_SPIELER_TREFFER,
    INTEGER_SPIELER_TUNNEL_BENUTZT,
    INTEGER_TEAM_KILLS,
    INTEGER_TEAM_PUNKTE,
    INTEGER_TEAM_SPIELERANZAHL,
    INTEGER_TEAM_TODE,
    INTEGER_TEAM_WIEDERBELEBUNGSZEIT,
    INTEGER_TIMER_AKTUELLE_ZEIT,
    INTEGER_TIMER_MAX_ZEIT,
    INTEGER_TRIGGER_RUNNS,
    INTEGER_TUNNEL_BENUTZUNGEN,
    INTEGER_UMLENKUNG_BENUTZUNGEN,
    INTEGER_X_VON_BARIERE,
    INTEGER_X_VON_BASE,
    INTEGER_X_VON_GESCHOSS,
    INTEGER_X_VON_SCHALTER,
    INTEGER_X_VON_SPIELER,
    INTEGER_X_VON_TIMER,
    INTEGER_X_VON_TUNNEL,
    INTEGER_X_VON_TUNNEL_ZIEL,
    INTEGER_X_VON_UMLENKUNG,
    INTEGER_Y_VON_BARIERE,
    INTEGER_Y_VON_BASE,
    INTEGER_Y_VON_GESCHOSS,
    INTEGER_Y_VON_SCHALTER,
    INTEGER_Y_VON_SPIELER,
    INTEGER_Y_VON_TIMER,
    INTEGER_Y_VON_TUNNEL,
    INTEGER_Y_VON_TUNNEL_ZIEL,
    INTEGER_Y_VON_UMLENKUNG,
    INTEGER_ZUFALL,
    ITEM_SPIELER_INVENTAR,
    ITEM_ZULETZT_AUFGEHOBEN,
    ITEM_ZULETZT_GEDROPT,
    KONSTANT_BOOLEAN,
    KONSTANT_FLOAT,
    KONSTANT_INTEGER,
    KONSTANT_NICHTS,
    KONSTANT_STRING,
    KONSTANT_VARIABLE,
    RICHTUNG_VON_GESCHOSS,
    RICHTUNG_VON_UMLENKUNG,
    RICHTUNG_ZUFALL,
    SCHALTER_AKTIVIEREN,
    SCHALTER_SET_ERLAUBT,
    SCHALTER_SET_POSITION,
    SCHALTER_ZUFALL,
    SCHALTER_ZULETZT_AKTIVIERT,
    SET_VARIABLE,
    SPIEL_ENDE,
    SPIELER_GIVE_ITEM,
    SPIELER_NACHRICHT,
    SPIELER_REMOVE_ITEM,
    SPIELER_SET_ABKLINGZEITVERRINGERUNG,
    SPIELER_SET_ARMOR,
    SPIELER_SET_ERFAHRUNG,
    SPIELER_SET_LEBEN,
    SPIELER_SET_LEBENSRAUB,
    SPIELER_SET_LEBENSREGENERATION,
    SPIELER_SET_LEVEL,
    SPIELER_SET_MAX_ERFAHRUNG,
    SPIELER_SET_POSITION,
    SPIELER_SET_SCHADEN_BONUS,
    SPIELER_SET_TEMPO,
    SPIELER_SET_GESCHOSS_TEMPO,
    SPIELER_ZUFALL,
    SPIELER_ZUFALL_AUS_TEAM,
    SPIELER_ZULETZT_ERFAHRUNG_BEKOMMEN,
    SPIELER_ZULETZT_GEGENSTAND_AKTIVIERT,
    SPIELER_ZULETZT_GEGENSTAND_AUFGEHOBEN,
    SPIELER_ZULETZT_GEHEILT,
    SPIELER_ZULETZT_GESCHOSSEN,
    SPIELER_ZULETZT_GESTORBEN,
    SPIELER_ZULETZT_LEVEL_UP,
    SPIELER_ZULETZT_SCHADEN_GEMACHT,
    SPIELER_ZULETZT_SCHADEN_GENOMMEN,
    SPIELER_ZULETZT_SCHALTER_AKTIVIERT,
    SPIELER_ZULETZT_TUNNEL_BENUTZT,
    SPIELER_ZULETZT_WIEDERBELEBT,
    SPIEL_PAUSE,
    TEAM_SET_PUNKTE,
    TEAM_VON_BARIERE,
    TEAM_VON_SPIELER,
    TEAM_ZUFALL,
    TEXT_AUS_BOOLEAN,
    TEXT_AUS_RICHTUNG,
    TEXT_AUS_ZAHL,
    TEXT_CONCAT,
    TEXT_ITEM_NAME,
    TEXT_SPIELER_NAME,
    TEXT_TEIL_VON_TEXT,
    TEXT_TRIGGER_NAME,
    TIMER_SET_PAUSE,
    TIMER_SET_POSITION,
    TIMER_SET_SICHTBAR,
    TIMER_SET_ZEIT,
    TIMER_START,
    TIMER_ZUFALL,
    TIMER_ZULETZT_ABGELAUFEN,
    TIMER_ZULETZT_FOTOGRAFIERT,
    TIMER_ZULETZT_GESTARTET,
    TIMER_ZULETZT_PAUSIERT,
    TRIGGER_AKTION,
    TRIGGER_LAST_RUNNED,
    TRIGGER_RUN_START,
    TRIGGER_SET_ENABLED,
    TRIGGER_ZUFALL,
    TUNNEL_SET_ERLAUBT,
    TUNNEL_SET_POSITION,
    TUNNEL_SET_ZIEL_POSITION,
    TUNNEL_ZUFALL,
    TUNNEL_ZULETZT_BENUTZT,
    UMLENKUNG_SET_ERLAUBT,
    UMLENKUNG_SET_MAX_ABK,
    UMLENKUNG_SET_POSITION,
    UMLENKUNG_SET_RICHTUNG,
    UMLENKUNG_ZUFALL,
    UMLENKUNG_ZULETZT_BENUTZT,
    WARTEN,
    WENN_DANN_SONST
};

class Aktion
{
private:
    AktionTyp typ;
    int ref;

public:
    Aktion( AktionTyp typ );
    virtual ~Aktion();
    virtual Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) = 0;
    Aktion *getThis();
    Aktion *release();
};

class KonstantNichts : public Aktion
{
public:
    KonstantNichts();
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class KonstantInteger : public Aktion
{
private:
    int value;

public:
    KonstantInteger( int val );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class KonstantBoolean : public Aktion
{
private:
    bool value;

public:
    KonstantBoolean( bool val );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class KonstantString : public Aktion
{
private:
    Text value;

public:
    KonstantString( Text val );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class KonstantFloat : public Aktion
{
private:
    float value;

public:
    KonstantFloat( float val );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class KonstantVariable : public Aktion
{
private:
    Text name;

public:
    KonstantVariable( Text name );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class Warten : public Aktion
{
private:
    Aktion *seconds;

public:
    Warten( Aktion *seconds );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class SetVariable : public Aktion
{
private:
    Text name;
    Aktion *value;

public:
    SetVariable( Text name, Aktion *value );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class WennDannSonst : public Aktion
{
private:
    Aktion *condition;
    Aktion *wahr;
    Aktion *falsch;

public:
    WennDannSonst( Aktion *condition, Aktion *wahr, Aktion *falsch );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class TriggerAktion : public Aktion
{
private:
    Aktion *number;
    Aktion *trigger;

public:
    TriggerAktion( Aktion *number, Aktion *triggerName );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class SpielerNachricht : public Aktion
{
private:
    Aktion *spieler;
    Aktion *nachricht;

public:
    SpielerNachricht( Aktion *spieler, Aktion *nachricht );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class DisplayText : public Aktion
{
private:
    Aktion *x;
    Aktion *y;
    Aktion *color;
    Aktion *dauer;
    Aktion *nachricht;

public:
    DisplayText( Aktion *x, Aktion *y, Aktion *f, Aktion *dauer, Aktion *nachricht );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class SpielPause : public Aktion
{
private:
    Aktion *paused;

public:
    SpielPause( Aktion *paused );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class SpielEnde : public Aktion
{
private:
    Aktion *gewinnerTeam;

public:
    SpielEnde( Aktion *gewinnerTeam );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class SpielerSetLevel : public Aktion
{
private:
    Aktion *level;
    Aktion *spieler;

public:
    SpielerSetLevel( Aktion *level, Aktion *spieler );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class SpielerGiveItem : public Aktion
{
private:
    Aktion *item;
    Aktion *anzahl;
    Aktion *spieler;

public:
    SpielerGiveItem( Aktion *item, Aktion *anzahl, Aktion *spieler );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class SpielerRemoveItem : public Aktion
{
private:
    Aktion *item;
    Aktion *anzahl;
    Aktion *spieler;

public:
    SpielerRemoveItem( Aktion *item, Aktion *anzahl, Aktion *spieler );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class SpielerSetPosition : public Aktion
{
private:
    Aktion *x;
    Aktion *y;
    Aktion *spieler;

public:
    SpielerSetPosition( Aktion *x, Aktion *y, Aktion *spieler );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class SpielerSetLeben : public Aktion
{
private:
    Aktion *leben;
    Aktion *spieler;

public:
    SpielerSetLeben( Aktion *leben, Aktion *spieler );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class SpielerSetMaxLeben : public Aktion
{
private:
    Aktion *leben;
    Aktion *spieler;

public:
    SpielerSetMaxLeben( Aktion *leben, Aktion *spieler );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class SpielerSetErfahrung : public Aktion
{
private:
    Aktion *erfahrung;
    Aktion *spieler;

public:
    SpielerSetErfahrung( Aktion *erfahrung, Aktion *spieler );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class SpielerSetMaxErfahrung : public Aktion
{
private:
    Aktion *erfahrung;
    Aktion *spieler;

public:
    SpielerSetMaxErfahrung( Aktion *erfahrung, Aktion *spieler );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class SpielerSetTempo : public Aktion
{
private:
    Aktion *tempo;
    Aktion *spieler;

public:
    SpielerSetTempo( Aktion *tempo, Aktion *spieler );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class SpielerSetWaffenTempo : public Aktion
{
private:
    Aktion *tempo;
    Aktion *spieler;

public:
    SpielerSetWaffenTempo( Aktion *tempo, Aktion *spieler );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class SpielerSetArmor : public Aktion
{
private:
    Aktion *armor;
    Aktion *spieler;

public:
    SpielerSetArmor( Aktion *armor, Aktion *spieler );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class SpielerSetSchadenBonus : public Aktion
{
private:
    Aktion *bonus;
    Aktion *spieler;

public:
    SpielerSetSchadenBonus( Aktion *bonus, Aktion *spieler );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class SpielerSetLebensraub : public Aktion
{
private:
    Aktion *lebensraub;
    Aktion *spieler;

public:
    SpielerSetLebensraub( Aktion *lebensraub, Aktion *spieler );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class SpielerSetLebensregeneration : public Aktion
{
private:
    Aktion *regeneration;
    Aktion *spieler;

public:
    SpielerSetLebensregeneration( Aktion *regeneration, Aktion *spieler );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class SpielerSetAbklingzeitverringerung : public Aktion
{
private:
    Aktion *verringerung;
    Aktion *spieler;

public:
    SpielerSetAbklingzeitverringerung( Aktion *verringerung, Aktion *spieler );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class DropSetTime : public Aktion
{
private:
    Aktion *time;
    Aktion *drop;

public:
    DropSetTime( Aktion *time, Aktion *drop );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class DropSetMaxTime : public Aktion
{
private:
    Aktion *time;
    Aktion *drop;

public:
    DropSetMaxTime( Aktion *time, Aktion *drop );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class DropSetArea : public Aktion
{
private:
    Aktion *minX;
    Aktion *maxX;
    Aktion *minY;
    Aktion *maxY;
    Aktion *drop;

public:
    DropSetArea( Aktion *minX, Aktion *maxX, Aktion *minY, Aktion *maxY, Aktion *drop );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class DropDoDrop : public Aktion
{
private:
    Aktion *drop;

public:
    DropDoDrop( Aktion *drop );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class BariereBewegung : public Aktion
{
private:
    Aktion *bariere;

public:
    BariereBewegung( Aktion *bariere );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class BariereSetEingeschaltet : public Aktion
{
private:
    Aktion *eingeschaltet;
    Aktion *bariere;

public:
    BariereSetEingeschaltet( Aktion *eingeschaltet, Aktion *bariere );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class BariereSetPosition : public Aktion
{
private:
    Aktion *x;
    Aktion *y;
    Aktion *bariere;

public:
    BariereSetPosition( Aktion *x, Aktion *y, Aktion *bariere );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class BariereSetTeam : public Aktion
{
private:
    Aktion *team;
    Aktion *bariere;

public:
    BariereSetTeam( Aktion *team, Aktion *bariere );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class SchalterSetPosition : public Aktion
{
private:
    Aktion *x;
    Aktion *y;
    Aktion *schalter;

public:
    SchalterSetPosition( Aktion *x, Aktion *y, Aktion *schalter );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class SchalterSetErlaubt : public Aktion
{
private:
    Aktion *erlaubt;
    Aktion *schalter;

public:
    SchalterSetErlaubt( Aktion *erlaubt, Aktion *schalter );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class SchalterAktivieren : public Aktion
{
private:
    Aktion *schalter;

public:
    SchalterAktivieren( Aktion *schalter );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class TunnelSetPosition : public Aktion
{
private:
    Aktion *x;
    Aktion *y;
    Aktion *tunnel;

public:
    TunnelSetPosition( Aktion *x, Aktion *y, Aktion *tunnel );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class TunnelSetZielPosition : public Aktion
{
private:
    Aktion *x;
    Aktion *y;
    Aktion *tunnel;

public:
    TunnelSetZielPosition( Aktion *x, Aktion *y, Aktion *tunnel );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class TunnelSetErlaubt : public Aktion
{
private:
    Aktion *erlaubt;
    Aktion *tunnel;

public:
    TunnelSetErlaubt( Aktion *erlaubt, Aktion *tunnel );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class UmlenkungSetPosition : public Aktion
{
private:
    Aktion *x;
    Aktion *y;
    Aktion *umlenkung;

public:
    UmlenkungSetPosition( Aktion *x, Aktion *y, Aktion *umlenkung );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class UmlenkungSetRichtung : public Aktion
{
private:
    Aktion *richtung;
    Aktion *umlenkung;

public:
    UmlenkungSetRichtung( Aktion *richtung, Aktion *umlenkung );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class UmlenkungSetMaxAbk : public Aktion
{
private:
    Aktion *abk;
    Aktion *umlenkung;

public:
    UmlenkungSetMaxAbk( Aktion *abk, Aktion *umlenkung );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class UmlenkungSetEnabled : public Aktion
{
private:
    Aktion *enabled;
    Aktion *umlenkung;

public:
    UmlenkungSetEnabled( Aktion *enabled, Aktion *umlenkung );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class BaseSetPosition : public Aktion
{
private:
    Aktion *x;
    Aktion *y;
    Aktion *base;

public:
    BaseSetPosition( Aktion *x, Aktion *y, Aktion *base );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class BaseSetTeam : public Aktion
{
private:
    Aktion *team;
    Aktion *base;

public:
    BaseSetTeam( Aktion *team, Aktion *base );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class TriggerRunStart : public Aktion
{
private:
    Aktion *trigger;

public:
    TriggerRunStart( Aktion *base );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class TriggerSetEnabled : public Aktion
{
private:
    Aktion *enabled;
    Aktion *trigger;

public:
    TriggerSetEnabled( Aktion *enabled, Aktion *trigger );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class TeamSetPunkte : public Aktion
{
private:
    Aktion *punkte;
    Aktion *team;

public:
    TeamSetPunkte( Aktion *punkte, Aktion *team );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class TimerSetPosition : public Aktion
{
private:
    Aktion *x;
    Aktion *y;
    Aktion *timer;

public:
    TimerSetPosition( Aktion *x, Aktion *y, Aktion *timer );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class TimerSetPause : public Aktion
{
private:
    Aktion *pause;
    Aktion *timer;

public:
    TimerSetPause( Aktion *pause, Aktion *timer );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class TimerStart : public Aktion
{
private:
    Aktion *timer;

public:
    TimerStart( Aktion *timer );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class TimerSetZeit : public Aktion
{
private:
    Aktion *zeit;
    Aktion *timer;

public:
    TimerSetZeit( Aktion *zeit, Aktion *timer );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class TimerSetSichtbar : public Aktion
{
private:
    Aktion *sichtbar;
    Aktion *timer;

public:
    TimerSetSichtbar( Aktion *sichtbar, Aktion *timer );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class GeschossNeu : public Aktion
{
private:
    Aktion *x;
    Aktion *y;
    Aktion *typ;
    Aktion *richtung;

public:
    GeschossNeu( Aktion *x, Aktion *y, Aktion *typ, Aktion *richtung );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class GeschossSetPosition : public Aktion
{
private:
    Aktion *x;
    Aktion *y;
    Aktion *geschoss;

public:
    GeschossSetPosition( Aktion *x, Aktion *y, Aktion *geschoss );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class GeschossSetSpeed : public Aktion
{
private:
    Aktion *speed;
    Aktion *geschoss;

public:
    GeschossSetSpeed( Aktion *speed, Aktion *geschoss );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class GeschossSetPlayer : public Aktion
{
private:
    Aktion *player;
    Aktion *geschoss;

public:
    GeschossSetPlayer( Aktion *player, Aktion *geschoss );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class GeschossSetRichtung : public Aktion
{
private:
    Aktion *richtung;
    Aktion *geschoss;

public:
    GeschossSetRichtung( Aktion *richtung, Aktion *geschoss );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class GeschossSetType : public Aktion
{
private:
    Aktion *type;
    Aktion *geschoss;

public:
    GeschossSetType( Aktion *type, Aktion *geschoss );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class TriggerZufall : public Aktion
{
public:
    TriggerZufall();
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class TriggerLastRunned : public Aktion
{
public:
    TriggerLastRunned();
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class BariereZufall : public Aktion
{
public:
    BariereZufall();
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class BariereZuletztEingeschaltet : public Aktion
{
public:
    BariereZuletztEingeschaltet();
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class BariereZuletztAusgeschaltet : public Aktion
{
public:
    BariereZuletztAusgeschaltet();
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class BariereZuletztBewegt : public Aktion
{
public:
    BariereZuletztBewegt();
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class BaseZufall : public Aktion
{
public:
    BaseZufall();
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class BaseZuletztBesitzerGewechselt : public Aktion
{
public:
    BaseZuletztBesitzerGewechselt();
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class DropZufall : public Aktion
{
public:
    DropZufall();
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class DropZuletztGedropt : public Aktion
{
public:
    DropZuletztGedropt();
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class IntegerRechnen : public Aktion
{
private:
    Aktion *left;
    Aktion *right;
    char op;

public:
    IntegerRechnen( Aktion *left, Aktion *right, char op );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class IntegerZufall : public Aktion
{
private:
    Aktion *min;
    Aktion *max;

public:
    IntegerZufall( Aktion *min, Aktion *max );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class IntegerAusText : public Aktion
{
private:
    Aktion *text;

public:
    IntegerAusText( Aktion *text );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class IntegerXVonSpieler : public Aktion
{
private:
    Aktion *spieler;

public:
    IntegerXVonSpieler( Aktion *spieler );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class IntegerYVonSpieler : public Aktion
{
private:
    Aktion *spieler;

public:
    IntegerYVonSpieler( Aktion *spieler );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class IntegerXVonBariere : public Aktion
{
private:
    Aktion *bariere;

public:
    IntegerXVonBariere( Aktion *bariere );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class IntegerYVonBariere : public Aktion
{
private:
    Aktion *bariere;

public:
    IntegerYVonBariere( Aktion *bariere );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class IntegerXVonSchalter : public Aktion
{
private:
    Aktion *schalter;

public:
    IntegerXVonSchalter( Aktion *schalter );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class IntegerYVonSchalter : public Aktion
{
private:
    Aktion *schalter;

public:
    IntegerYVonSchalter( Aktion *schalter );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class IntegerXVonTunnel : public Aktion
{
private:
    Aktion *tunnel;

public:
    IntegerXVonTunnel( Aktion *tunnel );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class IntegerYVonTunnel : public Aktion
{
private:
    Aktion *tunnel;

public:
    IntegerYVonTunnel( Aktion *tunnel );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class IntegerXVonTunnelZiel : public Aktion
{
private:
    Aktion *tunnel;

public:
    IntegerXVonTunnelZiel( Aktion *tunnel );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class IntegerYVonTunnelZiel : public Aktion
{
private:
    Aktion *tunnel;

public:
    IntegerYVonTunnelZiel( Aktion *tunnel );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class IntegerXVonUmlenkung : public Aktion
{
private:
    Aktion *umlenkung;

public:
    IntegerXVonUmlenkung( Aktion *umlenkung );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class IntegerYVonUmlenkung : public Aktion
{
private:
    Aktion *umlenkung;

public:
    IntegerYVonUmlenkung( Aktion *umlenkung );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class IntegerMinXVonDrop : public Aktion
{
private:
    Aktion *drop;

public:
    IntegerMinXVonDrop( Aktion *drop );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class IntegerMinYVonDrop : public Aktion
{
private:
    Aktion *drop;

public:
    IntegerMinYVonDrop( Aktion *drop );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class IntegerMaxXVonDrop : public Aktion
{
private:
    Aktion *drop;

public:
    IntegerMaxXVonDrop( Aktion *drop );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class IntegerMaxYVonDrop : public Aktion
{
private:
    Aktion *drop;

public:
    IntegerMaxYVonDrop( Aktion *drop );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class IntegerXVonBase : public Aktion
{
private:
    Aktion *base;

public:
    IntegerXVonBase( Aktion *base );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class IntegerYVonBase : public Aktion
{
private:
    Aktion *base;

public:
    IntegerYVonBase( Aktion *base );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class IntegerXVonTimer : public Aktion
{
private:
    Aktion *timer;

public:
    IntegerXVonTimer( Aktion *timer );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class IntegerYVonTimer : public Aktion
{
private:
    Aktion *timer;

public:
    IntegerYVonTimer( Aktion *timer );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class IntegerXVonGeschoss : public Aktion
{
private:
    Aktion *geschoss;

public:
    IntegerXVonGeschoss( Aktion *geschoss );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class IntegerYVonGeschoss : public Aktion
{
private:
    Aktion *geschoss;

public:
    IntegerYVonGeschoss( Aktion *geschoss );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class IntegerSpielerLevel : public Aktion
{
private:
    Aktion *spieler;

public:
    IntegerSpielerLevel( Aktion *spieler );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class IntegerSpielerLeben : public Aktion
{
private:
    Aktion *spieler;

public:
    IntegerSpielerLeben( Aktion *spieler );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class IntegerSpielerMaxLeben : public Aktion
{
private:
    Aktion *spieler;

public:
    IntegerSpielerMaxLeben( Aktion *spieler );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class IntegerSpielerErfahrung : public Aktion
{
private:
    Aktion *spieler;

public:
    IntegerSpielerErfahrung( Aktion *spieler );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class IntegerSpielerMaxErfahrung : public Aktion
{
private:
    Aktion *spieler;

public:
    IntegerSpielerMaxErfahrung( Aktion *spieler );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class IntegerSpielerTempo : public Aktion
{
private:
    Aktion *spieler;

public:
    IntegerSpielerTempo( Aktion *spieler );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class IntegerSpielerGeschossTempo : public Aktion
{
private:
    Aktion *spieler;

public:
    IntegerSpielerGeschossTempo( Aktion *spieler );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class IntegerSpielerArmor : public Aktion
{
private:
    Aktion *spieler;

public:
    IntegerSpielerArmor( Aktion *spieler );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class IntegerSpielerSchadenBonus : public Aktion
{
private:
    Aktion *spieler;

public:
    IntegerSpielerSchadenBonus( Aktion *spieler );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class IntegerSpielerLebensraub : public Aktion
{
private:
    Aktion *spieler;

public:
    IntegerSpielerLebensraub( Aktion *spieler );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class IntegerSpielerLebensregeneration : public Aktion
{
private:
    Aktion *spieler;

public:
    IntegerSpielerLebensregeneration( Aktion *spieler );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class IntegerSpielerAbklingzeitverringerrung : public Aktion
{
private:
    Aktion *spieler;

public:
    IntegerSpielerAbklingzeitverringerrung( Aktion *spieler );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class IntegerSpielerTode : public Aktion
{
private:
    Aktion *spieler;

public:
    IntegerSpielerTode( Aktion *spieler );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class IntegerSpielerKills : public Aktion
{
private:
    Aktion *spieler;

public:
    IntegerSpielerKills( Aktion *spieler );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class IntegerSpielerTreffer : public Aktion
{
private:
    Aktion *spieler;

public:
    IntegerSpielerTreffer( Aktion *spieler );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class IntegerSpielerGetroffen : public Aktion
{
private:
    Aktion *spieler;

public:
    IntegerSpielerGetroffen( Aktion *spieler );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class IntegerSpielerErlittenerSchaden : public Aktion
{
private:
    Aktion *spieler;

public:
    IntegerSpielerErlittenerSchaden( Aktion *spieler );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class IntegerSpielerSchaden : public Aktion
{
private:
    Aktion *spieler;

public:
    IntegerSpielerSchaden( Aktion *spieler );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class IntegerSpielerGeheiltesLeben : public Aktion
{
private:
    Aktion *spieler;

public:
    IntegerSpielerGeheiltesLeben( Aktion *spieler );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class IntegerSpielerItemsAufgehoben : public Aktion
{
private:
    Aktion *spieler;

public:
    IntegerSpielerItemsAufgehoben( Aktion *spieler );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class IntegerSpielerItemsVerwendet : public Aktion
{
private:
    Aktion *spieler;

public:
    IntegerSpielerItemsVerwendet( Aktion *spieler );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class IntegerSpielerItemsInInventar : public Aktion
{
private:
    Aktion *spieler;

public:
    IntegerSpielerItemsInInventar( Aktion *spieler );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class IntegerSpielerItemsTypeInInventar : public Aktion
{
private:
    Aktion *spieler;
    Aktion *item;

public:
    IntegerSpielerItemsTypeInInventar( Aktion *item, Aktion *spieler );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class IntegerSpielerTunnelBenutzt : public Aktion
{
private:
    Aktion *spieler;

public:
    IntegerSpielerTunnelBenutzt( Aktion *spieler );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class IntegerSpielerSchalterAktiviert : public Aktion
{
private:
    Aktion *spieler;

public:
    IntegerSpielerSchalterAktiviert( Aktion *spieler );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class IntegerSpielerGeschossen : public Aktion
{
private:
    Aktion *spieler;

public:
    IntegerSpielerGeschossen( Aktion *spieler );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class IntegerDropZeit : public Aktion
{
private:
    Aktion *drop;

public:
    IntegerDropZeit( Aktion *drop );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class IntegerDropMaxZeit : public Aktion
{
private:
    Aktion *drop;

public:
    IntegerDropMaxZeit( Aktion *drop );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class IntegerBariereBreite : public Aktion
{
private:
    Aktion *bariere;

public:
    IntegerBariereBreite( Aktion *bariere );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class IntegerBariereHeight : public Aktion
{
private:
    Aktion *bariere;

public:
    IntegerBariereHeight( Aktion *bariere );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class IntegerBariereVerschiebungen : public Aktion
{
private:
    Aktion *bariere;

public:
    IntegerBariereVerschiebungen( Aktion *bariere );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class IntegerBariereSchaltungen : public Aktion
{
private:
    Aktion *bariere;

public:
    IntegerBariereSchaltungen( Aktion *bariere );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class IntegerSchalterAktivierungen : public Aktion
{
private:
    Aktion *schalter;

public:
    IntegerSchalterAktivierungen( Aktion *schalter );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class IntegerTunnelBenutzungen : public Aktion
{
private:
    Aktion *tunnel;

public:
    IntegerTunnelBenutzungen( Aktion *tunnel );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class IntegerUmlenkungBenutzungen : public Aktion
{
private:
    Aktion *umlenkung;

public:
    IntegerUmlenkungBenutzungen( Aktion *umlenkung );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class IntegerTeamPunkte : public Aktion
{
private:
    Aktion *team;

public:
    IntegerTeamPunkte( Aktion *team );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class IntegerTeamKills : public Aktion
{
private:
    Aktion *team;

public:
    IntegerTeamKills( Aktion *team );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class IntegerTeamTode : public Aktion
{
private:
    Aktion *team;

public:
    IntegerTeamTode( Aktion *team );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class IntegerTeamWiederbelegungszeit : public Aktion
{
private:
    Aktion *team;

public:
    IntegerTeamWiederbelegungszeit( Aktion *team );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class IntegerTeamSpieleranzahl : public Aktion
{
private:
    Aktion *team;

public:
    IntegerTeamSpieleranzahl( Aktion *team );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class IntegerTimerAktuelleZeit : public Aktion
{
private:
    Aktion *timer;

public:
    IntegerTimerAktuelleZeit( Aktion *timer );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class IntegerTimerMaxZeit : public Aktion
{
private:
    Aktion *timer;

public:
    IntegerTimerMaxZeit( Aktion *timer );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class IntegerTriggerRunns : public Aktion
{
private:
    Aktion *trigger;

public:
    IntegerTriggerRunns( Aktion *trigger );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class ItemSpielerInventar : public Aktion
{
private:
    Aktion *spieler;
    Aktion *index;

public:
    ItemSpielerInventar( Aktion *index, Aktion *spieler );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class ItemZuletztAufgehoben : public Aktion
{
public:
    ItemZuletztAufgehoben();
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class ItemZuletztAktiviert : public Aktion
{
public:
    ItemZuletztAktiviert();
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class ItemZuletztGedropt : public Aktion
{
public:
    ItemZuletztGedropt();
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class ItemZufall : public Aktion
{
public:
    ItemZufall();
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class GeschossZufall : public Aktion
{
public:
    GeschossZufall();
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class GeschossZuletztAbgefeuert : public Aktion
{
public:
    GeschossZuletztAbgefeuert();
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class GeschossZuletztUmgelenkt : public Aktion
{
public:
    GeschossZuletztUmgelenkt();
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class GeschossZuletztBarjereGetroffen : public Aktion
{
public:
    GeschossZuletztBarjereGetroffen();
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class GeschossZuletztTunnelBenutzt : public Aktion
{
public:
    GeschossZuletztTunnelBenutzt();
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class GeschossZuletztGeschossGetroffen : public Aktion
{
public:
    GeschossZuletztGeschossGetroffen();
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class RichtungZufall : public Aktion
{
public:
    RichtungZufall();
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class RichtungVonUmlenkung : public Aktion
{
private:
    Aktion *umlenkung;

public:
    RichtungVonUmlenkung( Aktion *umlenkung );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class RichtungVonGeschoss : public Aktion
{
private:
    Aktion *geschoss;

public:
    RichtungVonGeschoss( Aktion *geschoss );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class SchalterZufall : public Aktion
{
public:
    SchalterZufall();
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class SchalterZuletztAktiviert : public Aktion
{
public:
    SchalterZuletztAktiviert();
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class SpielerZufall : public Aktion
{
public:
    SpielerZufall();
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class SpielerZufallAusTeam : public Aktion
{
private:
    Aktion *team;

public:
    SpielerZufallAusTeam( Aktion *team );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class SpielerZuletztSchadenGemacht : public Aktion
{
public:
    SpielerZuletztSchadenGemacht();
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class SpielerZuletztSchadenGenommen : public Aktion
{
public:
    SpielerZuletztSchadenGenommen();
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class SpielerZuletztGeheilt : public Aktion
{
public:
    SpielerZuletztGeheilt();
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class SpielerZuletztLevelUp : public Aktion
{
public:
    SpielerZuletztLevelUp();
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class SpielerZuletztErfahrungBekommen : public Aktion
{
public:
    SpielerZuletztErfahrungBekommen();
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class SpielerZuletztGegenstandAktiviert : public Aktion
{
public:
    SpielerZuletztGegenstandAktiviert();
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class SpielerZuletztGegenstandAufgehoben : public Aktion
{
public:
    SpielerZuletztGegenstandAufgehoben();
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class SpielerZuletztSchalterAktiviert : public Aktion
{
public:
    SpielerZuletztSchalterAktiviert();
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class SpielerZuletztTunnelBenutzt : public Aktion
{
public:
    SpielerZuletztTunnelBenutzt();
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class SpielerZuletztGestorben : public Aktion
{
public:
    SpielerZuletztGestorben();
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class SpielerZuletztWiederbelebent : public Aktion
{
public:
    SpielerZuletztWiederbelebent();
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class SpielerZuletztGeschossGeschossen : public Aktion
{
public:
    SpielerZuletztGeschossGeschossen();
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class TextConcat : public Aktion
{
private:
    Aktion *t1;
    Aktion *t2;

public:
    TextConcat( Aktion *t1, Aktion *t2 );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class TextAusZahl : public Aktion
{
private:
    Aktion *zahl;

public:
    TextAusZahl( Aktion *zahl );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class TextAusRichtung : public Aktion
{
private:
    Aktion *richtung;

public:
    TextAusRichtung( Aktion *richtung );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class TextAusBoolean : public Aktion
{
private:
    Aktion *boolean;

public:
    TextAusBoolean( Aktion *boolean );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class TextSpielerName : public Aktion
{
private:
    Aktion *spieler;

public:
    TextSpielerName( Aktion *spieler );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class TextItemName : public Aktion
{
private:
    Aktion *item;

public:
    TextItemName( Aktion *item );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class TextTriggerName : public Aktion
{
private:
    Aktion *trigger;

public:
    TextTriggerName( Aktion *trigger );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class TextTeilVonText : public Aktion
{
private:
    Aktion *start;
    Aktion *ende;
    Aktion *text;

public:
    TextTeilVonText( Aktion *start, Aktion *ende, Aktion *text );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class TeamZufall : public Aktion
{
public:
    TeamZufall();
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class TeamVonSpieler : public Aktion
{
private:
    Aktion *spieler;

public:
    TeamVonSpieler( Aktion *spieler );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class TeamVonBariere : public Aktion
{
private:
    Aktion *bariere;

public:
    TeamVonBariere( Aktion *bariere );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class TimerZufall : public Aktion
{
public:
    TimerZufall();
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class TimerZuletztAbgelaufen : public Aktion
{
public:
    TimerZuletztAbgelaufen();
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class TimerZuletztGestartet : public Aktion
{
public:
    TimerZuletztGestartet();
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class TimerZuletztPausiert : public Aktion
{
public:
    TimerZuletztPausiert();
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class TimerZuletztFortgesetzt : public Aktion
{
public:
    TimerZuletztFortgesetzt();
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class TunnelZufall : public Aktion
{
public:
    TunnelZufall();
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class TunnelZuletztBenutzt : public Aktion
{
public:
    TunnelZuletztBenutzt();
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class UmlenkungZufall : public Aktion
{
public:
    UmlenkungZufall();
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class UmlenkungZuletztBenutzt : public Aktion
{
public:
    UmlenkungZuletztBenutzt();
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class BooleanZufall : public Aktion
{
public:
    BooleanZufall();
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class BooleanSpielPausiert : public Aktion
{
public:
    BooleanSpielPausiert();
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class BooleanSpielerAmLeben : public Aktion
{
private:
    Aktion *spieler;

public:
    BooleanSpielerAmLeben( Aktion *spieler );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class BooleanSpielerHatGegenstand : public Aktion
{
private:
    Aktion *spieler;
    Aktion *item;

public:
    BooleanSpielerHatGegenstand( Aktion *item, Aktion *spieler );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class BooleanSpielerInTeam : public Aktion
{
private:
    Aktion *spieler;
    Aktion *team;

public:
    BooleanSpielerInTeam( Aktion *team, Aktion *spieler );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class BooleanSpielerIstVerwundbar : public Aktion
{
private:
    Aktion *spieler;

public:
    BooleanSpielerIstVerwundbar( Aktion *spieler );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class BooleanSpielerKannItemBenutzen : public Aktion
{
private:
    Aktion *spieler;
    Aktion *item;

public:
    BooleanSpielerKannItemBenutzen( Aktion *item, Aktion *spieler );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class BooleanUmlenkungHatAbk : public Aktion
{
private:
    Aktion *umlenkung;

public:
    BooleanUmlenkungHatAbk( Aktion *umlenkung );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class BooleanUmlenkungIstDrehend : public Aktion
{
private:
    Aktion *umlenkung;

public:
    BooleanUmlenkungIstDrehend( Aktion *umlenkung );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class BooleanBariereBewegtSich : public Aktion
{
private:
    Aktion *bariere;

public:
    BooleanBariereBewegtSich( Aktion *bariere );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class BooleanBariereIstSchaltend : public Aktion
{
private:
    Aktion *bariere;

public:
    BooleanBariereIstSchaltend( Aktion *bariere );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class BooleanBariereIstAktiv : public Aktion
{
private:
    Aktion *bariere;

public:
    BooleanBariereIstAktiv( Aktion *bariere );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class BooleanSchalterIstAktiv : public Aktion
{
private:
    Aktion *schalter;

public:
    BooleanSchalterIstAktiv( Aktion *schalter );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class BooleanTunnelIstAktiv : public Aktion
{
private:
    Aktion *tunnel;

public:
    BooleanTunnelIstAktiv( Aktion *tunnel );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class BooleanBaseIstNeutral : public Aktion
{
private:
    Aktion *base;

public:
    BooleanBaseIstNeutral( Aktion *base );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class BooleanTimerIsRunning : public Aktion
{
private:
    Aktion *timer;

public:
    BooleanTimerIsRunning( Aktion *timer );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class BooleanTimerIstSichtbar : public Aktion
{
private:
    Aktion *timer;

public:
    BooleanTimerIstSichtbar( Aktion *timer );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class BooleanAusText : public Aktion
{
private:
    Aktion *text;

public:
    BooleanAusText( Aktion *text );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class BooleanTriggerIstAktiv : public Aktion
{
private:
    Aktion *trigger;

public:
    BooleanTriggerIstAktiv( Aktion *trigger );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class BooleanGleich : public Aktion
{
private:
    Aktion *v1;
    Aktion *v2;

public:
    BooleanGleich( Aktion *v1, Aktion *v2 );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class BooleanNicht : public Aktion
{
private:
    Aktion *boolean;

public:
    BooleanNicht( Aktion *boolean );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class BooleanUnd : public Aktion
{
private:
    Aktion *v1;
    Aktion *v2;

public:
    BooleanUnd( Aktion *v1, Aktion *v2 );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};

class BooleanOder : public Aktion
{
private:
    Aktion *v1;
    Aktion *v2;

public:
    BooleanOder( Aktion *v1, Aktion *v2 );
    Variable *run( Spiel *zSpiel, Ereignis *zEreignis, double &waitCount ) override;
};