Reader.cpp 36 KB

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