Reader.cpp 28 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057
  1. #include "Reader.h"
  2. #include "Spiel.h"
  3. // Konstruktor
  4. MapReader::MapReader(int karteId, SSDatenbankV* db, const char* tmpPfad)
  5. : ReferenceCounter()
  6. {
  7. this->karteId = karteId;
  8. this->db = db;
  9. pfad = new Text(tmpPfad);
  10. }
  11. MapReader::MapReader()
  12. : ReferenceCounter()
  13. {
  14. db = 0;
  15. pfad = 0;
  16. }
  17. // Destruktor
  18. MapReader::~MapReader()
  19. {
  20. if (db)
  21. db->release();
  22. if (pfad)
  23. pfad->release();
  24. }
  25. Aktion* MapReader::readAktion(Datei& dat)
  26. {
  27. int id;
  28. dat.lese((char*)&id, 4);
  29. char pAnz = 0;
  30. dat.lese(&pAnz, 1);
  31. RCArray< Aktion >* params = new RCArray< Aktion >();
  32. for (int i = 0; i < pAnz; i++)
  33. params->add(readAktion(dat));
  34. switch (id)
  35. {
  36. case BARIERE_BEWEGUNG:
  37. return new BariereBewegung(params);
  38. case BARIERE_SET_EINGESCHALTET:
  39. return new BariereSetEingeschaltet(params);
  40. case GAME_OBJEKT_SET_POSITION:
  41. return new GameObjektSetPosition(params);
  42. case GAME_OBJEKT_SET_SIZE:
  43. return new GameObjektSetSize(params);
  44. case BARIERE_SET_TEAM:
  45. return new BariereSetTeam(params);
  46. case BARIERE_ZUFALL:
  47. params->release();
  48. return new BariereZufall();
  49. case BARIERE_ZULETZT_AUSGESCHALTET:
  50. params->release();
  51. return new BariereZuletztAusgeschaltet();
  52. case BARIERE_ZULETZT_BEWEGT:
  53. params->release();
  54. return new BariereZuletztBewegt();
  55. case BARIERE_ZULETZT_EINGESCHALTET:
  56. params->release();
  57. return new BariereZuletztEingeschaltet();
  58. case BASE_SET_TEAM:
  59. return new BaseSetTeam(params);
  60. case BASE_START_TEAM_CHANGE:
  61. return new BaseStartTeamChange(params);
  62. case BASE_ZUFALL:
  63. params->release();
  64. return new BaseZufall();
  65. case BASE_ZULETZT_BESITZER_GEWECHSELT:
  66. params->release();
  67. return new BaseZuletztBesitzerGewechselt();
  68. case BOOLEAN_AUS_TEXT:
  69. return new BooleanAusText(params);
  70. case BOOLEAN_BARIERE_BEWEGT_SICH:
  71. return new BooleanBariereBewegtSich(params);
  72. case BOOLEAN_BARIERE_IST_AKTIV:
  73. return new BooleanBariereIstAktiv(params);
  74. case BOOLEAN_BARIERE_IST_SCHALTEND:
  75. return new BooleanBariereIstSchaltend(params);
  76. case BOOLEAN_BASE_IST_NEUTRAL:
  77. return new BooleanBaseIstNeutral(params);
  78. case BOOLEAN_RECHNUNG:
  79. {
  80. char op;
  81. dat.lese(&op, 1);
  82. return new BooleanRechnung(params, (Operator)op);
  83. }
  84. case BOOLEAN_SCHALTER_IST_AKTIV:
  85. return new BooleanSchalterIstAktiv(params);
  86. case BOOLEAN_SPIELER_AM_LEBEN:
  87. return new BooleanSpielerAmLeben(params);
  88. case BOOLEAN_SPIELER_HAT_GEGENSTAND:
  89. return new BooleanSpielerHatGegenstand(params);
  90. case BOOLEAN_SPIELER_IST_VERWUNDBAR:
  91. return new BooleanSpielerIstVerwundbar(params);
  92. case BOOLEAN_SPIELER_KANN_ITEM_BENUTZEN:
  93. return new BooleanSpielerKannItemBenutzen(params);
  94. case BOOLEAN_SPIEL_PAUSIERT:
  95. params->release();
  96. return new BooleanSpielPausiert();
  97. case BOOLEAN_TIMER_IS_RUNNING:
  98. return new BooleanTimerIsRunning(params);
  99. case BOOLEAN_TIMER_IST_SICHTBAR:
  100. return new BooleanTimerIstSichtbar(params);
  101. case BOOLEAN_TRIGGER_IST_AKTIV:
  102. return new BooleanTriggerIstAktiv(params);
  103. case BOOLEAN_TUNNEL_IST_AKTIV:
  104. return new BooleanTunnelIstAktiv(params);
  105. case BOOLEAN_UMLENKUNG_HAT_ABK:
  106. return new BooleanUmlenkungHatAbk(params);
  107. case BOOLEAN_UMLENKUNG_IST_DREHEND:
  108. return new BooleanUmlenkungIstDrehend(params);
  109. case BOOLEAN_ZUFALL:
  110. params->release();
  111. return new BooleanZufall();
  112. case DISPLAY_TEXT:
  113. return new DisplayText(params);
  114. case DROP_DO_DROP:
  115. return new DropDoDrop(params);
  116. case DROP_SET_AREA:
  117. return new DropSetArea(params);
  118. case DROP_SET_MAX_TIME:
  119. return new DropSetMaxTime(params);
  120. case DROP_SET_TIME:
  121. return new DropSetTime(params);
  122. case DROP_ZUFALL:
  123. params->release();
  124. return new DropZufall();
  125. case DROP_ZULETZT_GEDROPT:
  126. params->release();
  127. return new DropZuletztGedropt();
  128. case GESCHOSS_NEU:
  129. return new GeschossNeu(params);
  130. case GESCHOSS_SET_PLAYER:
  131. return new GeschossSetPlayer(params);
  132. case GESCHOSS_SET_RICHTUNG:
  133. return new GeschossSetRichtung(params);
  134. case GESCHOSS_SET_SPEED:
  135. return new GeschossSetSpeed(params);
  136. case GESCHOSS_SET_TYPE:
  137. return new GeschossSetType(params);
  138. case GESCHOSS_ZUFALL:
  139. params->release();
  140. return new GeschossZufall();
  141. case GESCHOSS_ZULETZT_ABGEFEUERT:
  142. params->release();
  143. return new GeschossZuletztAbgefeuert();
  144. case GESCHOSS_ZULETZT_BARIERE_GETROFFEN:
  145. params->release();
  146. return new GeschossZuletztBarjereGetroffen();
  147. case GESCHOSS_ZULETZT_GESCHOSS_GETROFFEN:
  148. params->release();
  149. return new GeschossZuletztGeschossGetroffen();
  150. case GESCHOSS_ZULETZT_TUNNEL_BENUTZT:
  151. params->release();
  152. return new GeschossZuletztTunnelBenutzt();
  153. case GESCHOSS_ZULETZT_UMGELENKT:
  154. params->release();
  155. return new GeschossZuletztUmgelenkt();
  156. case INTEGER_AUS_TEXT:
  157. return new IntegerAusText(params);
  158. case FLOAT_GAME_OBJEKT_BREITE:
  159. return new FloatGameObjektBreite(params);
  160. case FLOAT_GAME_OBJEKT_HEIGHT:
  161. return new FloatGameObjektHeight(params);
  162. case INTEGER_BARIERE_SCHALTUNGEN:
  163. return new IntegerBariereSchaltungen(params);
  164. case INTEGER_BARIERE_VERSCHIEBUNGEN:
  165. return new IntegerBariereVerschiebungen(params);
  166. case INTEGER_DROP_MAX_ZEIT:
  167. return new IntegerDropMaxZeit(params);
  168. case FLOAT_DROP_ZEIT:
  169. return new FloatDropZeit(params);
  170. case INTEGER_MAX_X_VON_DROP:
  171. return new IntegerMaxXVonDrop(params);
  172. case INTEGER_MAX_Y_VON_DROP:
  173. return new IntegerMaxYVonDrop(params);
  174. case INTEGER_MIN_X_VON_DROP:
  175. return new IntegerMinXVonDrop(params);
  176. case INTEGER_MIN_Y_VON_DROP:
  177. return new IntegerMinYVonDrop(params);
  178. case INTEGER_RECHNEN:
  179. {
  180. char op;
  181. dat.lese(&op, 1);
  182. return new IntegerRechnen(params, (Operator)op);
  183. }
  184. case INTEGER_SCHALTER_AKTIVIERUNGEN:
  185. return new IntegerSchalterAktivierungen(params);
  186. case FLOAT_SPIELER_ABKLINGZEITVERRINGERUNG:
  187. return new FloatSpielerAbklingzeitVerringerung(params);
  188. case FLOAT_SPIELER_ARMOR:
  189. return new FloatSpielerArmor(params);
  190. case FLOAT_SPIELER_ERFAHRUNG:
  191. return new FloatSpielerErfahrung(params);
  192. case FLOAT_SPIELER_ERLITTENER_SCHADEN:
  193. return new FloatSpielerErlittenerSchaden(params);
  194. case FLOAT_SPIELER_GEHEILTES_LEBEN:
  195. return new FloatSpielerGeheiltesLeben(params);
  196. case INTEGER_SPIELER_GESCHOSSEN:
  197. return new IntegerSpielerGeschossen(params);
  198. case FLOAT_SPIELER_GESCHOSS_TEMPO:
  199. return new FloatSpielerGeschossTempo(params);
  200. case INTEGER_SPIELER_GETROFFEN:
  201. return new IntegerSpielerGetroffen(params);
  202. case INTEGER_SPIELER_ITEMS_AUFGEHOBEN:
  203. return new IntegerSpielerItemsAufgehoben(params);
  204. case INTEGER_SPIELER_ANZAHL_ITEMS_IN_INVENTAR:
  205. return new IntegerSpielerItemsInInventar(params);
  206. case INTEGER_SPIELER_ANZAHL_ITEMS_VON_TYP:
  207. return new IntegerSpielerItemsTypeInInventar(params);
  208. case INTEGER_SPIELER_ITEMS_VERWENDET:
  209. return new IntegerSpielerItemsVerwendet(params);
  210. case INTEGER_SPIELER_KILLS:
  211. return new IntegerSpielerKills(params);
  212. case FLOAT_SPIELER_LEBEN:
  213. return new FloatSpielerLeben(params);
  214. case FLOAT_SPIELER_LEBENSRAUB:
  215. return new FloatSpielerLebensraub(params);
  216. case FLOAT_SPIELER_LEBENSREGENERATION:
  217. return new FloatSpielerLebensregeneration(params);
  218. case INTEGER_SPIELER_LEVEL:
  219. return new IntegerSpielerLevel(params);
  220. case INTEGER_SPIELER_MAX_ERFAHRUNG:
  221. return new IntegerSpielerMaxErfahrung(params);
  222. case INTEGER_SPIELER_MAX_LEBEN:
  223. return new IntegerSpielerMaxLeben(params);
  224. case FLOAT_SPIELER_SCHADEN:
  225. return new FloatSpielerSchaden(params);
  226. case FLOAT_SPIELER_SCHADEN_BONUS:
  227. return new FloatSpielerSchadenBonus(params);
  228. case INTEGER_SPIELER_SCHALTER_AKTIVIERT:
  229. return new IntegerSpielerSchalterAktiviert(params);
  230. case FLOAT_SPIELER_TEMPO:
  231. return new FloatSpielerTempo(params);
  232. case INTEGER_SPIELER_TODE:
  233. return new IntegerSpielerTode(params);
  234. case INTEGER_SPIELER_TREFFER:
  235. return new IntegerSpielerTreffer(params);
  236. case INTEGER_SPIELER_TUNNEL_BENUTZT:
  237. return new IntegerSpielerTunnelBenutzt(params);
  238. case INTEGER_TEAM_KILLS:
  239. return new IntegerTeamKills(params);
  240. case INTEGER_TEAM_PUNKTE:
  241. return new IntegerTeamPunkte(params);
  242. case INTEGER_TEAM_SPIELERANZAHL:
  243. return new IntegerTeamSpieleranzahl(params);
  244. case INTEGER_TEAM_TODE:
  245. return new IntegerTeamTode(params);
  246. case FLOAT_TEAM_WIEDERBELEBUNGSZEIT:
  247. return new FloatTeamWiederbelegungszeit(params);
  248. case FLOAT_TIMER_AKTUELLE_ZEIT:
  249. return new FloatTimerAktuelleZeit(params);
  250. case INTEGER_TIMER_MAX_ZEIT:
  251. return new IntegerTimerMaxZeit(params);
  252. case INTEGER_TRIGGER_RUNNS:
  253. return new IntegerTriggerRunns(params);
  254. case INTEGER_TUNNEL_BENUTZUNGEN:
  255. return new IntegerTunnelBenutzungen(params);
  256. case INTEGER_UMLENKUNG_BENUTZUNGEN:
  257. return new IntegerUmlenkungBenutzungen(params);
  258. case FLOAT_X_VON_GAME_OBJEKT:
  259. return new FloatXVonGameObjekt(params);
  260. case FLOAT_Y_VON_GAME_OBJEKT:
  261. return new FloatYVonGameObjekt(params);
  262. case INTEGER_X_VON_TUNNEL_ZIEL:
  263. return new IntegerXVonTunnelZiel(params);
  264. case INTEGER_Y_VON_TUNNEL_ZIEL:
  265. return new IntegerYVonTunnelZiel(params);
  266. case INTEGER_ZUFALL:
  267. return new IntegerZufall(params);
  268. case ITEM_SPIELER_INVENTAR:
  269. return new ItemSpielerInventar(params);
  270. case ITEM_ZULETZT_AUFGEHOBEN:
  271. params->release();
  272. return new ItemZuletztAufgehoben();
  273. case ITEM_ZULETZT_AKTIVIERT:
  274. params->release();
  275. return new ItemZuletztAktiviert();
  276. case ITEM_ZULETZT_GEDROPT:
  277. params->release();
  278. return new ItemZuletztGedropt();
  279. case ITEM_ZUFALL:
  280. params->release();
  281. return new ItemZufall();
  282. case KONSTANT_BOOLEAN:
  283. {
  284. params->release();
  285. bool b;
  286. dat.lese((char*)&b, 1);
  287. return new KonstantBoolean(b);
  288. }
  289. case KONSTANT_FLOAT:
  290. {
  291. params->release();
  292. float f;
  293. dat.lese((char*)&f, 4);
  294. return new KonstantFloat(f);
  295. }
  296. case KONSTANT_INTEGER:
  297. {
  298. params->release();
  299. int i;
  300. dat.lese((char*)&i, 4);
  301. return new KonstantInteger(i);
  302. }
  303. case KONSTANT_GEGENSTAND_TYP:
  304. {
  305. params->release();
  306. int i;
  307. dat.lese((char*)&i, 4);
  308. return new KonstantGegenstandTyp((GegenstandTyp)i);
  309. }
  310. case KONSTANT_TASTE:
  311. {
  312. params->release();
  313. unsigned char i;
  314. dat.lese((char*)&i, 1);
  315. return new KonstantTaste(i);
  316. }
  317. case KONSTANT_NICHTS:
  318. params->release();
  319. return new KonstantNichts();
  320. case KONSTANT_STRING:
  321. {
  322. params->release();
  323. char len;
  324. dat.lese(&len, 1);
  325. char* txt = new char[len + 1];
  326. dat.lese(txt, len);
  327. txt[(int)len] = 0;
  328. Aktion* ret = new KonstantString(txt);
  329. delete[] txt;
  330. return ret;
  331. }
  332. case KONSTANT_VARIABLE:
  333. {
  334. params->release();
  335. char len;
  336. dat.lese(&len, 1);
  337. char* txt = new char[len + 1];
  338. dat.lese(txt, len);
  339. txt[(int)len] = 0;
  340. Aktion* ret = new KonstantVariable(txt);
  341. delete[] txt;
  342. return ret;
  343. }
  344. case RICHTUNG_VON_GESCHOSS:
  345. return new RichtungVonGeschoss(params);
  346. case RICHTUNG_VON_UMLENKUNG:
  347. return new RichtungVonUmlenkung(params);
  348. case RICHTUNG_ZUFALL:
  349. params->release();
  350. return new RichtungZufall();
  351. case SCHALTER_AKTIVIEREN:
  352. return new SchalterAktivieren(params);
  353. case SCHALTER_SET_ERLAUBT:
  354. return new SchalterSetErlaubt(params);
  355. case SCHALTER_ZUFALL:
  356. params->release();
  357. return new SchalterZufall();
  358. case SCHALTER_ZULETZT_AKTIVIERT:
  359. params->release();
  360. return new SchalterZuletztAktiviert();
  361. case SET_VARIABLE:
  362. {
  363. char len;
  364. dat.lese(&len, 1);
  365. char* txt = new char[len + 1];
  366. dat.lese(txt, len);
  367. txt[(int)len] = 0;
  368. Aktion* ret = new SetVariable(txt, params);
  369. delete[] txt;
  370. return ret;
  371. }
  372. case SPIEL_ENDE:
  373. return new SpielEnde(params);
  374. case SPIELER_GIVE_ITEM:
  375. return new SpielerGiveItem(params);
  376. case SPIELER_NACHRICHT:
  377. return new SpielerNachricht(params);
  378. case SPIELER_REMOVE_ITEM:
  379. return new SpielerRemoveItem(params);
  380. case SPIELER_SET_ABKLINGZEITVERRINGERUNG:
  381. return new SpielerSetAbklingzeitverringerung(params);
  382. case SPIELER_SET_ARMOR:
  383. return new SpielerSetArmor(params);
  384. case SPIELER_SET_ERFAHRUNG:
  385. return new SpielerSetErfahrung(params);
  386. case SPIELER_SET_LEBEN:
  387. return new SpielerSetLeben(params);
  388. case SPIELER_SET_LEBENSRAUB:
  389. return new SpielerSetLebensraub(params);
  390. case SPIELER_SET_LEBENSREGENERATION:
  391. return new SpielerSetLebensraub(params);
  392. case SPIELER_SET_LEVEL:
  393. return new SpielerSetLevel(params);
  394. case SPIELER_SET_MAX_ERFAHRUNG:
  395. return new SpielerSetMaxErfahrung(params);
  396. case SPIELER_SET_SCHADEN_BONUS:
  397. return new SpielerSetSchadenBonus(params);
  398. case SPIELER_SET_TEMPO:
  399. return new SpielerSetTempo(params);
  400. case SPIELER_SET_GESCHOSS_TEMPO:
  401. return new SpielerSetWaffenTempo(params);
  402. case SPIELER_ZUFALL:
  403. params->release();
  404. return new SpielerZufall();
  405. case SPIELER_ZUFALL_AUS_TEAM:
  406. return new SpielerZufallAusTeam(params);
  407. case SPIELER_ZULETZT_ERFAHRUNG_BEKOMMEN:
  408. return new SpielerZuletztErfahrungBekommen();
  409. case SPIELER_ZULETZT_GEGENSTAND_AKTIVIERT:
  410. params->release();
  411. return new SpielerZuletztGegenstandAktiviert();
  412. case SPIELER_ZULETZT_GEGENSTAND_AUFGEHOBEN:
  413. params->release();
  414. return new SpielerZuletztGegenstandAufgehoben();
  415. case SPIELER_ZULETZT_GEHEILT:
  416. params->release();
  417. return new SpielerZuletztGeheilt();
  418. case SPIELER_ZULETZT_GESCHOSSEN:
  419. params->release();
  420. return new SpielerZuletztGeschossGeschossen();
  421. case SPIELER_ZULETZT_GESTORBEN:
  422. params->release();
  423. return new SpielerZuletztGestorben();
  424. case SPIELER_ZULETZT_LEVEL_UP:
  425. params->release();
  426. return new SpielerZuletztLevelUp();
  427. case SPIELER_ZULETZT_SCHADEN_GEMACHT:
  428. params->release();
  429. return new SpielerZuletztSchadenGemacht();
  430. case SPIELER_ZULETZT_SCHADEN_GENOMMEN:
  431. params->release();
  432. return new SpielerZuletztSchadenGenommen();
  433. case SPIELER_ZULETZT_SCHALTER_AKTIVIERT:
  434. params->release();
  435. return new SpielerZuletztSchalterAktiviert();
  436. case SPIELER_ZULETZT_TUNNEL_BENUTZT:
  437. params->release();
  438. return new SpielerZuletztTunnelBenutzt();
  439. case SPIELER_ZULETZT_WIEDERBELEBT:
  440. params->release();
  441. return new SpielerZuletztWiederbelebent();
  442. case SPIEL_PAUSE:
  443. return new SpielPause(params);
  444. case TEAM_SET_PUNKTE:
  445. return new TeamSetPunkte(params);
  446. case TEAM_VON_BARIERE:
  447. return new TeamVonBariere(params);
  448. case TEAM_VON_SPIELER:
  449. return new TeamVonSpieler(params);
  450. case TEAM_ZUFALL:
  451. params->release();
  452. return new TeamZufall();
  453. case TEXT_AUS_BOOLEAN:
  454. return new TextAusBoolean(params);
  455. case TEXT_AUS_RICHTUNG:
  456. return new TextAusRichtung(params);
  457. case TEXT_AUS_INTEGER:
  458. return new TextAusInteger(params);
  459. case TEXT_CONCAT:
  460. return new TextConcat(params);
  461. case TEXT_ITEM_NAME:
  462. return new TextItemName(params);
  463. case TEXT_SPIELER_NAME:
  464. return new TextSpielerName(params);
  465. case TEXT_TEIL_VON_TEXT:
  466. return new TextTeilVonText(params);
  467. case TEXT_TRIGGER_NAME:
  468. return new TextTriggerName(params);
  469. case TIMER_SET_PAUSE:
  470. return new TimerSetPause(params);
  471. case TIMER_SET_SICHTBAR:
  472. return new TimerSetSichtbar(params);
  473. case TIMER_SET_ZEIT:
  474. return new TimerSetZeit(params);
  475. case TIMER_START:
  476. return new TimerStart(params);
  477. case TIMER_ZUFALL:
  478. params->release();
  479. return new TimerZufall();
  480. case TIMER_ZULETZT_ABGELAUFEN:
  481. params->release();
  482. return new TimerZuletztAbgelaufen();
  483. case TIMER_ZULETZT_FOTOGRAFIERT:
  484. params->release();
  485. return new TimerZuletztFortgesetzt();
  486. case TIMER_ZULETZT_GESTARTET:
  487. params->release();
  488. return new TimerZuletztGestartet();
  489. case TIMER_ZULETZT_PAUSIERT:
  490. params->release();
  491. return new TimerZuletztPausiert();
  492. case TRIGGER_AKTION:
  493. return new TriggerAktion(params);
  494. case TRIGGER_LAST_RUNNED:
  495. params->release();
  496. return new TriggerLastRunned();
  497. case TRIGGER_RUN_START:
  498. return new TriggerRunStart(params);
  499. case TRIGGER_SET_ENABLED:
  500. return new TriggerSetEnabled(params);
  501. case TRIGGER_ZUFALL:
  502. params->release();
  503. return new TriggerZufall();
  504. case TUNNEL_SET_ERLAUBT:
  505. return new TunnelSetErlaubt(params);
  506. case TUNNEL_SET_ZIEL_POSITION:
  507. return new TunnelSetZielPosition(params);
  508. case TUNNEL_ZUFALL:
  509. params->release();
  510. return new TunnelZufall();
  511. case TUNNEL_ZULETZT_BENUTZT:
  512. params->release();
  513. return new TunnelZuletztBenutzt();
  514. case UMLENKUNG_SET_ERLAUBT:
  515. return new UmlenkungSetEnabled(params);
  516. case UMLENKUNG_SET_MAX_ABK:
  517. return new UmlenkungSetMaxAbk(params);
  518. case UMLENKUNG_SET_RICHTUNG:
  519. return new UmlenkungSetRichtung(params);
  520. case UMLENKUNG_ZUFALL:
  521. params->release();
  522. return new UmlenkungZufall();
  523. case UMLENKUNG_ZULETZT_BENUTZT:
  524. params->release();
  525. return new UmlenkungZuletztBenutzt();
  526. case WARTEN:
  527. return new Warten(params);
  528. case WENN_DANN_SONST:
  529. return new WennDannSonst(params);
  530. case SEQUENZ:
  531. return new Sequenz(params);
  532. case FLOAT_RECHNUNG:
  533. {
  534. char op;
  535. dat.lese(&op, 1);
  536. return new FloatRechnung(params, (Operator)op);
  537. }
  538. case FLOAT_AUS_INTEGER:
  539. return new FloatAusInteger(params);
  540. case FLOAT_AUS_TEXT:
  541. return new FloatAusText(params);
  542. case TEXT_AUS_FLOAT:
  543. return new TextAusFloat(params);
  544. case FLOAT_ZUFALL:
  545. return new FloatZufall(params);
  546. case INTEGER_AUS_FLOAT:
  547. return new IntegerAusFloat(params);
  548. case BESTENLISTE_NEU:
  549. return new BestenlisteNeu(params);
  550. case BESTENLISTE_ADD_SPALTE:
  551. return new BestenlisteAddSpalte(params);
  552. case BESTENLISTE_ADD_ZEILE:
  553. return new BestenlisteAddZeile(params);
  554. case BESTENLISTE_SET_WERT:
  555. return new BestenlisteSetWert(params);
  556. case BESTENLISTE_GET_WERT:
  557. return new BestenlisteGetWert(params);
  558. case SCHALTER_MIT_NUMMER:
  559. return new SchalterMitNummer(params);
  560. case BASE_MIT_NUMMER:
  561. return new BaseMitNummer(params);
  562. case TEAM_MIT_NUMMER:
  563. return new TeamMitNummer(params);
  564. case TEAM_VON_BASE:
  565. return new TeamVonBase(params);
  566. case SPIELER_MIT_NUMMER:
  567. return new SpielerMitNummer(params);
  568. }
  569. params->release();
  570. return new KonstantNichts();
  571. }
  572. void MapReader::writeAktion(Aktion* zAk, Datei& dat)
  573. {
  574. int id = zAk->getTyp();
  575. dat.schreibe((char*)&id, 4);
  576. unsigned char pAnz = (unsigned char)zAk->zSubActions()->getEintragAnzahl();
  577. dat.schreibe((char*)&pAnz, 1);
  578. for (auto e : *zAk->zSubActions())
  579. {
  580. writeAktion(e, dat);
  581. e->writeOptions(dat);
  582. }
  583. }
  584. // nicht constant
  585. void MapReader::ladeKarte(Spiel* zSpiel)
  586. {
  587. if (!pfad)
  588. return;
  589. SpielerTeamStruktur sts;
  590. Text* pf = new Text(pfad->getText());
  591. pf->append("sts.ltgd");
  592. Datei* datei = new Datei();
  593. datei->setDatei(pf);
  594. if (!datei->existiert() || datei->istOrdner())
  595. {
  596. datei->release();
  597. return;
  598. }
  599. datei->open(Datei::Style::lesen);
  600. datei->lese((char*)&sts.spielerAnzahl, 4);
  601. datei->lese((char*)&sts.teamAnzahl, 4);
  602. for (int i = 0; i < sts.spielerAnzahl; i++)
  603. {
  604. int farbe = 0;
  605. datei->lese((char*)&farbe, 4);
  606. sts.spielerFarbe.set(farbe, i);
  607. }
  608. for (int i = 0; i < sts.teamAnzahl; i++)
  609. {
  610. int farbe = 0;
  611. datei->lese((char*)&farbe, 4);
  612. sts.teamFarbe.set(farbe, i);
  613. }
  614. for (int i = 0; i < sts.teamAnzahl; i++)
  615. {
  616. char len = 0;
  617. datei->lese(&len, 1);
  618. char* txt = new char[len + 1];
  619. txt[(int)len] = 0;
  620. datei->lese(txt, len);
  621. Text* name = new Text(txt);
  622. delete[] txt;
  623. sts.teamName.set(name, i);
  624. }
  625. for (int i = 0; i < sts.teamAnzahl; i++)
  626. {
  627. int size = 0;
  628. datei->lese((char*)&size, 4);
  629. sts.teamSize.set(size, i);
  630. }
  631. datei->close();
  632. datei->release();
  633. pf = new Text(pfad->getText());
  634. pf->append("data.map");
  635. Datei mapFile;
  636. mapFile.setDatei(pf);
  637. if (!mapFile.existiert() || mapFile.istOrdner())
  638. return;
  639. mapFile.open(Datei::Style::lesen);
  640. // map Size
  641. int width;
  642. int height;
  643. mapFile.lese((char*)&width, 4);
  644. mapFile.lese((char*)&height, 4);
  645. zSpiel->setMapSize(width, height);
  646. // teams
  647. for (int i = 0; i < sts.teamAnzahl; i++)
  648. {
  649. int maxWbZeit;
  650. int punkte;
  651. mapFile.lese((char*)&maxWbZeit, 4);
  652. mapFile.lese((char*)&punkte, 4);
  653. zSpiel->addTeam(new Team(i, sts.teamSize.get(i), punkte, maxWbZeit, sts.teamFarbe.get(i), sts.teamName.z(i)->getText()));
  654. }
  655. // spieler
  656. int team = 0;
  657. int maxT = sts.teamSize.get(team);
  658. for (int i = 0; i < sts.spielerAnzahl; i++)
  659. {
  660. int spawnX;
  661. int spawnY;
  662. mapFile.lese((char*)&spawnX, 4);
  663. mapFile.lese((char*)&spawnY, 4);
  664. if (i >= maxT)
  665. {
  666. team++;
  667. if (sts.teamSize.hat(team))
  668. maxT += sts.teamSize.get(team);
  669. }
  670. zSpiel->addSpieler(new Spieler(i, zSpiel->getTeam(team), spawnX, spawnY, sts.spielerFarbe.get(i)));
  671. }
  672. // Barieren
  673. int anz = 0;
  674. mapFile.lese((char*)&anz, 4);
  675. for (int i = 0; i < anz; i++)
  676. {
  677. int x;
  678. int y;
  679. int breite;
  680. int height;
  681. int style;
  682. int verschiebungWeite;
  683. int autoSchaltungMaxTime;
  684. int team;
  685. int id;
  686. mapFile.lese((char*)&id, 4);
  687. mapFile.lese((char*)&x, 4);
  688. mapFile.lese((char*)&y, 4);
  689. mapFile.lese((char*)&breite, 4);
  690. mapFile.lese((char*)&height, 4);
  691. mapFile.lese((char*)&style, 4);
  692. mapFile.lese((char*)&verschiebungWeite, 4);
  693. mapFile.lese((char*)&autoSchaltungMaxTime, 4);
  694. mapFile.lese((char*)&team, 4);
  695. zSpiel->addBariere(new Bariere(id, x, y, breite, height, style, verschiebungWeite, autoSchaltungMaxTime, zSpiel->getTeam(team)));
  696. }
  697. // Basen
  698. mapFile.lese((char*)&anz, 4);
  699. for (int i = 0; i < anz; i++)
  700. {
  701. int x;
  702. int y;
  703. int breite;
  704. int height;
  705. int maxTime;
  706. int team;
  707. int id;
  708. bool showTimer;
  709. int timerX;
  710. int timerY;
  711. int timerFarbe;
  712. mapFile.lese((char*)&id, 4);
  713. mapFile.lese((char*)&x, 4);
  714. mapFile.lese((char*)&y, 4);
  715. mapFile.lese((char*)&breite, 4);
  716. mapFile.lese((char*)&height, 4);
  717. mapFile.lese((char*)&maxTime, 4);
  718. mapFile.lese((char*)&team, 4);
  719. mapFile.lese((char*)&showTimer, 1);
  720. mapFile.lese((char*)&timerX, 4);
  721. mapFile.lese((char*)&timerY, 4);
  722. mapFile.lese((char*)&timerFarbe, 4);
  723. zSpiel->addBase(new Base(id, x, y, breite, height, showTimer, Punkt(timerX, timerY), timerFarbe, maxTime, zSpiel->getTeam(team)));
  724. }
  725. // Drops
  726. mapFile.lese((char*)&anz, 4);
  727. for (int i = 0; i < anz; i++)
  728. {
  729. int minX;
  730. int minY;
  731. int maxX;
  732. int maxY;
  733. int maxTime;
  734. int numDrops;
  735. float wahrscheinlichkeit[ITEMANZAHL];
  736. int id;
  737. mapFile.lese((char*)&id, 4);
  738. mapFile.lese((char*)&minX, 4);
  739. mapFile.lese((char*)&minY, 4);
  740. mapFile.lese((char*)&maxX, 4);
  741. mapFile.lese((char*)&maxY, 4);
  742. mapFile.lese((char*)&maxTime, 4);
  743. mapFile.lese((char*)&numDrops, 4);
  744. for (int j = KEIN_GEGENSTAND; j < ITEMANZAHL; j++)
  745. mapFile.lese((char*)&wahrscheinlichkeit[j], 4);
  746. char len;
  747. mapFile.lese((char*)&len, 1);
  748. char* name = new char[(int)len + 1];
  749. mapFile.lese(name, len);
  750. name[(int)len] = 0;
  751. zSpiel->addDrop(new Drop(id, minX, maxX, minY, maxY, maxTime, numDrops, name, wahrscheinlichkeit));
  752. delete[] name;
  753. }
  754. // Schalter
  755. mapFile.lese((char*)&anz, 4);
  756. for (int i = 0; i < anz; i++)
  757. {
  758. int x;
  759. int y;
  760. int breite;
  761. int height;
  762. bool aktive;
  763. int id;
  764. mapFile.lese((char*)&id, 4);
  765. mapFile.lese((char*)&x, 4);
  766. mapFile.lese((char*)&y, 4);
  767. mapFile.lese((char*)&breite, 4);
  768. mapFile.lese((char*)&height, 4);
  769. mapFile.lese((char*)&aktive, 1);
  770. zSpiel->addSchalter(new Schalter(id, x, y, breite, height, aktive));
  771. }
  772. // Schiene
  773. mapFile.lese((char*)&anz, 4);
  774. for (int i = 0; i < anz; i++)
  775. {
  776. int x;
  777. int y;
  778. int breite;
  779. int height;
  780. int id;
  781. mapFile.lese((char*)&id, 4);
  782. mapFile.lese((char*)&x, 4);
  783. mapFile.lese((char*)&y, 4);
  784. mapFile.lese((char*)&breite, 4);
  785. mapFile.lese((char*)&height, 4);
  786. zSpiel->addSchiene(new Schiene(id, x, y, breite, height));
  787. }
  788. // Timer
  789. mapFile.lese((char*)&anz, 4);
  790. for (int i = 0; i < anz; i++)
  791. {
  792. int x;
  793. int y;
  794. int maxZeit;
  795. bool sichtbar;
  796. bool autoWiederhohlung;
  797. bool runns;
  798. int farbe;
  799. int id;
  800. mapFile.lese((char*)&id, 4);
  801. mapFile.lese((char*)&x, 4);
  802. mapFile.lese((char*)&y, 4);
  803. mapFile.lese((char*)&maxZeit, 4);
  804. mapFile.lese((char*)&sichtbar, 1);
  805. mapFile.lese((char*)&autoWiederhohlung, 1);
  806. mapFile.lese((char*)&runns, 1);
  807. mapFile.lese((char*)&farbe, 4);
  808. char len;
  809. mapFile.lese((char*)&len, 1);
  810. char* name = new char[(int)len + 1];
  811. mapFile.lese(name, len);
  812. name[(int)len] = 0;
  813. zSpiel->addTimer(new Timer(id, name, maxZeit, x, y, sichtbar, autoWiederhohlung, runns, farbe));
  814. delete[] name;
  815. }
  816. // Tunnel
  817. mapFile.lese((char*)&anz, 4);
  818. for (int i = 0; i < anz; i++)
  819. {
  820. int x;
  821. int y;
  822. int breite;
  823. int height;
  824. int zielX;
  825. int zielY;
  826. bool aktiv;
  827. int id;
  828. mapFile.lese((char*)&id, 4);
  829. mapFile.lese((char*)&x, 4);
  830. mapFile.lese((char*)&y, 4);
  831. mapFile.lese((char*)&breite, 4);
  832. mapFile.lese((char*)&height, 4);
  833. mapFile.lese((char*)&zielX, 4);
  834. mapFile.lese((char*)&zielY, 4);
  835. mapFile.lese((char*)&aktiv, 1);
  836. zSpiel->addTunnel(new Tunnel(id, x, y, breite, height, zielX, zielY, aktiv));
  837. }
  838. // Umlenkungen
  839. mapFile.lese((char*)&anz, 4);
  840. for (int i = 0; i < anz; i++)
  841. {
  842. int x;
  843. int y;
  844. int breite;
  845. int height;
  846. char richtung;
  847. int maxAbklingzeit;
  848. bool drehend;
  849. bool aktiv;
  850. int id;
  851. mapFile.lese((char*)&id, 4);
  852. mapFile.lese((char*)&x, 4);
  853. mapFile.lese((char*)&y, 4);
  854. mapFile.lese((char*)&breite, 4);
  855. mapFile.lese((char*)&height, 4);
  856. mapFile.lese((char*)&richtung, 1);
  857. mapFile.lese((char*)&maxAbklingzeit, 4);
  858. mapFile.lese((char*)&drehend, 1);
  859. mapFile.lese((char*)&aktiv, 1);
  860. zSpiel->addUmlenkung(new Umlenkung(id, x, y, breite, height, (Richtung)richtung, maxAbklingzeit, drehend, aktiv));
  861. }
  862. // Trigger
  863. mapFile.lese((char*)&anz, 4);
  864. for (int i = 0; i < anz; i++)
  865. {
  866. int id;
  867. mapFile.lese((char*)&id, 4);
  868. char len;
  869. mapFile.lese((char*)&len, 1);
  870. char* name = new char[(int)len + 1];
  871. mapFile.lese(name, len);
  872. name[(int)len] = 0;
  873. int ereignisAnzahl;
  874. int bedingungAnzahl;
  875. int aktionAnzahl;
  876. mapFile.lese((char*)&ereignisAnzahl, 4);
  877. mapFile.lese((char*)&bedingungAnzahl, 4);
  878. mapFile.lese((char*)&aktionAnzahl, 4);
  879. EreignisTyp* ereignisse = new EreignisTyp[ereignisAnzahl];
  880. for (int j = 0; j < ereignisAnzahl; j++)
  881. mapFile.lese((char*)&ereignisse[j], 4);
  882. RCArray< Bedingung >* bedingungen = new RCArray< Bedingung >();
  883. for (int j = 0; j < bedingungAnzahl; j++)
  884. bedingungen->add(new Bedingung(readAktion(mapFile)));
  885. RCArray< Aktion >* aktionen = new RCArray< Aktion >();
  886. for (int j = 0; j < aktionAnzahl; j++)
  887. aktionen->add(readAktion(mapFile));
  888. zSpiel->addTrigger(new Trigger(id, name, ereignisAnzahl, ereignisse, bedingungen, aktionen));
  889. delete[] name;
  890. }
  891. // Variablen
  892. mapFile.lese((char*)&anz, 4);
  893. for (int i = 0; i < anz; i++)
  894. {
  895. char len;
  896. mapFile.lese((char*)&len, 1);
  897. char* name = new char[(int)len + 1];
  898. mapFile.lese(name, len);
  899. name[(int)len] = 0;
  900. char typ;
  901. mapFile.lese(&typ, 1);
  902. char def;
  903. mapFile.lese(&def, 1);
  904. Variable* var;
  905. if (!def)
  906. var = new Variable(NICHTS);
  907. else
  908. {
  909. switch (typ)
  910. {
  911. case NICHTS:
  912. var = new Variable(NICHTS);
  913. break;
  914. case INTEGER:
  915. {
  916. int val;
  917. mapFile.lese((char*)&val, 4);
  918. var = new Integer(val);
  919. break;
  920. }
  921. case BOOLEAN:
  922. {
  923. bool val;
  924. mapFile.lese((char*)&val, 1);
  925. var = new Boolean(val);
  926. break;
  927. }
  928. case STRING:
  929. {
  930. char len;
  931. mapFile.lese((char*)&len, 1);
  932. char* value = new char[(int)len + 1];
  933. mapFile.lese(value, len);
  934. value[(int)len] = 0;
  935. var = new String(value);
  936. delete[] value;
  937. break;
  938. }
  939. case RICHTUNG:
  940. {
  941. char len;
  942. mapFile.lese((char*)&len, 1);
  943. char* value = new char[(int)len + 1];
  944. mapFile.lese(value, len);
  945. value[(int)len] = 0;
  946. var = new String(getRichtungFromString(Text(value)));
  947. delete[] value;
  948. break;
  949. }
  950. case FLOAT:
  951. {
  952. float val;
  953. mapFile.lese((char*)&val, 4);
  954. var = new Float(val);
  955. break;
  956. }
  957. case TASTE:
  958. {
  959. char val;
  960. mapFile.lese(&val, 1);
  961. var = new Integer(val, 1);
  962. break;
  963. }
  964. case SPIELER:
  965. {
  966. int id;
  967. mapFile.lese((char*)&id, 4);
  968. var = zSpiel->getSpieler(id);
  969. break;
  970. }
  971. case TIMER:
  972. {
  973. int id;
  974. mapFile.lese((char*)&id, 4);
  975. var = zSpiel->getTimer(id);
  976. break;
  977. }
  978. case TEAM:
  979. {
  980. int id;
  981. mapFile.lese((char*)&id, 4);
  982. var = zSpiel->getTeam(id);
  983. break;
  984. }
  985. case BARIERE:
  986. {
  987. int id;
  988. mapFile.lese((char*)&id, 4);
  989. var = zSpiel->getBariere(id);
  990. break;
  991. }
  992. case SCHALTER:
  993. {
  994. int id;
  995. mapFile.lese((char*)&id, 4);
  996. var = zSpiel->getSchalter(id);
  997. break;
  998. }
  999. case BASE:
  1000. {
  1001. int id;
  1002. mapFile.lese((char*)&id, 4);
  1003. var = zSpiel->getBase(id);
  1004. break;
  1005. }
  1006. case GEGENSTAND:
  1007. {
  1008. int id;
  1009. mapFile.lese((char*)&id, 4);
  1010. var = new GegenstandTypVar((GegenstandTyp)id);
  1011. break;
  1012. }
  1013. case SCHIENE:
  1014. {
  1015. int id;
  1016. mapFile.lese((char*)&id, 4);
  1017. var = zSpiel->getSchiene(id);
  1018. break;
  1019. }
  1020. case TUNNEL:
  1021. {
  1022. int id;
  1023. mapFile.lese((char*)&id, 4);
  1024. var = zSpiel->getTunnel(id);
  1025. break;
  1026. }
  1027. case UMLENKUNG:
  1028. {
  1029. int id;
  1030. mapFile.lese((char*)&id, 4);
  1031. var = zSpiel->getUmlenkung(id);
  1032. break;
  1033. }
  1034. case TRIGGER:
  1035. {
  1036. int id;
  1037. mapFile.lese((char*)&id, 4);
  1038. var = zSpiel->getTrigger(id);
  1039. break;
  1040. }
  1041. default:
  1042. var = new Variable(NICHTS);
  1043. }
  1044. }
  1045. zSpiel->addVariable(name, var);
  1046. delete[] name;
  1047. }
  1048. mapFile.close();
  1049. }