Trigger.cpp 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296
  1. #include "Trigger.h"
  2. #include "Gegenstand.h"
  3. VarPointer::VarPointer( const char* name, Variable* var )
  4. : ReferenceCounter()
  5. {
  6. this->name = name;
  7. this->var = var;
  8. }
  9. VarPointer::~VarPointer()
  10. {
  11. if( var )
  12. var->release();
  13. }
  14. Text VarPointer::getName() const
  15. {
  16. return name;
  17. }
  18. void VarPointer::setVariable( Variable* var )
  19. {
  20. if( this->var )
  21. this->var->release();
  22. this->var = var;
  23. }
  24. Variable* VarPointer::getVariable() const
  25. {
  26. return var ? dynamic_cast<Variable*>(var->getThis()) : 0;
  27. }
  28. Variable* VarPointer::zVariable() const
  29. {
  30. return var;
  31. }
  32. VarPointer::operator Variable* () const
  33. {
  34. return var;
  35. }
  36. LocalMemory::LocalMemory()
  37. : ReferenceCounter()
  38. {}
  39. LocalMemory::~LocalMemory()
  40. {}
  41. void LocalMemory::setVar( const char* name, Variable* var )
  42. {
  43. for( auto v : vars )
  44. {
  45. if( v->getName().istGleich( name ) )
  46. {
  47. v->setVariable( var );
  48. return;
  49. }
  50. }
  51. vars.add( new VarPointer( name, var ) );
  52. }
  53. Variable* LocalMemory::getVariable( const char* name )
  54. {
  55. for( auto v : vars )
  56. {
  57. if( v->getName().istGleich( name ) )
  58. return v->getVariable();
  59. }
  60. return 0;
  61. }
  62. Variable* LocalMemory::zVariable( const char* name )
  63. {
  64. for( auto v : vars )
  65. {
  66. if( v->getName().istGleich( name ) )
  67. return v->zVariable();
  68. }
  69. return 0;
  70. }
  71. ProgramCounter::ProgramCounter()
  72. : ReferenceCounter()
  73. {
  74. current.add( 0 );
  75. depth = 0;
  76. }
  77. ProgramCounter::~ProgramCounter()
  78. {}
  79. void ProgramCounter::stepIn()
  80. {
  81. depth++;
  82. if( current.getEintragAnzahl() <= depth )
  83. current.add( 0 );
  84. }
  85. void ProgramCounter::count()
  86. {
  87. current.set( current.get( depth ) + 1, depth );
  88. while( depth + 1 < current.getEintragAnzahl() )
  89. current.remove( depth + 1 );
  90. }
  91. void ProgramCounter::stepOut()
  92. {
  93. depth--;
  94. }
  95. Text ProgramCounter::getUniqueString() const
  96. {
  97. Text ret = "__";
  98. for( int i = 0; i < depth; i++ )
  99. ret += Text( current.get( i ) ) + "__";
  100. return ret;
  101. }
  102. int ProgramCounter::currentPosition() const
  103. {
  104. return current.get( depth );
  105. }
  106. Bedingung::Bedingung( Aktion* expression )
  107. : ReferenceCounter()
  108. {
  109. this->expression = expression;
  110. }
  111. Bedingung::~Bedingung()
  112. {
  113. if( expression )
  114. expression->release();
  115. }
  116. void Bedingung::setExpression( Aktion* expr )
  117. {
  118. if( expression )
  119. expression->release();
  120. expression = expr;
  121. }
  122. bool Bedingung::check( Spiel* zSpiel, Ereignis* zEreignis )
  123. {
  124. if( !expression )
  125. return 1;
  126. double wait = 0;
  127. ProgramCounter c;
  128. LocalMemory m;
  129. while( !expression->runNext( zSpiel, zEreignis, &m, &c, wait ) )
  130. wait = 0;
  131. Variable* var = m.zVariable( "__return__" );
  132. return isTrue( var );
  133. }
  134. Aktion* Bedingung::zExpression() const
  135. {
  136. return expression;
  137. }
  138. Trigger::Trigger( int id, const char* name, int ereignisAnzahl, EreignisTyp* ereignisse, RCArray< Bedingung >* bedingungen, RCArray< Aktion >* aktionen )
  139. : Variable( TRIGGER )
  140. {
  141. this->id = id;
  142. this->name = name;
  143. this->ereignisAnzahl = ereignisAnzahl;
  144. this->ereignisse = ereignisse;
  145. this->bedingungen = bedingungen;
  146. this->aktionen = aktionen;
  147. aktiv = 1;
  148. runCount = 0;
  149. }
  150. Trigger::~Trigger()
  151. {
  152. delete[]ereignisse;
  153. bedingungen->release();
  154. aktionen->release();
  155. }
  156. void Trigger::setAktiv( bool aktiv )
  157. {
  158. this->aktiv = aktiv;
  159. }
  160. bool Trigger::hatEreignis( EreignisTyp typ ) const
  161. {
  162. for( int i = 0; i < ereignisAnzahl; i++ )
  163. {
  164. if( ereignisse[ i ] == typ )
  165. return 1;
  166. }
  167. return 0;
  168. }
  169. int Trigger::getAktionAnzahl() const
  170. {
  171. return aktionen->getEintragAnzahl();
  172. }
  173. Aktion* Trigger::zAktion( int index ) const
  174. {
  175. return aktionen->z( index );
  176. }
  177. Aktion* Trigger::getAktion( int index ) const
  178. {
  179. return aktionen->get( index );
  180. }
  181. // return: 0, falls die bedingungen nicht erfüllt sind
  182. TriggerRun* Trigger::runTrigger( Ereignis* e, Spiel* zSpiel )
  183. {
  184. if( !aktiv )
  185. {
  186. e->release();
  187. return 0;
  188. }
  189. for( auto b : *bedingungen )
  190. {
  191. if( !b->check( zSpiel, e ) )
  192. {
  193. e->release();
  194. return 0;
  195. }
  196. }
  197. runCount++;
  198. return new TriggerRun( dynamic_cast<Trigger*>(getThis()), e, zSpiel );
  199. }
  200. int Trigger::getId() const
  201. {
  202. return id;
  203. }
  204. int Trigger::getRuns() const
  205. {
  206. return runCount;
  207. }
  208. const char* Trigger::getName() const
  209. {
  210. return name.getText();
  211. }
  212. bool Trigger::istAktiv() const
  213. {
  214. return aktiv;
  215. }
  216. TriggerRun::TriggerRun( Trigger* trig, Ereignis* e, Spiel* zSpiel )
  217. : ReferenceCounter()
  218. {
  219. trigger = trig;
  220. ereignis = e;
  221. this->zSpiel = zSpiel;
  222. waitCount = 0;
  223. }
  224. TriggerRun::~TriggerRun()
  225. {
  226. trigger->release();
  227. ereignis->release();
  228. }
  229. // gibt 0 zurück, wenn der Auslöser vollständig durchgelaufen ist
  230. bool TriggerRun::runNext( double t )
  231. {
  232. if( waitCount > 0 )
  233. waitCount -= t;
  234. else
  235. {
  236. int current = counter.currentPosition();
  237. if( current >= trigger->getAktionAnzahl() )
  238. return 0;
  239. Aktion* ak = trigger->zAktion( current );
  240. if( !ak || ak->runNext( zSpiel, ereignis, &localMem, &counter, waitCount ) )
  241. counter.count();
  242. if( counter.currentPosition() >= trigger->getAktionAnzahl() )
  243. return 0;
  244. }
  245. return 1;
  246. }
  247. Trigger* TriggerRun::getTrigger() const
  248. {
  249. return dynamic_cast<Trigger*>(trigger->getThis());
  250. }