Spiel.cpp 42 KB

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