Reader.cpp 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047
  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_NICHTS:
  363. params->release();
  364. return new KonstantNichts();
  365. case KONSTANT_STRING:
  366. {
  367. params->release();
  368. char len;
  369. dat.lese( &len, 1 );
  370. char *txt = new char[ len + 1 ];
  371. dat.lese( txt, len );
  372. txt[ (int)len ] = 0;
  373. Aktion *ret = new KonstantString( txt );
  374. delete[] txt;
  375. return ret;
  376. }
  377. case KONSTANT_VARIABLE:
  378. {
  379. params->release();
  380. char len;
  381. dat.lese( &len, 1 );
  382. char *txt = new char[ len + 1 ];
  383. dat.lese( txt, len );
  384. txt[ (int)len ] = 0;
  385. Aktion *ret = new KonstantVariable( txt );
  386. delete[] txt;
  387. return ret;
  388. }
  389. case RICHTUNG_VON_GESCHOSS:
  390. return new RichtungVonGeschoss( params );
  391. case RICHTUNG_VON_UMLENKUNG:
  392. return new RichtungVonUmlenkung( params );
  393. case RICHTUNG_ZUFALL:
  394. params->release();
  395. return new RichtungZufall();
  396. case SCHALTER_AKTIVIEREN:
  397. return new SchalterAktivieren( params );
  398. case SCHALTER_SET_ERLAUBT:
  399. return new SchalterSetErlaubt( params );
  400. case SCHALTER_ZUFALL:
  401. params->release();
  402. return new SchalterZufall();
  403. case SCHALTER_ZULETZT_AKTIVIERT:
  404. params->release();
  405. return new SchalterZuletztAktiviert();
  406. case SET_VARIABLE:
  407. {
  408. char len;
  409. dat.lese( &len, 1 );
  410. char *txt = new char[ len + 1 ];
  411. dat.lese( txt, len );
  412. txt[ (int)len ] = 0;
  413. Aktion *ret = new SetVariable( txt, params );
  414. delete[] txt;
  415. return ret;
  416. }
  417. case SPIEL_ENDE:
  418. return new SpielEnde( params );
  419. case SPIELER_GIVE_ITEM:
  420. return new SpielerGiveItem( params );
  421. case SPIELER_NACHRICHT:
  422. return new SpielerNachricht( params );
  423. case SPIELER_REMOVE_ITEM:
  424. return new SpielerRemoveItem( params );
  425. case SPIELER_SET_ABKLINGZEITVERRINGERUNG:
  426. return new SpielerSetAbklingzeitverringerung( params );
  427. case SPIELER_SET_ARMOR:
  428. return new SpielerSetArmor( params );
  429. case SPIELER_SET_ERFAHRUNG:
  430. return new SpielerSetErfahrung( params );
  431. case SPIELER_SET_LEBEN:
  432. return new SpielerSetLeben( params );
  433. case SPIELER_SET_LEBENSRAUB:
  434. return new SpielerSetLebensraub( params );
  435. case SPIELER_SET_LEBENSREGENERATION:
  436. return new SpielerSetLebensraub( params );
  437. case SPIELER_SET_LEVEL:
  438. return new SpielerSetLevel( params );
  439. case SPIELER_SET_MAX_ERFAHRUNG:
  440. return new SpielerSetMaxErfahrung( params );
  441. case SPIELER_SET_SCHADEN_BONUS:
  442. return new SpielerSetSchadenBonus( params );
  443. case SPIELER_SET_TEMPO:
  444. return new SpielerSetTempo( params );
  445. case SPIELER_SET_GESCHOSS_TEMPO:
  446. return new SpielerSetWaffenTempo( params );
  447. case SPIELER_ZUFALL:
  448. params->release();
  449. return new SpielerZufall();
  450. case SPIELER_ZUFALL_AUS_TEAM:
  451. return new SpielerZufallAusTeam( params );
  452. case SPIELER_ZULETZT_ERFAHRUNG_BEKOMMEN:
  453. return new SpielerZuletztErfahrungBekommen();
  454. case SPIELER_ZULETZT_GEGENSTAND_AKTIVIERT:
  455. params->release();
  456. return new SpielerZuletztGegenstandAktiviert();
  457. case SPIELER_ZULETZT_GEGENSTAND_AUFGEHOBEN:
  458. params->release();
  459. return new SpielerZuletztGegenstandAufgehoben();
  460. case SPIELER_ZULETZT_GEHEILT:
  461. params->release();
  462. return new SpielerZuletztGeheilt();
  463. case SPIELER_ZULETZT_GESCHOSSEN:
  464. params->release();
  465. return new SpielerZuletztGeschossGeschossen();
  466. case SPIELER_ZULETZT_GESTORBEN:
  467. params->release();
  468. return new SpielerZuletztGestorben();
  469. case SPIELER_ZULETZT_LEVEL_UP:
  470. params->release();
  471. return new SpielerZuletztLevelUp();
  472. case SPIELER_ZULETZT_SCHADEN_GEMACHT:
  473. params->release();
  474. return new SpielerZuletztSchadenGemacht();
  475. case SPIELER_ZULETZT_SCHADEN_GENOMMEN:
  476. params->release();
  477. return new SpielerZuletztSchadenGenommen();
  478. case SPIELER_ZULETZT_SCHALTER_AKTIVIERT:
  479. params->release();
  480. return new SpielerZuletztSchalterAktiviert();
  481. case SPIELER_ZULETZT_TUNNEL_BENUTZT:
  482. params->release();
  483. return new SpielerZuletztTunnelBenutzt();
  484. case SPIELER_ZULETZT_WIEDERBELEBT:
  485. params->release();
  486. return new SpielerZuletztWiederbelebent();
  487. case SPIEL_PAUSE:
  488. return new SpielPause( params );
  489. case TEAM_SET_PUNKTE:
  490. return new TeamSetPunkte( params );
  491. case TEAM_VON_BARIERE:
  492. return new TeamVonBariere( params );
  493. case TEAM_VON_SPIELER:
  494. return new TeamVonSpieler( params );
  495. case TEAM_ZUFALL:
  496. params->release();
  497. return new TeamZufall();
  498. case TEXT_AUS_BOOLEAN:
  499. return new TextAusBoolean( params );
  500. case TEXT_AUS_RICHTUNG:
  501. return new TextAusRichtung( params );
  502. case TEXT_AUS_INTEGER:
  503. return new TextAusInteger( params );
  504. case TEXT_CONCAT:
  505. return new TextConcat( params );
  506. case TEXT_ITEM_NAME:
  507. return new TextItemName( params );
  508. case TEXT_SPIELER_NAME:
  509. return new TextSpielerName( params );
  510. case TEXT_TEIL_VON_TEXT:
  511. return new TextTeilVonText( params );
  512. case TEXT_TRIGGER_NAME:
  513. return new TextTriggerName( params );
  514. case TIMER_SET_PAUSE:
  515. return new TimerSetPause( params );
  516. case TIMER_SET_SICHTBAR:
  517. return new TimerSetSichtbar( params );
  518. case TIMER_SET_ZEIT:
  519. return new TimerSetZeit( params );
  520. case TIMER_START:
  521. return new TimerStart( params );
  522. case TIMER_ZUFALL:
  523. params->release();
  524. return new TimerZufall();
  525. case TIMER_ZULETZT_ABGELAUFEN:
  526. params->release();
  527. return new TimerZuletztAbgelaufen();
  528. case TIMER_ZULETZT_FOTOGRAFIERT:
  529. params->release();
  530. return new TimerZuletztFortgesetzt();
  531. case TIMER_ZULETZT_GESTARTET:
  532. params->release();
  533. return new TimerZuletztGestartet();
  534. case TIMER_ZULETZT_PAUSIERT:
  535. params->release();
  536. return new TimerZuletztPausiert();
  537. case TRIGGER_AKTION:
  538. return new TriggerAktion( params );
  539. case TRIGGER_LAST_RUNNED:
  540. params->release();
  541. return new TriggerLastRunned();
  542. case TRIGGER_RUN_START:
  543. return new TriggerRunStart( params );
  544. case TRIGGER_SET_ENABLED:
  545. return new TriggerSetEnabled( params );
  546. case TRIGGER_ZUFALL:
  547. params->release();
  548. return new TriggerZufall();
  549. case TUNNEL_SET_ERLAUBT:
  550. return new TunnelSetErlaubt( params );
  551. case TUNNEL_SET_ZIEL_POSITION:
  552. return new TunnelSetZielPosition( params );
  553. case TUNNEL_ZUFALL:
  554. params->release();
  555. return new TunnelZufall();
  556. case TUNNEL_ZULETZT_BENUTZT:
  557. params->release();
  558. return new TunnelZuletztBenutzt();
  559. case UMLENKUNG_SET_ERLAUBT:
  560. return new UmlenkungSetEnabled( params );
  561. case UMLENKUNG_SET_MAX_ABK:
  562. return new UmlenkungSetMaxAbk( params );
  563. case UMLENKUNG_SET_RICHTUNG:
  564. return new UmlenkungSetRichtung( params );
  565. case UMLENKUNG_ZUFALL:
  566. params->release();
  567. return new UmlenkungZufall();
  568. case UMLENKUNG_ZULETZT_BENUTZT:
  569. params->release();
  570. return new UmlenkungZuletztBenutzt();
  571. case WARTEN:
  572. return new Warten( params );
  573. case WENN_DANN_SONST:
  574. return new WennDannSonst( params );
  575. case SEQUENZ:
  576. return new Sequenz( params );
  577. case FLOAT_RECHNUNG:
  578. {
  579. char op;
  580. dat.lese( &op, 1 );
  581. return new FloatRechnung( params, (Operator)op );
  582. }
  583. case FLOAT_AUS_INTEGER:
  584. return new FloatAusInteger( params );
  585. case FLOAT_AUS_TEXT:
  586. return new FloatAusText( params );
  587. case TEXT_AUS_FLOAT:
  588. return new TextAusFloat( params );
  589. case FLOAT_ZUFALL:
  590. return new FloatZufall( params );
  591. case INTEGER_AUS_FLOAT:
  592. return new IntegerAusFloat( params );
  593. }
  594. params->release();
  595. return new KonstantNichts();
  596. }
  597. // nicht constant
  598. void MapReader::ladeKarte( Spiel *zSpiel )
  599. {
  600. if( !pfad )
  601. return;
  602. SpielerTeamStruktur sts;
  603. Text *pf = new Text( pfad->getText() );
  604. pf->append( "data.sts" );
  605. Datei *datei = new Datei();
  606. datei->setDatei( pf );
  607. if( !datei->existiert() || datei->istOrdner() )
  608. {
  609. datei->release();
  610. return;
  611. }
  612. datei->open( Datei::Style::lesen );
  613. datei->lese( (char *)& sts.spielerAnzahl, 4 );
  614. datei->lese( (char *)& sts.teamAnzahl, 4 );
  615. for( int i = 0; i < sts.spielerAnzahl; i++ )
  616. {
  617. int farbe = 0;
  618. datei->lese( (char *)& farbe, 4 );
  619. sts.spielerFarbe.set( farbe, i );
  620. }
  621. for( int i = 0; i < sts.teamAnzahl; i++ )
  622. {
  623. int farbe = 0;
  624. datei->lese( (char *)& farbe, 4 );
  625. sts.teamFarbe.set( farbe, i );
  626. }
  627. for( int i = 0; i < sts.teamAnzahl; i++ )
  628. {
  629. char len = 0;
  630. datei->lese( &len, 1 );
  631. char *txt = new char[ len + 1 ];
  632. txt[ (int)len ] = 0;
  633. datei->lese( txt, len );
  634. Text *name = new Text( txt );
  635. delete[] txt;
  636. sts.teamName.set( name, i );
  637. }
  638. for( int i = 0; i < sts.teamAnzahl; i++ )
  639. {
  640. int size = 0;
  641. datei->lese( (char *)& size, 4 );
  642. sts.teamSize.set( size, i );
  643. }
  644. datei->close();
  645. datei->release();
  646. pf = new Text( pfad->getText() );
  647. pf->append( "data.map" );
  648. Datei mapFile;
  649. mapFile.setDatei( pf );
  650. if( !mapFile.existiert() || mapFile.istOrdner() )
  651. return;
  652. mapFile.open( Datei::Style::lesen );
  653. // map Size
  654. int width;
  655. int height;
  656. mapFile.lese( (char *)& width, 4 );
  657. mapFile.lese( (char *)& height, 4 );
  658. zSpiel->setMapSize( width, height );
  659. // teams
  660. for( int i = 0; i < sts.teamAnzahl; i++ )
  661. {
  662. int maxWbZeit;
  663. int punkte;
  664. mapFile.lese( (char *)& maxWbZeit, 4 );
  665. mapFile.lese( (char *)& punkte, 4 );
  666. zSpiel->addTeam( new Team( i, sts.teamSize.get( i ), punkte, maxWbZeit, sts.teamFarbe.get( i ), sts.teamName.z( i )->getText() ) );
  667. }
  668. // spieler
  669. int team = 0;
  670. int maxT = sts.teamSize.get( team );
  671. for( int i = 0; i < sts.spielerAnzahl; i++ )
  672. {
  673. int spawnX;
  674. int spawnY;
  675. mapFile.lese( (char *)& spawnX, 4 );
  676. mapFile.lese( (char *)& spawnY, 4 );
  677. if( i >= maxT )
  678. team++;
  679. if( sts.teamSize.hat( team ) )
  680. maxT += sts.teamSize.get( team );
  681. zSpiel->addSpieler( new Spieler( zSpiel->zResources(), i, zSpiel->getTeam( team ), spawnX, spawnY, sts.spielerFarbe.get( i ) ) );
  682. }
  683. // Barieren
  684. int anz = 0;
  685. mapFile.lese( (char *)& anz, 4 );
  686. for( int i = 0; i < anz; i++ )
  687. {
  688. int x;
  689. int y;
  690. int breite;
  691. int height;
  692. int style;
  693. int verschiebungWeite;
  694. int autoSchaltungMaxTime;
  695. int team;
  696. mapFile.lese( (char *)& x, 4 );
  697. mapFile.lese( (char *)& y, 4 );
  698. mapFile.lese( (char *)& breite, 4 );
  699. mapFile.lese( (char *)& height, 4 );
  700. mapFile.lese( (char *)& style, 4 );
  701. mapFile.lese( (char *)& verschiebungWeite, 4 );
  702. mapFile.lese( (char *)& autoSchaltungMaxTime, 4 );
  703. mapFile.lese( (char *)& team, 4 );
  704. zSpiel->addBariere( new Bariere( zSpiel->zResources(), zSpiel->getNextId(), x, y, breite, height, style, verschiebungWeite, autoSchaltungMaxTime, zSpiel->getTeam( team ) ) );
  705. }
  706. // Basen
  707. mapFile.lese( (char *)& anz, 4 );
  708. for( int i = 0; i < anz; i++ )
  709. {
  710. int x;
  711. int y;
  712. int breite;
  713. int height;
  714. int maxTime;
  715. int team;
  716. mapFile.lese( (char *)& x, 4 );
  717. mapFile.lese( (char *)& y, 4 );
  718. mapFile.lese( (char *)& breite, 4 );
  719. mapFile.lese( (char *)& height, 4 );
  720. mapFile.lese( (char *)& maxTime, 4 );
  721. mapFile.lese( (char *)& team, 4 );
  722. zSpiel->addBase( new Base( zSpiel->zResources(), zSpiel->getNextId(), x, y, breite, height, maxTime, zSpiel->getTeam( team ) ) );
  723. }
  724. // Drops
  725. mapFile.lese( (char *)& anz, 4 );
  726. for( int i = 0; i < anz; i++ )
  727. {
  728. int minX;
  729. int minY;
  730. int maxX;
  731. int maxY;
  732. int maxTime;
  733. int numDrops;
  734. float wahrscheinlichkeit[ ITEMANZAHL ];
  735. mapFile.lese( (char *)& minX, 4 );
  736. mapFile.lese( (char *)& minY, 4 );
  737. mapFile.lese( (char *)& maxX, 4 );
  738. mapFile.lese( (char *)& maxY, 4 );
  739. mapFile.lese( (char *)& maxTime, 4 );
  740. mapFile.lese( (char *)& numDrops, 4 );
  741. for( int j = KEIN_GEGENSTAND; j < ITEMANZAHL; j++ )
  742. mapFile.lese( (char *)& wahrscheinlichkeit[ j ], 4 );
  743. char len;
  744. mapFile.lese( (char *)& len, 1 );
  745. char *name = new char[ (int)len + 1 ];
  746. mapFile.lese( name, len );
  747. name[ (int)len ] = 0;
  748. zSpiel->addDrop( new Drop( zSpiel->getNextId(), minX, maxX, minY, maxY, maxTime, numDrops, name, wahrscheinlichkeit ) );
  749. delete[] name;
  750. }
  751. // Schalter
  752. mapFile.lese( (char *)& anz, 4 );
  753. for( int i = 0; i < anz; i++ )
  754. {
  755. int x;
  756. int y;
  757. int breite;
  758. int height;
  759. bool aktive;
  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 *)& aktive, 1 );
  765. zSpiel->addSchalter( new Schalter( zSpiel->zResources(), zSpiel->getNextId(), x, y, breite, height, aktive ) );
  766. }
  767. // Schiene
  768. mapFile.lese( (char *)& anz, 4 );
  769. for( int i = 0; i < anz; i++ )
  770. {
  771. int x;
  772. int y;
  773. int breite;
  774. int height;
  775. mapFile.lese( (char *)& x, 4 );
  776. mapFile.lese( (char *)& y, 4 );
  777. mapFile.lese( (char *)& breite, 4 );
  778. mapFile.lese( (char *)& height, 4 );
  779. zSpiel->addSchiene( new Schiene( zSpiel->zResources(), zSpiel->getNextId(), x, y, breite, height ) );
  780. }
  781. // Timer
  782. mapFile.lese( (char *)& anz, 4 );
  783. for( int i = 0; i < anz; i++ )
  784. {
  785. int x;
  786. int y;
  787. int maxZeit;
  788. bool sichtbar;
  789. bool autoWiederhohlung;
  790. bool runns;
  791. int farbe;
  792. mapFile.lese( (char *)& x, 4 );
  793. mapFile.lese( (char *)& y, 4 );
  794. mapFile.lese( (char *)& maxZeit, 4 );
  795. mapFile.lese( (char *)& sichtbar, 1 );
  796. mapFile.lese( (char *)& autoWiederhohlung, 1 );
  797. mapFile.lese( (char *)& runns, 1 );
  798. mapFile.lese( (char *)& farbe, 4 );
  799. char len;
  800. mapFile.lese( (char *)& len, 1 );
  801. char *name = new char[ (int)len + 1 ];
  802. mapFile.lese( name, len );
  803. name[ (int)len ] = 0;
  804. zSpiel->addTimer( new Timer( zSpiel->getNextId(), name, maxZeit, x, y, sichtbar, autoWiederhohlung, runns, farbe ) );
  805. delete[] name;
  806. }
  807. // Tunnel
  808. mapFile.lese( (char *)& anz, 4 );
  809. for( int i = 0; i < anz; i++ )
  810. {
  811. int x;
  812. int y;
  813. int breite;
  814. int height;
  815. int zielX;
  816. int zielY;
  817. bool aktiv;
  818. mapFile.lese( (char *)& x, 4 );
  819. mapFile.lese( (char *)& y, 4 );
  820. mapFile.lese( (char *)& breite, 4 );
  821. mapFile.lese( (char *)& height, 4 );
  822. mapFile.lese( (char *)& zielX, 4 );
  823. mapFile.lese( (char *)& zielY, 4 );
  824. mapFile.lese( (char *)& aktiv, 1 );
  825. zSpiel->addTunnel( new Tunnel( zSpiel->zResources(), zSpiel->getNextId(), x, y, breite, height, zielX, zielY, aktiv ) );
  826. }
  827. // Umlenkungen
  828. mapFile.lese( (char *)& anz, 4 );
  829. for( int i = 0; i < anz; i++ )
  830. {
  831. int x;
  832. int y;
  833. int breite;
  834. int height;
  835. char richtung;
  836. int maxAbklingzeit;
  837. bool drehend;
  838. bool aktiv;
  839. mapFile.lese( (char *)& x, 4 );
  840. mapFile.lese( (char *)& y, 4 );
  841. mapFile.lese( (char *)& breite, 4 );
  842. mapFile.lese( (char *)& height, 4 );
  843. mapFile.lese( (char *)& richtung, 1 );
  844. mapFile.lese( (char *)& maxAbklingzeit, 4 );
  845. mapFile.lese( (char *)& drehend, 1 );
  846. mapFile.lese( (char *)& aktiv, 1 );
  847. zSpiel->addUmlenkung( new Umlenkung( zSpiel->zResources(), zSpiel->getNextId(), x, y, breite, height, (Richtung)richtung, maxAbklingzeit, drehend, aktiv ) );
  848. }
  849. // Trigger
  850. mapFile.lese( (char *)& anz, 4 );
  851. for( int i = 0; i < anz; i++ )
  852. {
  853. char len;
  854. mapFile.lese( (char *)& len, 1 );
  855. char *name = new char[ (int)len + 1 ];
  856. mapFile.lese( name, len );
  857. name[ (int)len ] = 0;
  858. int ereignisAnzahl;
  859. int bedingungAnzahl;
  860. int aktionAnzahl;
  861. mapFile.lese( (char *)& ereignisAnzahl, 4 );
  862. mapFile.lese( (char *)& bedingungAnzahl, 4 );
  863. mapFile.lese( (char *)& aktionAnzahl, 4 );
  864. EreignisTyp *ereignisse = new EreignisTyp[ ereignisAnzahl ];
  865. for( int j = 0; j < ereignisAnzahl; j++ )
  866. mapFile.lese( (char *)& ereignisse[ j ], 4 );
  867. RCArray< Bedingung > *bedingungen = new RCArray< Bedingung >();
  868. for( int j = 0; j < bedingungAnzahl; j++ )
  869. bedingungen->add( new Bedingung( readAktion( mapFile ) ) );
  870. RCArray< Aktion > *aktionen = new RCArray< Aktion >();
  871. for( int j = 0; j < aktionAnzahl; j++ )
  872. aktionen->add( readAktion( mapFile ) );
  873. zSpiel->addTrigger( new Trigger( zSpiel->getNextId(), name, ereignisAnzahl, ereignisse, bedingungen, aktionen ) );
  874. delete[] name;
  875. }
  876. // Variablen
  877. mapFile.lese( (char *)& anz, 4 );
  878. for( int i = 0; i < anz; i++ )
  879. {
  880. char len;
  881. mapFile.lese( (char *)& len, 1 );
  882. char *name = new char[ (int)len + 1 ];
  883. mapFile.lese( name, len );
  884. name[ (int)len ] = 0;
  885. char typ;
  886. mapFile.lese( &typ, 1 );
  887. Variable *var = 0;
  888. switch( typ )
  889. {
  890. case NICHTS:
  891. var = new Variable( NICHTS );
  892. break;
  893. case INTEGER:
  894. {
  895. int val;
  896. mapFile.lese( (char *)& val, 4 );
  897. var = new Integer( val );
  898. break;
  899. }
  900. case BOOLEAN:
  901. {
  902. bool val;
  903. mapFile.lese( (char *)& val, 1 );
  904. var = new Boolean( val );
  905. break;
  906. }
  907. case STRING:
  908. {
  909. char len;
  910. mapFile.lese( (char *)& len, 1 );
  911. char *value = new char[ (int)len + 1 ];
  912. mapFile.lese( value, len );
  913. value[ (int)len ] = 0;
  914. var = new String( value );
  915. delete[] value;
  916. break;
  917. }
  918. case RICHTUNG:
  919. {
  920. char len;
  921. mapFile.lese( (char *)& len, 1 );
  922. char *value = new char[ (int)len + 1 ];
  923. mapFile.lese( value, len );
  924. value[ (int)len ] = 0;
  925. var = new String( getRichtungFromString( Text( value ) ) );
  926. delete[] value;
  927. break;
  928. }
  929. case FLOAT:
  930. {
  931. float val;
  932. mapFile.lese( (char *)& val, 4 );
  933. var = new Float( val );
  934. break;
  935. }
  936. case TASTE:
  937. {
  938. char val;
  939. mapFile.lese( &val, 1 );
  940. var = new Integer( val, 1 );
  941. break;
  942. }
  943. case SPIELER:
  944. {
  945. int id;
  946. mapFile.lese( (char *)& id, 4 );
  947. var = zSpiel->getSpieler( id );
  948. break;
  949. }
  950. case TIMER:
  951. {
  952. int id;
  953. mapFile.lese( (char *)& id, 4 );
  954. var = zSpiel->getTimer( id );
  955. break;
  956. }
  957. case TEAM:
  958. {
  959. int id;
  960. mapFile.lese( (char *)& id, 4 );
  961. var = zSpiel->getTeam( id );
  962. break;
  963. }
  964. case BARIERE:
  965. {
  966. int id;
  967. mapFile.lese( (char *)& id, 4 );
  968. var = zSpiel->getBariere( id );
  969. break;
  970. }
  971. case SCHALTER:
  972. {
  973. int id;
  974. mapFile.lese( (char *)& id, 4 );
  975. var = zSpiel->getSchalter( id );
  976. break;
  977. }
  978. case BASE:
  979. {
  980. int id;
  981. mapFile.lese( (char *)& id, 4 );
  982. var = zSpiel->getBase( id );
  983. break;
  984. }
  985. case GEGENSTAND:
  986. {
  987. int id;
  988. mapFile.lese( (char *)& id, 4 );
  989. var = new GegenstandTypVar( (GegenstandTyp)id );
  990. break;
  991. }
  992. case SCHIENE:
  993. {
  994. int id;
  995. mapFile.lese( (char *)& id, 4 );
  996. var = zSpiel->getSchiene( id );
  997. break;
  998. }
  999. case TUNNEL:
  1000. {
  1001. int id;
  1002. mapFile.lese( (char *)& id, 4 );
  1003. var = zSpiel->getTunnel( id );
  1004. break;
  1005. }
  1006. case UMLENKUNG:
  1007. {
  1008. int id;
  1009. mapFile.lese( (char *)& id, 4 );
  1010. var = zSpiel->getUmlenkung( id );
  1011. break;
  1012. }
  1013. case TRIGGER:
  1014. {
  1015. int id;
  1016. mapFile.lese( (char *)& id, 4 );
  1017. var = zSpiel->getTrigger( id );
  1018. break;
  1019. }
  1020. }
  1021. zSpiel->addVariable( name, var );
  1022. delete[] name;
  1023. }
  1024. mapFile.close();
  1025. }
  1026. // Reference Counting
  1027. MapReader *MapReader::getThis()
  1028. {
  1029. ref++;
  1030. return this;
  1031. }
  1032. MapReader *MapReader::release()
  1033. {
  1034. if( !--ref )
  1035. delete this;
  1036. return 0;
  1037. }