Map.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421
  1. #include "Map.h"
  2. #include <Rahmen.h>
  3. #include <InitDatei.h>
  4. #include <Text.h>
  5. #include <Zeit.h>
  6. #include <KSGTDatei.h>
  7. #include <AsynchronCall.h>
  8. // Inhalt der Map Klasse aus Map.h
  9. // Konstruktor
  10. Map::Map( MinigameKlientV *klient )
  11. {
  12. this->klient = klient;
  13. gegner = new RCArray< Spieler >();
  14. ziele = new RCArray< Spieler >();
  15. spieler = 0;
  16. feld = new LRahmen();
  17. feld->setFarbe( 0xFFFFFFFF );
  18. kam = new LRahmen();
  19. kam->setFarbe( 0xFF777777 );
  20. map = new LRahmen();
  21. map->setFarbe( 0xFFFFFFFF );
  22. map->setPosition( 10, 10 );
  23. map->setSize( 200, 200 );
  24. beendet = 1;
  25. gameTime = 0;
  26. tastenStände = 0;
  27. rGen = 0;
  28. ref = 1;
  29. }
  30. // Destruktor
  31. Map::~Map()
  32. {
  33. speichern();
  34. gegner->release();
  35. ziele->release();
  36. if( spieler )
  37. spieler->release();
  38. feld->release();
  39. kam->release();
  40. map->release();
  41. if( rGen )
  42. rGen->release();
  43. if( klient )
  44. klient->release();
  45. }
  46. // nicht constant
  47. void Map::reset( Text *zOptionen )
  48. {
  49. gameTime = 0;
  50. tastenStände = 0;
  51. if( rGen )
  52. rGen = rGen->release();
  53. beendet = 0;
  54. score = 0;
  55. gegner->leeren();
  56. ziele->leeren();
  57. if( spieler )
  58. spieler = spieler->release();
  59. ziele->leeren();
  60. Text *tmp = zOptionen->getTeilText( zOptionen->positionVon( '=' ) + 1, zOptionen->positionVon( ',' ) );
  61. breite = *tmp;
  62. tmp->release();
  63. tmp = zOptionen->getTeilText( zOptionen->positionVon( '=', 1 ) + 1, zOptionen->positionVon( ',', 1 ) );
  64. höhe = *tmp;
  65. tmp->release();
  66. tmp = zOptionen->getTeilText( zOptionen->positionVon( '=', 2 ) + 1, zOptionen->positionVon( ',', 2 ) );
  67. zAnzahl = *tmp;
  68. tmp->release();
  69. tmp = zOptionen->getTeilText( zOptionen->positionVon( '=', 3 ) + 1, zOptionen->positionVon( ',', 3 ) );
  70. neuGegner = *tmp;
  71. tmp->release();
  72. tmp = zOptionen->getTeilText( zOptionen->positionVon( '=', 4 ) + 1, zOptionen->positionVon( ',', 4 ) );
  73. geschwindigkeit = *tmp;
  74. tmp->release();
  75. tmp = zOptionen->getTeilText( zOptionen->positionVon( '=', 5 ) + 1, zOptionen->positionVon( ',', 5 ) );
  76. bool fortsetzen = (int)*tmp != 0;
  77. tmp->release();
  78. kamX = 0;
  79. kamY = 0;
  80. if( breite > 80 )
  81. kamX = breite / 2 - 400;
  82. if( höhe > 50 )
  83. kamY = höhe / 2 - 250;
  84. if( fortsetzen && DateiExistiert( "data/Minigames/Fangen/data/game.save" ) && klient )
  85. {
  86. if( capture.istOffen() )
  87. capture.close();
  88. capture.setDatei( "data/Minigames/Fangen/data/game.mgc" );
  89. capture.open( Datei::Style::schreiben | Datei::Style::ende | Datei::Style::lesen );
  90. Datei *save = new Datei();
  91. save->setDatei( "data/Minigames/Fangen/data/game.save" );
  92. save->open( Datei::Style::lesen );
  93. int br = 0;
  94. int hö = 0;
  95. __int64 seed;
  96. save->lese( (char*)&seed, 8 );
  97. rGen = new RandomGenerator();
  98. rGen->setSeed( seed );
  99. save->lese( (char*)&gameTime, 8 );
  100. save->lese( (char*)&br, 4 );
  101. save->lese( (char*)&hö, 4 );
  102. if( br == breite && hö == höhe )
  103. {
  104. save->lese( (char*)&score, 4 );
  105. spieler = new Spieler( SPIELER, save );
  106. int anz = 0;
  107. save->lese( (char*)&anz, 4 );
  108. for( int i = 0; i < anz; i++ )
  109. gegner->add( new Spieler( GEGNER, save ) );
  110. save->lese( (char*)&anz, 4 );
  111. for( int i = 0; i < anz; i++ )
  112. ziele->add( new Spieler( ZIEL, save ) );
  113. }
  114. save->close();
  115. save->release();
  116. }
  117. else
  118. {
  119. rGen = new RandomGenerator();
  120. if( klient )
  121. {
  122. if( capture.istOffen() )
  123. capture.close();
  124. DateiRemove( "data/Minigames/Fangen/data/game.mgc" );
  125. capture.setDatei( "data/Minigames/Fangen/data/game.mgc" );
  126. capture.erstellen();
  127. capture.open( Datei::Style::schreiben );
  128. __int64 seed = rGen->getSeed();
  129. capture.schreibe( (char*)&seed, 8 );
  130. }
  131. else
  132. {
  133. tmp = zOptionen->getTeilText( zOptionen->positionVon( '=', 6 ) + 1 );
  134. rGen->setSeed( (__int64)*tmp );
  135. tmp->release();
  136. }
  137. }
  138. if( !spieler )
  139. spieler = new Spieler( SPIELER, breite, höhe, rGen );
  140. if( !gegner->getEintragAnzahl() )
  141. {
  142. for( int i = 0; i < neuGegner; i++ )
  143. gegner->add( new Spieler( GEGNER, breite, höhe, rGen ) );
  144. }
  145. if( !ziele->getEintragAnzahl() )
  146. {
  147. for( int i = 0; i < zAnzahl; i++ )
  148. ziele->add( new Spieler( ZIEL, breite, höhe, rGen ) );
  149. }
  150. }
  151. void Map::doMausEreignis( MausEreignis &me )
  152. {
  153. }
  154. void Map::doTastaturEreignis( TastaturEreignis &te )
  155. {
  156. cs.lock();
  157. bool ok = 1;
  158. if( !beendet )
  159. {
  160. char tmp = tastenStände;
  161. if( te.taste == 'w' || te.taste == 'W' || te.taste == T_Oben )
  162. {
  163. if( te.id == TE_Press )
  164. tastenStände |= 1;
  165. else
  166. tastenStände &= ~1;
  167. }
  168. if( te.taste == 'd' || te.taste == 'D' || te.taste == T_Rechts )
  169. {
  170. if( te.id == TE_Press )
  171. tastenStände |= 2;
  172. else
  173. tastenStände &= ~2;
  174. }
  175. if( te.taste == 'a' || te.taste == 'A' || te.taste == T_Links )
  176. {
  177. if( te.id == TE_Press )
  178. tastenStände |= 4;
  179. else
  180. tastenStände &= ~4;
  181. }
  182. if( te.taste == 's' || te.taste == 'S' || te.taste == T_Unten )
  183. {
  184. if( te.id == TE_Press )
  185. tastenStände |= 8;
  186. else
  187. tastenStände &= ~8;
  188. }
  189. if( tmp != tastenStände && klient )
  190. {
  191. if( klient )
  192. {
  193. capture.schreibe( (char*)&gameTime, 8 );
  194. capture.schreibe( &tastenStände, 1 );
  195. }
  196. }
  197. }
  198. cs.unlock();
  199. }
  200. bool Map::tick( double tickVal )
  201. {
  202. if( beendet || !spieler )
  203. return 0;
  204. cs.lock();
  205. gameTime += tickVal;
  206. double t = tickVal * geschwindigkeit / 1000;
  207. spieler->tick( t, breite, höhe, tastenStände );
  208. int anz = gegner->getEintragAnzahl();
  209. for( int i = 0; i < anz; i++ )
  210. {
  211. gegner->z( i )->tick( t, breite, höhe, tastenStände );
  212. if( gegner->z( i )->berührt( spieler->getX(), spieler->getY() ) )
  213. beendet = 1;
  214. }
  215. anz = ziele->getEintragAnzahl();
  216. for( int i = 0; i < anz; i++ )
  217. {
  218. ziele->z( i )->tick( t, breite, höhe, tastenStände );
  219. if( ziele->z( i )->berührt( spieler->getX(), spieler->getY() ) )
  220. {
  221. score++;
  222. ziele->leeren();
  223. for( int i = 0; i < zAnzahl; i++ )
  224. ziele->add( new Spieler( ZIEL, breite, höhe, rGen ) );
  225. for( int i = 0; i < neuGegner; i++ )
  226. gegner->add( new Spieler( GEGNER, breite, höhe, rGen ) );
  227. }
  228. }
  229. if( breite > 800 )
  230. {
  231. kamX = (int)spieler->getX() - 400;
  232. if( kamX < 0 )
  233. kamX = 0;
  234. if( kamX + 800 > breite )
  235. kamX = breite - 800;
  236. }
  237. if( höhe > 500 )
  238. {
  239. kamY = (int)spieler->getY() - 250;
  240. if( kamY < 0 )
  241. kamY = 0;
  242. if( kamY + 500 > höhe )
  243. kamY = höhe - 500;
  244. }
  245. if( beendet && klient )
  246. {
  247. capture.close();
  248. DateiRemove( "data/Minigames/Fangen/data/upload.mgc" );
  249. DateiUmbenennen( "data/Minigames/Fangen/data/game.mgc", "data/Minigames/Fangen/data/upload.mgc" );
  250. int tmpScore = score;
  251. MinigameKlientV *tmpKlient = klient->getThis();
  252. new AsynchronCall( [ tmpScore, tmpKlient ]()
  253. {
  254. InitDatei *opd = new InitDatei( "data/Minigames/Fangen/data/optionen.ini" );
  255. opd->laden();
  256. Text optionen = "Width=";
  257. optionen += opd->zWert( "Breite" )->getText();
  258. optionen += ",Height=";
  259. optionen += opd->zWert( "Höhe" )->getText();
  260. optionen += ",Ziele=";
  261. optionen += opd->zWert( "Ziele" )->getText();
  262. optionen += ",Gegner=";
  263. optionen += opd->zWert( "+Gegner" )->getText();
  264. optionen += ",Speed=";
  265. optionen += opd->zWert( "Geschwindigkeit" )->getText();
  266. opd->release();
  267. int status = tmpKlient->reportEndOfGame( "Fangen", optionen, tmpScore );
  268. if( status == 2 )
  269. {
  270. Datei d;
  271. d.setDatei( "data/Minigames/Fangen/data/upload.mgc" );
  272. tmpKlient->uploadGameCapture( &d );
  273. }
  274. DateiRemove( "data/Minigames/Fangen/data/upload.mgc" );
  275. tmpKlient->release();
  276. } );
  277. KSGTDatei *stb = new KSGTDatei( "data/Minigames/Fangen/data/score.ksgt" );
  278. if( !stb->laden() )
  279. DateiPfadErstellen( "data/Minigames/Fangen/data/score.ksgt" );
  280. RCArray< Text > *zeile = new RCArray< Text >();
  281. Zeit *zeit = getZeit();
  282. zeile->add( zeit->getZeit( "y-m-d h:i:s" ) );
  283. zeit->release();
  284. Text *scoreT = new Text();
  285. scoreT->append( score );
  286. zeile->add( scoreT );
  287. Text *breiteT = new Text();
  288. breiteT->append( breite );
  289. zeile->add( breiteT );
  290. Text *höheT = new Text();
  291. höheT->append( höhe );
  292. zeile->add( höheT );
  293. Text *geschwindigkeitT = new Text();
  294. geschwindigkeitT->append( geschwindigkeit );
  295. zeile->add( geschwindigkeitT );
  296. Text *zAnzahlT = new Text();
  297. zAnzahlT->append( zAnzahl );
  298. zeile->add( zAnzahlT );
  299. Text *nAnzahlT = new Text();
  300. nAnzahlT->append( neuGegner );
  301. zeile->add( nAnzahlT );
  302. stb->addZeile( 7, zeile );
  303. zeile->release();
  304. stb->speichern();
  305. stb->release();
  306. DateiRemove( "data/Minigames/Fangen/data/game.save" );
  307. }
  308. cs.unlock();
  309. return 1;
  310. }
  311. void Map::render( Bild &zRObj )
  312. {
  313. if( !spieler )
  314. return;
  315. int xStart = 0;
  316. int yStart = 0;
  317. if( breite < 800 )
  318. xStart = 400 - breite / 2;
  319. else
  320. xStart -= kamX;
  321. if( höhe < 500 )
  322. yStart = 250 - höhe / 2;
  323. else
  324. yStart -= kamY;
  325. feld->setPosition( xStart, yStart );
  326. feld->setSize( breite, höhe );
  327. feld->render( zRObj );
  328. bool rMap = breite > 800 || höhe > 500;
  329. zRObj.addScrollOffset( -xStart, -yStart );
  330. spieler->render( zRObj );
  331. int gAnz = gegner->getEintragAnzahl();
  332. for( int i = 0; i < gAnz; i++ )
  333. gegner->z( i )->render( zRObj );
  334. int zAnz = ziele->getEintragAnzahl();
  335. for( int i = 0; i < zAnz; i++ )
  336. ziele->z( i )->render( zRObj );
  337. zRObj.addScrollOffset( xStart, yStart );
  338. if( rMap )
  339. {
  340. const Punkt &dOff = zRObj.getDrawOff();
  341. map->render( zRObj );
  342. zRObj.setPixelDP( 10 + ( 200 * spieler->getX() ) / breite + dOff.x, 10 + ( 200 * spieler->getY() ) / höhe + dOff.y, 0xFF00FF00 );
  343. for( int i = 0; i < gAnz; i++ )
  344. zRObj.setPixelDP( 10 + ( 200 * gegner->z( i )->getX() ) / breite + dOff.x, 10 + ( 200 * gegner->z( i )->getY() ) / höhe + dOff.y, 0xFFFF0000 );
  345. for( int i = 0; i < zAnz; i++ )
  346. zRObj.setPixelDP( 10 + ( 200 * ziele->z( i )->getX() ) / breite + dOff.x, 10 + ( 200 * ziele->z( i )->getY() ) / höhe + dOff.y, 0xFF00FFFF );
  347. kam->setPosition( 10 + ( 200 * kamX ) / breite, 10 + ( 200 * kamY ) / höhe );
  348. kam->setSize( ( 200 * 800 ) / breite, ( 200 * 500 ) / höhe );
  349. if( kam->getBreite() > 200 )
  350. kam->setSize( 200, kam->getHeight() );
  351. if( kam->getHeight() > 200 )
  352. kam->setSize( kam->getBreite(), 200 );
  353. kam->render( zRObj );
  354. }
  355. }
  356. void Map::speichern()
  357. {
  358. if( !beendet && spieler )
  359. {
  360. if( capture.istOffen() )
  361. capture.close();
  362. Datei *d = new Datei();
  363. d->setDatei( "data/Minigames/Fangen/data/game.save" );
  364. d->erstellen();
  365. d->open( Datei::Style::schreiben );
  366. __int64 seed = rGen->getSeed();
  367. d->schreibe( (char*)&seed, 8 );
  368. d->schreibe( (char*)&gameTime, 8 );
  369. d->schreibe( (char*)&breite, 4 );
  370. d->schreibe( (char*)&höhe, 4 );
  371. d->schreibe( (char*)&score, 4 );
  372. spieler->save( d );
  373. int anz = gegner->getEintragAnzahl();
  374. d->schreibe( (char*)&anz, 4 );
  375. for( int i = 0; i < anz; i++ )
  376. gegner->z( i )->save( d );
  377. anz = ziele->getEintragAnzahl();
  378. d->schreibe( (char*)&anz, 4 );
  379. for( int i = 0; i < anz; i++ )
  380. ziele->z( i )->save( d );
  381. d->close();
  382. d->release();
  383. }
  384. else if( klient )
  385. DateiRemove( "data/Minigames/Fangen/data/game.save" );
  386. }
  387. // constant
  388. int Map::getScore() const
  389. {
  390. return score;
  391. }
  392. bool Map::istBeendet() const
  393. {
  394. return beendet;
  395. }
  396. // Reference Counting
  397. Map *Map::getThis()
  398. {
  399. ref++;
  400. return this;
  401. }
  402. Map *Map::release()
  403. {
  404. ref--;
  405. if( !ref )
  406. delete this;
  407. return 0;
  408. }