Map.cpp 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484
  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. : GameData( "data/Minigames/Asteroids/models/ship.m2", "data/Minigames/Asteroids/models/asteroids.m2" )
  18. {
  19. this->klient = klient;
  20. aTextur = new Bild*[ 7 ]();
  21. sTextur = new Bild*[ 2 ]();
  22. // lade Flammen animation
  23. LTDBDatei flammenStartLTDB;
  24. flammenStartLTDB.setDatei( new Text( "data/Minigames/Asteroids/bilder/f_start.ltdb" ) );
  25. flammenStartLTDB.leseDaten( 0 );
  26. Animation2DData *flammenStart = new Animation2DData();
  27. flammenStart->ladeAnimation( flammenStartLTDB.getThis() );
  28. flammenStart->setFPS( 60 );
  29. flammenStart->setWiederhohlend( 0 );
  30. LTDBDatei flammenLTDB;
  31. flammenLTDB.setDatei( new Text( "data/Minigames/Asteroids/bilder/f_burn.ltdb" ) );
  32. Animation2DData *flammenBurn = new Animation2DData();
  33. flammenBurn->ladeAnimation( flammenLTDB.getThis() );
  34. flammenBurn->setFPS( 60 );
  35. flammenBurn->setWiederhohlend( 1 );
  36. flammenM = new Textur2D();
  37. flammenM->addAnimationZ( flammenStart->getThis() );
  38. flammenM->addAnimationZ( flammenBurn->getThis() );
  39. flammenL = new Textur2D();
  40. flammenL->addAnimationZ( flammenStart->getThis() );
  41. flammenL->addAnimationZ( flammenBurn->getThis() );
  42. flammenR = new Textur2D();
  43. flammenR->addAnimationZ( flammenStart );
  44. flammenR->addAnimationZ( flammenBurn );
  45. LTDBDatei td;
  46. td.setDatei( new Text( "data/Minigames/Asteroids/bilder/asteroids.ltdb" ) );
  47. td.leseDaten( 0 );
  48. for( int i = 0; i < 7; i++ )
  49. {
  50. Text name = "";
  51. name.append( (char)( 'a' + i ) );
  52. aTextur[ i ] = td.laden( 0, new Text( (char*)( Text( name ) += ".png" ) ) );
  53. }
  54. td.setDatei( new Text( "data/Minigames/Asteroids/bilder/ship.ltdb" ) );
  55. td.leseDaten( 0 );
  56. for( int i = 0; i < 2; i++ )
  57. {
  58. Text name = "";
  59. name.append( (char)( 'a' + i ) );
  60. sTextur[ i ] = td.laden( 0, new Text( (char*)( Text( name ) += ".png" ) ) );
  61. }
  62. kam = new LRahmen();
  63. kam->setFarbe( 0xFF777777 );
  64. map = new LRahmen();
  65. map->setFarbe( 0xFFFFFFFF );
  66. map->setPosition( 10, 10 );
  67. map->setSize( 200, 200 );
  68. }
  69. // Destruktor
  70. Map::~Map()
  71. {
  72. for( int i = 0; i < 7; i++ )
  73. aTextur[ i ]->release();
  74. for( int i = 0; i < 2; i++ )
  75. sTextur[ i ]->release();
  76. delete[] aTextur;
  77. delete[] sTextur;
  78. kam->release();
  79. map->release();
  80. if( klient )
  81. klient->release();
  82. flammenM->release();
  83. flammenL->release();
  84. flammenR->release();
  85. }
  86. Asteroid *Map::createNewAsteroid()
  87. {
  88. Asteroid *a = __super::createNewAsteroid();
  89. a->setTextur( aTextur[ a->getId() ] );
  90. return a;
  91. }
  92. // nicht constant
  93. void Map::reset( Text *zOptionen )
  94. {
  95. flammenL->setAnimation( -1 );
  96. flammenR->setAnimation( -1 );
  97. flammenM->setAnimation( -1 );
  98. __super::reset( zOptionen );
  99. Text *tmp = zOptionen->getTeilText( zOptionen->positionVon( '=', 5 ) + 1, zOptionen->positionVon( ',', 5 ) );
  100. bool fortsetzen = (int)*tmp != 0;
  101. tmp->release();
  102. if( fortsetzen && DateiExistiert( "data/Minigames/Asteroids/data/game.save" ) && klient )
  103. {
  104. M2Datei sad;
  105. int index = 0;
  106. int sadI = 0;
  107. Text pfad = "data/Minigames/Asteroids/data/sasave_";
  108. pfad += sadI;
  109. pfad += ".m2";
  110. sad.setPfad( pfad );
  111. sad.leseDaten();
  112. if( capture.istOffen() )
  113. capture.close();
  114. capture.setDatei( "data/Minigames/Asteroids/data/game.mgc" );
  115. capture.open( Datei::Style::schreiben | Datei::Style::ende | Datei::Style::lesen );
  116. Datei *save = new Datei();
  117. save->setDatei( "data/Minigames/Asteroids/data/game.save" );
  118. save->open( Datei::Style::lesen );
  119. int br = 0;
  120. int hö = 0;
  121. int gr = 0;
  122. int shn = 0;
  123. __int64 seed;
  124. if( rGen )
  125. rGen = rGen->release();
  126. save->lese( (char*)&seed, 8 );
  127. rGen = new RandomGenerator();
  128. rGen->setSeed( seed );
  129. save->lese( (char*)&gameTime, 8 );
  130. save->lese( (char*)&br, 4 );
  131. save->lese( (char*)&hö, 4 );
  132. save->lese( (char*)&gr, 4 );
  133. save->lese( (char*)&shn, 4 );
  134. if( br == breite && hö == höhe && gr == aGröße && shn == shipN )
  135. {
  136. save->lese( (char*)&score, 4 );
  137. scoreCheck = score * 11197;
  138. save->lese( (char*)&mTimer, 4 );
  139. // Schiff laden
  140. Vec2< float > shipPos( (float)( breite / 2 ), (float)( höhe / 2 ) );
  141. Vec2< float > shipSpeed( 0, 0 );
  142. float shipR = (float)-PI / 2;
  143. float shipRSpeed = 0;
  144. save->lese( (char*)&shipPos.x, 4 );
  145. save->lese( (char*)&shipPos.y, 4 );
  146. save->lese( (char*)&shipSpeed.x, 4 );
  147. save->lese( (char*)&shipSpeed.y, 4 );
  148. save->lese( (char*)&shipR, 4 );
  149. save->lese( (char*)&shipRSpeed, 4 );
  150. ship->setPRS( shipPos, shipSpeed, shipR, shipRSpeed );
  151. int anz = 0;
  152. save->lese( (char*)&anz, 4 );
  153. for( int i = 0; i < anz; i++ )
  154. { // Asteroiden Laden
  155. char n = 0;
  156. float x = 0;
  157. float y = 0;
  158. float xs = 0;
  159. float ys = 0;
  160. float rs = 0;
  161. float r = 0;
  162. float gr = 0;
  163. save->lese( &n, 1 );
  164. save->lese( (char*)&x, 4 );
  165. save->lese( (char*)&y, 4 );
  166. save->lese( (char*)&xs, 4 );
  167. save->lese( (char*)&ys, 4 );
  168. save->lese( (char*)&rs, 4 );
  169. save->lese( (char*)&r, 4 );
  170. save->lese( (char*)&gr, 4 );
  171. Bild *at = 0;
  172. Model2DData *ad = 0;
  173. if( n < 0 )
  174. {
  175. at = aTextur[ -n - 1 ]->getThis();
  176. ad = sad.ladeModel( sad.zModelName( index++ )->getText() );
  177. if( index == 120 )
  178. {
  179. index = 0;
  180. sadI++;
  181. Text pfad = "data/Minigames/Asteroids/data/sasave_";
  182. pfad += sadI;
  183. pfad += ".m2";
  184. sad = M2Datei();
  185. sad.setPfad( pfad );
  186. sad.leseDaten();
  187. }
  188. }
  189. else
  190. {
  191. at = aTextur[ n ]->getThis();
  192. ad = aData[ n ]->getThis();
  193. }
  194. asteroid->add( new Asteroid( ad, at,
  195. Vec2< float >( x, y ), Vec2< float >( xs, ys ), rs, r, gr, n ) );
  196. }
  197. save->lese( (char*)&anz, 4 );
  198. for( int i = 0; i < anz; i++ )
  199. { // Schüsse Laden
  200. float x = 0;
  201. float y = 0;
  202. float xs = 0;
  203. float ys = 0;
  204. save->lese( (char*)&x, 4 );
  205. save->lese( (char*)&y, 4 );
  206. save->lese( (char*)&xs, 4 );
  207. save->lese( (char*)&ys, 4 );
  208. schuss->add( new Schuss( Vec2< float >( x, y ), Vec2< float >( xs, ys ) ) );
  209. }
  210. }
  211. save->close();
  212. save->release();
  213. }
  214. else
  215. {
  216. if( klient )
  217. {
  218. if( capture.istOffen() )
  219. capture.close();
  220. DateiRemove( "data/Minigames/Asteroids/data/game.mgc" );
  221. capture.setDatei( "data/Minigames/Asteroids/data/game.mgc" );
  222. capture.erstellen();
  223. capture.open( Datei::Style::schreiben );
  224. __int64 seed = rGen->getSeed();
  225. capture.schreibe( (char*)&seed, 8 );
  226. }
  227. }
  228. ship->setTexture( flammenM, flammenL, flammenR, sTextur[ shipN ]->getThis() );
  229. }
  230. void Map::doMausEreignis( MausEreignis &me )
  231. {
  232. }
  233. void Map::doTastaturEreignis( TastaturEreignis &te )
  234. {
  235. cs.lock();
  236. bool ok = 1;
  237. if( !beendet )
  238. {
  239. char tmp = tastenStände;
  240. if( te.taste == 'w' || te.taste == 'W' || te.taste == T_Oben )
  241. {
  242. if( te.id == TE_Press )
  243. {
  244. if( (tastenStände | 1) != tastenStände )
  245. flammenM->setAnimation( 0 );
  246. tastenStände |= 1;
  247. }
  248. else
  249. {
  250. tastenStände &= ~1;
  251. flammenM->setAnimation( -1 );
  252. }
  253. }
  254. if( te.taste == 'd' || te.taste == 'D' || te.taste == T_Rechts )
  255. {
  256. if( te.id == TE_Press )
  257. {
  258. if( ( tastenStände | 2 ) != tastenStände )
  259. flammenL->setAnimation( 0 );
  260. tastenStände |= 2;
  261. }
  262. else
  263. {
  264. tastenStände &= ~2;
  265. flammenL->setAnimation( -1 );
  266. }
  267. }
  268. if( te.taste == 'a' || te.taste == 'A' || te.taste == T_Links )
  269. {
  270. if( te.id == TE_Press )
  271. {
  272. if( ( tastenStände | 4 ) != tastenStände )
  273. flammenR->setAnimation( 0 );
  274. tastenStände |= 4;
  275. }
  276. else
  277. {
  278. tastenStände &= ~4;
  279. flammenR->setAnimation( -1 );
  280. }
  281. }
  282. if( te.taste == T_Space )
  283. {
  284. if( te.id == TE_Press )
  285. {
  286. if( ( tastenStände | 8 ) != tastenStände )
  287. ok = 0;
  288. tastenStände |= 8;
  289. }
  290. else
  291. tastenStände &= ~8;
  292. }
  293. if( tmp != tastenStände && klient )
  294. {
  295. if( klient )
  296. {
  297. capture.schreibe( (char*)&gameTime, 8 );
  298. capture.schreibe( &tastenStände, 1 );
  299. }
  300. }
  301. }
  302. if( te.taste == T_Space && te.id == TE_Press )
  303. {
  304. if( klient && ok )
  305. {
  306. capture.schreibe( (char*)&gameTime, 8 );
  307. capture.schreibe( "\x10", 1 );
  308. }
  309. schuss->add( ship->getSchuss() );
  310. }
  311. cs.unlock();
  312. }
  313. bool Map::tick( double t )
  314. {
  315. if( beendet )
  316. return 0;
  317. bool ret = __super::tick( t );
  318. if( beendet && klient )
  319. {
  320. capture.close();
  321. DateiRemove( "data/Minigames/Asteroids/data/upload.mgc" );
  322. DateiUmbenennen( "data/Minigames/Asteroids/data/game.mgc", "data/Minigames/Asteroids/data/upload.mgc" );
  323. int tmpScore = score;
  324. MinigameKlientV *tmpKlient = klient->getThis();
  325. new AsynchronCall( [ tmpScore, tmpKlient ]()
  326. {
  327. InitDatei *opd = new InitDatei( "data/Minigames/Asteroids/data/optionen.ini" );
  328. opd->laden();
  329. Text optionen = "Width=";
  330. optionen += opd->zWert( "Breite" )->getText();
  331. optionen += ",Height=";
  332. optionen += opd->zWert( "Höhe" )->getText();
  333. optionen += ",Size=";
  334. optionen += opd->zWert( "Größe" )->getText();
  335. optionen += ",Timer=";
  336. optionen += opd->zWert( "Timer" )->getText();
  337. optionen += ",Ship=";
  338. optionen += opd->zWert( "Ship" )->getText();
  339. opd->release();
  340. int status = tmpKlient->reportEndOfGame( "Asteroids", optionen, tmpScore );
  341. if( status == 2 )
  342. {
  343. Datei d;
  344. d.setDatei( "data/Minigames/Asteroids/data/upload.mgc" );
  345. tmpKlient->uploadGameCapture( &d );
  346. }
  347. DateiRemove( "data/Minigames/Asteroids/data/upload.mgc" );
  348. tmpKlient->release();
  349. } );
  350. KSGTDatei *stb = new KSGTDatei( "data/Minigames/Asteroids/data/score.ksgt" );
  351. if( !stb->laden() )
  352. DateiPfadErstellen( "data/Minigames/Asteroids/data/score.ksgt" );
  353. RCArray< Text > *zeile = new RCArray< Text >();
  354. Zeit *zeit = getZeit();
  355. zeile->add( zeit->getZeit( "y-m-d h:i:s" ) );
  356. zeit->release();
  357. Text *scoreT = new Text();
  358. scoreT->append( score );
  359. zeile->add( scoreT );
  360. Text *breiteT = new Text();
  361. breiteT->append( breite );
  362. zeile->add( breiteT );
  363. Text *höheT = new Text();
  364. höheT->append( höhe );
  365. zeile->add( höheT );
  366. Text *timerT = new Text();
  367. timerT->append( maxTimer );
  368. zeile->add( timerT );
  369. Text *aGrößeT = new Text();
  370. aGrößeT->append( aGröße );
  371. zeile->add( aGrößeT );
  372. Text *shipT = new Text();
  373. shipT->append( shipN );
  374. zeile->add( shipT );
  375. stb->addZeile( 7, zeile );
  376. zeile->release();
  377. stb->speichern();
  378. stb->release();
  379. DateiRemove( "data/Minigames/Asteroids/data/game.save" );
  380. }
  381. ret |= flammenM->tick( t );
  382. ret |= flammenL->tick( t );
  383. ret |= flammenR->tick( t );
  384. return ret;
  385. }
  386. void Map::render( Bild &zRObj )
  387. {
  388. cs.lock();
  389. Punkt kamP = ship->getKamPos( breite, höhe );
  390. zRObj.addScrollOffset( kamP.x, kamP.y );
  391. int aAnz = asteroid->getEintragAnzahl();
  392. for( int i = 0; i < aAnz; i++ )
  393. asteroid->z( i )->render( zRObj );
  394. int sAnz = schuss->getEintragAnzahl();
  395. for( int i = 0; i < sAnz; i++ )
  396. schuss->z( i )->render( zRObj );
  397. ship->render( zRObj );
  398. zRObj.addScrollOffset( -kamP.x, -kamP.y );
  399. if( breite >= 800 || höhe >= 500 )
  400. { // Minimap
  401. const Punkt &dOff = zRObj.getDrawOff();
  402. map->render( zRObj );
  403. zRObj.setPixelDP( 10 + ( ship->getPos().x * 200 ) / breite + dOff.x, 10 + ( ship->getPos().y * 200 ) / höhe + dOff.y, 0xFF00FF00 );
  404. for( int i = 0; i < aAnz; i++ )
  405. zRObj.setPixelDP( 10 + ( asteroid->z( i )->getPos().x * 200 ) / breite + dOff.x, 10 + ( asteroid->z( i )->getPos().y * 200 ) / höhe + dOff.y, 0xFFFF0000 );
  406. for( int i = 0; i < sAnz; i++ )
  407. 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 );
  408. kam->setPosition( 10 + ( 200 * kamP.x ) / breite, 10 + ( 200 * kamP.y ) / höhe );
  409. kam->setSize( ( 200 * 800 ) / breite, ( 200 * 500 ) / höhe );
  410. if( kam->getBreite() > 200 )
  411. kam->setSize( 200, kam->getHeight() );
  412. if( kam->getHeight() > 200 )
  413. kam->setSize( kam->getBreite(), 200 );
  414. kam->render( zRObj );
  415. }
  416. cs.unlock();
  417. }
  418. void Map::speichern()
  419. {
  420. if( !beendet && klient )
  421. {
  422. if( capture.istOffen() )
  423. capture.close();
  424. cs.lock();
  425. int anz = asteroid->getEintragAnzahl();
  426. int index = 0;
  427. for( int i = 0; index < anz; i++ )
  428. {
  429. M2Datei sad;
  430. Text pfad = "data/Minigames/Asteroids/data/sasave_";
  431. pfad += i;
  432. pfad += ".m2";
  433. DateiRemove( pfad );
  434. sad.setPfad( pfad );
  435. sad.leseDaten();
  436. char name[ 2 ];
  437. name[ 1 ] = 0;
  438. for( char n = 1; n <= 120 && index < anz; n++ )
  439. {
  440. name[ 0 ] = n;
  441. if( asteroid->z( index++ )->getId() < 0 )
  442. sad.saveModel( asteroid->z( index - 1 )->zModel()->zModel(), name );
  443. else
  444. n--;
  445. }
  446. }
  447. Datei *d = new Datei();
  448. d->setDatei( "data/Minigames/Asteroids/data/game.save" );
  449. d->erstellen();
  450. d->open( Datei::Style::schreiben );
  451. __int64 seed = rGen->getSeed();
  452. d->schreibe( (char*)&seed, 8 );
  453. d->schreibe( (char*)&gameTime, 8 );
  454. d->schreibe( (char*)&breite, 4 );
  455. d->schreibe( (char*)&höhe, 4 );
  456. d->schreibe( (char*)&aGröße, 4 );
  457. d->schreibe( (char*)&shipN, 4 );
  458. d->schreibe( (char*)&score, 4 );
  459. d->schreibe( (char*)&mTimer, 4 );
  460. ship->save( d );
  461. d->schreibe( (char*)&anz, 4 );
  462. for( int i = 0; i < anz; i++ )
  463. asteroid->z( i )->save( d );
  464. anz = schuss->getEintragAnzahl();
  465. d->schreibe( (char*)&anz, 4 );
  466. for( int i = 0; i < anz; i++ )
  467. schuss->z( i )->save( d );
  468. d->close();
  469. d->release();
  470. cs.unlock();
  471. }
  472. else if( klient )
  473. DateiRemove( "data/Minigames/Asteroids/data/game.save" );
  474. }