Reader.cpp 29 KB

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