Reader.cpp 32 KB

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