Spiel.cpp 44 KB

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