#pragma once #include #include "Ereignis.h" #include "Aktionen.h" using namespace Framework; class TriggerRun; class Spiel; class VarPointer : public virtual ReferenceCounter { private: Variable *var; Text name; public: VarPointer( const char *name, Variable *var ); ~VarPointer(); Text getName() const; void setVariable( Variable *var ); Variable *getVariable() const; Variable *zVariable() const; operator Variable *( ) const; }; class LocalMemory : public virtual ReferenceCounter { private: RCArray< VarPointer > vars; public: LocalMemory(); ~LocalMemory(); void setVar( const char *name, Variable *var ); Variable *getVariable( const char *name ); Variable *zVariable( const char *name ); }; class ProgramCounter : public virtual ReferenceCounter { private: Array< int > current; int depth; public: ProgramCounter(); ~ProgramCounter(); void stepIn(); void count(); void stepOut(); Text getUniqueString() const; int currentPosition() const; }; class Bedingung : public virtual ReferenceCounter { private: Aktion *expression; public: Bedingung( Aktion *expression ); ~Bedingung(); void setExpression( Aktion *expr ); bool check( Spiel *zSpiel, Ereignis *zEreignis ); Aktion *zExpression() const; }; class Trigger : public Variable { private: int id; Text name; int ereignisAnzahl; EreignisTyp *ereignisse; RCArray< Bedingung > *bedingungen; RCArray< Aktion > *aktionen; int runCount; bool aktiv; public: Trigger( int id, const char *name, int ereignisAnzahl, EreignisTyp *ereignisse, RCArray< Bedingung > *bedingungen, RCArray< Aktion > *aktionen ); ~Trigger(); void setAktiv( bool aktiv ); bool hatEreignis( EreignisTyp typ ) const; int getAktionAnzahl() const; Aktion *zAktion( int index ) const; Aktion *getAktion( int index ) const; // return: 0, falls die bedingungen nicht erfüllt sind TriggerRun *runTrigger( Ereignis *e, Spiel *zSpiel ); int getId() const; int getRuns() const; const char *getName() const; bool istAktiv() const; }; class TriggerRun : public virtual ReferenceCounter { private: Trigger *trigger; Ereignis *ereignis; Spiel *zSpiel; LocalMemory localMem; ProgramCounter counter; int programCounter; double waitCount; public: TriggerRun( Trigger *trig, Ereignis *e, Spiel *zSpiel ); ~TriggerRun(); // gibt 0 zurück, wenn der Auslöser vollständig durchgelaufen ist bool runNext( double t ); Trigger *getTrigger() const; };