Map.cpp 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603
  1. #include "Map.h"
  2. #include <InitDatei.h>
  3. #include <Datei.h>
  4. #include <Text.h>
  5. #include <M2Datei.h>
  6. #include <DateiSystem.h>
  7. #include <TastaturEreignis.h>
  8. #include <KSGTDatei.h>
  9. #include <Zeit.h>
  10. #include <Rahmen.h>
  11. #include <Globals.h>
  12. #include <AsynchronCall.h>
  13. #include <Animation.h>
  14. // Inhalt der Map Klasse aus Map.h
  15. // Konstruktor
  16. Map::Map( MinigameKlientV *klient )
  17. {
  18. this->klient = klient;
  19. schuss = new RCArray< Schuss >();
  20. ship = 0;
  21. asteroid = new RCArray< Asteroid >();
  22. aData = new Model2DData*[ 7 ]();
  23. aTextur = new Bild*[ 7 ]();
  24. sData = new Model2DData*[ 2 ]();
  25. sTextur = new Bild*[ 2 ]();
  26. // lade Flammen animation
  27. LTDBDatei flammenStartLTDB;
  28. flammenStartLTDB.setDatei( new Text( "data/Minigames/Asteroids/bilder/f_start.ltdb" ) );
  29. flammenStartLTDB.leseDaten( 0 );
  30. Animation2DData *flammenStart = new Animation2DData();
  31. flammenStart->ladeAnimation( flammenStartLTDB.getThis() );
  32. flammenStart->setFPS( 60 );
  33. flammenStart->setWiederhohlend( 0 );
  34. LTDBDatei flammenLTDB;
  35. flammenLTDB.setDatei( new Text( "data/Minigames/Asteroids/bilder/f_burn.ltdb" ) );
  36. Animation2DData *flammenBurn = new Animation2DData();
  37. flammenBurn->ladeAnimation( flammenLTDB.getThis() );
  38. flammenBurn->setFPS( 60 );
  39. flammenBurn->setWiederhohlend( 1 );
  40. flammenM = new Textur2D();
  41. flammenM->addAnimationZ( flammenStart->getThis() );
  42. flammenM->addAnimationZ( flammenBurn->getThis() );
  43. flammenL = new Textur2D();
  44. flammenL->addAnimationZ( flammenStart->getThis() );
  45. flammenL->addAnimationZ( flammenBurn->getThis() );
  46. flammenR = new Textur2D();
  47. flammenR->addAnimationZ( flammenStart );
  48. flammenR->addAnimationZ( flammenBurn );
  49. M2Datei m2d( "data/Minigames/Asteroids/models/asteroids.m2" );
  50. m2d.leseDaten();
  51. LTDBDatei td;
  52. td.setDatei( new Text( "data/Minigames/Asteroids/bilder/asteroids.ltdb" ) );
  53. td.leseDaten( 0 );
  54. for( int i = 0; i < 7; i++ )
  55. {
  56. Text name = "";
  57. name.append( (char)( 'a' + i ) );
  58. aData[ i ] = m2d.ladeModel( name );
  59. aTextur[ i ] = td.laden( 0, new Text( (char*)( Text( name ) += ".png" ) ) );
  60. }
  61. m2d.setPfad( "data/Minigames/Asteroids/models/ship.m2" );
  62. m2d.leseDaten();
  63. td.setDatei( new Text( "data/Minigames/Asteroids/bilder/ship.ltdb" ) );
  64. td.leseDaten( 0 );
  65. for( int i = 0; i < 2; i++ )
  66. {
  67. Text name = "";
  68. name.append( (char)( 'a' + i ) );
  69. sData[ i ] = m2d.ladeModel( name );
  70. sTextur[ i ] = td.laden( 0, new Text( (char*)( Text( name ) += ".png" ) ) );
  71. }
  72. kam = new LRahmen();
  73. kam->setFarbe( 0xFF777777 );
  74. map = new LRahmen();
  75. map->setFarbe( 0xFFFFFFFF );
  76. map->setPosition( 10, 10 );
  77. map->setSize( 200, 200 );
  78. shipN = 0;
  79. score = 0;
  80. breite = 0;
  81. höhe = 0;
  82. aGröße = 0;
  83. maxTimer = 0;
  84. mTimer = 0;
  85. timer = 0;
  86. beendet = 1;
  87. rend = 0;
  88. gameTime = 0;
  89. tastenStände = 0;
  90. rGen = 0;
  91. ref = 1;
  92. }
  93. // Destruktor
  94. Map::~Map()
  95. {
  96. speichern();
  97. schuss->release();
  98. if( ship )
  99. ship->release();
  100. asteroid->release();
  101. for( int i = 0; i < 7; i++ )
  102. {
  103. aData[ i ]->release();
  104. aTextur[ i ]->release();
  105. }
  106. for( int i = 0; i < 2; i++ )
  107. {
  108. sData[ i ]->release();
  109. sTextur[ i ]->release();
  110. }
  111. delete[] aData;
  112. delete[] aTextur;
  113. delete[] sData;
  114. delete[] sTextur;
  115. kam->release();
  116. map->release();
  117. if( rGen )
  118. rGen->release();
  119. if( klient )
  120. klient->release();
  121. flammenM->release();
  122. flammenL->release();
  123. flammenR->release();
  124. }
  125. // nicht constant
  126. void Map::reset( Text *zOptionen )
  127. {
  128. flammenL->setAnimation( -1 );
  129. flammenR->setAnimation( -1 );
  130. flammenM->setAnimation( -1 );
  131. gameTime = 0;;
  132. timer = 0;
  133. beendet = 0;
  134. score = 0;
  135. tastenStände = 0;
  136. if( ship )
  137. ship = ship->release();
  138. schuss->leeren();
  139. asteroid->leeren();
  140. Text *tmp = zOptionen->getTeilText( zOptionen->positionVon( '=' ) + 1, zOptionen->positionVon( ',' ) );
  141. breite = *tmp;
  142. tmp->release();
  143. tmp = zOptionen->getTeilText( zOptionen->positionVon( '=', 1 ) + 1, zOptionen->positionVon( ',', 1 ) );
  144. höhe = *tmp;
  145. tmp->release();
  146. tmp = zOptionen->getTeilText( zOptionen->positionVon( '=', 2 ) + 1, zOptionen->positionVon( ',', 2 ) );
  147. aGröße = *tmp;
  148. tmp->release();
  149. tmp = zOptionen->getTeilText( zOptionen->positionVon( '=', 3 ) + 1, zOptionen->positionVon( ',', 3 ) );
  150. maxTimer = *tmp;
  151. tmp->release();
  152. mTimer = maxTimer;
  153. tmp = zOptionen->getTeilText( zOptionen->positionVon( '=', 4 ) + 1, zOptionen->positionVon( ',', 4 ) );
  154. shipN = *tmp;
  155. tmp->release();
  156. tmp = zOptionen->getTeilText( zOptionen->positionVon( '=', 5 ) + 1, zOptionen->positionVon( ',', 5 ) );
  157. bool fortsetzen = (int)*tmp != 0;
  158. tmp->release();
  159. Vec2< float > shipPos( (float)( breite / 2 ), (float)( höhe / 2 ) );
  160. Vec2< float > shipSpeed( 0, 0 );
  161. float shipR = (float)-PI / 2;
  162. if( rGen )
  163. rGen = rGen->release();
  164. if( fortsetzen && DateiExistiert( "data/Minigames/Asteroids/data/game.save" ) && klient )
  165. {
  166. if( capture.istOffen() )
  167. capture.close();
  168. capture.setDatei( "data/Minigames/Asteroids/data/game.mgc" );
  169. capture.open( Datei::Style::schreiben | Datei::Style::ende | Datei::Style::lesen );
  170. Datei *save = new Datei();
  171. save->setDatei( "data/Minigames/Asteroids/data/game.save" );
  172. save->open( Datei::Style::lesen );
  173. int br = 0;
  174. int hö = 0;
  175. int gr = 0;
  176. int shn = 0;
  177. __int64 seed;
  178. save->lese( (char*)&seed, 8 );
  179. rGen = new RandomGenerator();
  180. rGen->setSeed( seed );
  181. save->lese( (char*)&gameTime, 8 );
  182. save->lese( (char*)&br, 4 );
  183. save->lese( (char*)&hö, 4 );
  184. save->lese( (char*)&gr, 4 );
  185. save->lese( (char*)&shn, 4 );
  186. if( br == breite && hö == höhe && gr == aGröße && shn == shipN )
  187. {
  188. save->lese( (char*)&score, 4 );
  189. save->lese( (char*)&mTimer, 4 );
  190. // Schiff laden
  191. save->lese( (char*)&shipPos.x, 4 );
  192. save->lese( (char*)&shipPos.y, 4 );
  193. save->lese( (char*)&shipSpeed.x, 4 );
  194. save->lese( (char*)&shipSpeed.y, 4 );
  195. save->lese( (char*)&shipR, 4 );
  196. int anz = 0;
  197. save->lese( (char*)&anz, 4 );
  198. for( int i = 0; i < anz; i++ )
  199. { // Asteroiden Laden
  200. char n = 0;
  201. float x = 0;
  202. float y = 0;
  203. float xs = 0;
  204. float ys = 0;
  205. float rs = 0;
  206. float r = 0;
  207. float gr = 0;
  208. save->lese( &n, 1 );
  209. save->lese( (char*)&x, 4 );
  210. save->lese( (char*)&y, 4 );
  211. save->lese( (char*)&xs, 4 );
  212. save->lese( (char*)&ys, 4 );
  213. save->lese( (char*)&rs, 4 );
  214. save->lese( (char*)&r, 4 );
  215. save->lese( (char*)&gr, 4 );
  216. asteroid->add( new Asteroid( aData[ n ]->getThis(), aTextur[ n ]->getThis(),
  217. Vec2< float >( x, y ), Vec2< float >( xs, ys ), rs, r, gr, n ) );
  218. }
  219. save->lese( (char*)&anz, 4 );
  220. for( int i = 0; i < anz; i++ )
  221. { // Schüsse Laden
  222. float x = 0;
  223. float y = 0;
  224. float xs = 0;
  225. float ys = 0;
  226. save->lese( (char*)&x, 4 );
  227. save->lese( (char*)&y, 4 );
  228. save->lese( (char*)&xs, 4 );
  229. save->lese( (char*)&ys, 4 );
  230. schuss->add( new Schuss( Vec2< float >( x, y ), Vec2< float >( xs, ys ) ) );
  231. }
  232. }
  233. save->close();
  234. save->release();
  235. }
  236. else
  237. {
  238. rGen = new RandomGenerator();
  239. if( klient )
  240. {
  241. if( capture.istOffen() )
  242. capture.close();
  243. DateiRemove( "data/Minigames/Asteroids/data/game.mgc" );
  244. capture.setDatei( "data/Minigames/Asteroids/data/game.mgc" );
  245. capture.erstellen();
  246. capture.open( Datei::Style::schreiben );
  247. __int64 seed = rGen->getSeed();
  248. capture.schreibe( (char*)&seed, 8 );
  249. }
  250. else
  251. {
  252. tmp = zOptionen->getTeilText( zOptionen->positionVon( '=', 6 ) + 1 );
  253. rGen->setSeed( (__int64)*tmp );
  254. tmp->release();
  255. }
  256. }
  257. ship = new Ship( sData[ shipN ]->getThis(), flammenM, flammenL, flammenR, sTextur[ shipN ]->getThis(), shipPos, shipSpeed, shipR );
  258. }
  259. void Map::doMausEreignis( MausEreignis &me )
  260. {
  261. }
  262. void Map::doTastaturEreignis( TastaturEreignis &te )
  263. {
  264. cs.lock();
  265. bool ok = 1;
  266. if( !beendet )
  267. {
  268. char tmp = tastenStände;
  269. if( te.taste == 'w' || te.taste == 'W' || te.taste == T_Oben )
  270. {
  271. if( te.id == TE_Press )
  272. {
  273. if( (tastenStände | 1) != tastenStände )
  274. flammenM->setAnimation( 0 );
  275. tastenStände |= 1;
  276. }
  277. else
  278. {
  279. tastenStände &= ~1;
  280. flammenM->setAnimation( -1 );
  281. }
  282. }
  283. if( te.taste == 'd' || te.taste == 'D' || te.taste == T_Rechts )
  284. {
  285. if( te.id == TE_Press )
  286. {
  287. if( ( tastenStände | 2 ) != tastenStände )
  288. flammenL->setAnimation( 0 );
  289. tastenStände |= 2;
  290. }
  291. else
  292. {
  293. tastenStände &= ~2;
  294. flammenL->setAnimation( -1 );
  295. }
  296. }
  297. if( te.taste == 'a' || te.taste == 'A' || te.taste == T_Links )
  298. {
  299. if( te.id == TE_Press )
  300. {
  301. if( ( tastenStände | 4 ) != tastenStände )
  302. flammenR->setAnimation( 0 );
  303. tastenStände |= 4;
  304. }
  305. else
  306. {
  307. tastenStände &= ~4;
  308. flammenR->setAnimation( -1 );
  309. }
  310. }
  311. if( te.taste == T_Space )
  312. {
  313. if( te.id == TE_Press )
  314. {
  315. tastenStände |= 8;
  316. ok = 0;
  317. }
  318. else
  319. tastenStände &= ~8;
  320. }
  321. if( tmp != tastenStände && klient )
  322. {
  323. if( klient )
  324. {
  325. capture.schreibe( (char*)&gameTime, 8 );
  326. capture.schreibe( &tastenStände, 1 );
  327. }
  328. }
  329. }
  330. if( te.taste == T_Space && te.id == TE_Press )
  331. {
  332. if( klient && ok )
  333. {
  334. capture.schreibe( (char*)&gameTime, 8 );
  335. capture.schreibe( "\x10", 1 );
  336. }
  337. schuss->add( ship->getSchuss() );
  338. }
  339. cs.unlock();
  340. }
  341. bool Map::tick( double tickVal )
  342. {
  343. if( beendet )
  344. {
  345. bool ret = rend;
  346. rend = 0;
  347. return ret;
  348. }
  349. cs.lock();
  350. gameTime += tickVal;
  351. // Timer
  352. timer -= tickVal;
  353. if( timer <= 0 )
  354. {
  355. mTimer -= 25;
  356. if( mTimer < 500 )
  357. mTimer = 500;
  358. timer = mTimer / 1000.0;
  359. for( int i = 0; i < rGen->rand() * 4 + 1; i++ )
  360. {
  361. int num = (int)(rGen->rand() * 7);
  362. double sw = ( rGen->rand() * 360 ) / 180.0 * PI;
  363. Vec2< float > speed( (float)cos( sw ), (float)sin( sw ) );
  364. speed *= (float)( rGen->rand() * 40 );
  365. Vec2< float > pos( -200.f, höhe / 2.f );
  366. if( speed.x < 0 )
  367. pos.x = (float)( breite + 200 );
  368. asteroid->add( new Asteroid( aData[ num ]->getThis(), aTextur[ num ]->getThis(), pos, speed, (float)( rGen->rand() * 100 ) / 75.f, (float)sw, aGröße / 1000.f, num ) );
  369. }
  370. }
  371. // Update
  372. int aAnz = asteroid->getEintragAnzahl();
  373. for( int i = 0; i < aAnz; i++ )
  374. asteroid->z( i )->tick( tickVal, breite, höhe );
  375. int sAnz = schuss->getEintragAnzahl();
  376. for( int i = 0; i < sAnz; i++ )
  377. schuss->z( i )->tick( tickVal );
  378. ship->tick( tickVal, breite, höhe, tastenStände );
  379. for( int i = aAnz - 1; i >= 0; i-- )
  380. {
  381. if( !asteroid->z( i )->amLeben() )
  382. {
  383. score++;
  384. asteroid->remove( i );
  385. aAnz--;
  386. }
  387. }
  388. for( int i = sAnz - 1; i >= 0; i-- )
  389. {
  390. Vec2< float > pos = schuss->z( i )->getPos();
  391. if( pos.x < 0 || pos.y < 0 || pos.x > breite || pos.y > höhe )
  392. {
  393. sAnz--;
  394. schuss->remove( i );
  395. }
  396. }
  397. // Collision
  398. for( int i = sAnz - 1; i >= 0; i-- )
  399. {
  400. Schuss *zs = schuss->z( i );
  401. bool b = 0;
  402. for( int j = 0; j < aAnz; j++ )
  403. {
  404. Polygon2D ap;
  405. Polygon2D bp;
  406. Punkt pa;
  407. Punkt pb;
  408. if( asteroid->z( j )->istGetroffen( zs, ap, bp, pa, pb, rGen ) )
  409. {
  410. Array< Polygon2D > *npaA = new Array< Polygon2D >();
  411. npaA->add( ap );
  412. Model2DData *npdA = new Model2DData();
  413. npdA->erstelleModell( npaA );
  414. float rot = asteroid->z( j )->zModel()->getDrehung();
  415. asteroid->add( new Asteroid( npdA, asteroid->z( j )->getTextur(), pa.rotation( rot ) + asteroid->z( j )->getPos(), asteroid->z( j )->getSpeed(), asteroid->z( j )->getRSpeed(), rot, asteroid->z( j )->zModel()->getSize() ) );
  416. Array< Polygon2D > *npaB = new Array< Polygon2D >();
  417. npaB->add( bp );
  418. Model2DData *npdB = new Model2DData();
  419. npdB->erstelleModell( npaB );
  420. asteroid->add( new Asteroid( npdB, asteroid->z( j )->getTextur(), pb.rotation( rot ) + asteroid->z( j )->getPos(), asteroid->z( j )->getSpeed(), asteroid->z( j )->getRSpeed(), rot, asteroid->z( j )->zModel()->getSize() ) );
  421. b = 1;
  422. asteroid->z( j )->setDead();
  423. }
  424. }
  425. if( b )
  426. {
  427. schuss->remove( i );
  428. sAnz--;
  429. }
  430. }
  431. for( int i = 0; i < aAnz && !beendet; i++ )
  432. beendet |= ship->istTod( asteroid->z( i ) );
  433. if( beendet && klient )
  434. {
  435. capture.close();
  436. DateiRemove( "data/Minigames/Asteroids/data/upload.mgc" );
  437. DateiUmbenennen( "data/Minigames/Asteroids/data/game.mgc", "data/Minigames/Asteroids/data/upload.mgc" );
  438. int tmpScore = score;
  439. MinigameKlientV *tmpKlient = klient->getThis();
  440. new AsynchronCall( [ tmpScore, tmpKlient ]()
  441. {
  442. InitDatei *opd = new InitDatei( "data/Minigames/Asteroids/data/optionen.ini" );
  443. opd->laden();
  444. Text optionen = "Width=";
  445. optionen += opd->zWert( "Breite" )->getText();
  446. optionen += ",Height=";
  447. optionen += opd->zWert( "Höhe" )->getText();
  448. optionen += ",Size=";
  449. optionen += opd->zWert( "Größe" )->getText();
  450. optionen += ",Timer=";
  451. optionen += opd->zWert( "Timer" )->getText();
  452. optionen += ",Ship=";
  453. optionen += opd->zWert( "Ship" )->getText();
  454. opd->release();
  455. int status = tmpKlient->reportEndOfGame( "Asteroids", optionen, tmpScore );
  456. if( status == 2 )
  457. {
  458. Datei d;
  459. d.setDatei( "data/Minigames/Asteroids/data/upload.mgc" );
  460. tmpKlient->uploadGameCapture( &d );
  461. }
  462. DateiRemove( "data/Minigames/Asteroids/data/upload.mgc" );
  463. tmpKlient->release();
  464. } );
  465. KSGTDatei *stb = new KSGTDatei( "data/Minigames/Asteroids/data/score.ksgt" );
  466. if( !stb->laden() )
  467. DateiPfadErstellen( "data/Minigames/Asteroids/data/score.ksgt" );
  468. RCArray< Text > *zeile = new RCArray< Text >();
  469. Zeit *zeit = getZeit();
  470. zeile->add( zeit->getZeit( "y-m-d h:i:s" ) );
  471. zeit->release();
  472. Text *scoreT = new Text();
  473. scoreT->append( score );
  474. zeile->add( scoreT );
  475. Text *breiteT = new Text();
  476. breiteT->append( breite );
  477. zeile->add( breiteT );
  478. Text *höheT = new Text();
  479. höheT->append( höhe );
  480. zeile->add( höheT );
  481. Text *timerT = new Text();
  482. timerT->append( maxTimer );
  483. zeile->add( timerT );
  484. Text *aGrößeT = new Text();
  485. aGrößeT->append( aGröße );
  486. zeile->add( aGrößeT );
  487. Text *shipT = new Text();
  488. shipT->append( shipN );
  489. zeile->add( shipT );
  490. stb->addZeile( 7, zeile );
  491. zeile->release();
  492. stb->speichern();
  493. stb->release();
  494. DateiRemove( "data/Minigames/Asteroids/data/game.save" );
  495. }
  496. cs.unlock();
  497. flammenM->tick( tickVal );
  498. flammenL->tick( tickVal );
  499. flammenR->tick( tickVal );
  500. return 1;
  501. }
  502. void Map::render( Bild &zRObj )
  503. {
  504. cs.lock();
  505. Punkt kamP = ship->getKamPos( breite, höhe );
  506. zRObj.addScrollOffset( kamP.x, kamP.y );
  507. int aAnz = asteroid->getEintragAnzahl();
  508. for( int i = 0; i < aAnz; i++ )
  509. asteroid->z( i )->render( zRObj );
  510. int sAnz = schuss->getEintragAnzahl();
  511. for( int i = 0; i < sAnz; i++ )
  512. schuss->z( i )->render( zRObj );
  513. ship->render( zRObj );
  514. zRObj.addScrollOffset( -kamP.x, -kamP.y );
  515. if( breite >= 800 || höhe >= 500 )
  516. { // Minimap
  517. const Punkt &dOff = zRObj.getDrawOff();
  518. map->render( zRObj );
  519. zRObj.setPixelDP( 10 + ( ship->getPos().x * 200 ) / breite + dOff.x, 10 + ( ship->getPos().y * 200 ) / höhe + dOff.y, 0xFF00FF00 );
  520. for( int i = 0; i < aAnz; i++ )
  521. zRObj.setPixelDP( 10 + ( asteroid->z( i )->getPos().x * 200 ) / breite + dOff.x, 10 + ( asteroid->z( i )->getPos().y * 200 ) / höhe + dOff.y, 0xFFFF0000 );
  522. for( int i = 0; i < sAnz; i++ )
  523. zRObj.setPixelDP( 10 + ( (int)schuss->z( i )->getPos().x * 200 ) / breite + dOff.x, 10 + ( (int)schuss->z( i )->getPos().y * 200 ) / höhe + dOff.y, 0xFF00FFFF );
  524. kam->setPosition( 10 + ( 200 * kamP.x ) / breite, 10 + ( 200 * kamP.y ) / höhe );
  525. kam->setSize( ( 200 * 800 ) / breite, ( 200 * 500 ) / höhe );
  526. if( kam->getBreite() > 200 )
  527. kam->setSize( 200, kam->getHeight() );
  528. if( kam->getHeight() > 200 )
  529. kam->setSize( kam->getBreite(), 200 );
  530. kam->render( zRObj );
  531. }
  532. cs.unlock();
  533. }
  534. void Map::speichern()
  535. {
  536. if( !beendet && klient )
  537. {
  538. if( capture.istOffen() )
  539. capture.close();
  540. Datei *d = new Datei();
  541. d->setDatei( "data/Minigames/Asteroids/data/game.save" );
  542. d->erstellen();
  543. d->open( Datei::Style::schreiben );
  544. __int64 seed = rGen->getSeed();
  545. d->schreibe( (char*)&seed, 8 );
  546. d->schreibe( (char*)&gameTime, 8 );
  547. d->schreibe( (char*)&breite, 4 );
  548. d->schreibe( (char*)&höhe, 4 );
  549. d->schreibe( (char*)&aGröße, 4 );
  550. d->schreibe( (char*)&shipN, 4 );
  551. d->schreibe( (char*)&score, 4 );
  552. d->schreibe( (char*)&mTimer, 4 );
  553. ship->save( d );
  554. int anz = asteroid->getEintragAnzahl();
  555. d->schreibe( (char*)&anz, 4 );
  556. for( int i = 0; i < anz; i++ )
  557. asteroid->z( i )->save( d );
  558. anz = schuss->getEintragAnzahl();
  559. d->schreibe( (char*)&anz, 4 );
  560. for( int i = 0; i < anz; i++ )
  561. schuss->z( i )->save( d );
  562. d->close();
  563. d->release();
  564. }
  565. else if( klient )
  566. DateiRemove( "data/Minigames/Asteroids/data/game.save" );
  567. }
  568. // constant
  569. int Map::getScore() const
  570. {
  571. return score;
  572. }
  573. bool Map::istBeendet() const
  574. {
  575. return beendet;
  576. }
  577. // Reference Counting
  578. Map *Map::getThis()
  579. {
  580. ref++;
  581. return this;
  582. }
  583. Map *Map::release()
  584. {
  585. ref--;
  586. if( !ref )
  587. delete this;
  588. return 0;
  589. }