SpielKlasse.cpp 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818
  1. #include "SpielKlasse.h"
  2. #include <time.h>
  3. #include <Schrift.h>
  4. #include <MausEreignis.h>
  5. #include <TastaturEreignis.h>
  6. // Inhalt der SpielKlasse Klasse aus SpielKlasse.h
  7. // Konstruktor
  8. SpielKlasse::SpielKlasse()
  9. {
  10. spielZeit = 0;
  11. rZeit = 0;
  12. spielPause = 1;
  13. rendern = 0;
  14. stkn = new RCArray< STKNachricht >();
  15. stkna = 0;
  16. schrift = 0;
  17. time_t t;
  18. time( &t );
  19. srand( (unsigned int)t );
  20. infoKlient = 0;
  21. spielKlient = 0;
  22. spieler = new RCArray< Spieler >();
  23. screen = 0;
  24. kam = 0;
  25. spielerAnzahl = 0;
  26. karteId = 0;
  27. spielerNummer = 0;
  28. map = 0;
  29. rEnd = 0;
  30. end = 0;
  31. chat = new SpielChat();
  32. tasten = new char[ 256 ];
  33. for( int i = 0; i < 256; i++ )
  34. tasten[ i ] = 0;
  35. mx = -1;
  36. my = -1;
  37. bestenliste = 0;
  38. ref = 1;
  39. }
  40. // Destruktor
  41. SpielKlasse::~SpielKlasse()
  42. {
  43. stkn->release();
  44. if( schrift )
  45. schrift->release();
  46. if( infoKlient )
  47. infoKlient->release();
  48. if( spielKlient )
  49. spielKlient->release();
  50. if( kam )
  51. kam->release();
  52. if( map )
  53. map->release();
  54. if( rEnd )
  55. rEnd->release();
  56. if( end )
  57. end->release();
  58. if( bestenliste )
  59. bestenliste->release();
  60. chat->relese();
  61. spieler->release();
  62. delete[] tasten;
  63. }
  64. // privat
  65. bool SpielKlasse::istAmLeben() const
  66. {
  67. for( int i = 0; i < spielerAnzahl; i++ )
  68. {
  69. if( spieler->z( i )->getSpielerNummer() == spielerNummer )
  70. return spieler->z( i )->istAmLeben();
  71. }
  72. return 0;
  73. }
  74. // nicht constant
  75. void SpielKlasse::lock()
  76. {
  77. if( screen )
  78. screen->lock();
  79. }
  80. void SpielKlasse::unlock()
  81. {
  82. if( screen )
  83. screen->unlock();
  84. }
  85. void SpielKlasse::setSchrift( Schrift *schrift )
  86. {
  87. if( this->schrift )
  88. this->schrift->release();
  89. this->schrift = schrift;
  90. chat->setSchrift( schrift );
  91. if( !bestenliste )
  92. bestenliste = new Bestenliste( schrift->getThis() );
  93. if( !rEnd )
  94. rEnd = new RundenEnde( schrift );
  95. }
  96. void SpielKlasse::setBildschirm( Bildschirm *zScreen )
  97. {
  98. screen = zScreen;
  99. }
  100. void SpielKlasse::nachricht( int län, char *bytes )
  101. {
  102. if( !län )
  103. return;
  104. lock();
  105. stkn->add( new STKNachricht( län, bytes ), stkna );
  106. stkna++;
  107. unlock();
  108. }
  109. void SpielKlasse::setKlients( KSGClient::InformationServerClient *infoKlient, KSGClient::SpielServerClient *spielKlient )
  110. {
  111. if( this->infoKlient )
  112. this->infoKlient->release();
  113. this->infoKlient = infoKlient;
  114. if( this->spielKlient )
  115. this->spielKlient->release();
  116. this->spielKlient = spielKlient;
  117. }
  118. void SpielKlasse::setKarteId( int karteId )
  119. {
  120. this->karteId = karteId;
  121. }
  122. void SpielKlasse::ladeDaten()
  123. {
  124. kam = new Kamera();
  125. kam->setSize( 400, 400 );
  126. map = new Karte();
  127. map->setId( karteId );
  128. for( int i = 1; i <= 100; i++ )
  129. {
  130. Sleep( 100 + ( rand() % 100 ) );
  131. spielKlient->setLadenProzent( i );
  132. }
  133. }
  134. void SpielKlasse::doPublicMausEreignis( MausEreignis &me )
  135. {
  136. if( end )
  137. {
  138. end->doPublicMausEreignis( me );
  139. return;
  140. }
  141. if( !istAmLeben() && kam->istMausIn( me.mx, me.my ) )
  142. {
  143. if( ( me.id == ME_RLinks || me.id == ME_RRechts ) && mx >= 0 )
  144. {
  145. mx = -1;
  146. my = -1;
  147. }
  148. if( me.id == ME_Bewegung && mx >= 0 )
  149. {
  150. kam->addPosition( mx - me.mx, my - me.my, map );
  151. mx = me.mx;
  152. my = me.my;
  153. }
  154. if( ( me.id == ME_PLinks || me.id == ME_PRechts ) && mx < 0 )
  155. {
  156. mx = me.mx;
  157. my = me.my;
  158. }
  159. me.verarbeitet = 1;
  160. }
  161. else
  162. {
  163. mx = -1;
  164. my = -1;
  165. }
  166. chat->doPublicMausEreignis( me );
  167. if( bestenliste )
  168. bestenliste->doPublicMausEreignis( me );
  169. }
  170. void SpielKlasse::doTastaturEreignis( TastaturEreignis &te )
  171. {
  172. if( end )
  173. return;
  174. if( istAmLeben() )
  175. {
  176. if( te.id == TE_Press )
  177. {
  178. switch( te.taste )
  179. {
  180. case T_Links:
  181. if( !tasten[ T_Links ] )
  182. {
  183. tasten[ T_Links ] = 1;
  184. char byte = 0;
  185. spielKlient->spielNachricht( 1, &byte );
  186. te.verarbeitet = 1;
  187. }
  188. break;
  189. case T_Rechts:
  190. if( !tasten[ T_Rechts ] )
  191. {
  192. tasten[ T_Rechts ] = 1;
  193. char byte = 2;
  194. spielKlient->spielNachricht( 1, &byte );
  195. te.verarbeitet = 1;
  196. }
  197. break;
  198. }
  199. }
  200. if( te.id == TE_Release )
  201. {
  202. switch( te.taste )
  203. {
  204. case T_Links:
  205. if( tasten[ T_Links ] )
  206. {
  207. tasten[ T_Links ] = 0;
  208. char byte = 1;
  209. spielKlient->spielNachricht( 1, &byte );
  210. te.verarbeitet = 1;
  211. }
  212. break;
  213. case T_Rechts:
  214. if( tasten[ T_Rechts ] )
  215. {
  216. tasten[ T_Rechts ] = 0;
  217. char byte = 3;
  218. spielKlient->spielNachricht( 1, &byte );
  219. te.verarbeitet = 1;
  220. }
  221. break;
  222. }
  223. }
  224. }
  225. else
  226. {
  227. if( te.id == TE_Press )
  228. {
  229. switch( te.taste )
  230. {
  231. case T_Links:
  232. kam->addPosition( -2, 0, map );
  233. te.verarbeitet = 1;
  234. break;
  235. case T_Oben:
  236. kam->addPosition( 0, -2, map );
  237. te.verarbeitet = 1;
  238. break;
  239. case T_Rechts:
  240. kam->addPosition( 2, 0, map );
  241. te.verarbeitet = 1;
  242. break;
  243. case T_Unten:
  244. kam->addPosition( 0, 2, map );
  245. te.verarbeitet = 1;
  246. break;
  247. }
  248. }
  249. }
  250. if( !te.verarbeitet )
  251. chat->doTastaturEreignis( te, spielKlient );
  252. }
  253. void SpielKlasse::stknVerarbeitung()
  254. {
  255. lock();
  256. for( int i = 0; i < stkna; i++ )
  257. {
  258. STKNachricht *n = stkn->z( i );
  259. double zeit = n->getSpielZeit();
  260. if( zeit > spielZeit && ( !rEnd || !rEnd->istSichtbar() ) )
  261. break;
  262. int län = n->getLength();
  263. char *bytes = n->getNachricht();
  264. län--;
  265. switch( bytes[ 0 ] )
  266. {
  267. case 0: // set Spieler Nummer
  268. bytes++;
  269. spielerNummer = *(int*)bytes;
  270. län -= 4;
  271. break;
  272. case 1: // init Spieler
  273. if( 1 )
  274. {
  275. bytes++;
  276. spielerAnzahl = *(int*)bytes;
  277. län -= 4;
  278. bytes += 4;
  279. int maxTeam = 0;
  280. for( int i = 0; i < spielerAnzahl; i++ )
  281. {
  282. Spieler *tmp = new Spieler( infoKlient );
  283. int sNum = *(int*)bytes;
  284. län -= 4;
  285. bytes += 4;
  286. tmp->setSpielerNummer( sNum );
  287. int team = *(int*)bytes;
  288. län -= 4;
  289. bytes += 4;
  290. maxTeam = maxTeam < team ? team : maxTeam;
  291. tmp->setTeam( team );
  292. int sFarbe = *(int*)bytes;
  293. län -= 4;
  294. bytes += 4;
  295. tmp->setSpielerFarbe( sFarbe );
  296. int tFarbe = *(int*)bytes;
  297. län -= 4;
  298. bytes += 4;
  299. tmp->setTeamFarbe( tFarbe );
  300. int accId = *(int*)bytes;
  301. län -= 4;
  302. bytes += 4;
  303. tmp->setAccountId( accId );
  304. bestenliste->addSpieler( tmp );
  305. bestenliste->updateSpielerStatus( tmp );
  306. spieler->set( tmp, i );
  307. }
  308. bestenliste->setTeamAnzahl( maxTeam + 1 );
  309. }
  310. break;
  311. case 2: // setze Spieler Position
  312. if( 1 )
  313. {
  314. bytes++;
  315. int sNum = *(int*)bytes;
  316. län -= 4;
  317. bytes += 4;
  318. double posX = *(double*)bytes;
  319. län -= 8;
  320. bytes += 8;
  321. double posY = *(double*)bytes;
  322. län -= 8;
  323. for( int i = 0; i < spielerAnzahl; i++ )
  324. {
  325. if( spieler->z( i )->getSpielerNummer() == sNum )
  326. spieler->z( i )->setPos( posX, posY );
  327. }
  328. if( spielerNummer == sNum )
  329. kam->setPosition( (int)posX, (int)posY );
  330. }
  331. break;
  332. case 3: // setzt kammera größe
  333. if( 1 )
  334. {
  335. bytes++;
  336. int br = *(int*)bytes;
  337. län -= 4;
  338. bytes += 4;
  339. int hö = *(int*)bytes;
  340. län -= 4;
  341. kam->setSize( br, hö );
  342. }
  343. break;
  344. case 4: // Zeit Beginn
  345. spielPause = 0;
  346. spielZeit = 0;
  347. rZeit = 0;
  348. rendern = 1;
  349. break;
  350. case 5: // spieler ist tod
  351. if( 1 )
  352. {
  353. bytes++;
  354. int sNum = *(int*)bytes;
  355. län -= 4;
  356. Text *zName = 0;
  357. for( int i = 0; i < spielerAnzahl; i++ )
  358. {
  359. int team = spieler->z( i )->getTeam();
  360. int player = spieler->z( i )->getSpielerNummer();
  361. if( player == sNum )
  362. {
  363. spieler->z( i )->sterben( map->zMap(), zeit, spielZeit );
  364. bestenliste->updateSpielerStatus( spieler->z( i ) );
  365. zName = spieler->z( i )->zName();
  366. bool teamLebt = 0;
  367. for( int j = 0; j < spielerAnzahl; j++ )
  368. {
  369. if( spieler->z( j ) && spieler->z( j )->getTeam() == team )
  370. teamLebt |= spieler->z( j )->istAmLeben();
  371. }
  372. if( !teamLebt )
  373. {
  374. for( int j = 0; j < bestenliste->getTeamAnzahl(); j++ )
  375. {
  376. if( bestenliste->teamExistiert( j ) )
  377. {
  378. bool amLeben = 0;
  379. for( int k = 0; k < spielerAnzahl; k++ )
  380. {
  381. if( spieler->z( k ) && spieler->z( k )->getTeam() == j )
  382. amLeben |= spieler->z( k )->istAmLeben();
  383. }
  384. if( amLeben )
  385. bestenliste->addPunkt( j, 1 );
  386. else
  387. bestenliste->addPunkt( j, 0 );
  388. if( bestenliste->getTeamPunkte( j ) <= 0 )
  389. bestenliste->setTeamStatus( j, "tot", 0xFFFF0000 );
  390. }
  391. }
  392. }
  393. }
  394. else
  395. {
  396. if( spieler->z( i )->istAmLeben() )
  397. bestenliste->addPunkt( team, player, 1 );
  398. }
  399. }
  400. if( sNum == spielerNummer )
  401. chat->addNachricht( "Du bist gestorben.", 0xFFFFFF00 );
  402. else if( zName )
  403. {
  404. Text *txt = new Text( zName->getText() );
  405. txt->append( " ist gestorben." );
  406. chat->addNachricht( txt->getText(), 0xFFFFFF00 );
  407. txt->release();
  408. }
  409. }
  410. break;
  411. case 6: // spiel Ende
  412. if( 1 )
  413. {
  414. bestenliste->updatePunkte();
  415. bytes++;
  416. char gewonnen = *bytes;
  417. län--;
  418. end = new Ende( schrift );
  419. end->setGewonnen( gewonnen );
  420. }
  421. break;
  422. case 7: // set Spieler Geschwindigkeit
  423. if( 1 )
  424. {
  425. bytes++;
  426. int sNum = *(int*)bytes;
  427. län -= 4;
  428. bytes += 4;
  429. double xSpeed = *(double*)bytes;
  430. län -= 8;
  431. bytes += 8;
  432. double ySpeed = *(double*)bytes;
  433. län -= 8;
  434. for( int i = 0; i < spielerAnzahl; i++ )
  435. {
  436. if( spieler->z( i )->getSpielerNummer() == sNum )
  437. spieler->z( i )->setSpeed( xSpeed, ySpeed );
  438. }
  439. }
  440. break;
  441. case 8: // set Spieler Wendigkeit
  442. if( 1 )
  443. {
  444. bytes++;
  445. int sNum = *(int*)bytes;
  446. län -= 4;
  447. bytes += 4;
  448. double kurve = *(double*)bytes;
  449. län -= 8;
  450. for( int i = 0; i < spielerAnzahl; i++ )
  451. {
  452. if( spieler->z( i )->getSpielerNummer() == sNum )
  453. spieler->z( i )->setKurveSpeed( kurve );
  454. }
  455. }
  456. break;
  457. case 9: // set Spieler Kurve
  458. if( 1 )
  459. {
  460. bytes++;
  461. int sNum = *(int*)bytes;
  462. län -= 4;
  463. bytes += 4;
  464. char k = *bytes;
  465. län--;
  466. if( k == 0 )
  467. {
  468. for( int i = 0; i < spielerAnzahl; i++ )
  469. {
  470. if( spieler->z( i )->getSpielerNummer() == sNum )
  471. {
  472. spieler->z( i )->setLinksKurve( map->zMap(), 0, zeit, spielZeit );
  473. spieler->z( i )->setRechtsKurve( map->zMap(), 0, zeit, spielZeit );
  474. }
  475. }
  476. }
  477. else if( k == 1 )
  478. {
  479. for( int i = 0; i < spielerAnzahl; i++ )
  480. {
  481. if( spieler->z( i )->getSpielerNummer() == sNum )
  482. spieler->z( i )->setLinksKurve( map->zMap(), 1, zeit, spielZeit );
  483. }
  484. }
  485. else if( k == 2 )
  486. {
  487. for( int i = 0; i < spielerAnzahl; i++ )
  488. {
  489. if( spieler->z( i )->getSpielerNummer() == sNum )
  490. spieler->z( i )->setLinksKurve( map->zMap(), 0, zeit, spielZeit );
  491. }
  492. }
  493. else if( k == 3 )
  494. {
  495. for( int i = 0; i < spielerAnzahl; i++ )
  496. {
  497. if( spieler->z( i )->getSpielerNummer() == sNum )
  498. spieler->z( i )->setRechtsKurve( map->zMap(), 1, zeit, spielZeit );
  499. }
  500. }
  501. else if( k == 4 )
  502. {
  503. for( int i = 0; i < spielerAnzahl; i++ )
  504. {
  505. if( spieler->z( i )->getSpielerNummer() == sNum )
  506. spieler->z( i )->setRechtsKurve( map->zMap(), 0, zeit, spielZeit );
  507. }
  508. }
  509. else if( k == 5 )
  510. {
  511. for( int i = 0; i < spielerAnzahl; i++ )
  512. {
  513. if( spieler->z( i )->getSpielerNummer() == sNum )
  514. {
  515. spieler->z( i )->setLinksKurve( map->zMap(), 1, zeit, spielZeit );
  516. spieler->z( i )->setRechtsKurve( map->zMap(), 1, zeit, spielZeit );
  517. }
  518. }
  519. }
  520. }
  521. break;
  522. case 0xA: // set Karte Größe
  523. if( 1 )
  524. {
  525. bytes++;
  526. int br = *(int*)bytes;
  527. län -= 4;
  528. bytes += 4;
  529. int hö = *(int*)bytes;
  530. län -= 4;
  531. map->setSize( br, hö );
  532. }
  533. break;
  534. case 0xB: // chat Nachricht
  535. if( 1 )
  536. {
  537. bytes++;
  538. Text *txt = new Text( "" );
  539. txt->append( bytes, län );
  540. chat->addNachricht( txt->getText() );
  541. txt->release();
  542. län = 0;
  543. }
  544. break;
  545. case 0xC: // Spieler Linien Unterbrechung
  546. if( 1 )
  547. {
  548. bytes++;
  549. int sNum = *(int*)bytes;
  550. län -= 4;
  551. bytes += 4;
  552. char unterbrechung = *bytes;
  553. län--;
  554. for( int i = 0; i < spielerAnzahl; i++ )
  555. {
  556. Spieler *tmp = spieler->z( i );
  557. if( tmp && tmp->getSpielerNummer() == sNum )
  558. tmp->setLinienUnterbrechung( map->zMap(), unterbrechung != 0, zeit, spielZeit );
  559. }
  560. }
  561. break;
  562. case 0xD: // Max Team Punkte
  563. if( 1 )
  564. {
  565. bytes++;
  566. int team = *(int*)bytes;
  567. län -= 4;
  568. bytes += 4;
  569. int mP = *(int*)bytes;
  570. län -= 4;
  571. bestenliste->setTeamMaxPunkte( team, mP );
  572. }
  573. break;
  574. case 0xE: // Team Punkte
  575. if( 1 )
  576. {
  577. bytes++;
  578. int team = *(int*)bytes;
  579. län -= 4;
  580. bytes += 4;
  581. int p = *(int*)bytes;
  582. län -= 4;
  583. bestenliste->setTeamPunkte( team, p );
  584. if( !p )
  585. bestenliste->setTeamStatus( team, "tot", 0xFFFF0000 );
  586. }
  587. break;
  588. case 0xF: // Spieler Punkte
  589. if( 1 )
  590. {
  591. bytes++;
  592. int sNum = *(int*)bytes;
  593. län -= 4;
  594. bytes += 4;
  595. int p = *(int*)bytes;
  596. län -= 4;
  597. for( int i = 0; i < spielerAnzahl; i++ )
  598. {
  599. if( spieler->z( i ) && spieler->z( i )->getSpielerNummer() == sNum )
  600. {
  601. bestenliste->setSpielerPunkte( spieler->z( i )->getTeam(), sNum, p );
  602. break;
  603. }
  604. }
  605. }
  606. break;
  607. case 0x10: // Team Tod
  608. if( 1 )
  609. {
  610. bytes++;
  611. int team = *(int*)bytes;
  612. län -= 4;
  613. bestenliste->setTeamPunkte( team, 0 );
  614. bestenliste->setTeamStatus( team, "tot", 0xFFFF0000 );
  615. for( int i = 0; i < spielerAnzahl; i++ )
  616. {
  617. if( spieler->z( i ) && spieler->z( i )->getTeam() == team )
  618. {
  619. spieler->z( i )->sterben();
  620. bestenliste->updateSpielerStatus( spieler->z( i ) );
  621. }
  622. }
  623. }
  624. break;
  625. case 0x11: // Runden Ende
  626. if( 1 )
  627. {
  628. spielPause = 1;
  629. bytes++;
  630. int team = *(int*)bytes;
  631. län -= 4;
  632. bool gewonnen = 0;
  633. for( int i = 0; i < spielerAnzahl; i++ )
  634. {
  635. if( spieler->z( i )->getSpielerNummer() == spielerNummer )
  636. {
  637. gewonnen = spieler->z( i )->getTeam() == team;
  638. break;
  639. }
  640. }
  641. rEnd->setGewonnen( gewonnen );
  642. bestenliste->updatePunkte();
  643. rEnd->setSichtbar( 1 );
  644. }
  645. break;
  646. case 0x12: // Verbleibende Zeit
  647. if( 1 )
  648. {
  649. bytes++;
  650. int sek = *(int*)bytes;
  651. län -= 4;
  652. rEnd->setZeit( sek );
  653. if( !sek )
  654. {
  655. if( rEnd && rEnd->istSichtbar() )
  656. {
  657. rEnd->setSichtbar( 0 );
  658. rEnd->setZeit( 6 );
  659. for( int i = 0; i < spielerAnzahl; i++ )
  660. {
  661. if( spieler->z( i ) )
  662. {
  663. spieler->z( i )->neuRunde();
  664. if( !bestenliste->getTeamPunkte( spieler->z( i )->getTeam() ) )
  665. spieler->z( i )->sterben();
  666. bestenliste->updateSpielerStatus( spieler->z( i ) );
  667. }
  668. }
  669. }
  670. }
  671. }
  672. break;
  673. case 0x13: // Team Name
  674. if( 1 )
  675. {
  676. bytes++;
  677. int team = *(int*)bytes;
  678. län -= 4;
  679. bytes += 4;
  680. char *n = new char[ län + 1 ];
  681. n[ län ] = 0;
  682. memcpy( n, bytes, län );
  683. län -= län;
  684. bestenliste->setTeamName( team, n );
  685. delete[] n;
  686. }
  687. break;
  688. default:
  689. // Fehler beim verarbeiten
  690. break;
  691. }
  692. if( län != 0 )
  693. {
  694. // Fehler beim verarbeiten
  695. chat->addNachricht( "Es ist ein Fehler beim verarbeiten einer Nachricht aufgetreten.", 0xFFFF0000 );
  696. }
  697. n->setVerarbeitet();
  698. }
  699. for( int i = stkna; i > 0; i-- )
  700. {
  701. if( !stkn->z( 0 ) || !stkn->z( 0 )->istVerarbeitet() )
  702. break;
  703. stkna--;
  704. stkn->remove( 0 );
  705. }
  706. unlock();
  707. }
  708. bool SpielKlasse::tick( double zeit )
  709. {
  710. if( spielPause )
  711. {
  712. zeit = 0;
  713. stknVerarbeitung();
  714. }
  715. rZeit += zeit;
  716. while( spielZeit + TICK < rZeit )
  717. {
  718. spielZeit += TICK;
  719. stknVerarbeitung();
  720. if( end )
  721. return 1;
  722. if( !rEnd->istSichtbar() )
  723. {
  724. int x = 0;
  725. int y = 0;
  726. bool setKam = 0;
  727. lock();
  728. for( int i = 0; i < spielerAnzahl; i++ )
  729. {
  730. spieler->z( i )->tick( map->zMap(), TICK );
  731. if( spielerNummer == spieler->z( i )->getSpielerNummer() )
  732. {
  733. x = (int)spieler->z( i )->getX();
  734. y = (int)spieler->z( i )->getY();
  735. setKam = spieler->z( i )->istAmLeben();
  736. }
  737. }
  738. unlock();
  739. if( setKam )
  740. {
  741. double px = ( ( x - kam->getX() ) / 100.0 ) * ( 50 * TICK );
  742. double py = ( ( y - kam->getY() ) / 100.0 ) * ( 50 * TICK );
  743. kam->addPosition( (int)px, (int)py, map );
  744. }
  745. }
  746. chat->tick( !zeit ? 0.05 : zeit );
  747. }
  748. return 1;
  749. }
  750. void SpielKlasse::render( Bild &zRObj )
  751. {
  752. if( !rendern )
  753. return;
  754. lock();
  755. chat->render( zRObj );
  756. if( bestenliste )
  757. bestenliste->render( zRObj );
  758. kam->render( zRObj );
  759. int x = kam->getRX( kam->getLinks() ) + 1, y = kam->getRY( kam->getOben() ) + 1;
  760. if( zRObj.setDrawOptions( x, y, kam->getRechts() - kam->getLinks() - 2, kam->getUnten() - kam->getOben() - 2 ) )
  761. {
  762. zRObj.addScrollOffset( x, y );
  763. map->render( kam, zRObj );
  764. for( int i = 0; i < spielerAnzahl; i++ )
  765. spieler->z( i )->render( kam, zRObj );
  766. zRObj.releaseDrawOptions();
  767. }
  768. if( rEnd )
  769. rEnd->render( zRObj );
  770. if( end )
  771. end->render( zRObj );
  772. unlock();
  773. }
  774. // constant
  775. int SpielKlasse::läuft() const
  776. {
  777. if( !rendern )
  778. return 3;
  779. if( !end )
  780. return 2;
  781. if( end && !end->getWeiter() )
  782. return 1;
  783. if( end && end->getWeiter() )
  784. return 0;
  785. return 0;
  786. }
  787. // Reference Counting
  788. SpielV *SpielKlasse::getThis()
  789. {
  790. ref++;
  791. return this;
  792. }
  793. SpielV *SpielKlasse::release()
  794. {
  795. ref--;
  796. if( !ref )
  797. delete this;
  798. return 0;
  799. }