Spiel.cpp 39 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439
  1. #include "Spiel.h"
  2. #define TICK 0.03333333
  3. // Konstruktor
  4. Spiel::Spiel()
  5. {
  6. stkn = new RCArray< STKNachricht >();
  7. schrift = 0;
  8. infoKlient = 0;
  9. spielKlient = 0;
  10. zScreen = 0;
  11. chat = new SpielChat();
  12. end = 0;
  13. spielerGUI = new SpielerGUI();
  14. deads = new RCArray< DeadPlayer >();
  15. nextId = 0;
  16. rendern = 0;
  17. rZeit = 0;
  18. gameTicks = 0;
  19. spielerAnzahl = 0;
  20. karteId = 0;
  21. ladenProzent = 0;
  22. spielerNummer = 0;
  23. zWinner = 0;
  24. pause = 1;
  25. tasten = new char[ 256 ];
  26. for( int i = 0; i < 256; i++ )
  27. tasten[ i ] = 0;
  28. lastRunnedTrigger = 0;
  29. zuletztEingeschalteteBariere = 0;
  30. zuletztAusgeschalteteBariere = 0;
  31. zuletztBewegteBariere = 0;
  32. lastTeamChangedBase = 0;
  33. lastDropedDrop = 0;
  34. zuletztAufgehobenerGegenstand = KEIN_GEGENSTAND;
  35. zuletztBenutzterGegenstand = KEIN_GEGENSTAND;
  36. zuletztGedropterGegenstand = KEIN_GEGENSTAND;
  37. zuletztAbgefeuertesGeschoss = 0;
  38. zuletztUmgelenktesGeschoss = 0;
  39. zuletztBariereGetroffenesGeschoss = 0;
  40. zuletztTunnelBenutztesGeschoss = 0;
  41. zuletztGeschossGetroffenesGeschoss = 0;
  42. zuletztAktivierterSchalter = 0;
  43. zuletztSchadenGemachterSpieler = 0;
  44. zuletztSchadenGenommenerSpieler = 0;
  45. zuletztGeheilterSpieler = 0;
  46. zuletztLevelUpSpieler = 0;
  47. zuletztErfahrungBekommenerSpieler = 0;
  48. zuletztGegenstandAktivierterSpieler = 0;
  49. zuletztGegenstandAufgehobenerSpieler = 0;
  50. zuletztSchalterAktivierterSpieler = 0;
  51. zuletztTunnelBenutzterSpieler = 0;
  52. zuletztGestorbenerSpieler = 0;
  53. zuletztWiederbelebterSpieler = 0;
  54. zuletztGeschossenerSpieler = 0;
  55. zuletztAbgelaufenerTimer = 0;
  56. zuletztGestarteterTimer = 0;
  57. zuletztPausierterTimer = 0;
  58. zuletztFortgesetzterTimer = 0;
  59. zuletztBenutzterTunnel = 0;
  60. zuletztBenutzteUmlenkung = 0;
  61. ref = 1;
  62. }
  63. // Destruktor
  64. Spiel::~Spiel()
  65. {
  66. stkn->release();
  67. if( schrift )
  68. schrift->release();
  69. if( infoKlient )
  70. infoKlient->release();
  71. if( spielKlient )
  72. spielKlient->release();
  73. chat->relese();
  74. if( end )
  75. end->release();
  76. spielerGUI->release();
  77. deads->release();
  78. if( lastRunnedTrigger )
  79. lastRunnedTrigger->release();
  80. if( zuletztEingeschalteteBariere )
  81. zuletztEingeschalteteBariere->release();
  82. if( zuletztAusgeschalteteBariere )
  83. zuletztAusgeschalteteBariere->release();
  84. if( zuletztBewegteBariere )
  85. zuletztBewegteBariere->release();
  86. if( lastTeamChangedBase )
  87. lastTeamChangedBase->release();
  88. if( lastDropedDrop )
  89. lastDropedDrop->release();
  90. if( zuletztAbgefeuertesGeschoss )
  91. zuletztAbgefeuertesGeschoss->release();
  92. if( zuletztUmgelenktesGeschoss )
  93. zuletztUmgelenktesGeschoss->release();
  94. if( zuletztBariereGetroffenesGeschoss )
  95. zuletztBariereGetroffenesGeschoss->release();
  96. if( zuletztTunnelBenutztesGeschoss )
  97. zuletztTunnelBenutztesGeschoss->release();
  98. if( zuletztGeschossGetroffenesGeschoss )
  99. zuletztGeschossGetroffenesGeschoss->release();
  100. if( zuletztAktivierterSchalter )
  101. zuletztAktivierterSchalter->release();
  102. if( zuletztSchadenGemachterSpieler )
  103. zuletztSchadenGemachterSpieler->release();
  104. if( zuletztSchadenGenommenerSpieler )
  105. zuletztSchadenGenommenerSpieler->release();
  106. if( zuletztGeheilterSpieler )
  107. zuletztGeheilterSpieler->release();
  108. if( zuletztLevelUpSpieler )
  109. zuletztLevelUpSpieler->release();
  110. if( zuletztErfahrungBekommenerSpieler )
  111. zuletztErfahrungBekommenerSpieler->release();
  112. if( zuletztGegenstandAktivierterSpieler )
  113. zuletztGegenstandAktivierterSpieler->release();
  114. if( zuletztGegenstandAufgehobenerSpieler )
  115. zuletztGegenstandAufgehobenerSpieler->release();
  116. if( zuletztSchalterAktivierterSpieler )
  117. zuletztSchalterAktivierterSpieler->release();
  118. if( zuletztTunnelBenutzterSpieler )
  119. zuletztTunnelBenutzterSpieler->release();
  120. if( zuletztGestorbenerSpieler )
  121. zuletztGestorbenerSpieler->release();
  122. if( zuletztWiederbelebterSpieler )
  123. zuletztWiederbelebterSpieler->release();
  124. if( zuletztGeschossenerSpieler )
  125. zuletztGeschossenerSpieler->release();
  126. if( zuletztAbgelaufenerTimer )
  127. zuletztAbgelaufenerTimer->release();
  128. if( zuletztGestarteterTimer )
  129. zuletztGestarteterTimer->release();
  130. if( zuletztPausierterTimer )
  131. zuletztPausierterTimer->release();
  132. if( zuletztFortgesetzterTimer )
  133. zuletztFortgesetzterTimer->release();
  134. if( zuletztBenutzterTunnel )
  135. zuletztBenutzterTunnel->release();
  136. if( zuletztBenutzteUmlenkung )
  137. zuletztBenutzteUmlenkung->release();
  138. delete[] tasten;
  139. }
  140. bool Spiel::istAmLeben() const
  141. {
  142. for( int i = 0; i < spielerAnzahl; i++ )
  143. {
  144. if( spieler.z( i )->getId() == spielerNummer )
  145. return spieler.z( i )->istAmLeben();
  146. }
  147. return 0;
  148. }
  149. void Spiel::tick()
  150. {
  151. rZeit -= TICK;// spieler bewegungen
  152. for( auto s = spieler.getIterator(); s; s++ )
  153. {
  154. s->move( TICK );
  155. if( s->getX() < 0 || s->getY() < 0 || s->getX() + s->getWidth() >= mapSize.x || s->getY() + s->getHeight() >= mapSize.y )
  156. s->move( -TICK );
  157. else
  158. {
  159. for( auto b = barieren.getIterator(); b; b++ )
  160. { // spieler - bariere intersection
  161. if( b->hatStyle( Bariere::Style::Aktiv ) && ( b->zTeam() != s->zTeam() ) && b->intersectsWith( s ) )
  162. s->move( -TICK );
  163. }
  164. }
  165. }
  166. for( auto s = spieler.getIterator(); s; s++ )
  167. s->tick( TICK, this );
  168. // barieren bewegung
  169. for( auto b = barieren.getIterator(); b; b++ )
  170. b->tick( TICK, this );
  171. // geschoss bewegung
  172. for( int i = 0; i < shots.getEintragAnzahl(); i++ )
  173. {
  174. Geschoss *g = shots.z( i );
  175. g->tick( TICK );
  176. bool removed = 0;
  177. // geschoss - bariere intersection
  178. bool intersectsWithBariere = 0;
  179. for( auto b = barieren.getIterator(); b; b++ )
  180. {
  181. if( b->hatStyle( Bariere::Style::Aktiv ) && b->intersectsWith( g ) )
  182. {
  183. intersectsWithBariere = 1;
  184. break;
  185. }
  186. }
  187. if( intersectsWithBariere || g->getX() < 0 || g->getY() < 0 || g->getX() + g->getWidth() >= mapSize.x || g->getY() + g->getHeight() >= mapSize.y )
  188. {
  189. if( zuletztBariereGetroffenesGeschoss )
  190. zuletztBariereGetroffenesGeschoss->release();
  191. zuletztBariereGetroffenesGeschoss = (Geschoss *)g->getThis();
  192. g->tick( -TICK );
  193. switch( g->getTyp() )
  194. {
  195. case GESCHOSS_PFEIL:
  196. shots.remove( i );
  197. i--;
  198. removed = 1;
  199. break;
  200. case GESCHOSS_KUGEL:
  201. case GESCHOSS_DRACHENAUGE:
  202. g->invertDirection();
  203. break;
  204. case GESCHOSS_FEUERBALL:
  205. if( intersectsWithBariere )
  206. {
  207. feuer.add( new FeuerballTreffer( ++nextId, (int)g->getX() - 70, (int)g->getY() - 70, g->getBesitzer(), 10 ) );
  208. shots.remove( i );
  209. i--;
  210. removed = 1;
  211. }
  212. else
  213. g->invertDirection();
  214. break;
  215. case GESCHOSS_MINE:
  216. for( auto s = spieler.getIterator(); s; s++ )
  217. {
  218. if( s->abstandZu( g ) < 50 )
  219. {
  220. s->nimmSchaden( 100 - s->abstandZu( g ), g->zBesitzer(), MITTE, this );
  221. if( g->zBesitzer() )
  222. g->zBesitzer()->addTreffer( this );
  223. s->addGetroffen();
  224. }
  225. }
  226. shots.remove( i );
  227. i--;
  228. removed = 1;
  229. break;
  230. }
  231. }
  232. if( !removed )
  233. { // geschoss - tunnel intersection
  234. for( auto t = tunnel.getIterator(); t; t++ )
  235. {
  236. if( t->istAktiv() && t->intersectsWith( g ) )
  237. {
  238. g->setX( g->getX() + (float)t->getZielX() - t->getX() );
  239. g->setY( g->getY() + (float)t->getZielY() - t->getY() );
  240. g->addTunnel( this );
  241. Ereignis *e = new Ereignis( TUNNEL_BENUTZT );
  242. e->addParameter( "Betroffes Geschoss", g->getThis() );
  243. e->addParameter( "Betroffer Tunnel", t->getThis() );
  244. throwEvent( e );
  245. }
  246. }
  247. // geschoss - schalter intersection
  248. if( g->getTyp() == GESCHOSS_PFEIL )
  249. {
  250. for( auto s = schalter.getIterator(); s; s++ )
  251. {
  252. if( s->isAktive() && s->intersectsWith( g ) )
  253. {
  254. shots.remove( i );
  255. i--;
  256. removed = 1;
  257. g->addSchalter();
  258. activateShalter( s->getId() );
  259. }
  260. }
  261. }
  262. if( !removed )
  263. {
  264. // geschoss - umlenkung intersection
  265. if( g->getTyp() != GESCHOSS_PFEIL )
  266. {
  267. for( auto u = umlenkungen.getIterator(); u; u++ )
  268. {
  269. if( u->isAktive() && !u->hatAbklingzeit() && g->getTyp() != GESCHOSS_PFEIL && u->intersectsWith( g ) )
  270. {
  271. g->setRichtung( u->getRichtung() );
  272. g->addUmlenkung( this );
  273. u->addBenutzt( this );
  274. Ereignis *e = new Ereignis( UMLENKUNG_LENKT_UM );
  275. e->addParameter( "Betroffes Geschoss", g->getThis() );
  276. e->addParameter( "Betroffe Umlenkung", u->getThis() );
  277. throwEvent( e );
  278. }
  279. }
  280. }
  281. // geschoss - geschoss intersection
  282. if( g->getTyp() == GESCHOSS_PFEIL )
  283. {
  284. for( int j = 0; j < shots.getEintragAnzahl(); j++ )
  285. {
  286. if( i == j )
  287. continue;
  288. Geschoss *g2 = shots.z( j );
  289. if( g2->intersectsWith( g ) )
  290. {
  291. if( g2->getTyp() == GESCHOSS_PFEIL )
  292. removed = 1;
  293. g->addGeschossTreffer( this );
  294. if( j < i )
  295. i--;
  296. shots.remove( j );
  297. }
  298. }
  299. }
  300. if( !removed )
  301. {
  302. // geschoss - spieler intersection
  303. for( auto s = spieler.getIterator(); s; s++ )
  304. {
  305. if( s->istAmLeben() && s != g->zBesitzer() && g->intersectsWith( s ) )
  306. {
  307. switch( g->getTyp() )
  308. {
  309. case GESCHOSS_PFEIL:
  310. {
  311. s->nimmSchaden( PFEIL_DAMAGE, g->zBesitzer(), invert( g->getRichtung() ), this );
  312. break;
  313. }
  314. case GESCHOSS_KUGEL:
  315. {
  316. s->nimmSchaden( KUGEL_DAMAGE, g->zBesitzer(), invert( g->getRichtung() ), this );
  317. break;
  318. }
  319. case GESCHOSS_DRACHENAUGE:
  320. s->addEffekt( new DrachenAugeEffect( g->zBesitzer(), s._ ) );
  321. break;
  322. case GESCHOSS_FEUERBALL:
  323. feuer.add( new FeuerballTreffer( ++nextId, (int)g->getX() - 70, (int)g->getY() - 70, g->getBesitzer(), 10 ) );
  324. break;
  325. case GESCHOSS_MINE:
  326. for( auto s2 = spieler.getIterator(); s2; s2++ )
  327. {
  328. if( s2->abstandZu( g ) < 50 )
  329. {
  330. s2->nimmSchaden( 100 - s->abstandZu( g ), g->zBesitzer(), MITTE, this );
  331. if( g->zBesitzer() )
  332. g->zBesitzer()->addTreffer( this );
  333. s->addGetroffen();
  334. }
  335. }
  336. break;
  337. }
  338. if( g->getTyp() != GESCHOSS_MINE )
  339. {
  340. if( g->zBesitzer() )
  341. g->zBesitzer()->addTreffer( this );
  342. s->addGetroffen();
  343. }
  344. shots.remove( i );
  345. i--;
  346. removed = 1;
  347. }
  348. }
  349. }
  350. }
  351. }
  352. }
  353. // Feuer Ticks
  354. for( int i = 0; i < feuer.getEintragAnzahl(); i++ )
  355. {
  356. FeuerballTreffer *f = feuer.z( i );
  357. f->tick( TICK );
  358. if( f->isOver() )
  359. {
  360. feuer.remove( i );
  361. i--;
  362. continue;
  363. }
  364. if( f->makeDamage() )
  365. {
  366. for( auto s = spieler.getIterator(); s; s++ )
  367. {
  368. if( s->abstandZu( f ) < f->getWidth() / 2 )
  369. s->addEffekt( new BrandEffekt( f->zVerursacher(), s ) );
  370. }
  371. }
  372. }
  373. // Drop Ticks
  374. for( auto d = drops.getIterator(); d; d++ )
  375. d->tick( TICK, this );
  376. // Timer Ticks
  377. for( auto t = timer.getIterator(); t; t++ )
  378. t->tick( TICK, this );
  379. // Umlenkung Ticks
  380. for( auto u = umlenkungen.getIterator(); u; u++ )
  381. u->tick( TICK );
  382. // Base Ticks
  383. for( auto b = basen.getIterator(); b; b++ )
  384. b->tick( TICK, this );
  385. // aktive trigger Ticks
  386. for( int i = 0; i < triggerRuns.getEintragAnzahl(); i++ )
  387. {
  388. if( !triggerRuns.z( i )->runNext( TICK ) )
  389. {
  390. Ereignis *e = new Ereignis( AUSLOESER_RUNNED );
  391. e->addParameter( "Betroffener Auslöser", triggerRuns.z( i )->getTrigger() );
  392. throwEvent( e );
  393. triggerRuns.remove( i );
  394. i--;
  395. }
  396. }
  397. }
  398. // nicht constant
  399. void Spiel::lock()
  400. {
  401. c.lock();
  402. }
  403. void Spiel::unlock()
  404. {
  405. c.unlock();
  406. }
  407. // call 4
  408. void Spiel::setSchrift( Schrift *schrift )
  409. {
  410. if( this->schrift )
  411. this->schrift->release();
  412. this->schrift = schrift;
  413. }
  414. // call 3
  415. void Spiel::setBildschirm( Bildschirm *zScreen )
  416. {
  417. this->zScreen = zScreen;
  418. }
  419. void Spiel::nachricht( int län, char *bytes )
  420. {
  421. lock();
  422. stkn->add( new STKNachricht( län, bytes ) );
  423. unlock();
  424. }
  425. // call 2
  426. void Spiel::setKlients( KSGClient::InformationServerClient *infoKlient, KSGClient::SpielServerClient *spielKlient )
  427. {
  428. if( this->infoKlient )
  429. this->infoKlient->release();
  430. this->infoKlient = infoKlient;
  431. if( this->spielKlient )
  432. this->spielKlient->release();
  433. this->spielKlient = spielKlient;
  434. }
  435. // call 1
  436. void Spiel::setKarteId( int karteId )
  437. {
  438. this->karteId = karteId;
  439. }
  440. // call 5
  441. void Spiel::ladeDaten()
  442. {
  443. Text *gamePath = infoKlient->getDateiGruppePfad( infoKlient->getDateiGruppeIdVonSpiel( infoKlient->getSpielId( karteId ) ) );
  444. Text *mapPf = new Text( "data/tmp/Karten/" );
  445. mapPf->append( karteId );
  446. mapPf->append( "/spiel/data/data.sts" );
  447. spielKlient->setLadenProzent( 100 );
  448. mapPf->release();
  449. gamePath->release();
  450. }
  451. void Spiel::doPublicMausEreignis( MausEreignis &me )
  452. {
  453. if( me.verarbeitet )
  454. return;
  455. if( end )
  456. {
  457. end->doPublicMausEreignis( me );
  458. return;
  459. }
  460. chat->doPublicMausEreignis( me );
  461. }
  462. void Spiel::doTastaturEreignis( TastaturEreignis &te )
  463. {
  464. if( te.verarbeitet )
  465. return;
  466. if( end )
  467. {
  468. end->doTastaturEreignis( te );
  469. return;
  470. }
  471. if( !chat->istAktiv() )
  472. {
  473. if( te.id == TE_Press && !tasten[ te.taste ] )
  474. {
  475. char buff[ 2 ] = { 0, te.taste };
  476. spielKlient->spielNachricht( 2, buff );
  477. tasten[ te.taste ] = 1;
  478. te.verarbeitet = 1;
  479. }
  480. else if( te.id == TE_Release && tasten[ te.taste ] )
  481. {
  482. char buff[ 2 ] = { 1, te.taste };
  483. spielKlient->spielNachricht( 2, buff );
  484. tasten[ te.taste ] = 0;
  485. te.verarbeitet = 1;
  486. }
  487. }
  488. if( !te.verarbeitet )
  489. chat->doTastaturEreignis( te, spielKlient );
  490. }
  491. void Spiel::stknVerarbeitung()
  492. {
  493. lock();
  494. while( stkn->getEintragAnzahl() )
  495. {
  496. STKNachricht *n = stkn->z( 0 );
  497. char *msg = n->getNachricht();
  498. switch( *msg )
  499. {
  500. case 1: // initialisation
  501. spielerAnzahl = ( int ) * ( msg + 1 );
  502. for( int i = 0; i < spielerAnzahl; i++ )
  503. {
  504. int sId = *(int *)( msg + 2 + i * 8 );
  505. int aId = *(int *)( msg + 6 + i * 8 );
  506. for( auto s = spieler.getIterator(); s; s++ )
  507. {
  508. if( s->getId() == sId )
  509. {
  510. s->setAccount( aId );
  511. Text *t = infoKlient->getSpielerName( aId );
  512. s->setName( t->getText() );
  513. t->release();
  514. break;
  515. }
  516. }
  517. }
  518. n->setVerarbeitet();
  519. break;
  520. case 2: // spielernummer
  521. spielerNummer = *(int *)( msg + 1 );
  522. n->setVerarbeitet();
  523. break;
  524. case 3: // spiel start
  525. pause = 0;
  526. n->setVerarbeitet();
  527. break;
  528. case 4: // tasten stand
  529. {
  530. char taste = *(char *)( msg + 1 );
  531. char aktiv = *(char *)( msg + 2 );
  532. int sId = *(int *)( msg + 3 );
  533. for( auto s = spieler.getIterator(); s; s++ )
  534. {
  535. if( s->getId() == sId )
  536. {
  537. s->setTastenStand( taste, aktiv );
  538. break;
  539. }
  540. }
  541. n->setVerarbeitet();
  542. break;
  543. }
  544. case 5: // Spiel ende
  545. n->setVerarbeitet();
  546. break;
  547. case 6: //tick
  548. if( rZeit > 0.2 )
  549. {
  550. tick();
  551. n->setVerarbeitet();
  552. }
  553. break;
  554. case 7: // chat nachricht
  555. {
  556. unsigned char len = ( unsigned char ) * ( msg + 1 );
  557. char *buf = new char[ len + 1 ];
  558. memcpy( buf, msg + 2, len );
  559. buf[ len ] = 0;
  560. chat->addNachricht( buf );
  561. delete[] buf;
  562. n->setVerarbeitet();
  563. break;
  564. }
  565. }
  566. if( n->istVerarbeitet() )
  567. stkn->remove( 0 );
  568. else
  569. break;
  570. }
  571. unlock();
  572. }
  573. bool Spiel::tick( double zeit )
  574. {
  575. if( !pause && !end )
  576. rZeit += zeit;
  577. stknVerarbeitung();
  578. int deadsCount = deads->getEintragAnzahl();
  579. for( int i = 0; i < deadsCount; i++ )
  580. {
  581. if( deads->z( i )->isFinished() )
  582. {
  583. deads->remove( i-- );
  584. deadsCount--;
  585. }
  586. }
  587. chat->tick( zeit );
  588. return 1;
  589. }
  590. void Spiel::render( Bild &zRObj )
  591. {
  592. }
  593. void Spiel::setMapSize( int width, int height )
  594. {
  595. mapSize = Punkt( width, height );
  596. }
  597. void Spiel::setPausiert( bool pausiert )
  598. {
  599. this->pause = pausiert;
  600. }
  601. void Spiel::addVariable( const char *name, Variable *var )
  602. {
  603. bool found = 0;
  604. for( auto v = variablen.getIterator(); v; v++ )
  605. {
  606. if( v->getName().istGleich( name ) )
  607. {
  608. found = 1;
  609. break;
  610. }
  611. }
  612. if( !found )
  613. variablen.add( new VarPointer( name, var ) );
  614. else
  615. var->release();
  616. }
  617. void Spiel::setVariable( const char *name, Variable *var )
  618. {
  619. bool found = 0;
  620. for( auto v = variablen.getIterator(); v; v++ )
  621. {
  622. if( v->getName().istGleich( name ) )
  623. {
  624. v->setVariable( var );
  625. break;
  626. }
  627. }
  628. if( !found )
  629. var->release();
  630. }
  631. void Spiel::addTeam( Team *team )
  632. {
  633. teams.add( team );
  634. }
  635. void Spiel::addSpieler( Spieler *spieler )
  636. {
  637. this->spieler.add( spieler );
  638. }
  639. void Spiel::addBariere( Bariere *bariere )
  640. {
  641. barieren.add( bariere );
  642. }
  643. void Spiel::addBase( Base *base )
  644. {
  645. basen.add( base );
  646. }
  647. void Spiel::addDrop( Drop *drop )
  648. {
  649. drops.add( drop );
  650. }
  651. void Spiel::addGegenstand( Gegenstand *gegenstand )
  652. {
  653. items.add( gegenstand );
  654. zuletztGedropterGegenstand = gegenstand->getTyp();
  655. Ereignis *e = new Ereignis( GEGENSTAND_DROPED );
  656. e->addParameter( "Betroffener Gegenstand", gegenstand->getThis() );
  657. throwEvent( e );
  658. }
  659. void Spiel::addGeschoss( Geschoss *geschoss )
  660. {
  661. if( zuletztAbgefeuertesGeschoss )
  662. zuletztAbgefeuertesGeschoss->release();
  663. zuletztAbgefeuertesGeschoss = geschoss;
  664. shots.add( geschoss );
  665. }
  666. void Spiel::addSchalter( Schalter *schalter )
  667. {
  668. this->schalter.add( schalter );
  669. }
  670. void Spiel::addSchiene( Schiene *schiene )
  671. {
  672. schienen.add( schiene );
  673. }
  674. void Spiel::addTimer( Timer *timer )
  675. {
  676. this->timer.add( timer );
  677. }
  678. void Spiel::addTunnel( Tunnel *tunnel )
  679. {
  680. this->tunnel.add( tunnel );
  681. }
  682. void Spiel::addUmlenkung( Umlenkung *umlenkung )
  683. {
  684. umlenkungen.add( umlenkung );
  685. }
  686. void Spiel::addTrigger( Trigger *trigger )
  687. {
  688. this->trigger.add( trigger );
  689. }
  690. void Spiel::addTriggerRun( TriggerRun *tRun )
  691. {
  692. if( tRun )
  693. {
  694. if( lastRunnedTrigger )
  695. lastRunnedTrigger->release();
  696. lastRunnedTrigger = tRun->getTrigger();
  697. triggerRuns.add( tRun );
  698. }
  699. }
  700. void Spiel::spielerActivate( Spieler *zSpieler )
  701. {
  702. // spieler - item intersection
  703. for( int i = 0; i < items.getEintragAnzahl(); i++ )
  704. {
  705. if( items.z( i )->intersectsWith( zSpieler ) )
  706. {
  707. items.remove( i );
  708. zSpieler->addItem( items.z( i )->getTyp(), 1, this );
  709. i--;
  710. }
  711. }
  712. // Spieler - schalter intersection
  713. for( int i = 0; i < schalter.getEintragAnzahl(); i++ )
  714. {
  715. if( schalter.z( i )->intersectsWith( zSpieler ) )
  716. {
  717. zSpieler->addSchalterBenutzung( this );
  718. schalter.z( i )->press( this );
  719. }
  720. }
  721. // Spieler - tunnel intersection
  722. for( int i = 0; i < tunnel.getEintragAnzahl(); i++ )
  723. {
  724. if( tunnel.z( i )->intersectsWith( zSpieler ) )
  725. {
  726. zSpieler->addTunnelBenutzung( this );
  727. zSpieler->setX( (float)tunnel.z( i )->getZielX() - zSpieler->getWidth() / 2.f );
  728. zSpieler->setY( (float)tunnel.z( i )->getZielY() - zSpieler->getHeight() / 2.f );
  729. tunnel.z( i )->addBenutzung( this );
  730. }
  731. }
  732. }
  733. Team *Spiel::getTeam( int id ) const
  734. {
  735. for( auto t = teams.getIterator(); t; t++ )
  736. {
  737. if( t->getTeamNummer() == id )
  738. return (Team *)t->getThis();
  739. }
  740. return 0;
  741. }
  742. Spieler *Spiel::getSpieler( int id ) const
  743. {
  744. for( auto s = spieler.getIterator(); s; s++ )
  745. {
  746. if( s->getId() == id )
  747. return (Spieler *)s->getThis();
  748. }
  749. return 0;
  750. }
  751. Iterator<Spieler *> Spiel::getSpieler() const
  752. {
  753. return spieler.getIterator();
  754. }
  755. Iterator<Bariere *> Spiel::getBarieren() const
  756. {
  757. return barieren.getIterator();
  758. }
  759. Bariere *Spiel::getBariere( int id ) const
  760. {
  761. for( auto b = barieren.getIterator(); b; b++ )
  762. {
  763. if( b->getId() == id )
  764. return (Bariere *)b->getThis();
  765. }
  766. return 0;
  767. }
  768. Base *Spiel::getBase( int id ) const
  769. {
  770. for( auto b = basen.getIterator(); b; b++ )
  771. {
  772. if( b->getId() == id )
  773. return (Base *)b->getThis();
  774. }
  775. return 0;
  776. }
  777. Drop *Spiel::getDrop( int id ) const
  778. {
  779. for( auto d = drops.getIterator(); d; d++ )
  780. {
  781. if( d->getId() == id )
  782. return (Drop *)d->getThis();
  783. }
  784. return 0;
  785. }
  786. Schalter *Spiel::getSchalter( int id ) const
  787. {
  788. for( auto s = schalter.getIterator(); s; s++ )
  789. {
  790. if( s->getId() == id )
  791. return (Schalter *)s->getThis();
  792. }
  793. return 0;
  794. }
  795. Schiene *Spiel::getSchiene( int id ) const
  796. {
  797. for( auto s = schienen.getIterator(); s; s++ )
  798. {
  799. if( s->getId() == id )
  800. return (Schiene *)s->getThis();
  801. }
  802. return 0;
  803. }
  804. Timer *Spiel::getTimer( int id ) const
  805. {
  806. for( auto t = timer.getIterator(); t; t++ )
  807. {
  808. if( t->getId() == id )
  809. return (Timer *)t->getThis();
  810. }
  811. return 0;
  812. }
  813. Tunnel *Spiel::getTunnel( int id ) const
  814. {
  815. for( auto t = tunnel.getIterator(); t; t++ )
  816. {
  817. if( t->getId() == id )
  818. return (Tunnel *)t->getThis();
  819. }
  820. return 0;
  821. }
  822. Umlenkung *Spiel::getUmlenkung( int id ) const
  823. {
  824. for( auto u = umlenkungen.getIterator(); u; u++ )
  825. {
  826. if( u->getId() == id )
  827. return (Umlenkung *)u->getThis();
  828. }
  829. return 0;
  830. }
  831. Trigger *Spiel::getTrigger( int id ) const
  832. {
  833. for( auto t = trigger.getIterator(); t; t++ )
  834. {
  835. if( t->getId() == id )
  836. return (Trigger *)t->getThis();
  837. }
  838. return 0;
  839. }
  840. Variable *Spiel::getVariable( const char *name ) const
  841. {
  842. for( auto v = variablen.getIterator(); v; v++ )
  843. {
  844. if( v->getName().istGleich( name ) )
  845. return v->getVariable();
  846. }
  847. return 0;
  848. }
  849. Variable *Spiel::zVariable( const char *name ) const
  850. {
  851. for( auto v = variablen.getIterator(); v; v++ )
  852. {
  853. if( v->getName().istGleich( name ) )
  854. return v->zVariable();
  855. }
  856. return 0;
  857. }
  858. bool Spiel::istPausiert() const
  859. {
  860. return pause;
  861. }
  862. void Spiel::activateShalter( int id )
  863. {
  864. for( auto s = schalter.getIterator(); s; s++ )
  865. {
  866. if( s->getId() == id )
  867. s->press( this );
  868. }
  869. }
  870. void Spiel::throwEvent( Ereignis *e )
  871. {
  872. for( auto t = trigger.getIterator(); t; t++ )
  873. {
  874. if( t->hatEreignis( e->getTyp() ) )
  875. {
  876. TriggerRun *tr = t->runTrigger( e->getThis(), this );
  877. if( tr )
  878. triggerRuns.add( tr );
  879. }
  880. }
  881. e->release();
  882. }
  883. bool Spiel::needEvent( EreignisTyp typ ) const
  884. {
  885. for( auto t = trigger.getIterator(); t; t++ )
  886. {
  887. if( t->hatEreignis( typ ) )
  888. return 1;
  889. }
  890. return 0;
  891. }
  892. int Spiel::getNextId()
  893. {
  894. return ++nextId;
  895. }
  896. double Spiel::getRand()
  897. {
  898. return randG.rand();
  899. }
  900. int Spiel::getTickCount() const
  901. {
  902. return gameTicks;
  903. }
  904. void Spiel::setEnde( Team *zGewinner )
  905. {
  906. zWinner = zGewinner;
  907. // TODO initialize ende dialog
  908. }
  909. Trigger *Spiel::getRandomTrigger()
  910. {
  911. if( !trigger.getEintragAnzahl() )
  912. return 0;
  913. return trigger.get( (int)( randG.rand() * trigger.getEintragAnzahl() ) );
  914. }
  915. Trigger *Spiel::getLastRunnedTrigger() const
  916. {
  917. return lastRunnedTrigger ? (Trigger *)lastRunnedTrigger->getThis() : 0;
  918. }
  919. Bariere *Spiel::getRandomBariere()
  920. {
  921. return barieren.get( (int)( randG.rand() * barieren.getEintragAnzahl() ) );
  922. }
  923. void Spiel::setZuletztEingeschalteteBariere( Bariere *b )
  924. {
  925. if( zuletztEingeschalteteBariere )
  926. zuletztEingeschalteteBariere->release();
  927. zuletztEingeschalteteBariere = b;
  928. }
  929. Bariere *Spiel::getZuletztEingeschalteteBariere() const
  930. {
  931. return zuletztEingeschalteteBariere ? (Bariere *)zuletztEingeschalteteBariere->getThis() : 0;
  932. }
  933. void Spiel::setZuletztAusgeschalteteBariere( Bariere *b )
  934. {
  935. if( zuletztAusgeschalteteBariere )
  936. zuletztAusgeschalteteBariere->release();
  937. zuletztAusgeschalteteBariere = b;
  938. }
  939. Bariere *Spiel::getZuletztAusgeschalteteBariere() const
  940. {
  941. return zuletztAusgeschalteteBariere ? (Bariere *)zuletztAusgeschalteteBariere->getThis() : 0;
  942. }
  943. void Spiel::setZuletztBewegteBariere( Bariere *b )
  944. {
  945. if( zuletztBewegteBariere )
  946. zuletztBewegteBariere->release();
  947. zuletztBewegteBariere = b;
  948. }
  949. Bariere *Spiel::getZuletztBewegteBariere() const
  950. {
  951. return zuletztBewegteBariere ? (Bariere *)zuletztBewegteBariere->getThis() : 0;
  952. }
  953. Base *Spiel::getRandomBase()
  954. {
  955. if( !basen.getEintragAnzahl() )
  956. return 0;
  957. return basen.get( (int)( randG.rand() * basen.getEintragAnzahl() ) );
  958. }
  959. void Spiel::setLastTeamChangedBase( Base *b )
  960. {
  961. if( lastTeamChangedBase )
  962. lastTeamChangedBase->release();
  963. lastTeamChangedBase = b;
  964. }
  965. Base *Spiel::getLastTeamChangedBase() const
  966. {
  967. return lastTeamChangedBase ? (Base *)lastTeamChangedBase->getThis() : 0;
  968. }
  969. Drop *Spiel::getRandomDrop()
  970. {
  971. if( !drops.getEintragAnzahl() )
  972. return 0;
  973. return drops.get( (int)( randG.rand() * drops.getEintragAnzahl() ) );
  974. }
  975. void Spiel::setLastDrop( Drop *d )
  976. {
  977. if( lastDropedDrop )
  978. lastDropedDrop->release();
  979. lastDropedDrop = d;
  980. }
  981. Drop *Spiel::getLastDrop() const
  982. {
  983. return lastDropedDrop ? (Drop *)lastDropedDrop->getThis() : 0;
  984. }
  985. void Spiel::setItemZuletztAufgehoben( GegenstandTyp g )
  986. {
  987. zuletztAufgehobenerGegenstand = g;
  988. }
  989. GegenstandTyp Spiel::getItemZuletztAufgehoben() const
  990. {
  991. return zuletztAufgehobenerGegenstand;
  992. }
  993. void Spiel::setItemZuletztAktiviert( GegenstandTyp g )
  994. {
  995. zuletztBenutzterGegenstand = g;
  996. }
  997. GegenstandTyp Spiel::getItemZuletztAktiviert() const
  998. {
  999. return zuletztBenutzterGegenstand;
  1000. }
  1001. GegenstandTyp Spiel::getItemZuletztGedropt() const
  1002. {
  1003. return zuletztGedropterGegenstand;
  1004. }
  1005. Geschoss *Spiel::getRandomGeschoss()
  1006. {
  1007. if( !shots.getEintragAnzahl() )
  1008. return 0;
  1009. return shots.get( (int)( randG.rand() * shots.getEintragAnzahl() ) );
  1010. }
  1011. Geschoss *Spiel::getGeschossZuletztAbgefeuert() const
  1012. {
  1013. return zuletztAbgefeuertesGeschoss ? (Geschoss *)zuletztAbgefeuertesGeschoss->getThis() : 0;
  1014. }
  1015. void Spiel::setGeschossZuletztUmgelenkt( Geschoss *g )
  1016. {
  1017. if( zuletztUmgelenktesGeschoss )
  1018. zuletztUmgelenktesGeschoss->release();
  1019. zuletztUmgelenktesGeschoss = g;
  1020. }
  1021. Geschoss *Spiel::getGeschossZuletztUmgelenkt() const
  1022. {
  1023. return zuletztUmgelenktesGeschoss ? (Geschoss *)zuletztUmgelenktesGeschoss->getThis() : 0;
  1024. }
  1025. Geschoss *Spiel::getGeschossZuletztBariereGetroffen() const
  1026. {
  1027. return zuletztBariereGetroffenesGeschoss ? (Geschoss *)zuletztBariereGetroffenesGeschoss->getThis() : 0;
  1028. }
  1029. void Spiel::setGeschossZuletztTunnelBenutzt( Geschoss *g )
  1030. {
  1031. if( zuletztTunnelBenutztesGeschoss )
  1032. zuletztTunnelBenutztesGeschoss->release();
  1033. zuletztTunnelBenutztesGeschoss = g;
  1034. }
  1035. Geschoss *Spiel::getGeschossZuletztTunnelBenutzt() const
  1036. {
  1037. return zuletztTunnelBenutztesGeschoss ? (Geschoss *)zuletztTunnelBenutztesGeschoss->getThis() : 0;
  1038. }
  1039. void Spiel::setGeschossZuletztGeschossGetroffen( Geschoss *g )
  1040. {
  1041. if( zuletztGeschossGetroffenesGeschoss )
  1042. zuletztGeschossGetroffenesGeschoss->release();
  1043. zuletztGeschossGetroffenesGeschoss = g;
  1044. }
  1045. Geschoss *Spiel::getGeschossZuletztGeschossGetroffen() const
  1046. {
  1047. return zuletztGeschossGetroffenesGeschoss ? (Geschoss *)zuletztGeschossGetroffenesGeschoss->getThis() : 0;
  1048. }
  1049. Schalter *Spiel::getRandomSchalter()
  1050. {
  1051. if( !schalter.getEintragAnzahl() )
  1052. return 0;
  1053. return schalter.get( (int)( randG.rand() * schalter.getEintragAnzahl() ) );
  1054. }
  1055. void Spiel::setSchalterZuletztAktiviert( Schalter *s )
  1056. {
  1057. if( zuletztAktivierterSchalter )
  1058. zuletztAktivierterSchalter->release();
  1059. zuletztAktivierterSchalter = s;
  1060. }
  1061. Schalter *Spiel::getSchalterZuletztAktiviert() const
  1062. {
  1063. return zuletztAktivierterSchalter ? (Schalter *)zuletztAktivierterSchalter->getThis() : 0;
  1064. }
  1065. Spieler *Spiel::getRandomSpieler()
  1066. {
  1067. if( !spieler.getEintragAnzahl() )
  1068. return 0;
  1069. return spieler.get( (int)( randG.rand() * spieler.getEintragAnzahl() ) );
  1070. }
  1071. Spieler *Spiel::getRandomSpieler( Team *zTeam )
  1072. {
  1073. if( !zTeam || !zTeam->getSpielerAnzahl() )
  1074. return 0;
  1075. int index = (int)( randG.rand() * zTeam->getSpielerAnzahl() );
  1076. for( auto s = spieler.getIterator(); s; s++ )
  1077. {
  1078. if( s->zTeam() == zTeam )
  1079. {
  1080. if( index-- <= 0 )
  1081. return (Spieler *)s->getThis();
  1082. }
  1083. }
  1084. return 0;
  1085. }
  1086. void Spiel::setSpielerZuletztSchadenGemacht( Spieler *s )
  1087. {
  1088. if( zuletztSchadenGemachterSpieler )
  1089. zuletztSchadenGemachterSpieler->release();
  1090. zuletztSchadenGemachterSpieler = s;
  1091. }
  1092. Spieler *Spiel::getSpielerZuletztSchadenGemacht() const
  1093. {
  1094. return zuletztSchadenGemachterSpieler ? (Spieler *)zuletztSchadenGemachterSpieler->getThis() : 0;
  1095. }
  1096. void Spiel::setSpielerZuletztSchadenGenommen( Spieler *s )
  1097. {
  1098. if( zuletztSchadenGenommenerSpieler )
  1099. zuletztSchadenGenommenerSpieler->release();
  1100. zuletztSchadenGenommenerSpieler = s;
  1101. }
  1102. Spieler *Spiel::getSpielerZuletztSchadenGenommen() const
  1103. {
  1104. return zuletztSchadenGenommenerSpieler ? (Spieler *)zuletztSchadenGenommenerSpieler->getThis() : 0;
  1105. }
  1106. void Spiel::setSpielerZuletztGeheilt( Spieler *s )
  1107. {
  1108. if( zuletztGeheilterSpieler )
  1109. zuletztGeheilterSpieler->release();
  1110. zuletztGeheilterSpieler = s;
  1111. }
  1112. Spieler *Spiel::getSpielerZuletztGeheilt() const
  1113. {
  1114. return zuletztGeheilterSpieler ? (Spieler *)zuletztGeheilterSpieler->getThis() : 0;
  1115. }
  1116. void Spiel::setSpielerZuletztLevelUp( Spieler *s )
  1117. {
  1118. if( zuletztLevelUpSpieler )
  1119. zuletztLevelUpSpieler->release();
  1120. zuletztLevelUpSpieler = s;
  1121. }
  1122. Spieler *Spiel::getSpielerZuletztLevelUp() const
  1123. {
  1124. return zuletztLevelUpSpieler ? (Spieler *)zuletztLevelUpSpieler->getThis() : 0;
  1125. }
  1126. void Spiel::setSpielerZuletztErfahrungBekommen( Spieler *s )
  1127. {
  1128. if( zuletztErfahrungBekommenerSpieler )
  1129. zuletztErfahrungBekommenerSpieler->release();
  1130. zuletztErfahrungBekommenerSpieler = s;
  1131. }
  1132. Spieler *Spiel::getSpielerZuletztErfahrungBekommen() const
  1133. {
  1134. return zuletztErfahrungBekommenerSpieler ? (Spieler *)zuletztErfahrungBekommenerSpieler->getThis() : 0;
  1135. }
  1136. void Spiel::setSpielerZuletztGegenstandAktiviert( Spieler *s )
  1137. {
  1138. if( zuletztGegenstandAktivierterSpieler )
  1139. zuletztGegenstandAktivierterSpieler->release();
  1140. zuletztGegenstandAktivierterSpieler = s;
  1141. }
  1142. Spieler *Spiel::getSpielerZuletztGegenstandAktiviert() const
  1143. {
  1144. return zuletztGegenstandAktivierterSpieler ? (Spieler *)zuletztGegenstandAktivierterSpieler->getThis() : 0;
  1145. }
  1146. void Spiel::setSpielerZuletztGegenstandAufgehoben( Spieler *s )
  1147. {
  1148. if( zuletztGegenstandAufgehobenerSpieler )
  1149. zuletztGegenstandAufgehobenerSpieler->release();
  1150. zuletztGegenstandAufgehobenerSpieler = s;
  1151. }
  1152. Spieler *Spiel::getSpielerZuletztGegenstandAufgehoben() const
  1153. {
  1154. return zuletztGegenstandAufgehobenerSpieler ? (Spieler *)zuletztGegenstandAufgehobenerSpieler->getThis() : 0;
  1155. }
  1156. void Spiel::setSpielerZuletztSchalterAktiviert( Spieler *s )
  1157. {
  1158. if( zuletztSchalterAktivierterSpieler )
  1159. zuletztSchalterAktivierterSpieler->release();
  1160. zuletztSchalterAktivierterSpieler = s;
  1161. }
  1162. Spieler *Spiel::getSpielerZuletztSchalterAktiviert() const
  1163. {
  1164. return zuletztSchalterAktivierterSpieler ? (Spieler *)zuletztSchalterAktivierterSpieler->getThis() : 0;
  1165. }
  1166. void Spiel::setSpielerZuletztTunnelBenutzt( Spieler *s )
  1167. {
  1168. if( zuletztTunnelBenutzterSpieler )
  1169. zuletztTunnelBenutzterSpieler->release();
  1170. zuletztTunnelBenutzterSpieler = s;
  1171. }
  1172. Spieler *Spiel::getSpielerZuletztTunnelBenutzt() const
  1173. {
  1174. return zuletztTunnelBenutzterSpieler ? (Spieler *)zuletztTunnelBenutzterSpieler->getThis() : 0;
  1175. }
  1176. void Spiel::setSpielerZuletztGestorben( Spieler *s )
  1177. {
  1178. if( zuletztGestorbenerSpieler )
  1179. zuletztGestorbenerSpieler->release();
  1180. zuletztGestorbenerSpieler = s;
  1181. }
  1182. Spieler *Spiel::getSpielerZuletztGestorben() const
  1183. {
  1184. return zuletztGestorbenerSpieler ? (Spieler *)zuletztGestorbenerSpieler->getThis() : 0;
  1185. }
  1186. void Spiel::setSpielerZuletztWiederbelebt( Spieler *s )
  1187. {
  1188. if( zuletztWiederbelebterSpieler )
  1189. zuletztWiederbelebterSpieler->release();
  1190. zuletztWiederbelebterSpieler = s;
  1191. }
  1192. Spieler *Spiel::getSpielerZuletztWiederbelebt() const
  1193. {
  1194. return zuletztWiederbelebterSpieler ? (Spieler *)zuletztWiederbelebterSpieler->getThis() : 0;
  1195. }
  1196. void Spiel::setSpielerZuletztGeschossen( Spieler *s )
  1197. {
  1198. if( zuletztGeschossenerSpieler )
  1199. zuletztGeschossenerSpieler->release();
  1200. zuletztGeschossenerSpieler = s;
  1201. }
  1202. Spieler *Spiel::getSpielerZuletztGeschossen() const
  1203. {
  1204. return zuletztGeschossenerSpieler ? (Spieler *)zuletztGeschossenerSpieler->getThis() : 0;
  1205. }
  1206. Team *Spiel::getRandomTeam()
  1207. {
  1208. if( !teams.getEintragAnzahl() )
  1209. return 0;
  1210. return teams.get( (int)( randG.rand() * teams.getEintragAnzahl() ) );
  1211. }
  1212. Timer *Spiel::getRandomTimer()
  1213. {
  1214. if( !timer.getEintragAnzahl() )
  1215. return 0;
  1216. return timer.get( (int)( randG.rand() * timer.getEintragAnzahl() ) );
  1217. }
  1218. void Spiel::setTimerZuletztAbgelaufen( Timer *t )
  1219. {
  1220. if( zuletztAbgelaufenerTimer )
  1221. zuletztAbgelaufenerTimer->release();
  1222. zuletztAbgelaufenerTimer = t;
  1223. }
  1224. Timer *Spiel::getTimerZuletztAbgelaufen() const
  1225. {
  1226. return zuletztAbgelaufenerTimer ? (Timer *)zuletztAbgelaufenerTimer->getThis() : 0;
  1227. }
  1228. void Spiel::setTimerZuletztGestartet( Timer *t )
  1229. {
  1230. if( zuletztGestarteterTimer )
  1231. zuletztGestarteterTimer->release();
  1232. zuletztGestarteterTimer = t;
  1233. }
  1234. Timer *Spiel::getTimerZuletztGestartet() const
  1235. {
  1236. return zuletztGestarteterTimer ? (Timer *)zuletztGestarteterTimer->getThis() : 0;
  1237. }
  1238. void Spiel::setTimerZuletztPausiert( Timer *t )
  1239. {
  1240. if( zuletztPausierterTimer )
  1241. zuletztPausierterTimer->release();
  1242. zuletztPausierterTimer = t;
  1243. }
  1244. Timer *Spiel::getTimerZuletztPausiert() const
  1245. {
  1246. return zuletztPausierterTimer ? (Timer *)zuletztPausierterTimer->getThis() : 0;
  1247. }
  1248. void Spiel::setTimerZuletztFortgesetzt( Timer *t )
  1249. {
  1250. if( zuletztFortgesetzterTimer )
  1251. zuletztFortgesetzterTimer->release();
  1252. zuletztFortgesetzterTimer = t;
  1253. }
  1254. Timer *Spiel::getTimerZuletztFortgesetzt() const
  1255. {
  1256. return zuletztFortgesetzterTimer ? (Timer *)zuletztFortgesetzterTimer->getThis() : 0;
  1257. }
  1258. Tunnel *Spiel::getRandomTunnel()
  1259. {
  1260. if( !tunnel.getEintragAnzahl() )
  1261. return 0;
  1262. return tunnel.get( (int)( randG.rand() * tunnel.getEintragAnzahl() ) );
  1263. }
  1264. void Spiel::setTunnelZuletztBenutzt( Tunnel *t )
  1265. {
  1266. if( zuletztBenutzterTunnel )
  1267. zuletztBenutzterTunnel->release();
  1268. zuletztBenutzterTunnel = t;
  1269. }
  1270. Tunnel *Spiel::getTunnelZuletztBenutzt() const
  1271. {
  1272. return zuletztBenutzterTunnel ? (Tunnel *)zuletztBenutzterTunnel->getThis() : 0;
  1273. }
  1274. Umlenkung *Spiel::getRandomUmlenkung()
  1275. {
  1276. if( !umlenkungen.getEintragAnzahl() )
  1277. return 0;
  1278. return umlenkungen.get( (int)( randG.rand() * umlenkungen.getEintragAnzahl() ) );
  1279. }
  1280. void Spiel::setUmlenkungZuletztBenutzt( Umlenkung *t )
  1281. {
  1282. if( zuletztBenutzteUmlenkung )
  1283. zuletztBenutzteUmlenkung->release();
  1284. zuletztBenutzteUmlenkung = t;
  1285. }
  1286. Umlenkung *Spiel::getUmlenkungZuletztBenutzt() const
  1287. {
  1288. return zuletztBenutzteUmlenkung ? (Umlenkung *)zuletztBenutzteUmlenkung->getThis() : 0;
  1289. }
  1290. // Reference Counting
  1291. SpielV *Spiel::getThis()
  1292. {
  1293. ref++;
  1294. return this;
  1295. }
  1296. SpielV *Spiel::release()
  1297. {
  1298. if( !--ref )
  1299. delete this;
  1300. return 0;
  1301. }