#include "Menü.h" #include "Initialisierung.h" #include #include #include #include #include #include #include #include #include #include #include #include // Inhalt der MenüVerloren Klasse aus Menü.h // Kontruktor MenüVerloren::MenüVerloren( UIInit &uiFactory ) : ReferenceCounter() { ram = new LRahmen(); ram->setSize( 160, 100 ); ram->setPosition( 320, 200 ); ram->setFarbe( 0xFFFFFFFF ); verloren = initTextFeld( 325, 210, 150, 20, uiFactory, TextFeld::Style::Text | TextFeld::Style::Center, "Du hast verloren." ); neu = initKnopf( 350, 240, 100, 20, uiFactory, TextFeld::Style::Text | TextFeld::Style::Center, "Neues Spiel" ); beenden = initKnopf( 350, 270, 100, 20, uiFactory, TextFeld::Style::Text | TextFeld::Style::Center, "Zurück" ); } // Destruktor MenüVerloren::~MenüVerloren() { verloren->release(); neu->release(); beenden->release(); ram->release(); } // nicht constant int MenüVerloren::doPublicMausEreignis( MausEreignis &me ) { bool vera = me.verarbeitet; int ret = 0; neu->doPublicMausEreignis( me ); if( !vera && me.verarbeitet && me.id == ME_RLinks ) ret = 1; beenden->doPublicMausEreignis( me ); if( !vera && me.verarbeitet && !ret && me.id == ME_RLinks ) ret = 2; return ret; } bool MenüVerloren::tick( double tickVal ) { bool ret = verloren->tick( tickVal ); ret |= neu->tick( tickVal ); ret |= beenden->tick( tickVal ); return ret; } void MenüVerloren::render( Bild &zRObj ) { zRObj.alphaRegion( ram->getX(), ram->getY(), ram->getBreite(), ram->getHeight(), 0xD0000000 ); verloren->render( zRObj ); neu->render( zRObj ); beenden->render( zRObj ); ram->render( zRObj ); } // Inhalt der MenüSpiel Klasse aus Menü.h // Konstruktor MenüSpiel::MenüSpiel( UIInit &uiFactory, KSGClient::MinigameServerClient *klient ) : ReferenceCounter() { scoreT = initTextFeld( 690, 10, 100, 20, uiFactory, TextFeld::Style::Text, "Score: 0" ); beenden = initKnopf( 690, 40, 100, 20, uiFactory, Knopf::Style::Sichtbar, "Beenden" ); map = new Map( klient ); verloren = new MenüVerloren( uiFactory ); beendet = 0; timePuffer = 0; } // Destruktor MenüSpiel::~MenüSpiel() { scoreT->release(); beenden->release(); map->release(); verloren->release(); } // nicht constant void MenüSpiel::reset() { timePuffer = 0; Text optionen = "Width="; InitDatei *opd = new InitDatei( "data/Minigames/Asteroids/data/optionen.ini" ); if( !opd->laden() ) DateiPfadErstellen( "data/Minigames/Asteroids/data/optionen.ini" ); if( opd->wertExistiert( "Breite" ) ) optionen += (int)*opd->zWert( "Breite" ); else { opd->addWert( "Breite", "1600" ); optionen += "1600"; } optionen += ",Height="; if( opd->wertExistiert( "Höhe" ) ) optionen += (int)*opd->zWert( "Höhe" ); else { opd->addWert( "Höhe", "1000" ); optionen += "1000"; } optionen += ",Size="; if( opd->wertExistiert( "Größe" ) ) optionen += (int)*opd->zWert( "Größe" ); else { opd->addWert( "Größe", "1000" ); optionen += 1000; } optionen += ",Timer="; if( opd->wertExistiert( "Timer" ) ) optionen += (int)*opd->zWert( "Timer" ); else { opd->addWert( "Timer", "5000" ); optionen += 5000; } optionen += ",Ship="; if( opd->wertExistiert( "Ship" ) ) optionen += (int)*opd->zWert( "Ship" ); else { opd->addWert( "Ship", "0" ); optionen += 0; } optionen += ",Fortsetzen="; if( opd->wertExistiert( "Fortsetzen" ) ) optionen += (int)*opd->zWert( "Fortsetzen" ) != 0; else { opd->addWert( "Fortsetzen", "0" ); optionen += 0; } optionen += ",AutoKam="; if( opd->wertExistiert( "AutoKam" ) ) optionen += (int)*opd->zWert( "AutoKam" ) != 0; else { opd->addWert( "AutoKam", "0" ); optionen += 0; } opd->speichern(); opd->release(); map->reset( &optionen ); beendet = 0; scoreT->setText( "Score: " ); scoreT->zText()->append( map->getScore() ); } void MenüSpiel::doPublicMausEreignis( MausEreignis &me ) { bool vera = me.verarbeitet; beenden->doPublicMausEreignis( me ); if( !vera && me.verarbeitet && me.id == ME_RLinks ) { map->speichern(); beendet = 1; } map->doPublicMausEreignis( me ); if( map->istBeendet() ) { int ak = verloren->doPublicMausEreignis( me ); if( ak == 1 ) reset(); if( ak == 2 ) beendet = 1; } } void MenüSpiel::doTastaturEreignis( TastaturEreignis &te ) { if( map->istBeendet() ) { if( te.id == TE_Release && te.taste == T_Enter ) reset(); if( te.id == TE_Release && te.taste == T_BackSpace ) beendet = 1; return; } map->doTastaturEreignis( te ); } bool MenüSpiel::tick( double tickVal ) { timePuffer += tickVal; bool ret = beenden->tick( tickVal ); while( timePuffer >= 0.02 ) { ret |= map->tick( 0.02 ); timePuffer -= 0.02; } if( map->istBeendet() ) ret |= verloren->tick( tickVal ); scoreT->setText( "Score: " ); scoreT->zText()->append( map->getScore() ); return ret; } void MenüSpiel::render( Bild &zRObj ) { map->render( zRObj ); scoreT->render( zRObj ); beenden->render( zRObj ); if( map->istBeendet() ) verloren->render( zRObj ); } // constant bool MenüSpiel::istBeendet() const { return beendet; } // Inhalt der MenüWiederhohlung Klasse // Konstruktor MenüWiederhohlung::MenüWiederhohlung( UIInit &uiFactory, Datei *datei, Text *zOptionen ) : ReferenceCounter() { scoreT = initTextFeld( 690, 10, 100, 20, uiFactory, TextFeld::Style::Text, "Score: 0" ); beenden = initKnopf( 690, 40, 100, 20, uiFactory, Knopf::Style::Sichtbar, "Beenden" ); this->datei = datei; if( !datei->istOffen() ) datei->open( Datei::Style::lesen ); __int64 seed; datei->lese( (char *)&seed, 8 ); zOptionen->append( ",Fortsetzen=0,AutoKam=0,Seed=" ); zOptionen->append( seed ); map = new Map( 0 ); map->reset( zOptionen ); beendet = 0; nowTime = 0; nextTime = 0; tastenStände = 0; datei->lese( (char *)&nextTime, 8 ); timePuffer = 0; } // Destruktor MenüWiederhohlung::~MenüWiederhohlung() { scoreT->release(); beenden->release(); map->release(); datei->close(); datei->release(); } // nicht constant void MenüWiederhohlung::doPublicMausEreignis( MausEreignis &me ) { bool vera = me.verarbeitet; beenden->doPublicMausEreignis( me ); if( !vera && me.verarbeitet && me.id == ME_RLinks ) beendet = 1; if( map->istBeendet() ) beendet = 1; } void MenüWiederhohlung::doTastaturEreignis( TastaturEreignis &te ) {} bool MenüWiederhohlung::tick( double tickVal ) { bool ret = beenden->tick( tickVal ); // TODO Replay Activity while( nextTime >= 0 && nowTime + tickVal >= nextTime ) { while( nowTime < nextTime ) { ret |= map->tick( 0.02 ); tickVal -= 0.02; nowTime += 0.02; } char aktion; datei->lese( &aktion, 1 ); if( datei->istEnde() ) nextTime = -1; else datei->lese( (char *)&nextTime, 8 ); TastaturEreignis te; te.verarbeitet = 0; if( ( aktion | 16 ) == aktion ) { te.id = TE_Press; te.taste = T_Space; } else if( aktion != tastenStände ) { if( ( aktion & ~1 ) == ( tastenStände & ~1 ) ) { te.taste = T_Oben; te.id = ( ( aktion | 1 ) == aktion ) ? TE_Press : TE_Release; } if( ( aktion & ~2 ) == ( tastenStände & ~2 ) ) { te.taste = T_Rechts; te.id = ( ( aktion | 2 ) == aktion ) ? TE_Press : TE_Release; } if( ( aktion & ~4 ) == ( tastenStände & ~4 ) ) { te.taste = T_Links; te.id = ( ( aktion | 4 ) == aktion ) ? TE_Press : TE_Release; } if( ( aktion & ~8 ) == ( tastenStände & ~8 ) ) { te.taste = T_Space; te.id = ( ( aktion | 8 ) == aktion ) ? TE_Press : TE_Release; } tastenStände = aktion; } map->doTastaturEreignis( te ); } timePuffer += tickVal; while( timePuffer > 0 ) { ret |= map->tick( 0.02 ); nowTime += 0.02; timePuffer -= 0.02; } scoreT->setText( "Score: " ); scoreT->zText()->append( map->getScore() ); return ret; } void MenüWiederhohlung::render( Bild &zRObj ) { map->render( zRObj ); scoreT->render( zRObj ); beenden->render( zRObj ); } // constant bool MenüWiederhohlung::istBeendet() const { return beendet; } // Inhalt der MenüStatistik Klasse aus Menü.h // Konstruktor MenüStatistik::MenüStatistik( UIInit &uiFactory, KSGClient::MinigameServerClient *klient ) { this->klient = klient; wiederH = 0; ansichtT = initTextFeld( 245, 10, 50, 20, uiFactory, TextFeld::Style::Text | TextFeld::Style::VCenter, "Ansicht:" ); ansicht = initAuswahlBox( 295, 10, 120, 20, uiFactory, AuswahlBox::Style::Normal | AuswahlBox::Style::Hintergrund, { "Tabelle", "Diagramm" } ); optionen = initKontrollKnopf( 425, 10, 130, 20, uiFactory, KontrollKnopf::Style::Normal, "Optionen beachten" ); worldBestT = initObjTabelle( 115, 40, 570, 120, uiFactory, ObjTabelle::Style::normal | ObjTabelle::Style::VScroll, { { "Score", 60, 0, 0 }, { "Spieler", 100, 0, 0 }, {"Ansehen", 55, 0, 0 }, { "Breite", 60, 0, 0 }, { "Höhe", 60, 0, 0 }, { "Größe", 70, 0, 0 }, { "Timer", 70, 0, 0 }, { "Ship", 70, 0, 0 } }, 20 ); gesammtT = initObjTabelle( 115, 170, 570, 290, uiFactory, ObjTabelle::Style::normal | ObjTabelle::Style::VScroll, { { "Score", 70, 0, 0 }, { "Datum", 145, 0, 0 }, { "Breite", 60, 0, 0 }, { "Höhe", 60, 0, 0 }, { "Größe", 70, 0, 0 }, { "Timer", 70, 0, 0 }, { "Ship", 70, 0, 0 } }, 20 ); optionenT = initObjTabelle( 115, 170, 570, 290, uiFactory, ObjTabelle::Style::normal | ObjTabelle::Style::VScroll, { { "Score", 70, 0, 0 }, { "Datum", 145, 0, 0 }, { "Breite", 60, 0, 0 }, { "Höhe", 60, 0, 0 }, { "Größe", 70, 0, 0 }, { "Timer", 70, 0, 0 }, { "Ship", 70, 0, 0 } }, 20 ); gesammtD = initLinienDiagramm( 100, 170, 600, 290, uiFactory, LDiag::Style::DatenRahmen, 0 ); optionenD = initLinienDiagramm( 100, 170, 600, 290, uiFactory, LDiag::Style::DatenRahmen, 0 ); remove = initKnopf( 10, 470, 100, 20, uiFactory, Knopf::Style::Sichtbar, "Zurücksetzen" ); zurück = initKnopf( 350, 470, 100, 20, uiFactory, Knopf::Style::Sichtbar, "Zurück" ); this->uiFactory = uiFactory; tr = new TextRenderer( dynamic_cast( uiFactory.initParam.schrift->getThis() ) ); asyncFinished = 1; } // Destruktor MenüStatistik::~MenüStatistik() { while( !asyncFinished ) Sleep( 100 ); tr->release(); worldBestT->release(); ansichtT->release(); ansicht->release(); optionen->release(); gesammtT->release(); optionenT->release(); gesammtD->release(); optionenD->release(); remove->release(); zurück->release(); klient->release(); if( wiederH ) wiederH->release(); } // nicht constant void MenüStatistik::reset() { if( wiederH ) wiederH = (MenüWiederhohlung *)wiederH->release(); ObjTabelle *tmpWBT = dynamic_cast( worldBestT->getThis() ); KSGClient::MinigameServerClient *tmpKlient = dynamic_cast( klient->getThis() ); asyncFinished = 0; new AsynchronCall( [this, tmpWBT, tmpKlient]() { Array< int > score; RCArray< Text > player; RCArray< Text > option; int anz = tmpKlient->getMinigameBestscoreList( "Asteroids", &score, &player, &option ); for( int i = 0; i < anz; i++ ) { TextFeld *scoreT = initTextFeld( 0, 0, 0, 0, uiFactory, TextFeld::Style::Text | TextFeld::Style::VCenter, Text( score.get( i ) ) ); TextFeld *spielerT = initTextFeld( 0, 0, 0, 0, uiFactory, TextFeld::Style::Text | TextFeld::Style::VCenter, player.z( i )->getText() ); Text optionen = option.z( i )->getText(); Text *breite = optionen.getTeilText( optionen.positionVon( '=' ) + 1, optionen.positionVon( ',' ) ); Text *höhe = optionen.getTeilText( optionen.positionVon( '=', 1 ) + 1, optionen.positionVon( ',', 1 ) ); Text *größe = optionen.getTeilText( optionen.positionVon( '=', 2 ) + 1, optionen.positionVon( ',', 2 ) ); Text *timer = optionen.getTeilText( optionen.positionVon( '=', 3 ) + 1, optionen.positionVon( ',', 3 ) ); Text *ship = optionen.getTeilText( optionen.positionVon( '=', 4 ) + 1 ); switch( (int)*ship ) { case 0: ship->setText( "Normal" ); break; case 1: ship->setText( "Enterprise" ); break; } TextFeld *breiteT = initTextFeld( 0, 0, 0, 0, uiFactory, TextFeld::Style::Text | TextFeld::Style::VCenter, breite->getText() ); breite->release(); TextFeld *höheT = initTextFeld( 0, 0, 0, 0, uiFactory, TextFeld::Style::Text | TextFeld::Style::VCenter, höhe->getText() ); höhe->release(); TextFeld *größeT = initTextFeld( 0, 0, 0, 0, uiFactory, TextFeld::Style::Text | TextFeld::Style::VCenter, größe->getText() ); größe->release(); TextFeld *timerT = initTextFeld( 0, 0, 0, 0, uiFactory, TextFeld::Style::Text | TextFeld::Style::VCenter, timer->getText() ); timer->release(); TextFeld *shipT = initTextFeld( 0, 0, 0, 0, uiFactory, TextFeld::Style::Text | TextFeld::Style::VCenter, ship->getText() ); ship->release(); Knopf *ansehenK = initKnopf( 0, 0, 0, 0, uiFactory, Knopf::Style::Normal, "Ansehen" ); ansehenK->setMausEreignis( [this, optionen]( void *p, void *obj, MausEreignis me ) -> bool { if( me.id == ME_RLinks && !me.verarbeitet ) { ( (Knopf *)obj )->removeStyle( Knopf::Style::Erlaubt ); getThis(); new AsynchronCall( [this, optionen, obj]() { Datei *d = klient->downloadGameCapture( "Asteroids", optionen ); ( (Knopf *)obj )->addStyle( Knopf::Style::Erlaubt ); if( wiederH ) wiederH = (MenüWiederhohlung *)wiederH->release(); Text options = optionen.getText(); wiederH = new MenüWiederhohlung( uiFactory, d, &options ); release(); } ); } return 1; } ); tmpWBT->addZeile( optionen.getText() ); tmpWBT->setZeichnungZ( 0, i + 1, scoreT ); tmpWBT->setZeichnungZ( 1, i + 1, spielerT ); tmpWBT->setZeichnungZ( 2, i + 1, ansehenK ); tmpWBT->setZeichnungZ( 3, i + 1, breiteT ); tmpWBT->setZeichnungZ( 4, i + 1, höheT ); tmpWBT->setZeichnungZ( 5, i + 1, größeT ); tmpWBT->setZeichnungZ( 6, i + 1, timerT ); tmpWBT->setZeichnungZ( 7, i + 1, shipT ); } tmpKlient->release(); tmpWBT->release(); }, &asyncFinished ); InitDatei *opd = new InitDatei( "data/Minigames/Asteroids/data/optionen.ini" ); opd->laden(); if( !opd->wertExistiert( "Breite" ) ) opd->addWert( "Breite", "1600" ); if( !opd->wertExistiert( "Höhe" ) ) opd->addWert( "Höhe", "1000" ); if( !opd->wertExistiert( "Größe" ) ) opd->addWert( "Größe", "1000" ); if( !opd->wertExistiert( "Timer" ) ) opd->addWert( "Timer", "5000" ); if( !opd->wertExistiert( "Ship" ) ) opd->addWert( "Ship", "0" ); if( !opd->wertExistiert( "Fortsetzen" ) ) opd->addWert( "Fortsetzen", "0" ); if( !opd->wertExistiert( "AutoKam" ) ) opd->addWert( "AutoKam", "0" ); opd->speichern(); KSGTDatei *stb = new KSGTDatei( "data/Minigames/Asteroids/data/score.ksgt" ); stb->laden(); int anz = stb->getZeilenAnzahl(); bool *fertig = new bool[ anz ]; ZeroMemory( fertig, anz ); int mS = 0; int omS = 0; int oAnz = 0; for( int i = 0; i < anz; i++ ) { int maxScore = -1; int p = -1; for( int j = 0; j < anz; j++ ) { if( !fertig[ j ] && maxScore < (int)*stb->zFeld( j, 1 ) ) { p = j; maxScore = (int)*stb->zFeld( j, 1 ); } } if( p >= 0 ) { fertig[ p ] = 1; TextFeld *scoreT = initTextFeld( 0, 0, 0, 0, uiFactory, TextFeld::Style::Text | TextFeld::Style::VCenter, stb->zFeld( p, 1 )->getText() ); TextFeld *datumT = initTextFeld( 0, 0, 0, 0, uiFactory, TextFeld::Style::Text | TextFeld::Style::VCenter, stb->zFeld( p, 0 )->getText() ); TextFeld *breiteT = initTextFeld( 0, 0, 0, 0, uiFactory, TextFeld::Style::Text | TextFeld::Style::VCenter, stb->zFeld( p, 2 )->getText() ); TextFeld *höheT = initTextFeld( 0, 0, 0, 0, uiFactory, TextFeld::Style::Text | TextFeld::Style::VCenter, stb->zFeld( p, 3 )->getText() ); TextFeld *größeT = initTextFeld( 0, 0, 0, 0, uiFactory, TextFeld::Style::Text | TextFeld::Style::VCenter, stb->zFeld( p, 5 )->getText() ); TextFeld *timerT = initTextFeld( 0, 0, 0, 0, uiFactory, TextFeld::Style::Text | TextFeld::Style::VCenter, stb->zFeld( p, 4 )->getText() ); TextFeld *shipT = initTextFeld( 0, 0, 0, 0, uiFactory, TextFeld::Style::Text | TextFeld::Style::VCenter, stb->zFeld( p, 6 )->getText() ); int ship = *stb->zFeld( p, 6 ); switch( ship ) { case 0: shipT->setText( "Normal" ); break; case 1: shipT->setText( "Enterprise" ); break; } gesammtT->addZeile( Text() += p ); gesammtT->setZeichnungZ( 0, i + 1, scoreT ); gesammtT->setZeichnungZ( 1, i + 1, datumT ); gesammtT->setZeichnungZ( 2, i + 1, breiteT ); gesammtT->setZeichnungZ( 3, i + 1, höheT ); gesammtT->setZeichnungZ( 4, i + 1, größeT ); gesammtT->setZeichnungZ( 5, i + 1, timerT ); gesammtT->setZeichnungZ( 6, i + 1, shipT ); if( breiteT->zText()->istGleich( opd->zWert( "Breite" )->getText() ) && höheT->zText()->istGleich( opd->zWert( "Höhe" )->getText() ) && größeT->zText()->istGleich( opd->zWert( "Größe" )->getText() ) && timerT->zText()->istGleich( opd->zWert( "Timer" )->getText() ) && stb->zFeld( p, 6 )->istGleich( opd->zWert( "Ship" )->getText() ) ) { optionenT->addZeile( Text() += p ); int n = optionenT->getZeilenNummer( Text() += p ); optionenT->setZeichnungZ( 0, n, dynamic_cast( scoreT->getThis() ) ); optionenT->setZeichnungZ( 1, n, dynamic_cast( datumT->getThis() ) ); optionenT->setZeichnungZ( 2, n, dynamic_cast( breiteT->getThis() ) ); optionenT->setZeichnungZ( 3, n, dynamic_cast( höheT->getThis() ) ); optionenT->setZeichnungZ( 4, n, dynamic_cast( größeT->getThis() ) ); optionenT->setZeichnungZ( 5, n, dynamic_cast( timerT->getThis() ) ); optionenT->setZeichnungZ( 6, n, dynamic_cast( shipT->getThis() ) ); if( !omS ) omS = maxScore; oAnz++; } } if( !mS ) mS = maxScore; } delete[] fertig; DiagDaten *gd = new DiagDaten(); gd->style = DiagDaten::Style::autoIntervall | DiagDaten::Style::autoRaster | DiagDaten::Style::intervalle | DiagDaten::Style::intervallTexte | DiagDaten::Style::Sichtbar; gd->hIntervallFarbe = 0xFFFFFFFF; gd->hIntervallName->setText( "Spiel" ); gd->rasterDicke = 1; gd->rasterFarbe = 0xFF505050; gd->vIntervallFarbe = 0xFFFFFFFF; gd->vIntervallName->setText( "Score" ); gesammtD->setDiagDatenZ( gd ); gesammtD->addVIntervallText( mS + 1, Text() += ( mS + 1 ) ); gesammtD->addVIntervallText( 0, "0" ); gesammtD->addHIntervallText( 0, "1" ); if( anz > 1 ) gesammtD->addHIntervallText( anz - 1, Text() += anz ); gesammtD->addWert( "Score" ); gesammtD->setWertStyle( 0, DiagWert::Style::Sichtbar | DiagWert::Style::Hintergrund ); gesammtD->setWertFarbe( 0, 0xFF00FF00 ); gesammtD->zDiagWert( 0 )->hintergrund = 0xFF205050; DiagDaten *od = new DiagDaten(); od->style = DiagDaten::Style::autoIntervall | DiagDaten::Style::autoRaster | DiagDaten::Style::intervalle | DiagDaten::Style::intervallTexte | DiagDaten::Style::Sichtbar; od->hIntervallFarbe = 0xFFFFFFFF; od->hIntervallName->setText( "Spiel" ); od->rasterDicke = 1; od->rasterFarbe = 0xFF505050; od->vIntervallFarbe = 0xFFFFFFFF; od->vIntervallName->setText( "Score" ); optionenD->setDiagDatenZ( od ); optionenD->addVIntervallText( omS + 1, Text() += ( omS + 1 ) ); optionenD->addVIntervallText( 0, "0" ); optionenD->addHIntervallText( 0, "1" ); if( oAnz > 1 ) optionenD->addHIntervallText( oAnz - 1, Text() += oAnz ); optionenD->addWert( "Score" ); optionenD->setWertStyle( 0, DiagWert::Style::Sichtbar | DiagWert::Style::Hintergrund ); optionenD->setWertFarbe( 0, 0xFF00FF00 ); optionenD->zDiagWert( 0 )->hintergrund = 0xFF205050; int j = 0; for( int i = 0; i < anz; i++ ) { gesammtD->addPunkt( 0, i, (int)*stb->zFeld( i, 1 ) ); if( (int)*stb->zFeld( i, 2 ) == (int)*opd->zWert( "Breite" ) && (int)*stb->zFeld( i, 3 ) == (int)*opd->zWert( "Höhe" ) && (int)*stb->zFeld( i, 5 ) == (int)*opd->zWert( "Größe" ) && (int)*stb->zFeld( i, 4 ) == (int)*opd->zWert( "Timer" ) && (int)*stb->zFeld( i, 6 ) == (int)*opd->zWert( "Ship" ) ) { optionenD->addPunkt( 0, j, (int)*stb->zFeld( i, 1 ) ); j++; } } stb->release(); opd->release(); beendet = 0; } void MenüStatistik::doPublicMausEreignis( MausEreignis &me ) { if( wiederH ) { wiederH->doPublicMausEreignis( me ); return; } ansicht->doPublicMausEreignis( me ); optionen->doPublicMausEreignis( me ); gesammtT->doPublicMausEreignis( me ); optionenT->doPublicMausEreignis( me ); worldBestT->doPublicMausEreignis( me ); bool vera = me.verarbeitet; remove->doPublicMausEreignis( me ); if( !vera && me.verarbeitet && me.id == ME_RLinks ) { // Statistik remove if( optionen->hatStyle( KontrollKnopf::Style::Selected ) ) { // nur bestimmte Statistik remove InitDatei *opd = new InitDatei( "data/Minigames/Asteroids/data/optionen.ini" ); opd->laden(); KSGTDatei *score = new KSGTDatei( "data/Minigames/Asteroids/data/score.ksgt" ); score->laden(); int zeilen = score->getZeilenAnzahl(); for( int i = 0; i < zeilen; i++ ) { if( (int)*score->zFeld( i, 2 ) == (int)*opd->zWert( "Breite" ) && (int)*score->zFeld( i, 3 ) == (int)*opd->zWert( "Höhe" ) && (int)*score->zFeld( i, 5 ) == (int)*opd->zWert( "Größe" ) && (int)*score->zFeld( i, 4 ) == (int)*opd->zWert( "Timer" ) && (int)*score->zFeld( i, 6 ) == (int)*opd->zWert( "Ship" ) ) { score->removeZeile( i ); i--; zeilen--; } } score->speichern(); score->release(); opd->release(); } else // alles remove DateiRemove( "data/Minigames/Asteroids/data/score.ksgt" ); reset(); } vera = me.verarbeitet; zurück->doPublicMausEreignis( me ); if( !vera && me.verarbeitet && me.id == ME_RLinks ) beendet = 1; } bool MenüStatistik::tick( double tickVal ) { if( wiederH ) { bool ret = wiederH->tick( tickVal ); if( wiederH->istBeendet() ) wiederH = (MenüWiederhohlung *)wiederH->release(); return ret; } bool ret = ansicht->tick( tickVal ); ret |= optionen->tick( tickVal ); ret |= remove->tick( tickVal ); ret |= zurück->tick( tickVal ); ret |= gesammtT->tick( tickVal ); ret |= optionenT->tick( tickVal ); ret |= gesammtD->tick( tickVal ); ret |= optionenD->tick( tickVal ); ret |= worldBestT->tick( tickVal ); return ret; } void MenüStatistik::render( Bild &zRObj ) { if( wiederH ) { wiederH->render( zRObj ); return; } tr->setSchriftSize( 12 ); Text weltScore = "Welt Score:"; tr->renderText( 10, 40, weltScore, zRObj, 0xFFFFFFFF ); Text localScore = "Dein Score:"; tr->renderText( 10, 170, localScore, zRObj, 0xFFFFFFFF ); worldBestT->render( zRObj ); if( !ansicht->getAuswahl() ) { if( optionen->hatStyle( KontrollKnopf::Style::Selected ) ) optionenT->render( zRObj ); else gesammtT->render( zRObj ); } else { if( optionen->hatStyle( KontrollKnopf::Style::Selected ) ) optionenD->render( zRObj ); else gesammtD->render( zRObj ); } ansichtT->render( zRObj ); ansicht->render( zRObj ); optionen->render( zRObj ); remove->render( zRObj ); zurück->render( zRObj ); } // constant bool MenüStatistik::istBeendet() const { return beendet; } bool MenüStatistik::istWiederhohlung() const { return wiederH != 0; } // Inhalt der MenüOptionen aus Menü.h // Konstruktor MenüOptionen::MenüOptionen( UIInit &uiFactory ) : ReferenceCounter() { breiteT = initTextFeld( 310, 120, 130, 20, uiFactory, TextFeld::Style::Text | TextFeld::Style::VCenter, "Spielfeld Breite:" ); breite = initTextFeld( 440, 120, 50, 20, uiFactory, TextFeld::Style::TextFeld, "" ); breite->setTastaturEreignis( _nurNummernTE ); höheT = initTextFeld( 310, 160, 130, 20, uiFactory, TextFeld::Style::Text | TextFeld::Style::VCenter, "Spielfeld Höhe:" ); höhe = initTextFeld( 440, 160, 50, 20, uiFactory, TextFeld::Style::TextFeld, "" ); höhe->setTastaturEreignis( _nurNummernTE ); aGrößeT = initTextFeld( 310, 200, 130, 20, uiFactory, TextFeld::Style::Text | TextFeld::Style::VCenter, "Asteroiden Größe:" ); aGröße = initTextFeld( 440, 200, 50, 20, uiFactory, TextFeld::Style::TextFeld, "" ); aGröße->setTastaturEreignis( _nurNummernTE ); timerT = initTextFeld( 310, 240, 130, 20, uiFactory, TextFeld::Style::Text | TextFeld::Style::VCenter, "Zeit Abstände:" ); timer = initTextFeld( 440, 240, 50, 20, uiFactory, TextFeld::Style::TextFeld, "" ); timer->setTastaturEreignis( _nurNummernTE ); shipT = initTextFeld( 310, 280, 80, 20, uiFactory, TextFeld::Style::Text | TextFeld::Style::VCenter, "Raumschiff:" ); ship = initAuswahlBox( 390, 280, 100, 20, uiFactory, AuswahlBox::Style::Normal | AuswahlBox::Style::Hintergrund, { "Normal", "Enterprise" } ); autoKam = initKontrollKnopf( 310, 320, 180, 25, uiFactory, KontrollKnopf::Style::Normal, "Kamera drehen" ); fortsetzen = initKontrollKnopf( 310, 360, 180, 25, uiFactory, KontrollKnopf::Style::Normal, "Letztes Spiel fortsetzen" ); abbrechen = initKnopf( 310, 400, 85, 20, uiFactory, Knopf::Style::Sichtbar, "Abbrechen" ); ok = initKnopf( 405, 400, 85, 20, uiFactory, Knopf::Style::Sichtbar, "Ok" ); beendet = 0; } // Destruktor MenüOptionen::~MenüOptionen() { breiteT->release(); breite->release(); höheT->release(); höhe->release(); aGrößeT->release(); aGröße->release(); timerT->release(); timer->release(); shipT->release(); ship->release(); autoKam->release(); fortsetzen->release(); abbrechen->release(); ok->release(); } // nicht constant void MenüOptionen::reset() { InitDatei *opd = new InitDatei( "data/Minigames/Asteroids/data/optionen.ini" ); if( !opd->laden() ) DateiPfadErstellen( "data/Minigames/Asteroids/data/optionen.ini" ); breite->setText( "1600" ); if( opd->wertExistiert( "Breite" ) ) breite->setText( Text() += (int)*opd->zWert( "Breite" ) ); else opd->addWert( "Breite", "1600" ); höhe->setText( "1000" ); if( opd->wertExistiert( "Höhe" ) ) höhe->setText( Text() += (int)*opd->zWert( "Höhe" ) ); else opd->addWert( "Höhe", "1000" ); aGröße->setText( "1000" ); if( opd->wertExistiert( "Größe" ) ) aGröße->setText( Text() += (int)*opd->zWert( "Größe" ) ); else opd->addWert( "Größe", "1000" ); timer->setText( "5000" ); if( opd->wertExistiert( "Timer" ) ) timer->setText( Text() += (int)*opd->zWert( "Timer" ) ); else opd->addWert( "Timer", "5000" ); ship->setAuswahl( 0 ); if( opd->wertExistiert( "Ship" ) ) ship->setAuswahl( *opd->zWert( "Ship" ) ); else opd->addWert( "Ship", "0" ); autoKam->removeStyle( KontrollKnopf::Style::Selected ); if( opd->wertExistiert( "AutoKam" ) ) autoKam->setStyle( KontrollKnopf::Style::Selected, (int)*opd->zWert( "AutoKam" ) != 0 ); else opd->addWert( "AutoKam", "0" ); fortsetzen->removeStyle( KontrollKnopf::Style::Selected ); if( opd->wertExistiert( "Fortsetzen" ) ) fortsetzen->setStyle( KontrollKnopf::Style::Selected, (int)*opd->zWert( "Fortsetzen" ) != 0 ); else opd->addWert( "Fortsetzen", "0" ); beendet = 0; opd->speichern(); opd->release(); } void MenüOptionen::doPublicMausEreignis( MausEreignis &me ) { breite->doPublicMausEreignis( me ); höhe->doPublicMausEreignis( me ); aGröße->doPublicMausEreignis( me ); timer->doPublicMausEreignis( me ); ship->doPublicMausEreignis( me ); autoKam->doPublicMausEreignis( me ); fortsetzen->doPublicMausEreignis( me ); bool vera = me.verarbeitet; abbrechen->doPublicMausEreignis( me ); if( !vera && me.verarbeitet && me.id == ME_RLinks ) beendet = 1; vera = me.verarbeitet; ok->doPublicMausEreignis( me ); if( !vera && me.verarbeitet && me.id == ME_RLinks ) { InitDatei *opd = new InitDatei( "data/Minigames/Asteroids/data/optionen.ini" ); if( !opd->laden() ) DateiPfadErstellen( "data/Minigames/Asteroids/data/optionen.ini" ); if( (int)*breite->zText() > 10000 ) breite->setText( "10000" ); if( (int)*breite->zText() < 800 ) breite->setText( "800" ); if( opd->wertExistiert( "Breite" ) ) opd->setWert( "Breite", Text() += (int)*breite->zText() ); else opd->addWert( "Breite", Text() += (int)*breite->zText() ); if( (int)*höhe->zText() > 10000 ) höhe->setText( "10000" ); if( (int)*höhe->zText() < 500 ) höhe->setText( "500" ); if( opd->wertExistiert( "Höhe" ) ) opd->setWert( "Höhe", Text() += (int)*höhe->zText() ); else opd->addWert( "Höhe", Text() += (int)*höhe->zText() ); if( (int)*aGröße->zText() > 10000 ) aGröße->setText( "10000" ); if( (int)*aGröße->zText() < 10 ) aGröße->setText( "10" ); if( opd->wertExistiert( "Größe" ) ) opd->setWert( "Größe", Text() += (int)*aGröße->zText() ); else opd->addWert( "Größe", Text() += (int)*aGröße->zText() ); if( (int)*timer->zText() < 500 ) timer->setText( "500" ); if( opd->wertExistiert( "Timer" ) ) opd->setWert( "Timer", Text() += (int)*timer->zText() ); else opd->addWert( "Timer", Text() += (int)*timer->zText() ); if( opd->wertExistiert( "Ship" ) ) opd->setWert( "Ship", Text() += ship->getAuswahl() ); else opd->addWert( "Ship", Text() += ship->getAuswahl() ); if( opd->wertExistiert( "AutoKam" ) ) opd->setWert( "AutoKam", Text() += (int)autoKam->hatStyle( KontrollKnopf::Style::Selected ) ); else opd->addWert( "AutoKam", Text() += (int)autoKam->hatStyle( KontrollKnopf::Style::Selected ) ); if( opd->wertExistiert( "Fortsetzen" ) ) opd->setWert( "Fortsetzen", Text() += (int)fortsetzen->hatStyle( KontrollKnopf::Style::Selected ) ); else opd->addWert( "Fortsetzen", Text() += (int)fortsetzen->hatStyle( KontrollKnopf::Style::Selected ) ); opd->speichern(); opd->release(); beendet = 1; } } void MenüOptionen::doTastaturEreignis( TastaturEreignis &te ) { breite->doTastaturEreignis( te ); höhe->doTastaturEreignis( te ); aGröße->doTastaturEreignis( te ); timer->doTastaturEreignis( te ); } bool MenüOptionen::tick( double tickVal ) { bool ret = breite->tick( tickVal ); ret |= höhe->tick( tickVal ); ret |= aGröße->tick( tickVal ); ret |= timer->tick( tickVal ); ret |= ship->tick( tickVal ); ret |= autoKam->tick( tickVal ); ret |= fortsetzen->tick( tickVal ); ret |= abbrechen->tick( tickVal ); ret |= ok->tick( tickVal ); return ret; } void MenüOptionen::render( Bild &zRObj ) { breiteT->render( zRObj ); breite->render( zRObj ); höheT->render( zRObj ); höhe->render( zRObj ); aGrößeT->render( zRObj ); aGröße->render( zRObj ); timerT->render( zRObj ); timer->render( zRObj ); shipT->render( zRObj ); autoKam->render( zRObj ); fortsetzen->render( zRObj ); abbrechen->render( zRObj ); ok->render( zRObj ); ship->render( zRObj ); } // constant bool MenüOptionen::istBeendet() const { return beendet; } // Inhalt der Menü Klasse aus Menü.h // Konstruktor Menü::Menü( UIInit &uiFactory, KSGClient::MinigameServerClient *klient ) : ReferenceCounter() { spielen = initKnopf( 350, 180, 100, 20, uiFactory, Knopf::Style::Sichtbar, "Spielen" ); spielenF = new MenüSpiel( uiFactory, dynamic_cast( klient->getThis() ) ); optionen = initKnopf( 350, 220, 100, 20, uiFactory, Knopf::Style::Sichtbar, "Optionen" ); optionenF = new MenüOptionen( uiFactory ); statistik = initKnopf( 350, 260, 100, 20, uiFactory, Knopf::Style::Sichtbar, "Statistik" ); statistikF = new MenüStatistik( uiFactory, klient ); beenden = initKnopf( 350, 300, 100, 20, uiFactory, Knopf::Style::Sichtbar, "Beenden" ); ram = new LRahmen(); ram->setFarbe( 0xFFFFFFFF ); beendet = 0; status = 0; LTDBDatei *bgd = new LTDBDatei(); bgd->setDatei( new Text( "data/Minigames/Asteroids/bilder/hintergrund.ltdb" ) ); bgd->leseDaten( 0 ); hintergrund = bgd->laden( 0, new Text( "bg.jpg" ) ); bgd->release(); } // Destruktor Menü::~Menü() { spielen->release(); spielenF->release(); optionen->release(); optionenF->release(); statistik->release(); statistikF->release(); beenden->release(); if( hintergrund ) hintergrund->release(); ram->release(); } // nicht constant void Menü::reset() { status = 0; beendet = 0; } void Menü::doPublicMausEreignis( MausEreignis &me ) { switch( status ) { case 0: if( 1 ) { bool vera = me.verarbeitet; spielen->doPublicMausEreignis( me ); if( !vera && me.verarbeitet && me.id == ME_RLinks ) { spielenF->reset(); status = 3; } vera = me.verarbeitet; optionen->doPublicMausEreignis( me ); if( !vera && me.verarbeitet && me.id == ME_RLinks ) { optionenF->reset(); status = 1; } vera = me.verarbeitet; statistik->doPublicMausEreignis( me ); if( !vera && me.verarbeitet && me.id == ME_RLinks ) { statistikF->reset(); status = 2; } vera = me.verarbeitet; beenden->doPublicMausEreignis( me ); if( !vera && me.verarbeitet && me.id == ME_RLinks ) beendet = 1; } break; case 1: optionenF->doPublicMausEreignis( me ); break; case 2: statistikF->doPublicMausEreignis( me ); break; case 3: spielenF->doPublicMausEreignis( me ); } } void Menü::doTastaturEreignis( TastaturEreignis &te ) { if( status == 1 ) optionenF->doTastaturEreignis( te ); if( status == 3 ) spielenF->doTastaturEreignis( te ); } bool Menü::tick( double z ) { switch( status ) { case 0: if( 1 ) { bool ret = spielen->tick( z ); ret |= statistik->tick( z ); ret |= optionen->tick( z ); ret |= beenden->tick( z ); return ret; } case 1: if( optionenF->istBeendet() ) { status = 0; return 1; } return optionenF->tick( z ); case 2: if( statistikF->istBeendet() ) { status = 0; return 1; } return statistikF->tick( z ); case 3: if( spielenF->istBeendet() ) { status = 0; return 1; } return spielenF->tick( z ); } return 0; } void Menü::render( Bild &zRObj ) { if( status != 3 && ( status != 2 || !statistikF->istWiederhohlung() ) ) zRObj.drawBild( 0, 0, hintergrund->getBreite(), hintergrund->getHeight(), *hintergrund ); switch( status ) { case 0: ram->setPosition( 300, 170 ); ram->setSize( 200, 160 ); zRObj.alphaRegion( ram->getX(), ram->getY(), ram->getBreite(), ram->getHeight(), 0xD0000000 ); ram->render( zRObj ); spielen->render( zRObj ); statistik->render( zRObj ); optionen->render( zRObj ); beenden->render( zRObj ); break; case 1: ram->setPosition( 300, 110 ); ram->setSize( 200, 320 ); zRObj.alphaRegion( ram->getX(), ram->getY(), ram->getBreite(), ram->getHeight(), 0xD0000000 ); ram->render( zRObj ); optionenF->render( zRObj ); break; case 2: if( !statistikF->istWiederhohlung() ) zRObj.alphaRegion( 0, 0, hintergrund->getBreite(), hintergrund->getHeight(), 0xD0000000 ); statistikF->render( zRObj ); break; case 3: spielenF->render( zRObj ); } } // constant bool Menü::istBeendet() const { return beendet; }