StatistikChat.cpp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482
  1. #include "StatistikChat.h"
  2. #include <Punkt.h>
  3. #include <DateiSystem.h>
  4. #include <MausEreignis.h>
  5. #include <AlphaFeld.h>
  6. #include <Scroll.h>
  7. #include <Rahmen.h>
  8. #include <TastaturEreignis.h>
  9. #include "Initialisierung.h"
  10. // Inhalt der ChatListeSpieler Klasse aus StatistikChat.h
  11. // Konstruktor
  12. ChatListeSpieler::ChatListeSpieler( int accountId, int eigeneId, Schrift *zSchrift, BilderV *bilder, KSGClient::InformationServerClient *zInfoc,
  13. bool istFreund, void( *addChatF )( void*, int ), void( *addFreundF )( void*, int ),
  14. void( *accountAnsehenF )( void *, int ), void *param )
  15. : addChatF( addChatF ),
  16. addFreundF( addFreundF ),
  17. accountAnsehenF( accountAnsehenF ),
  18. nachrichtParam( param ),
  19. accountId( accountId ),
  20. bg( new AlphaFeld() ),
  21. name( initTextFeld( 0, 0, 133, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Rahmen | TextFeld::Style::VCenter, "" ) ),
  22. accountAnsehen( initKnopf( 133, 0, 20, 20, 0, 0, "" ) ),
  23. nachrichtSenden( initKnopf( 153, 0, 20, 20, 0, 0, "" ) ),
  24. freundesanfrageSenden( initKnopf( 173, 0, 20, 20, 0, 0, "" ) ),
  25. pos( 0, 0 ),
  26. gr( 133, 20 ),
  27. online( 1 ),
  28. minKnopfX( 113 - ( ( ( accountId != eigeneId ) + !istFreund ) * 20 ) ),
  29. knopfX( 133 ),
  30. mausIn( 0 ),
  31. tickVal( 0 ),
  32. rend( 0 ),
  33. ref( 1 )
  34. {
  35. Bild *ansehenBild = bilder->get( "data/client/bilder/chat.ltdb/ansehen.png" );
  36. Bild *nachrichtBild = bilder->get( "data/client/bilder/chat.ltdb/nachricht.png" );
  37. Bild *einladungBild = bilder->get( "data/client/bilder/chat.ltdb/neuerfreund.png" );
  38. bg->setSize( gr );
  39. bg->setFarbe( 0x0000FF00 );
  40. bg->setStrength( -4 );
  41. name->setText( zInfoc->getSpielerName( accountId ) );
  42. accountAnsehen->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HAlpha | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
  43. accountAnsehen->setHintergrundBildZ( ansehenBild );
  44. nachrichtSenden->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HAlpha | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
  45. nachrichtSenden->setHintergrundBildZ( nachrichtBild );
  46. freundesanfrageSenden->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HAlpha | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
  47. freundesanfrageSenden->setHintergrundBildZ( einladungBild );
  48. }
  49. // Destruktor
  50. ChatListeSpieler::~ChatListeSpieler()
  51. {
  52. bg->release();
  53. name->release();
  54. accountAnsehen->release();
  55. nachrichtSenden->release();
  56. freundesanfrageSenden->release();
  57. }
  58. // nicht constant
  59. void ChatListeSpieler::setOffline()
  60. {
  61. online = 0;
  62. }
  63. void ChatListeSpieler::setPosition( int y )
  64. {
  65. if( pos.y != y )
  66. rend = 1;
  67. pos.y = y;
  68. }
  69. void ChatListeSpieler::doPublicMausEreignis( MausEreignis &me )
  70. {
  71. int mx = me.mx;
  72. int my = me.my;
  73. me.mx -= pos.x;
  74. me.my -= pos.y;
  75. if( me.mx > 0 && me.mx < gr.x && me.my > 0 && me.my < gr.y )
  76. mausIn = 1;
  77. else
  78. mausIn = 0;
  79. me.mx += 133 - knopfX;
  80. bool vera = me.verarbeitet;
  81. accountAnsehen->doPublicMausEreignis( me );
  82. int aktion = ( me.verarbeitet && !vera ) ? 1 : 0;
  83. nachrichtSenden->doPublicMausEreignis( me );
  84. aktion = ( me.verarbeitet && !vera && !aktion ) ? 2 : aktion;
  85. freundesanfrageSenden->doPublicMausEreignis( me );
  86. aktion = ( me.verarbeitet && !vera && !aktion ) ? 3 : aktion;
  87. me.mx -= 133 - knopfX;
  88. if( me.id == ME_RLinks && mausIn )
  89. {
  90. switch( aktion )
  91. {
  92. case 1:
  93. accountAnsehenF( nachrichtParam, accountId );
  94. break;
  95. case 2:
  96. addChatF( nachrichtParam, accountId );
  97. break;
  98. case 3:
  99. addFreundF( nachrichtParam, accountId );
  100. break;
  101. }
  102. }
  103. me.mx = mx;
  104. me.my = my;
  105. }
  106. bool ChatListeSpieler::tick( double tickVal )
  107. {
  108. rend |= name->tick( tickVal );
  109. rend |= accountAnsehen->tick( tickVal );
  110. rend |= nachrichtSenden->tick( tickVal );
  111. rend |= freundesanfrageSenden->tick( tickVal );
  112. this->tickVal += tickVal * 60;
  113. int val = ( int )this->tickVal;
  114. if( val )
  115. {
  116. this->tickVal -= val;
  117. if( mausIn && knopfX != minKnopfX )
  118. {
  119. if( knopfX - val < minKnopfX )
  120. knopfX = minKnopfX;
  121. else
  122. knopfX -= val;
  123. rend = 1;
  124. }
  125. if( !mausIn && knopfX != gr.x )
  126. {
  127. if( knopfX + val > gr.x )
  128. knopfX = gr.x;
  129. else
  130. knopfX += val;
  131. rend = 1;
  132. }
  133. if( !online && bg->getFarbe() != 0x00FF0000 )
  134. {
  135. int g = ( bg->getFarbe() >> 8 ) & 0xFF;
  136. if( g - val < 0 )
  137. bg->setFarbe( 0x00FF0000 );
  138. else
  139. {
  140. bg->setFarbe( ( ( ( g - val ) << 8 ) & 0xFF00 ) | ( bg->getFarbe() & 0xFFFF00FF ) );
  141. bg->setFarbe( ( ( ( 255 - ( g - val ) ) << 16 ) & 0xFF0000 ) | ( bg->getFarbe() & 0xFF00FFFF ) );
  142. }
  143. rend = 1;
  144. }
  145. }
  146. bool ret = rend;
  147. rend = 0;
  148. return ret;
  149. }
  150. void ChatListeSpieler::render( Bild &zRObj )
  151. {
  152. if( !zRObj.setDrawOptions( pos, gr ) )
  153. return;
  154. bg->render( zRObj );
  155. name->render( zRObj );
  156. zRObj.addScrollOffset( 133 - knopfX, 0 );
  157. accountAnsehen->render( zRObj );
  158. nachrichtSenden->render( zRObj );
  159. freundesanfrageSenden->render( zRObj );
  160. zRObj.releaseDrawOptions();
  161. }
  162. // constant
  163. int ChatListeSpieler::getAccountId() const
  164. {
  165. return accountId;
  166. }
  167. // Reference Counting
  168. ChatListeSpieler *ChatListeSpieler::getThis()
  169. {
  170. ref++;
  171. return this;
  172. }
  173. ChatListeSpieler *ChatListeSpieler::release()
  174. {
  175. ref--;
  176. if( !ref )
  177. delete this;
  178. return 0;
  179. }
  180. // Inhalt der ChatListe Klasse aus StatistikChat.h
  181. // Konstruktor
  182. ChatListe::ChatListe( int eigeneId, KSGClient::InformationServerClient *infoc, Schrift *schrift, BilderV *bilder,
  183. void( *addChat )( void*, int ), void( *addFreund )( void*, int ),
  184. void( *accountAnsehen )( void *, int ), void *param )
  185. : addChat( addChat ),
  186. addFreund( addFreund ),
  187. accountAnsehen( accountAnsehen ),
  188. nachrichtParam( nachrichtParam ),
  189. eigeneId( eigeneId ),
  190. spieler( new RCArray< ChatListeSpieler >() ),
  191. vScroll( new VScrollBar() ),
  192. pos( 620, 295 ),
  193. gr( 150, 150 ),
  194. infoc( infoc ),
  195. schrift( schrift ),
  196. bilder( bilder ),
  197. ram( new LRahmen() ),
  198. rend( 0 ),
  199. ref( 1 )
  200. {
  201. vScroll->setKlickScroll( 10 );
  202. vScroll->update( 0, 148 );
  203. ram->setFarbe( 0xFFFFFFFF );
  204. ram->setSize( 150, 150 );
  205. }
  206. // Destruktor
  207. ChatListe::~ChatListe()
  208. {
  209. spieler->release();
  210. vScroll->release();
  211. infoc->release();
  212. schrift->release();
  213. ram->release();
  214. }
  215. // nicht constant
  216. void ChatListe::addSpieler( int accountId, bool istFreund )
  217. {
  218. int anz = spieler->getEintragAnzahl();
  219. for( int i = 0; i < anz; i++ )
  220. {
  221. if( spieler->z( i ) && spieler->z( i )->getAccountId() == accountId )
  222. return;
  223. }
  224. ChatListeSpieler *s = new ChatListeSpieler( accountId, eigeneId, schrift, bilder, infoc, istFreund, addChat, addFreund, accountAnsehen, nachrichtParam );
  225. s->setPosition( anz * 20 );
  226. spieler->add( s );
  227. rend = 1;
  228. }
  229. void ChatListe::setOffline( int accountId )
  230. {
  231. int anz = spieler->getEintragAnzahl();
  232. for( int i = 0; i < anz; i++ )
  233. {
  234. if( spieler->z( i ) && spieler->z( i )->getAccountId() == accountId )
  235. {
  236. spieler->z( i )->setOffline();
  237. return;
  238. }
  239. }
  240. }
  241. void ChatListe::doPublicMausEreignis( MausEreignis &me )
  242. {
  243. int mx = me.mx;
  244. int my = me.my;
  245. me.mx -= pos.x;
  246. me.my -= pos.y - vScroll->getScroll();
  247. vScroll->doMausMessage( 134, 1, 15, 148, me );
  248. int anz = spieler->getEintragAnzahl();
  249. for( int i = 0; i < anz; i++ )
  250. {
  251. if( spieler->z( i ) )
  252. spieler->z( i )->doPublicMausEreignis( me );
  253. }
  254. me.mx = mx;
  255. me.my = my;
  256. }
  257. bool ChatListe::tick( double tickVal )
  258. {
  259. rend |= vScroll->getRend();
  260. int anz = spieler->getEintragAnzahl();
  261. for( int i = 0; i < anz; i++ )
  262. {
  263. if( spieler->z( i ) )
  264. rend |= spieler->z( i )->tick( tickVal );
  265. }
  266. bool ret = rend;
  267. rend = 0;
  268. return ret;
  269. }
  270. void ChatListe::render( Bild &zRObj )
  271. {
  272. if( !zRObj.setDrawOptions( pos, gr ) )
  273. return;
  274. int anz = spieler->getEintragAnzahl();
  275. zRObj.addScrollOffset( 0, vScroll->getScroll() );
  276. for( int i = 0; i < anz; i++ )
  277. {
  278. if( spieler->z( i ) )
  279. spieler->z( i )->render( zRObj );
  280. }
  281. zRObj.addScrollOffset( 0, -vScroll->getScroll() );
  282. vScroll->render( 134, 1, 15, 148, zRObj );
  283. ram->render( zRObj );
  284. zRObj.releaseDrawOptions();
  285. }
  286. // constant
  287. // Reference Counting
  288. ChatListe *ChatListe::getThis()
  289. {
  290. ref++;
  291. return this;
  292. }
  293. ChatListe *ChatListe::release()
  294. {
  295. ref--;
  296. if( !ref )
  297. delete this;
  298. return 0;
  299. }
  300. // Inhalt der StatistikChat Klasse aus StatistikChat.h
  301. // Konstruktor
  302. StatistikChat::StatistikChat( int eigeneId, KSGClient::SpielServerClient *spielc, KSGClient::InformationServerClient *infoc, Schrift *schrift, BilderV *bilder,
  303. void( *addNachricht )( void *, Text *, Text *, Text *, Text * ),
  304. void( *addChat )( void*, int ), void( *addFreund )( void*, int ),
  305. void( *accountAnsehen )( void *, int ), void *param )
  306. : addNachricht( addNachricht ),
  307. nachrichtParam( nachrichtParam ),
  308. spielc( spielc ),
  309. infoc( infoc ),
  310. verlauf( initTextFeld( 10, 295, 600, 150, schrift, TextFeld::Style::Sichtbar | TextFeld::Style::Rahmen | TextFeld::Style::VScroll | TextFeld::Style::Mehrzeilig, "" ) ),
  311. nachricht( initTextFeld( 10, 450, 575, 20, schrift, TextFeld::Style::TextFeld, "" ) ),
  312. senden( initKnopf( 590, 450, 20, 20, 0, 0, "" ) ),
  313. verlassen( initKnopf( 630, 450, 130, 20, schrift, Knopf::Style::Sichtbar, "Verlassen" ) ),
  314. spielerListe( new ChatListe( eigeneId, infoc->getThis(), schrift, bilder, addChat, addFreund, accountAnsehen, nachrichtParam ) ),
  315. beenden( 0 ),
  316. ref( 1 )
  317. {
  318. Bild *sendenBild = bilder->get( "data/client/bilder/chat.ltdb/senden.png" );
  319. senden->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HAlpha | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
  320. senden->setHintergrundBildZ( sendenBild );
  321. }
  322. // Destruktor
  323. StatistikChat::~StatistikChat()
  324. {
  325. spielc->release();
  326. infoc->release();
  327. verlauf->release();
  328. nachricht->release();
  329. senden->release();
  330. verlassen->release();
  331. spielerListe->release();
  332. }
  333. // nicht constant
  334. void StatistikChat::addSpieler( int accountId, bool istFreund )
  335. {
  336. spielerListe->addSpieler( accountId, istFreund );
  337. }
  338. void StatistikChat::spielerOffline( int accountId )
  339. {
  340. spielerListe->setOffline( accountId );
  341. }
  342. void StatistikChat::addChatNachricht( int vonAccount, char *nachricht )
  343. {
  344. Text *txt = vonAccount ? infoc->getSpielerName( vonAccount ) : 0;
  345. if( !txt )
  346. txt = new Text();
  347. else
  348. *txt += ": ";
  349. *txt += nachricht;
  350. *txt += "\n";
  351. verlauf->zTextRenderer()->textFormatieren( txt, verlauf->getBreite() - 15 );
  352. verlauf->zText()->append( txt );
  353. verlauf->updateVScroll();
  354. }
  355. void StatistikChat::doPublicMausEreignis( MausEreignis &me )
  356. {
  357. verlauf->doPublicMausEreignis( me );
  358. nachricht->doPublicMausEreignis( me );
  359. spielerListe->doPublicMausEreignis( me );
  360. bool vera = me.verarbeitet;
  361. senden->doPublicMausEreignis( me );
  362. int aktion = ( me.verarbeitet && !vera ) ? 1 : 0;
  363. verlassen->doPublicMausEreignis( me );
  364. aktion = ( me.verarbeitet && !vera && !aktion ) ? 2 : aktion;
  365. if( me.id == ME_RLinks )
  366. {
  367. if( aktion == 1 )
  368. {
  369. if( nachricht->zText()->getLength() )
  370. {
  371. short län = 1 + nachricht->zText()->getLength();
  372. char *bytes = new char[ län ];
  373. bytes[ 0 ] = 1;
  374. for( int i = 0; i < län - 1; i++ )
  375. bytes[ i + 1 ] = nachricht->zText()->getText()[ i ];
  376. if( !spielc->statistikNachricht( län, bytes ) )
  377. addNachricht( nachrichtParam, new Text( "Fehler" ), new Text( "Die Nachricht konnte nicht gesendet werden." ), new Text( "Ok" ), 0 );
  378. else
  379. {
  380. nachricht->setAuswahl( 0, 0 );
  381. nachricht->setText( "" );
  382. }
  383. delete[] bytes;
  384. }
  385. }
  386. if( aktion == 2 )
  387. beenden = 1;
  388. }
  389. }
  390. void StatistikChat::doTastaturEreignis( TastaturEreignis &te )
  391. {
  392. bool vera = te.verarbeitet;
  393. nachricht->doTastaturEreignis( te );
  394. if( !vera && te.verarbeitet && te.id == TE_Release && te.taste == T_Enter )
  395. {
  396. if( nachricht->zText()->getLength() )
  397. {
  398. short län = 1 + nachricht->zText()->getLength();
  399. char *bytes = new char[ län ];
  400. bytes[ 0 ] = 1;
  401. for( int i = 0; i < län - 1; i++ )
  402. bytes[ i + 1 ] = nachricht->zText()->getText()[ i ];
  403. if( !spielc->statistikNachricht( län, bytes ) )
  404. addNachricht( nachrichtParam, new Text( "Fehler" ), new Text( "Die Nachricht konnte nicht gesendet werden." ), new Text( "Ok" ), 0 );
  405. else
  406. {
  407. nachricht->setAuswahl( 0, 0 );
  408. nachricht->setText( "" );
  409. }
  410. delete[] bytes;
  411. }
  412. }
  413. }
  414. bool StatistikChat::tick( double tickVal )
  415. {
  416. bool rend = verlauf->tick( tickVal );
  417. rend |= nachricht->tick( tickVal );
  418. rend |= senden->tick( tickVal );
  419. rend |= verlassen->tick( tickVal );
  420. rend |= spielerListe->tick( tickVal );
  421. return rend;
  422. }
  423. void StatistikChat::render( Bild &zRObj )
  424. {
  425. verlauf->render( zRObj );
  426. nachricht->render( zRObj );
  427. senden->render( zRObj );
  428. verlassen->render( zRObj );
  429. spielerListe->render( zRObj );
  430. }
  431. // constant
  432. bool StatistikChat::hatVerlassen()
  433. {
  434. return beenden;
  435. }
  436. // Reference Counting
  437. StatistikChat *StatistikChat::getThis()
  438. {
  439. ref++;
  440. return this;
  441. }
  442. StatistikChat *StatistikChat::release()
  443. {
  444. ref--;
  445. if( !ref )
  446. delete this;
  447. return 0;
  448. }