KSGScriptObj.cpp 10 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(const 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(const 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. }