Reader.cpp 32 KB

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