Reader.cpp 34 KB

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