SpielKlasse.cpp 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955
  1. #include "SpielKlasse.h"
  2. #include <time.h>
  3. #include <Schrift.h>
  4. #include <MausEreignis.h>
  5. #include <TastaturEreignis.h>
  6. #include <M2Datei.h>
  7. #include <DateiSystem.h>
  8. #include "SpielerGUI/SpielerGUI.h"
  9. #include "Define.h"
  10. #include <Animation.h>
  11. // Inhalt der SpielKlasse Klasse aus SpielKlasse.h
  12. // Konstruktor
  13. SpielKlasse::SpielKlasse()
  14. {
  15. spielZeit = 0;
  16. rZeit = 0;
  17. rendern = 0;
  18. stkn = new RCArray< STKNachricht >();
  19. stkna = 0;
  20. schrift = 0;
  21. time_t t;
  22. time( &t );
  23. srand( (unsigned int)t );
  24. infoKlient = 0;
  25. spielKlient = 0;
  26. spieler = new RCArray< Spieler >();
  27. teams = new RCArray< Team >();
  28. objekte = new RCArray< SpielObjekt >();
  29. deads = new RCArray< DeadPlayer >();
  30. screen = 0;
  31. welt = new Welt2D();
  32. welt->setCircular( 1 );
  33. welt->setAirResistance( 0.01f );
  34. kam = new Kamera2D();
  35. kam->setWelt( welt->getThis(), 1 );
  36. minimap = new Kamera2D();
  37. minimap->setSize( 200, 200 );
  38. minimap->setWelt( welt->getThis(), 0 );
  39. spielerAnzahl = 0;
  40. karteId = 0;
  41. ladenProzent = 0;
  42. spielerNummer = 0;
  43. map = 0;
  44. end = 0;
  45. chat = new SpielChat();
  46. tasten = new char[ 256 ];
  47. for( int i = 0; i < 256; i++ )
  48. tasten[ i ] = 0;
  49. bestenliste = 0;
  50. schüsse = new RCArray< Laser >();
  51. shipGUI = 0;
  52. spielPause = 1;
  53. ref = 1;
  54. }
  55. // Destruktor
  56. SpielKlasse::~SpielKlasse()
  57. {
  58. for( int i = 0; i < map->getMaxTeamAnzahl(); i++ )
  59. {
  60. if( teams->z( i ) )
  61. teams->z( i )->reset();
  62. }
  63. map->release();
  64. minimap->release();
  65. welt->release();
  66. deads->release();
  67. stkn->release();
  68. if( schrift )
  69. schrift->release();
  70. if( infoKlient )
  71. infoKlient->release();
  72. if( spielKlient )
  73. spielKlient->release();
  74. if( kam )
  75. kam->release();
  76. if( end )
  77. end->release();
  78. if( bestenliste )
  79. bestenliste->release();
  80. if( shipGUI )
  81. shipGUI->release();
  82. chat->relese();
  83. spieler->release();
  84. teams->release();
  85. objekte->release();
  86. if( screen )
  87. screen->release();
  88. schüsse->release();
  89. delete[] tasten;
  90. }
  91. // privat
  92. bool SpielKlasse::istAmLeben() const
  93. {
  94. for( int i = 0; i < spielerAnzahl; i++ )
  95. {
  96. if( spieler->z( i )->getSpielerNummer() == spielerNummer )
  97. return spieler->z( i )->istAmLeben();
  98. }
  99. return 0;
  100. }
  101. // nicht constant
  102. void SpielKlasse::lock()
  103. {
  104. if( screen )
  105. screen->lock();
  106. }
  107. void SpielKlasse::unlock()
  108. {
  109. if( screen )
  110. screen->unlock();
  111. }
  112. void SpielKlasse::setSchrift( Schrift *schrift )
  113. {
  114. if( this->schrift )
  115. this->schrift->release();
  116. this->schrift = schrift;
  117. chat->setSchrift( schrift );
  118. if( !bestenliste )
  119. bestenliste = new Bestenliste( schrift->getThis() );
  120. if( !shipGUI )
  121. shipGUI = new SpielerGUI( schrift );
  122. }
  123. void SpielKlasse::setBildschirm( Bildschirm *screen )
  124. {
  125. this->screen = screen;
  126. }
  127. void SpielKlasse::nachricht( int län, char *bytes )
  128. {
  129. if( !län )
  130. return;
  131. lock();
  132. stkn->add( new STKNachricht( län, bytes ), stkna );
  133. stkna++;
  134. unlock();
  135. }
  136. void SpielKlasse::setKlients( KSGClient::InformationServerClient *infoKlient, KSGClient::SpielServerClient *spielKlient )
  137. {
  138. if( this->infoKlient )
  139. this->infoKlient->release();
  140. this->infoKlient = infoKlient;
  141. if( this->spielKlient )
  142. this->spielKlient->release();
  143. this->spielKlient = spielKlient;
  144. }
  145. void SpielKlasse::setKarteId( int karteId )
  146. {
  147. this->karteId = karteId;
  148. }
  149. void SpielKlasse::ladeDaten()
  150. {
  151. Text path = "data/log/0.csv";
  152. for( int i = 1; DateiExistiert( path ); i++ )
  153. {
  154. path = "data/log/";
  155. path += i;
  156. path += ".csv";
  157. }
  158. csv.setDatei( path );
  159. csv.erstellen();
  160. csv.open( Datei::Style::schreiben );
  161. csv.schreibe( "Spielernummer;Skill ID\n", 23 );
  162. // load frame annimation
  163. Text *gamePath = infoKlient->getDateiGruppePfad( infoKlient->getDateiGruppeIdVonSpiel( infoKlient->getSpielId( karteId ) ) );
  164. LTDBDatei flammenStartLTDB;
  165. Text *f_start = new Text( gamePath->getText() );
  166. f_start->append( "/bilder/f_start.ltdb" );
  167. flammenStartLTDB.setDatei( f_start );
  168. flammenStartLTDB.leseDaten( 0 );
  169. Animation2DData *flammenStart = new Animation2DData();
  170. flammenStart->ladeAnimation( flammenStartLTDB.getThis() );
  171. flammenStart->setFPS( 75 );
  172. flammenStart->setWiederhohlend( 0 );
  173. spielKlient->setLadenProzent( 7 );
  174. LTDBDatei flammenLTDB;
  175. Text *f_burn = new Text( gamePath->getText() );
  176. f_burn->append( "/bilder/f_burn.ltdb" );
  177. flammenLTDB.setDatei( f_burn );
  178. Animation2DData *flammenBurn = new Animation2DData();
  179. flammenBurn->ladeAnimation( flammenLTDB.getThis() );
  180. flammenBurn->setFPS( 60 );
  181. flammenBurn->setWiederhohlend( 1 );
  182. map = new Karte();
  183. Text *mapPf = new Text( "data/tmp/Karten/" );
  184. mapPf->append( karteId );
  185. mapPf->append( "/spiel/data/data.sts" );
  186. Datei *stsD = new Datei();
  187. stsD->setDatei( mapPf->getText() );
  188. stsD->open( Datei::Style::lesen );
  189. map->ladeSts( stsD );
  190. stsD->close();
  191. stsD->release();
  192. spielKlient->setLadenProzent( 15 );
  193. mapPf->ersetzen( mapPf->getLength() - 3, mapPf->getLength(), "map" );
  194. Datei *mapD = new Datei();
  195. mapD->setDatei( mapPf->getText() );
  196. mapD->open( Datei::Style::lesen );
  197. map->ladeMap( mapD, karteId, spielKlient, gamePath );
  198. mapD->close();
  199. mapD->release();
  200. mapPf->release();
  201. for( int i = 0; i < map->getMaxSpielerAnzahl(); i++ )
  202. {
  203. Spieler *s = map->createSpieler( i, schrift, infoKlient, flammenStart, flammenBurn );
  204. welt->addObject( s->getThis() );
  205. spieler->set( s, i );
  206. }
  207. flammenStart->release();
  208. flammenBurn->release();
  209. spielKlient->setLadenProzent( 95 );
  210. for( int i = 0; i < map->getZeichnungAnzahl(); i++ )
  211. {
  212. SpielObjekt *obj = map->createObjekt( i, schrift );
  213. welt->addObject( obj->getThis() );
  214. objekte->set( obj, i );
  215. }
  216. bestenliste->setTeamAnzahl( map->getMaxTeamAnzahl() );
  217. welt->setSize( map->getSize().x, map->getSize().y );
  218. welt->setSize( 1 );
  219. minimap->lookAtWorldArea( map->getSize().x, map->getSize().y );
  220. spielKlient->setLadenProzent( 100 );
  221. }
  222. void SpielKlasse::doMausEreignis( MausEreignis &me )
  223. {
  224. if( end )
  225. {
  226. end->doMausEreignis( me );
  227. return;
  228. }
  229. if( !istAmLeben() )
  230. me.verarbeitet = 1;
  231. int skill = shipGUI->doMausEreignis( me );
  232. if( skill >= 0 )
  233. {
  234. char *bytes = new char[ 2 ];
  235. bytes[ 0 ] = 9;
  236. bytes[ 1 ] = (char)skill;
  237. spielKlient->spielNachricht( 2, bytes );
  238. }
  239. chat->doMausEreignis( me );
  240. if( bestenliste )
  241. bestenliste->doMausEreignis( me );
  242. }
  243. void SpielKlasse::doTastaturEreignis( TastaturEreignis &te )
  244. {
  245. bestenliste->doTastaturEreignis( te );
  246. if( end )
  247. {
  248. end->doTastaturEreignis( te );
  249. return;
  250. }
  251. if( !chat->istAktiv() )
  252. {
  253. if( istAmLeben() )
  254. {
  255. if( te.id == TE_Press )
  256. {
  257. switch( te.taste )
  258. {
  259. case 'w':
  260. case 'W':
  261. case T_Oben:
  262. if( !tasten[ T_Oben ] )
  263. {
  264. tasten[ T_Oben ] = 1;
  265. char byte = 0;
  266. spielKlient->spielNachricht( 1, &byte );
  267. te.verarbeitet = 1;
  268. }
  269. break;
  270. case 'a':
  271. case 'A':
  272. case T_Links:
  273. if( !tasten[ T_Links ] )
  274. {
  275. tasten[ T_Links ] = 1;
  276. char byte = 2;
  277. spielKlient->spielNachricht( 1, &byte );
  278. te.verarbeitet = 1;
  279. }
  280. break;
  281. case 'd':
  282. case 'D':
  283. case T_Rechts:
  284. if( !tasten[ T_Rechts ] )
  285. {
  286. tasten[ T_Rechts ] = 1;
  287. char byte = 4;
  288. spielKlient->spielNachricht( 1, &byte );
  289. te.verarbeitet = 1;
  290. }
  291. break;
  292. case T_Space:
  293. if( !tasten[ T_Space ] )
  294. {
  295. tasten[ T_Space ] = 1;
  296. char byte = 6;
  297. spielKlient->spielNachricht( 1, &byte );
  298. te.verarbeitet = 1;
  299. }
  300. break;
  301. }
  302. }
  303. if( te.id == TE_Release )
  304. {
  305. switch( te.taste )
  306. {
  307. case 'w':
  308. case 'W':
  309. case T_Oben:
  310. if( tasten[ T_Oben ] )
  311. {
  312. tasten[ T_Oben ] = 0;
  313. char byte = 1;
  314. spielKlient->spielNachricht( 1, &byte );
  315. te.verarbeitet = 1;
  316. }
  317. break;
  318. case 'a':
  319. case 'A':
  320. case T_Links:
  321. if( tasten[ T_Links ] )
  322. {
  323. tasten[ T_Links ] = 0;
  324. char byte = 3;
  325. spielKlient->spielNachricht( 1, &byte );
  326. te.verarbeitet = 1;
  327. }
  328. break;
  329. case 'd':
  330. case 'D':
  331. case T_Rechts:
  332. if( tasten[ T_Rechts ] )
  333. {
  334. tasten[ T_Rechts ] = 0;
  335. char byte = 5;
  336. spielKlient->spielNachricht( 1, &byte );
  337. te.verarbeitet = 1;
  338. }
  339. break;
  340. case T_Space:
  341. if( tasten[ T_Space ] )
  342. {
  343. tasten[ T_Space ] = 0;
  344. char byte = 7;
  345. spielKlient->spielNachricht( 1, &byte );
  346. te.verarbeitet = 1;
  347. }
  348. break;
  349. }
  350. }
  351. }
  352. else
  353. {
  354. if( te.id == TE_Press )
  355. {
  356. switch( te.taste )
  357. {
  358. case T_Links:
  359. kam->setPosition( kam->getPosition() + Vertex( -2, 0 ) );
  360. te.verarbeitet = 1;
  361. break;
  362. case T_Oben:
  363. kam->setPosition( kam->getPosition() + Vertex( 0, -2 ) );
  364. te.verarbeitet = 1;
  365. break;
  366. case T_Rechts:
  367. kam->setPosition( kam->getPosition() + Vertex( 2, 0 ) );
  368. te.verarbeitet = 1;
  369. break;
  370. case T_Unten:
  371. kam->setPosition( kam->getPosition() + Vertex( 0, 2 ) );
  372. te.verarbeitet = 1;
  373. break;
  374. }
  375. }
  376. }
  377. }
  378. if( !te.verarbeitet )
  379. chat->doTastaturEreignis( te, spielKlient );
  380. }
  381. void SpielKlasse::stknVerarbeitung()
  382. {
  383. lock();
  384. for( int i = 0; i < stkna; i++ )
  385. {
  386. STKNachricht *n = stkn->z( i );
  387. int zeit = n->getSpielZeit();
  388. if( zeit > spielZeit )
  389. break;
  390. int län = n->getLength();
  391. char *bytes = n->getNachricht();
  392. län--;
  393. int sNum = 0;
  394. switch( bytes[ 0 ] )
  395. {
  396. case 0: // spieler drückt gas
  397. bytes++;
  398. sNum = *(int*)bytes;
  399. län -= 4;
  400. for( int i = 0; i < spielerAnzahl; i++ )
  401. {
  402. if( spieler->z( i )->getSpielerNummer() == sNum )
  403. spieler->z( i )->setTastataturStatus( T_GAS, 1, zeit, welt->getWorldInfo() );
  404. }
  405. break;
  406. case 1: // spieler lässt gas los
  407. bytes++;
  408. sNum = *(int*)bytes;
  409. län -= 4;
  410. for( int i = 0; i < spielerAnzahl; i++ )
  411. {
  412. if( spieler->z( i )->getSpielerNummer() == sNum )
  413. spieler->z( i )->setTastataturStatus( T_GAS, 0, zeit, welt->getWorldInfo() );
  414. }
  415. break;
  416. case 2: // spieler drückt rotl
  417. bytes++;
  418. sNum = *(int*)bytes;
  419. län -= 4;
  420. for( int i = 0; i < spielerAnzahl; i++ )
  421. {
  422. if( spieler->z( i )->getSpielerNummer() == sNum )
  423. spieler->z( i )->setTastataturStatus( T_ROT_L, 1, zeit, welt->getWorldInfo() );
  424. }
  425. break;
  426. case 3: // spieler lässt rotl los
  427. bytes++;
  428. sNum = *(int*)bytes;
  429. län -= 4;
  430. for( int i = 0; i < spielerAnzahl; i++ )
  431. {
  432. if( spieler->z( i )->getSpielerNummer() == sNum )
  433. spieler->z( i )->setTastataturStatus( T_ROT_L, 0, zeit, welt->getWorldInfo() );
  434. }
  435. break;
  436. case 4: // spieler drückt rotr
  437. bytes++;
  438. sNum = *(int*)bytes;
  439. län -= 4;
  440. for( int i = 0; i < spielerAnzahl; i++ )
  441. {
  442. if( spieler->z( i )->getSpielerNummer() == sNum )
  443. spieler->z( i )->setTastataturStatus( T_ROT_R, 1, zeit, welt->getWorldInfo() );
  444. }
  445. break;
  446. case 5: // spieler lässt rotr los
  447. bytes++;
  448. sNum = *(int*)bytes;
  449. län -= 4;
  450. for( int i = 0; i < spielerAnzahl; i++ )
  451. {
  452. if( spieler->z( i )->getSpielerNummer() == sNum )
  453. spieler->z( i )->setTastataturStatus( T_ROT_R, 0, zeit, welt->getWorldInfo() );
  454. }
  455. break;
  456. case 6: // Init Spieler
  457. if( 1 )
  458. {
  459. bytes++;
  460. spielerAnzahl = (int)*bytes;
  461. bytes++;
  462. län--;
  463. for( int i = 0; i < spielerAnzahl; i++ )
  464. {
  465. int sNum = *(int*)bytes;
  466. Spieler *tmp = spieler->z( sNum - 1 );
  467. bytes += 4;
  468. län -= 4;
  469. tmp->setAccountId( *(int*)bytes );
  470. bytes += 4;
  471. län -= 4;
  472. if( !teams->z( map->getTeamNummer( sNum ) ) )
  473. teams->set( map->createTeam( map->getTeamNummer( sNum ) ), map->getTeamNummer( sNum ) );
  474. tmp->setTeam( teams->get( map->getTeamNummer( sNum ) ) );
  475. tmp->zTeam()->spieler->add( (Spieler*)tmp->getThis() );
  476. spieler->add( tmp );
  477. bestenliste->addSpieler( tmp );
  478. bestenliste->updateSpieler( tmp );
  479. bestenliste->updateTeam( tmp->zTeam() );
  480. }
  481. int max = map->getMaxSpielerAnzahl();
  482. for( int i = 0; i < max; i++ )
  483. {
  484. if( !spieler->z( i )->zTeam() )
  485. {
  486. spieler->remove( i );
  487. i--;
  488. max--;
  489. }
  490. }
  491. }
  492. break;
  493. case 0x8: // Chat Nachricht
  494. if( 1 )
  495. {
  496. bytes++;
  497. Text *txt = new Text( "" );
  498. txt->append( bytes, län );
  499. chat->addNachricht( txt->getText() );
  500. txt->release();
  501. län = 0;
  502. }
  503. break;
  504. case 0x9: // Spieler Nummer
  505. bytes++;
  506. spielerNummer = *(int*)bytes;
  507. län -= 4;
  508. for( int i = 0; i < spielerAnzahl; i++ )
  509. {
  510. if( spieler->z( i )->getSpielerNummer() == spielerNummer )
  511. {
  512. shipGUI->update( spieler->z( i ) );
  513. break;
  514. }
  515. }
  516. break;
  517. case 0xA: // Start
  518. spielPause = 0;
  519. rendern = 1;
  520. break;
  521. case 0xB: // Ende
  522. csv.schreibe( "\n\nSpielernummer;Kills;Tode;Schaden gemacht;Schaden bekommen;Schüsse;Treffer\n", 2 );
  523. for( int i = 0; i < spielerAnzahl; i++ )
  524. {
  525. Spieler *s = spieler->z( i );
  526. Text line = s->getSpielerNummer();
  527. line += ";";
  528. line += s->getKills();
  529. line += ";";
  530. line += s->getTode();
  531. line += ";";
  532. line += s->getSchadenGemacht();
  533. line += ";";
  534. line += s->getSchadenBekommen();
  535. line += ";";
  536. line += s->getSchüsse();
  537. line += ";";
  538. line += s->getTreffer();
  539. line += "\n";
  540. csv.schreibe( line, line.getLength() );
  541. }
  542. csv.close();
  543. end = new Ende( schrift );
  544. bytes++;
  545. län--;
  546. end->setGewonnen( *bytes );
  547. break;
  548. case 0xC: // Skill
  549. if( 1 )
  550. {
  551. bytes++;
  552. sNum = *(int*)bytes;
  553. bytes += 4;
  554. län -= 4;
  555. char art = *bytes;
  556. län--;
  557. Text line = sNum;
  558. line += ";";
  559. line += art;
  560. line += "\n";
  561. csv.schreibe( line, line.getLength() );
  562. for( int i = 0; i < spielerAnzahl; i++ )
  563. {
  564. if( spieler->z( i )->getSpielerNummer() == sNum )
  565. {
  566. Team *tmp = spieler->z( i )->zTeam();
  567. for( auto *j = &tmp->spieler->getArray(); j && j->set && j->var; j = j->next )
  568. j->var->resetToSaveTime( zeit, welt->getWorldInfo() );
  569. spieler->z( i )->setSkill( art );
  570. tmp->akkuLeistung = tmp->getAkkuLeistungBonus();
  571. tmp->beschleunigung = tmp->getBeschleunigungBonus();
  572. tmp->laserEffizienz = tmp->getLaserEffizienzBonus();
  573. tmp->laserIntensität = tmp->getLaserIntensitätBonus();
  574. tmp->laserTempo = tmp->getLaserTempoBonus();
  575. tmp->maxEnergie = tmp->getMaxEnergieBonus();
  576. tmp->maxStabilität = tmp->getMaxStabilitätBonus();
  577. tmp->reparatur = tmp->getReperaturBonus();
  578. tmp->wendigkeit = tmp->getWendigkeitBonus();
  579. tmp->antriebEffizienz = tmp->getAntriebEffizienzBonus();
  580. tmp->energieSchild = tmp->getEnergieSchildBonus();
  581. tmp->energieSchildEffizienz = tmp->getEnergieSchildEffizienzBonus();
  582. for( auto *j = &tmp->spieler->getArray(); j && j->set && j->var; j = j->next )
  583. j->var->resetToGameTime( spielZeit, welt->getWorldInfo() );
  584. break;
  585. }
  586. }
  587. for( int i = 0; i < spielerAnzahl; i++ )
  588. {
  589. if( spieler->z( i )->getSpielerNummer() == spielerNummer )
  590. {
  591. shipGUI->update( spieler->z( i ) );
  592. break;
  593. }
  594. }
  595. }
  596. break;
  597. case 0xD: // Schuss
  598. if( 1 )
  599. {
  600. bytes++;
  601. int id = *(int*)bytes;
  602. bytes += 4;
  603. län -= 4;
  604. sNum = *(int*)bytes;
  605. bytes += 4;
  606. län -= 4;
  607. double xPos = *(double*)bytes;
  608. bytes += 8;
  609. län -= 8;
  610. double yPos = *(double*)bytes;
  611. bytes += 8;
  612. län -= 8;
  613. double xSpeed = *(double*)bytes;
  614. bytes += 8;
  615. län -= 8;
  616. double ySpeed = *(double*)bytes;
  617. bytes += 8;
  618. län -= 8;
  619. double intensität = *(double*)bytes;
  620. län -= 8;
  621. int farbe = 0;
  622. for( int i = 0; i < spielerAnzahl; i++ )
  623. {
  624. if( spieler->z( i )->getSpielerNummer() == sNum )
  625. {
  626. spieler->z( i )->resetToSaveTime( zeit, welt->getWorldInfo() );
  627. spieler->z( i )->setPosition( Vec2< double >( xPos, yPos ) );
  628. spieler->z( i )->hatGeschossen();
  629. farbe = spieler->z( i )->zTeam()->farbe;
  630. spieler->z( i )->resetToGameTime( spielZeit, welt->getWorldInfo() );
  631. break;
  632. }
  633. }
  634. if( sNum == spielerNummer )
  635. {
  636. for( int i = 0; i < spielerAnzahl; i++ )
  637. {
  638. if( spieler->z( i )->getSpielerNummer() == spielerNummer )
  639. {
  640. shipGUI->update( spieler->z( i ) );
  641. bestenliste->updateSpieler( spieler->z( i ) );
  642. break;
  643. }
  644. }
  645. }
  646. Laser *l = new Laser( id, Vec2< double >( xPos, yPos ), Vec2< double >( xSpeed, ySpeed ), sNum, intensität, farbe );
  647. for( int i = 0; i < spielZeit - zeit; i++ )
  648. l->tick( welt->getWorldInfo(), TICK );
  649. welt->addObject( l->getThis() );
  650. schüsse->add( l );
  651. }
  652. break;
  653. case 0xE: // Treffer
  654. if( 1 )
  655. {
  656. bytes++;
  657. int schuss = *(int*)bytes;
  658. bytes += 4;
  659. län -= 4;
  660. int sNum = *(int*)bytes;
  661. län -= 4;
  662. int anz = schüsse->getEintragAnzahl();
  663. for( int i = 0; i < anz; i++ )
  664. {
  665. if( schüsse->z( i )->getId() == schuss )
  666. {
  667. Laser *tmp = schüsse->z( i );
  668. if( zeit > spielZeit )
  669. {
  670. for( int i = 0; i < zeit - spielZeit; i++ )
  671. tmp->tick( welt->getWorldInfo(), TICK );
  672. }
  673. else
  674. {
  675. for( int i = 0; i < spielZeit - zeit; i++ )
  676. tmp->tick( welt->getWorldInfo(), -TICK );
  677. }
  678. if( sNum >= 0 )
  679. {
  680. double intens = 0;
  681. for( int j = 0; j < spielerAnzahl; j++ )
  682. {
  683. if( spieler->z( j )->getSpielerNummer() == sNum )
  684. {
  685. spieler->z( j )->resetToSaveTime( zeit, welt->getWorldInfo() );
  686. intens = tmp->getIntensität( spieler->z( j )->getSpeed() );
  687. spieler->z( j )->nimmSchaden( intens );
  688. spieler->z( j )->calcDeadPlayerObject( schüsse->z( i ) );
  689. spieler->z( j )->resetToGameTime( spielZeit, welt->getWorldInfo() );
  690. bestenliste->updateSpieler( spieler->z( j ) );
  691. break;
  692. }
  693. }
  694. for( int j = 0; j < spielerAnzahl; j++ )
  695. {
  696. if( spieler->z( j )->getSpielerNummer() == tmp->getSpieler() )
  697. {
  698. spieler->z( j )->resetToSaveTime( zeit, welt->getWorldInfo() );
  699. spieler->z( j )->machSchaden( intens );
  700. spieler->z( j )->resetToGameTime( spielZeit, welt->getWorldInfo() );
  701. bestenliste->updateSpieler( spieler->z( j ) );
  702. break;
  703. }
  704. }
  705. }
  706. welt->removeObject( tmp );
  707. schüsse->remove( i );
  708. break;
  709. }
  710. }
  711. if( sNum == spielerNummer )
  712. {
  713. for( int i = 0; i < spielerAnzahl; i++ )
  714. {
  715. if( spieler->z( i )->getSpielerNummer() == spielerNummer )
  716. {
  717. shipGUI->update( spieler->z( i ) );
  718. break;
  719. }
  720. }
  721. }
  722. }
  723. break;
  724. case 0xF: // Wiederbelebung
  725. if( 1 )
  726. {
  727. bytes++;
  728. int sNum = *(int*)bytes;
  729. län -= 4;
  730. for( int i = 0; i < spielerAnzahl; i++ )
  731. {
  732. if( spieler->z( i )->getSpielerNummer() == sNum )
  733. {
  734. spieler->z( i )->resetToSaveTime( zeit, welt->getWorldInfo() );
  735. spieler->z( i )->wiederbelebung();
  736. spieler->z( i )->resetToGameTime( spielZeit, welt->getWorldInfo() );
  737. break;
  738. }
  739. }
  740. if( sNum == spielerNummer )
  741. {
  742. for( int i = 0; i < spielerAnzahl; i++ )
  743. {
  744. if( spieler->z( i )->getSpielerNummer() == spielerNummer )
  745. {
  746. shipGUI->update( spieler->z( i ) );
  747. break;
  748. }
  749. }
  750. }
  751. }
  752. break;
  753. case 0x10: // Tod
  754. if( 1 )
  755. {
  756. bytes++;
  757. sNum = *(int*)bytes;
  758. bytes += 4;
  759. län -= 4;
  760. int killer = *(int*)bytes;
  761. län -= 4;
  762. for( int i = 0; i < spielerAnzahl; i++ )
  763. {
  764. if( spieler->z( i )->getSpielerNummer() == sNum )
  765. {
  766. spieler->z( i )->resetToSaveTime( zeit, welt->getWorldInfo() );
  767. DeadPlayer *dp = spieler->z( i )->sterben();
  768. if( dp )
  769. {
  770. welt->addObject( dp->getThis() );
  771. deads->add( dp );
  772. }
  773. spieler->z( i )->resetToGameTime( spielZeit, welt->getWorldInfo() );
  774. bestenliste->updateSpieler( spieler->z( i ) );
  775. }
  776. if( spieler->z( i )->getSpielerNummer() == killer )
  777. {
  778. spieler->z( i )->resetToSaveTime( zeit, welt->getWorldInfo() );
  779. spieler->z( i )->addKill();
  780. spieler->z( i )->resetToGameTime( spielZeit, welt->getWorldInfo() );
  781. spieler->z( i )->zTeam()->punkte++;
  782. bestenliste->updateTeam( spieler->z( i )->zTeam() );
  783. bestenliste->updateSpieler( spieler->z( i ) );
  784. }
  785. }
  786. if( sNum == spielerNummer )
  787. {
  788. for( int i = 0; i < spielerAnzahl; i++ )
  789. {
  790. if( spieler->z( i )->getSpielerNummer() == spielerNummer )
  791. {
  792. shipGUI->update( spieler->z( i ) );
  793. break;
  794. }
  795. }
  796. }
  797. }
  798. break;
  799. default:
  800. // Fehler beim verarbeiten
  801. break;
  802. }
  803. if( län != 0 )
  804. {
  805. // Fehler beim verarbeiten
  806. chat->addNachricht( "Es ist ein Fehler beim verarbeiten einer Nachricht aufgetreten.", 0xFFFF0000 );
  807. }
  808. n->setVerarbeitet();
  809. }
  810. for( int i = stkna; i > 0; i-- )
  811. {
  812. if( !stkn->z( 0 ) || !stkn->z( 0 )->istVerarbeitet() )
  813. break;
  814. stkna--;
  815. stkn->remove( 0 );
  816. }
  817. unlock();
  818. }
  819. bool SpielKlasse::tick( double zeit )
  820. {
  821. if( spielPause )
  822. {
  823. zeit = 0;
  824. stknVerarbeitung();
  825. return 1;
  826. }
  827. rZeit += zeit;
  828. double sZ = 0;
  829. while( sZ + TICK < rZeit )
  830. {
  831. sZ += TICK;
  832. rZeit -= TICK;
  833. spielZeit++;
  834. stknVerarbeitung();
  835. if( end )
  836. return 1;
  837. int x = 0;
  838. int y = 0;
  839. bool setKam = 0;
  840. lock();
  841. int deadsCount = deads->getEintragAnzahl();
  842. for( int i = 0; i < deadsCount; i++ )
  843. {
  844. if( deads->z( i )->tick( welt->getWorldInfo(), 0 ) )
  845. {
  846. welt->removeObject( deads->z( i ) );
  847. deads->remove( i-- );
  848. deadsCount--;
  849. }
  850. }
  851. kam->tick( TICK );
  852. minimap->tick( TICK );
  853. for( int i = 0; i < spielerAnzahl; i++ )
  854. {
  855. if( spieler->z( i )->getSpielerNummer() == spielerNummer )
  856. shipGUI->update( spieler->z( i ) );
  857. if( spielerNummer == spieler->z( i )->getSpielerNummer() )
  858. {
  859. x = (int)spieler->z( i )->getPosition().x;
  860. y = (int)spieler->z( i )->getPosition().y;
  861. setKam = spieler->z( i )->istAmLeben();
  862. }
  863. }
  864. unlock();
  865. if( setKam )
  866. {
  867. float px = ( ( x - kam->getPosition().x ) / 100.0f ) * ( abs( ( x - kam->getPosition().x ) / 2 ) * (float)TICK );
  868. float py = ( ( y - kam->getPosition().y ) / 100.0f ) * ( abs( ( y - kam->getPosition().y ) / 2 ) * (float)TICK );
  869. if( abs( x - kam->getPosition().x ) > abs( x - ( kam->getPosition().x - map->getSize().x ) ) )
  870. px = ( ( x - ( kam->getPosition().x - map->getSize().x ) ) / 100.0f ) * ( abs( ( x - kam->getPosition().x ) / 2 ) * (float)TICK );
  871. else if( abs( x - kam->getPosition().x ) > abs( x - ( kam->getPosition().x + map->getSize().x ) ) )
  872. px = ( ( x - ( kam->getPosition().x + map->getSize().x ) ) / 100.0f ) * ( abs( ( x - kam->getPosition().x ) / 2 ) * (float)TICK );
  873. if( abs( y - kam->getPosition().y ) > abs( y - ( kam->getPosition().y - map->getSize().y ) ) )
  874. py = ( ( y - ( kam->getPosition().y - map->getSize().y ) ) / 100.0f ) * ( abs( ( y - kam->getPosition().y ) / 2 ) * (float)TICK );
  875. else if( abs( y - kam->getPosition().y ) > abs( y - ( kam->getPosition().y + map->getSize().y ) ) )
  876. py = ( ( y - ( kam->getPosition().y + map->getSize().y ) ) / 100.0f ) * ( abs( ( y - kam->getPosition().y ) / 2 ) * (float)TICK );
  877. kam->lookAtWorldPos( kam->getWorldPosition() + Vertex( px, py ) );
  878. }
  879. chat->tick( !zeit ? 0.05 : zeit );
  880. if( shipGUI )
  881. shipGUI->tick( !zeit ? 0.05 : zeit );
  882. }
  883. return 1;
  884. }
  885. void SpielKlasse::render( Bild &zRObj )
  886. {
  887. if( !rendern )
  888. return;
  889. lock();
  890. kam->lookAtWorldArea( zRObj.getBreite(), zRObj.getHeight() );
  891. kam->setSize( zRObj.getSize() );
  892. kam->render( zRObj );
  893. for( int j = 0; j < spielerAnzahl; j++ )
  894. spieler->z( j )->renderLeben( kam->getMatrix(), zRObj );
  895. int objektAnzahl = objekte->getEintragAnzahl();
  896. for( int i = 0; i < objektAnzahl; i++ )
  897. objekte->z( i )->renderLeben( kam->getMatrix(), zRObj );
  898. zRObj.setAlpha( 50 );
  899. minimap->setPosition( zRObj.getSize() - Punkt( 210, 210 ) );
  900. minimap->render( zRObj );
  901. zRObj.releaseAlpha();
  902. chat->render( zRObj );
  903. if( bestenliste )
  904. bestenliste->render( zRObj );
  905. if( shipGUI )
  906. shipGUI->render( zRObj );
  907. if( end )
  908. end->render( zRObj );
  909. unlock();
  910. }
  911. // constant
  912. int SpielKlasse::läuft() const
  913. {
  914. if( !rendern )
  915. return 3;
  916. if( !end )
  917. return 2;
  918. if( end && !end->getWeiter() )
  919. return 1;
  920. if( end && end->getWeiter() )
  921. return 0;
  922. return 0;
  923. }
  924. // Reference Counting
  925. SpielV *SpielKlasse::getThis()
  926. {
  927. ref++;
  928. return this;
  929. }
  930. SpielV *SpielKlasse::release()
  931. {
  932. ref--;
  933. if( !ref )
  934. delete this;
  935. return 0;
  936. }