Map.cpp 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577
  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. gameTime = 0;
  129. timer = 0;
  130. beendet = 0;
  131. score = 0;
  132. tastenStände = 0;
  133. if( ship )
  134. ship = ship->release();
  135. schuss->leeren();
  136. asteroid->leeren();
  137. Text *tmp = zOptionen->getTeilText( zOptionen->positionVon( '=' ) + 1, zOptionen->positionVon( ',' ) );
  138. breite = *tmp;
  139. tmp->release();
  140. tmp = zOptionen->getTeilText( zOptionen->positionVon( '=', 1 ) + 1, zOptionen->positionVon( ',', 1 ) );
  141. höhe = *tmp;
  142. tmp->release();
  143. tmp = zOptionen->getTeilText( zOptionen->positionVon( '=', 2 ) + 1, zOptionen->positionVon( ',', 2 ) );
  144. aGröße = *tmp;
  145. tmp->release();
  146. tmp = zOptionen->getTeilText( zOptionen->positionVon( '=', 3 ) + 1, zOptionen->positionVon( ',', 3 ) );
  147. maxTimer = *tmp;
  148. tmp->release();
  149. mTimer = maxTimer;
  150. tmp = zOptionen->getTeilText( zOptionen->positionVon( '=', 4 ) + 1, zOptionen->positionVon( ',', 4 ) );
  151. shipN = *tmp;
  152. tmp->release();
  153. tmp = zOptionen->getTeilText( zOptionen->positionVon( '=', 5 ) + 1, zOptionen->positionVon( ',', 5 ) );
  154. bool fortsetzen = (int)*tmp != 0;
  155. tmp->release();
  156. Vec2< float > shipPos( (float)( breite / 2 ), (float)( höhe / 2 ) );
  157. Vec2< float > shipSpeed( 0, 0 );
  158. float shipR = (float)-PI / 2;
  159. if( rGen )
  160. rGen = rGen->release();
  161. if( fortsetzen && DateiExistiert( "data/Minigames/Asteroids/data/game.save" ) && klient )
  162. {
  163. if( capture.istOffen() )
  164. capture.close();
  165. capture.setDatei( "data/Minigames/Asteroids/data/game.mgc" );
  166. capture.open( Datei::Style::schreiben | Datei::Style::ende | Datei::Style::lesen );
  167. Datei *save = new Datei();
  168. save->setDatei( "data/Minigames/Asteroids/data/game.save" );
  169. save->open( Datei::Style::lesen );
  170. int br = 0;
  171. int hö = 0;
  172. int gr = 0;
  173. int shn = 0;
  174. __int64 seed;
  175. save->lese( (char*)&seed, 8 );
  176. rGen = new RandomGenerator();
  177. rGen->setSeed( seed );
  178. save->lese( (char*)&gameTime, 8 );
  179. save->lese( (char*)&br, 4 );
  180. save->lese( (char*)&hö, 4 );
  181. save->lese( (char*)&gr, 4 );
  182. save->lese( (char*)&shn, 4 );
  183. if( br == breite && hö == höhe && gr == aGröße && shn == shipN )
  184. {
  185. save->lese( (char*)&score, 4 );
  186. save->lese( (char*)&mTimer, 4 );
  187. // Schiff laden
  188. save->lese( (char*)&shipPos.x, 4 );
  189. save->lese( (char*)&shipPos.y, 4 );
  190. save->lese( (char*)&shipSpeed.x, 4 );
  191. save->lese( (char*)&shipSpeed.y, 4 );
  192. save->lese( (char*)&shipR, 4 );
  193. int anz = 0;
  194. save->lese( (char*)&anz, 4 );
  195. for( int i = 0; i < anz; i++ )
  196. { // Asteroiden Laden
  197. char n = 0;
  198. float x = 0;
  199. float y = 0;
  200. float xs = 0;
  201. float ys = 0;
  202. float rs = 0;
  203. float r = 0;
  204. float gr = 0;
  205. save->lese( &n, 1 );
  206. save->lese( (char*)&x, 4 );
  207. save->lese( (char*)&y, 4 );
  208. save->lese( (char*)&xs, 4 );
  209. save->lese( (char*)&ys, 4 );
  210. save->lese( (char*)&rs, 4 );
  211. save->lese( (char*)&r, 4 );
  212. save->lese( (char*)&gr, 4 );
  213. asteroid->add( new Asteroid( aData[ n ]->getThis(), aTextur[ n ]->getThis(),
  214. Vec2< float >( x, y ), Vec2< float >( xs, ys ), rs, r, gr, n ) );
  215. }
  216. save->lese( (char*)&anz, 4 );
  217. for( int i = 0; i < anz; i++ )
  218. { // Schüsse Laden
  219. float x = 0;
  220. float y = 0;
  221. float xs = 0;
  222. float ys = 0;
  223. save->lese( (char*)&x, 4 );
  224. save->lese( (char*)&y, 4 );
  225. save->lese( (char*)&xs, 4 );
  226. save->lese( (char*)&ys, 4 );
  227. schuss->add( new Schuss( Vec2< float >( x, y ), Vec2< float >( xs, ys ) ) );
  228. }
  229. }
  230. save->close();
  231. save->release();
  232. }
  233. else
  234. {
  235. rGen = new RandomGenerator();
  236. if( klient )
  237. {
  238. if( capture.istOffen() )
  239. capture.close();
  240. DateiRemove( "data/Minigames/Asteroids/data/game.mgc" );
  241. capture.setDatei( "data/Minigames/Asteroids/data/game.mgc" );
  242. capture.erstellen();
  243. capture.open( Datei::Style::schreiben );
  244. __int64 seed = rGen->getSeed();
  245. capture.schreibe( (char*)&seed, 8 );
  246. }
  247. else
  248. {
  249. tmp = zOptionen->getTeilText( zOptionen->positionVon( '=', 6 ) + 1 );
  250. rGen->setSeed( (__int64)*tmp );
  251. tmp->release();
  252. }
  253. }
  254. ship = new Ship( sData[ shipN ]->getThis(), flammenM, flammenL, flammenR, sTextur[ shipN ]->getThis(), shipPos, shipSpeed, shipR );
  255. }
  256. void Map::doMausEreignis( MausEreignis &me )
  257. {
  258. }
  259. void Map::doTastaturEreignis( TastaturEreignis &te )
  260. {
  261. cs.lock();
  262. bool ok = 1;
  263. if( !beendet )
  264. {
  265. char tmp = tastenStände;
  266. if( te.taste == 'w' || te.taste == 'W' || te.taste == T_Oben )
  267. {
  268. if( te.id == TE_Press )
  269. {
  270. if( (tastenStände | 1) != tastenStände )
  271. flammenM->setAnimation( 0 );
  272. tastenStände |= 1;
  273. }
  274. else
  275. {
  276. tastenStände &= ~1;
  277. flammenM->setAnimation( -1 );
  278. }
  279. }
  280. if( te.taste == 'd' || te.taste == 'D' || te.taste == T_Rechts )
  281. {
  282. if( te.id == TE_Press )
  283. {
  284. if( ( tastenStände | 2 ) != tastenStände )
  285. flammenL->setAnimation( 0 );
  286. tastenStände |= 2;
  287. }
  288. else
  289. {
  290. tastenStände &= ~2;
  291. flammenL->setAnimation( -1 );
  292. }
  293. }
  294. if( te.taste == 'a' || te.taste == 'A' || te.taste == T_Links )
  295. {
  296. if( te.id == TE_Press )
  297. {
  298. if( ( tastenStände | 4 ) != tastenStände )
  299. flammenR->setAnimation( 0 );
  300. tastenStände |= 4;
  301. }
  302. else
  303. {
  304. tastenStände &= ~4;
  305. flammenR->setAnimation( -1 );
  306. }
  307. }
  308. if( te.taste == T_Space )
  309. {
  310. if( te.id == TE_Press )
  311. {
  312. tastenStände |= 8;
  313. ok = 0;
  314. }
  315. else
  316. tastenStände &= ~8;
  317. }
  318. if( tmp != tastenStände && klient )
  319. {
  320. if( klient )
  321. {
  322. capture.schreibe( (char*)&gameTime, 8 );
  323. capture.schreibe( &tastenStände, 1 );
  324. }
  325. }
  326. }
  327. if( te.taste == T_Space && te.id == TE_Press )
  328. {
  329. if( klient && ok )
  330. {
  331. capture.schreibe( (char*)&gameTime, 8 );
  332. capture.schreibe( "\x10", 1 );
  333. }
  334. schuss->add( ship->getSchuss() );
  335. }
  336. cs.unlock();
  337. }
  338. bool Map::tick( double tickVal )
  339. {
  340. if( beendet )
  341. {
  342. bool ret = rend;
  343. rend = 0;
  344. return ret;
  345. }
  346. cs.lock();
  347. gameTime += tickVal;
  348. // Timer
  349. timer -= tickVal;
  350. if( timer <= 0 )
  351. {
  352. mTimer -= 25;
  353. if( mTimer < 500 )
  354. mTimer = 500;
  355. timer = mTimer / 1000.0;
  356. for( int i = 0; i < rGen->rand() * 4 + 1; i++ )
  357. {
  358. int num = (int)(rGen->rand() * 7);
  359. double sw = ( rGen->rand() * 360 ) / 180.0 * PI;
  360. Vec2< float > speed( (float)cos( sw ), (float)sin( sw ) );
  361. speed *= (float)( rGen->rand() * 40 );
  362. Vec2< float > pos( -200.f, höhe / 2.f );
  363. if( speed.x < 0 )
  364. pos.x = (float)( breite + 200 );
  365. 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 ) );
  366. }
  367. }
  368. // Update
  369. int aAnz = asteroid->getEintragAnzahl();
  370. for( int i = 0; i < aAnz; i++ )
  371. asteroid->z( i )->tick( tickVal, breite, höhe );
  372. int sAnz = schuss->getEintragAnzahl();
  373. for( int i = 0; i < sAnz; i++ )
  374. schuss->z( i )->tick( tickVal );
  375. ship->tick( tickVal, breite, höhe, tastenStände );
  376. for( int i = aAnz - 1; i >= 0; i-- )
  377. {
  378. if( !asteroid->z( i )->amLeben() )
  379. {
  380. score++;
  381. asteroid->remove( i );
  382. aAnz--;
  383. }
  384. }
  385. for( int i = sAnz - 1; i >= 0; i-- )
  386. {
  387. Vec2< float > pos = schuss->z( i )->getPos();
  388. if( pos.x < 0 || pos.y < 0 || pos.x > breite || pos.y > höhe )
  389. {
  390. sAnz--;
  391. schuss->remove( i );
  392. }
  393. }
  394. // Collision
  395. for( int i = sAnz - 1; i >= 0; i-- )
  396. {
  397. Schuss *zs = schuss->z( i );
  398. bool b = 0;
  399. for( int j = 0; j < aAnz; j++ )
  400. b |= asteroid->z( j )->istGetroffen( zs );
  401. if( b )
  402. {
  403. schuss->remove( i );
  404. sAnz--;
  405. }
  406. }
  407. for( int i = 0; i < aAnz && !beendet; i++ )
  408. beendet |= ship->istTod( asteroid->z( i ) );
  409. if( beendet && klient )
  410. {
  411. capture.close();
  412. DateiRemove( "data/Minigames/Asteroids/data/upload.mgc" );
  413. DateiUmbenennen( "data/Minigames/Asteroids/data/game.mgc", "data/Minigames/Asteroids/data/upload.mgc" );
  414. int tmpScore = score;
  415. MinigameKlientV *tmpKlient = klient->getThis();
  416. new AsynchronCall( [ tmpScore, tmpKlient ]()
  417. {
  418. InitDatei *opd = new InitDatei( "data/Minigames/Asteroids/data/optionen.ini" );
  419. opd->laden();
  420. Text optionen = "Width=";
  421. optionen += opd->zWert( "Breite" )->getText();
  422. optionen += ",Height=";
  423. optionen += opd->zWert( "Höhe" )->getText();
  424. optionen += ",Size=";
  425. optionen += opd->zWert( "Größe" )->getText();
  426. optionen += ",Timer=";
  427. optionen += opd->zWert( "Timer" )->getText();
  428. optionen += ",Ship=";
  429. optionen += opd->zWert( "Ship" )->getText();
  430. opd->release();
  431. int status = tmpKlient->reportEndOfGame( "Asteroids", optionen, tmpScore );
  432. if( status == 2 )
  433. {
  434. Datei d;
  435. d.setDatei( "data/Minigames/Asteroids/data/upload.mgc" );
  436. tmpKlient->uploadGameCapture( &d );
  437. }
  438. DateiRemove( "data/Minigames/Asteroids/data/upload.mgc" );
  439. tmpKlient->release();
  440. } );
  441. KSGTDatei *stb = new KSGTDatei( "data/Minigames/Asteroids/data/score.ksgt" );
  442. if( !stb->laden() )
  443. DateiPfadErstellen( "data/Minigames/Asteroids/data/score.ksgt" );
  444. RCArray< Text > *zeile = new RCArray< Text >();
  445. Zeit *zeit = getZeit();
  446. zeile->add( zeit->getZeit( "y-m-d h:i:s" ) );
  447. zeit->release();
  448. Text *scoreT = new Text();
  449. scoreT->append( score );
  450. zeile->add( scoreT );
  451. Text *breiteT = new Text();
  452. breiteT->append( breite );
  453. zeile->add( breiteT );
  454. Text *höheT = new Text();
  455. höheT->append( höhe );
  456. zeile->add( höheT );
  457. Text *timerT = new Text();
  458. timerT->append( maxTimer );
  459. zeile->add( timerT );
  460. Text *aGrößeT = new Text();
  461. aGrößeT->append( aGröße );
  462. zeile->add( aGrößeT );
  463. Text *shipT = new Text();
  464. shipT->append( shipN );
  465. zeile->add( shipT );
  466. stb->addZeile( 7, zeile );
  467. zeile->release();
  468. stb->speichern();
  469. stb->release();
  470. DateiRemove( "data/Minigames/Asteroids/data/game.save" );
  471. }
  472. cs.unlock();
  473. flammenM->tick( tickVal );
  474. flammenL->tick( tickVal );
  475. flammenR->tick( tickVal );
  476. return 1;
  477. }
  478. void Map::render( Bild &zRObj )
  479. {
  480. Punkt kamP = ship->getKamPos( breite, höhe );
  481. zRObj.addScrollOffset( kamP.x, kamP.y );
  482. int aAnz = asteroid->getEintragAnzahl();
  483. for( int i = 0; i < aAnz; i++ )
  484. asteroid->z( i )->render( zRObj );
  485. int sAnz = schuss->getEintragAnzahl();
  486. for( int i = 0; i < sAnz; i++ )
  487. schuss->z( i )->render( zRObj );
  488. ship->render( zRObj );
  489. zRObj.addScrollOffset( -kamP.x, -kamP.y );
  490. if( breite >= 800 || höhe >= 500 )
  491. { // Minimap
  492. const Punkt &dOff = zRObj.getDrawOff();
  493. map->render( zRObj );
  494. zRObj.setPixelDP( 10 + ( ship->getPos().x * 200 ) / breite + dOff.x, 10 + ( ship->getPos().y * 200 ) / höhe + dOff.y, 0xFF00FF00 );
  495. for( int i = 0; i < aAnz; i++ )
  496. zRObj.setPixelDP( 10 + ( asteroid->z( i )->getPos().x * 200 ) / breite + dOff.x, 10 + ( asteroid->z( i )->getPos().y * 200 ) / höhe + dOff.y, 0xFFFF0000 );
  497. for( int i = 0; i < sAnz; i++ )
  498. 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 );
  499. kam->setPosition( 10 + ( 200 * kamP.x ) / breite, 10 + ( 200 * kamP.y ) / höhe );
  500. kam->setSize( ( 200 * 800 ) / breite, ( 200 * 500 ) / höhe );
  501. if( kam->getBreite() > 200 )
  502. kam->setSize( 200, kam->getHeight() );
  503. if( kam->getHeight() > 200 )
  504. kam->setSize( kam->getBreite(), 200 );
  505. kam->render( zRObj );
  506. }
  507. }
  508. void Map::speichern()
  509. {
  510. if( !beendet && klient )
  511. {
  512. if( capture.istOffen() )
  513. capture.close();
  514. Datei *d = new Datei();
  515. d->setDatei( "data/Minigames/Asteroids/data/game.save" );
  516. d->erstellen();
  517. d->open( Datei::Style::schreiben );
  518. __int64 seed = rGen->getSeed();
  519. d->schreibe( (char*)&seed, 8 );
  520. d->schreibe( (char*)&gameTime, 8 );
  521. d->schreibe( (char*)&breite, 4 );
  522. d->schreibe( (char*)&höhe, 4 );
  523. d->schreibe( (char*)&aGröße, 4 );
  524. d->schreibe( (char*)&shipN, 4 );
  525. d->schreibe( (char*)&score, 4 );
  526. d->schreibe( (char*)&mTimer, 4 );
  527. ship->save( d );
  528. int anz = asteroid->getEintragAnzahl();
  529. d->schreibe( (char*)&anz, 4 );
  530. for( int i = 0; i < anz; i++ )
  531. asteroid->z( i )->save( d );
  532. anz = schuss->getEintragAnzahl();
  533. d->schreibe( (char*)&anz, 4 );
  534. for( int i = 0; i < anz; i++ )
  535. schuss->z( i )->save( d );
  536. d->close();
  537. d->release();
  538. }
  539. else if( klient )
  540. DateiRemove( "data/Minigames/Asteroids/data/game.save" );
  541. }
  542. // constant
  543. int Map::getScore() const
  544. {
  545. return score;
  546. }
  547. bool Map::istBeendet() const
  548. {
  549. return beendet;
  550. }
  551. // Reference Counting
  552. Map *Map::getThis()
  553. {
  554. ref++;
  555. return this;
  556. }
  557. Map *Map::release()
  558. {
  559. ref--;
  560. if( !ref )
  561. delete this;
  562. return 0;
  563. }