Spiel.cpp 46 KB

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