Reader.cpp 36 KB

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