KSGScriptObj.cpp 10 KB

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