Reader.cpp 33 KB

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