KSGScriptObj.cpp 12 KB

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