KSGScriptObj.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500
  1. #include "KSGScriptObj.h"
  2. #include "../Befehl/KSGSKlasse.h"
  3. #include "../Leser/KSGSLeser.h"
  4. #include <fstream>
  5. #include <iostream>
  6. #include <sstream>
  7. #include <Punkt.h>
  8. #include "../Klassen/KSGSMausEreignis.h"
  9. #include "../Klassen/KSGSTastaturEreignis.h"
  10. #include "../Klassen/KSGSInt.h"
  11. #include "../Klassen/KSGSBild.h"
  12. #include "../Klassen/KSGSDouble.h"
  13. #include "../Error/Error.h"
  14. #include <Bildschirm.h>
  15. #include <Zeit.h>
  16. #include <Datei.h>
  17. using namespace KSGScript;
  18. #ifndef WIN32
  19. #define INFINITE 0xFFFFFFFF
  20. #endif
  21. // Inhalt der KSGScript Klasse aus KSGScript.h
  22. // Konstruktor
  23. KSGScriptO::KSGScriptO()
  24. {
  25. pfad = new Text();
  26. wd = new Text();
  27. rParam = 0;
  28. rFunktion = 0;
  29. variablen = new RCArray< KSGSVariable >();
  30. funktionen = new RCArray< KSGSFunktion >();
  31. klassen = new RCArray< KSGSKlasse >();
  32. schrift = 0;
  33. screen = 0;
  34. mainId = 0;
  35. mausId = 0;
  36. tastaturId = 0;
  37. tickId = 0;
  38. renderId = 0;
  39. geladen = 0;
  40. scrId = 0;
  41. mausP = new RCArray< KSGSVariable >();
  42. tastaturP = new RCArray< KSGSVariable >();
  43. tickP = new RCArray< KSGSVariable >();
  44. renderP = new RCArray< KSGSVariable >();
  45. log = 0;
  46. }
  47. // Destruktor
  48. KSGScriptO::~KSGScriptO()
  49. {
  50. if( schrift )
  51. schrift->release();
  52. if( screen )
  53. screen->release();
  54. reset();
  55. mausP->release();
  56. tastaturP->release();
  57. tickP->release();
  58. renderP->release();
  59. pfad->release();
  60. wd->release();
  61. variablen->release();
  62. funktionen->release();
  63. klassen->release();
  64. if( log )
  65. log->release();
  66. }
  67. // nicht constant
  68. void KSGScriptO::lock()
  69. {
  70. cs.lock();
  71. }
  72. void KSGScriptO::unlock()
  73. {
  74. cs.unlock();
  75. }
  76. void KSGScriptO::setScriptDatei( const char *pfad )
  77. {
  78. this->pfad->setText( pfad );
  79. this->pfad->ersetzen( '\\', '/' );
  80. int l = this->pfad->hat( '/' ) ? this->pfad->positionVon( '/', this->pfad->anzahlVon( '/' ) - 1 ) + 1 : 0;
  81. if( l )
  82. wd->setText( pfad, l );
  83. }
  84. void KSGScriptO::setScriptDatei( Text *pfad )
  85. {
  86. setScriptDatei( pfad->getText() );
  87. pfad->release();
  88. }
  89. bool KSGScriptO::neuLaden()
  90. {
  91. lock();
  92. ZeitMesser *gzm = new ZeitMesser();
  93. gzm->messungStart();
  94. if( geladen )
  95. reset();
  96. scrId++;
  97. Datei *datei = new Datei();
  98. datei->setDatei( *pfad );
  99. if( !datei->open( Datei::Style::lesen ) )
  100. {
  101. datei->release();
  102. error( 4, { *pfad }, this );
  103. return 0;
  104. }
  105. KSGSLeser *reader = new KSGSLeser( datei, this, *pfad );
  106. ZeitMesser *zm = new ZeitMesser();
  107. zm->messungStart();
  108. if( !reader->laden() )
  109. {
  110. reader->release();
  111. datei->close();
  112. datei->release();
  113. zm->release();
  114. gzm->release();
  115. unlock();
  116. return 0;
  117. }
  118. zm->messungEnde();
  119. if( log )
  120. {
  121. Text msg = "Reader: Zum lesen benötigte Sekunden: ";
  122. msg += zm->getSekunden();
  123. logNachricht( msg );
  124. }
  125. std::cout << "KSGS Reader: Zum lesen benötigte Sekunden: " << zm->getSekunden() << "\n";
  126. Array< KSGSVariableDef * > *varDefs = new Array< KSGSVariableDef * >();
  127. zm->messungStart();
  128. if( !reader->compile( klassen, funktionen, varDefs ) )
  129. {
  130. varDefs->release();
  131. reader->release();
  132. datei->close();
  133. datei->release();
  134. zm->release();
  135. gzm->release();
  136. unlock();
  137. return 0;
  138. }
  139. mausP->add( new KSGSMausEreignisKlasse( this ) );
  140. tastaturP->add( new KSGSTastaturEreignisKlasse( this ) );
  141. tickP->add( new KSGSDoubleKlasse( this ) );
  142. renderP->add( new KSGSBildKlasse( this ) );
  143. zm->messungEnde();
  144. if( log )
  145. {
  146. Text msg = "Reader: Zum compilieren benötigte Sekunden: ";
  147. msg += zm->getSekunden();
  148. logNachricht( msg );
  149. }
  150. std::cout << "KSGS Reader: Zum compilieren benötigte Sekunden: " << zm->getSekunden() << "\n";
  151. zm->release();
  152. int vAnz = varDefs->getEintragAnzahl();
  153. for( int i = 0; i < vAnz; i++ )
  154. {
  155. KSGSVariable *var = KSGSKlasseInstanz::erstellVariable( this, varDefs->get( i ) );
  156. if( var )
  157. variablen->add( var );
  158. delete varDefs->get( i );
  159. }
  160. varDefs->release();
  161. mainId = reader->getMainFuncId();
  162. mausId = reader->getMausFuncId();
  163. tastaturId = reader->getTastaturFuncId();
  164. tickId = reader->getTickFuncId();
  165. renderId = reader->getRenderFuncId();
  166. reader->release();
  167. datei->close();
  168. datei->release();
  169. int anz = funktionen->getEintragAnzahl();
  170. geladen = 1;
  171. for( int i = 0; i < anz; i++ )
  172. {
  173. if( funktionen->z( i )->getId() == mainId )
  174. {
  175. KSGSFunktionInstanz *inst = funktionen->z( i )->erstellInstanz( dynamic_cast<KSGScriptProcessor *>( getThis() ), 0, 0 );
  176. KSGSVariable *ret = inst->startFunktion();
  177. if( ret )
  178. ret->release();
  179. if( inst->isFunctionExecuting() )
  180. inst->warteAufFunktion( INFINITE );
  181. inst->release();
  182. break;
  183. }
  184. }
  185. geladen = 2;
  186. gzm->messungEnde();
  187. if( log )
  188. {
  189. Text msg = "Reader: Zum laden benötigte Sekunden: ";
  190. msg += gzm->getSekunden();
  191. logNachricht( msg );
  192. }
  193. std::cout << "KSGS Reader: Zum laden benötigte Sekunden: " << gzm->getSekunden() << "\n";
  194. gzm->release();
  195. unlock();
  196. return 1;
  197. }
  198. void KSGScriptO::reset()
  199. {
  200. lock();
  201. geladen = 0;
  202. variablen->leeren();
  203. funktionen->leeren();
  204. klassen->leeren();
  205. mausP->leeren();
  206. tastaturP->leeren();
  207. tickP->leeren();
  208. renderP->leeren();
  209. unlock();
  210. }
  211. void KSGScriptO::setCallbackParam( void *p )
  212. {
  213. rParam = p;
  214. }
  215. void KSGScriptO::setCallbackFunktion( void( *funktion )( void *, RCArray< KSGSVariable > *, KSGSVariable ** ) )
  216. {
  217. rFunktion = funktion;
  218. }
  219. void KSGScriptO::setSchriftZ( Schrift *s )
  220. {
  221. if( schrift )
  222. schrift->release();
  223. schrift = s;
  224. }
  225. void KSGScriptO::setBildschirmZ( Bildschirm *s )
  226. {
  227. if( screen )
  228. screen->release();
  229. screen = s;
  230. }
  231. void KSGScriptO::doPublicMausEreignis( MausEreignis &me )
  232. {
  233. if( geladen != 2 )
  234. return;
  235. lock();
  236. me.mx -= pos.x;
  237. me.my -= pos.y;
  238. int anz = funktionen->getEintragAnzahl();
  239. for( int i = 0; i < anz; i++ )
  240. {
  241. if( funktionen->z( i )->getId() == mausId )
  242. {
  243. ( (KSGSMausEreignisKlasse *)mausP->z( 0 ) )->set( me );
  244. KSGSFunktionInstanz *inst = funktionen->z( i )->erstellInstanz( dynamic_cast<KSGScriptProcessor *>( getThis() ), 0, dynamic_cast<RCArray<KSGSVariable>*>( mausP->getThis() ) );
  245. KSGSVariable *ret = inst->startFunktion();
  246. if( ret )
  247. {
  248. me.verarbeitet |= ret->getBool();
  249. ret->release();
  250. }
  251. if( inst->isFunctionExecuting() )
  252. inst->warteAufFunktion( INFINITE );
  253. inst->release();
  254. break;
  255. }
  256. }
  257. me.mx += pos.x;
  258. me.my += pos.y;
  259. unlock();
  260. }
  261. void KSGScriptO::doTastaturEreignis( TastaturEreignis &te )
  262. {
  263. if( geladen != 2 )
  264. return;
  265. lock();
  266. int anz = funktionen->getEintragAnzahl();
  267. for( int i = 0; i < anz; i++ )
  268. {
  269. if( funktionen->z( i )->getId() == tastaturId )
  270. {
  271. ( (KSGSTastaturEreignisKlasse *)tastaturP->z( 0 ) )->set( te );
  272. KSGSFunktionInstanz *inst = funktionen->z( i )->erstellInstanz( dynamic_cast<KSGScriptProcessor *>( getThis() ), 0, dynamic_cast<RCArray<KSGSVariable>*>( tastaturP->getThis() ) );
  273. KSGSVariable *ret = inst->startFunktion();
  274. if( ret )
  275. {
  276. te.verarbeitet |= ret->getBool();
  277. ret->release();
  278. }
  279. if( inst->isFunctionExecuting() )
  280. inst->warteAufFunktion( INFINITE );
  281. inst->release();
  282. break;
  283. }
  284. }
  285. unlock();
  286. }
  287. bool KSGScriptO::tick( double zeit )
  288. {
  289. if( geladen != 2 )
  290. return 0;
  291. lock();
  292. int anz = funktionen->getEintragAnzahl();
  293. for( int i = 0; i < anz; i++ )
  294. {
  295. if( funktionen->z( i )->getId() == tickId )
  296. {
  297. ( (KSGSDoubleKlasse *)tickP->z( 0 ) )->set( zeit );
  298. KSGSFunktionInstanz *inst = funktionen->z( i )->erstellInstanz( dynamic_cast<KSGScriptProcessor *>( getThis() ), 0, dynamic_cast<RCArray<KSGSVariable>*>( tickP->getThis() ) );
  299. KSGSVariable *ret = inst->startFunktion();
  300. bool r = 0;
  301. if( ret )
  302. {
  303. r = ret->getBool();
  304. ret->release();
  305. }
  306. if( inst->isFunctionExecuting() )
  307. inst->warteAufFunktion( INFINITE );
  308. inst->release();
  309. unlock();
  310. return r;
  311. }
  312. }
  313. unlock();
  314. return 0;
  315. }
  316. void KSGScriptO::render( Bild &zRObj )
  317. {
  318. if( geladen != 2 )
  319. return;
  320. lock();
  321. if( !zRObj.setDrawOptions( pos, gr ) )
  322. {
  323. unlock();
  324. return;
  325. }
  326. int anz = funktionen->getEintragAnzahl();
  327. for( int i = 0; i < anz; i++ )
  328. {
  329. if( funktionen->z( i )->getId() == renderId )
  330. {
  331. ( (KSGSBildKlasse *)renderP->z( 0 ) )->set( dynamic_cast<Bild *>( zRObj.getThis() ) );
  332. KSGSFunktionInstanz *inst = funktionen->z( i )->erstellInstanz( dynamic_cast<KSGScriptProcessor *>( getThis() ), 0, dynamic_cast<RCArray<KSGSVariable>*>( renderP->getThis() ) );
  333. KSGSVariable *ret = inst->startFunktion();
  334. if( ret )
  335. ret->release();
  336. if( inst->isFunctionExecuting() )
  337. inst->warteAufFunktion( INFINITE );
  338. inst->release();
  339. break;
  340. }
  341. }
  342. zRObj.releaseDrawOptions();
  343. unlock();
  344. }
  345. KSGSVariable *KSGScriptO::startFunktion( int id, RCArray< KSGSVariable > *parameter )
  346. {
  347. if( !funktionen || !funktionen->z( id ) || funktionen->z( id )->getSichtbarkeit() != 0 )
  348. {
  349. error( 19, {}, this );
  350. parameter->release();
  351. return 0;
  352. }
  353. KSGSFunktionInstanz *inst = funktionen->z( id )->erstellInstanz( dynamic_cast<KSGScriptProcessor *>( getThis() ), 0, parameter );
  354. KSGSVariable *ret = inst->startFunktion();
  355. inst->release();
  356. return ret;
  357. }
  358. KSGSVariable *KSGScriptO::erstellKlassenInstanz( int id )
  359. {
  360. int anz = klassen->getEintragAnzahl();
  361. for( int i = 0; i < anz; i++ )
  362. {
  363. if( klassen->z( i ) && klassen->z( i )->getId() == id )
  364. return klassen->z( i )->erstellInstanz( this );
  365. }
  366. error( 2, {}, this );
  367. return 0;
  368. }
  369. void KSGScriptO::setVariable( int id, KSGSVariable *var )
  370. {
  371. variablen->set( var, id );
  372. }
  373. Text *KSGScriptO::convertPfad( char *pf )
  374. {
  375. Text *ret = new Text( pf );
  376. ret->ersetzen( '\\', '/' );
  377. if( ret->getText()[ 0 ] == '/' )
  378. {
  379. ret->remove( 0 );
  380. return ret;
  381. }
  382. ret->insert( 0, wd->getText() );
  383. return ret;
  384. }
  385. void KSGScriptO::setLog( TextFeld *log )
  386. {
  387. lock();
  388. if( this->log )
  389. this->log->release();
  390. this->log = log;
  391. unlock();
  392. }
  393. void KSGScriptO::logNachricht( char *n )
  394. {
  395. if( log )
  396. {
  397. lock();
  398. log->addZeile( n );
  399. unlock();
  400. }
  401. }
  402. // constant
  403. KSGSVariable *KSGScriptO::callback( RCArray< KSGSVariable > *parameter ) const
  404. {
  405. if( !rFunktion )
  406. {
  407. parameter->release();
  408. return 0;
  409. }
  410. KSGSVariable *ret = 0;
  411. rFunktion( rParam, parameter, &ret );
  412. parameter->release();
  413. return ret;
  414. }
  415. Text *KSGScriptO::getScriptDateiPfad() const
  416. {
  417. return dynamic_cast<Text *>( pfad->getThis() );
  418. }
  419. Text *KSGScriptO::zScriptDateiPfad() const
  420. {
  421. return pfad;
  422. }
  423. Schrift *KSGScriptO::getSchrift() const
  424. {
  425. return schrift ? dynamic_cast<Schrift *>( schrift->getThis() ) : 0;
  426. }
  427. Schrift *KSGScriptO::zSchrift() const
  428. {
  429. return schrift;
  430. }
  431. Bildschirm *KSGScriptO::getBildschirm() const
  432. {
  433. return screen ? dynamic_cast<Bildschirm *>( screen->getThis() ) : 0;
  434. }
  435. Bildschirm *KSGScriptO::zBildschirm() const
  436. {
  437. return screen;
  438. }
  439. int KSGScriptO::getScriptId() const
  440. {
  441. return scrId;
  442. }
  443. bool KSGScriptO::istBeendet( int scrId ) const
  444. {
  445. return !geladen || this->scrId != scrId;
  446. }
  447. int KSGScriptO::getFunktionId( const char *name ) const
  448. {
  449. int anz = funktionen->getEintragAnzahl();
  450. for( int i = 0; i < anz; i++ )
  451. {
  452. if( funktionen->z( i )->hatName( name ) )
  453. return i;
  454. }
  455. return -1;
  456. }
  457. KSGSVariable *KSGScriptO::getVariable( int id ) const
  458. {
  459. if( !variablen || !variablen->z( id ) )
  460. {
  461. error( 17, {}, (KSGScriptO *)this );
  462. return 0;
  463. }
  464. return variablen->get( id );
  465. }