Reader.cpp 34 KB

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