123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644 |
- #include "Spiel.h"
- #define TICK 0.03333333
- // Konstruktor
- Spiel::Spiel()
- {
- isRunning = 0;
- log = 0;
- spielerAnzahl = 0;
- zAccounts = 0;
- spielId = 0;
- karteId = 0;
- pause = 0;
- gameTicks = 0;
- ende = 1;
- stat = new Statistik();
- ref = 1;
- }
- // Destruktor
- Spiel::~Spiel()
- {
- stat->release();
- if( psqldb )
- psqldb->release();
- }
- // nicht constant
- void Spiel::setPSQLK( SSDatenbankV *psqldb )
- {
- if( this->psqldb )
- this->psqldb->release();
- this->psqldb = psqldb;
- stat->setPSQLDB( psqldb->getThis() );
- }
- // call 1
- void Spiel::setSpielId( int id )
- {
- spielId = id;
- stat->setSpielId( id );
- }
- // call 2
- void Spiel::setKarteId( int karteId )
- {
- this->karteId = karteId;
- stat->setKarteId( karteId );
- }
- // call 3
- void Spiel::setTempPfad( char *pfad )
- {
- mapPfad = pfad;
- mapPfad += "/";
- }
- // call 3.5
- void Spiel::setAccounts( int anzahl, Array< int > *zAccounts )
- {
- this->zAccounts = zAccounts->getThis();
- spielerAnzahl = anzahl;
- }
- // call 4
- void Spiel::setKlients( int anzahl, RCArray< SSKlientV > *zKlients )
- {
- this->zKlients = zKlients->getThis();
- }
- // call 5
- void Spiel::setSpielerNummern( int anzahl, Array< int > *spielerNummern )
- {
- MapReader *reader = new MapReader( karteId, psqldb->getThis(), mapPfad );
- reader->ladeKarte( this );
- reader->release();
- for( int i = 0; i < anzahl; i++ )
- {
- for( auto s = spieler.getIterator(); s; s++ )
- {
- if( s->getSpielerNummer() == spielerNummern->get( i ) )
- {
- s->setAccount( zAccounts->get( i ) );
- s->setKlient( new Klient( zKlients->get( i ) ) );
- break;
- }
- }
- }
- zAccounts = zAccounts->release();
- zKlients = zKlients->release();
- stat->setTeams( spielerAnzahl, &teams );
- stat->setSpieler( spielerAnzahl, &spieler );
- }
- // call 6
- void Spiel::run()
- {
- log = new Datei();
- Text *pfad = new Text( "../spiel log/" );
- pfad->append( spielId );
- pfad->append( "/verlauf.ksggl" );
- log->setDatei( pfad );
- log->remove();
- log->erstellen();
- log->open( Datei::Style::schreiben );
- time_t t;
- time( &t );
- srand( (unsigned int)t );
- log->schreibe( (char *)& spielerAnzahl, 4 );
- for( int i = 0; i < spielerAnzahl; i++ )
- {
- Spieler *tmp = spieler.z( i );
- if( tmp && tmp->zKlient() )
- {
- tmp->zKlient()->sendeInit( &spieler, -1 );
- log->schreibe( (char *)& i, 4 );
- int sNum = tmp->getSpielerNummer();
- log->schreibe( (char *)& sNum, 4 );
- tmp->zKlient()->sendeSpielerNummer( sNum, -1 );
- Text * name = psqldb->getAccountRufName( tmp->getAccountId() );
- char len = (char)( name ? name->getLength() : 0 );
- log->schreibe( &len, 1 );
- if( len )
- log->schreibe( name->getText(), len );
- if( name )
- name->release();
- }
- }
- __int64 randSeed = randG.getSeed();
- log->schreibe( (char *)& randSeed, 8 );
- Array< char > spielerStatus;
- ZeitMesser * zeit = new ZeitMesser();
- zeit->messungStart();
- isRunning = 1;
- ende = 0;
- double ausgleich = 0;
- double sZ = 0;
- gameTicks = -1;
- for( int i = 0; i < spielerAnzahl; i++ )
- {
- Spieler *tmp = spieler.z( i );
- if( tmp && tmp->zKlient() )
- tmp->zKlient()->sendeStart( gameTicks );
- }
- double rZeit = 0;
- while( !ende )
- {
- zeit->messungEnde();
- zeit->messungStart();
- double z = zeit->getSekunden();
- ausgleich += TICK - z;
- if( ausgleich > 0 )
- Sleep( (int)( ausgleich * 1000 ) );
- rZeit += z;
- while( sZ + TICK < rZeit && !ende )
- {
- c.lock();
- sZ += TICK;
- gameTicks++;
- char ch = 0;
- log->schreibe( &ch, 1 );
- tick( TICK );
- c.unlock();
- }
- }
- zeit->messungEnde();
- zeit->release();
- for( int i = 0; i < spielerAnzahl; i++ )
- {
- if( spieler.z( i ) && spieler.z( i )->zKlient() )
- {
- if( !spieler.z( i )->zTeam()->getPunkte() )
- {
- spielerStatus.set( 1, i ); // Datenbank Verloren
- spieler.z( i )->zKlient()->sendeSpielEnde( 0, 0 );
- }
- else
- {
- spielerStatus.set( 2, i ); // Datenbank Gewonnen
- spieler.z( i )->zKlient()->sendeSpielEnde( 1, 0 );
- }
- }
- if( spieler.z( i ) && ( !spieler.z( i )->zKlient() || !spieler.z( i )->zKlient()->istOnline() ) )
- spielerStatus.set( 3, i );
- }
- psqldb->setSpielStatusBeendet( spielId, 5 );
- for( int i = 0; i < spielerAnzahl; i++ )
- {
- Spieler *tmp = spieler.z( i );
- if( tmp )
- {
- psqldb->setSpielSpielerStatus( spielId, tmp->getAccountId(), tmp->getPunkte(), spielerStatus.get( i ) );
- psqldb->addSpielerStatistik( tmp->getAccountId(), spielId );
- }
- }
- log->close();
- log = log->release();
- isRunning = 0;
- }
- // call 7
- void Spiel::klientOffline( int accountId )
- {
- for( int i = 0; i < spielerAnzahl; i++ )
- {
- if( spieler.z( i )->getAccountId() == accountId )
- spieler.z( i )->zKlient()->offline();
- }
- }
- void Spiel::klientOnline( int accountId, SSKlientV * zKlient )
- {
- for( int i = 0; i < spielerAnzahl; i++ )
- {
- if( spieler.z( i )->getAccountId() == accountId )
- {
- c.lock();
- Spieler *s = spieler.z( i );
- Klient *tmp = s->zKlient();
- tmp->online( zKlient );
- tmp->sendeSpielerNummer( s->getSpielerNummer(), 0 );
- //--------------------------
- c.unlock();
- }
- }
- }
- void Spiel::nachricht( int accountId, int len, char *bytes )
- {
- if( !isRunning )
- return;
- c.lock();
- if( ende )
- {
- c.unlock();
- return;
- }
- char *msgBeg = bytes;
- int msgLen = len;
- int msgAccount = accountId;
- bool saveMSG = 1;
- len--;
- switch( *bytes )
- {
- case 0: // key press
- bytes++;
- len--;
- for( int i = 0; i < spielerAnzahl; i++ )
- {
- Spieler *tmp = spieler.z( i );
- if( tmp && tmp->getAccountId() == accountId )
- {
- if( !tmp->setTastenStand( *bytes, 1 ) )
- {
- saveMSG = 0;
- break;
- }
- for( int j = 0; j < spielerAnzahl; j++ )
- {
- Spieler *s = spieler.z( j );
- if( s && s->zKlient() )
- s->zKlient()->sendeTastaturStatus( tmp->getSpielerNummer(), *bytes, 1, gameTicks );
- }
- break;
- }
- }
- break;
- case 1: // key release
- bytes++;
- len--;
- for( int i = 0; i < spielerAnzahl; i++ )
- {
- Spieler *tmp = spieler.z( i );
- if( tmp && tmp->getAccountId() == accountId )
- {
- if( !tmp->setTastenStand( *bytes, 0 ) )
- {
- saveMSG = 0;
- break;
- }
- for( int j = 0; j < spielerAnzahl; j++ )
- {
- Spieler *s = spieler.z( j );
- if( s && s->zKlient() )
- s->zKlient()->sendeTastaturStatus( tmp->getSpielerNummer(), *bytes, 0, gameTicks );
- }
- break;
- }
- }
- break;
- case 3: // chat Nachricht
- if( 1 )
- {
- bytes++;
- Text *txt = psqldb->getAccountRufName( accountId );
- txt->append( ": " );
- txt->append( bytes, len );
- for( int i = 0; i < spielerAnzahl; i++ )
- {
- Spieler *tmp = spieler.z( i );
- if( tmp && tmp->zKlient() )
- tmp->zKlient()->sendeChatNachricht( txt->getText(), gameTicks );
- }
- txt->release();
- len = 0;
- }
- break;
- default:
- saveMSG = 0;
- }
- if( len )
- {
- // error
- }
- if( log && log->istOffen() && saveMSG )
- {
- char c = 1;
- log->schreibe( &c, 1 );
- int spielerNum = 0;
- for( int i = 0; i < spielerAnzahl; i++ )
- {
- Spieler *tmp = spieler.z( i );
- if( tmp && tmp->getAccountId() == msgAccount )
- {
- spielerNum = tmp->getSpielerNummer();
- break;
- }
- }
- log->schreibe( (char *)& spielerNum, 4 );
- short l = (short)msgLen;
- log->schreibe( (char *)& l, 2 );
- log->schreibe( msgBeg, l );
- }
- c.unlock();
- }
- void Spiel::setPausiert( bool pausiert )
- {
- this->pause = pausiert;
- }
- void Spiel::tick( double zeit )
- {
- // spieler bewegungen
- for( auto s = spieler.getIterator(); s; s++ )
- {
- s->tick( zeit );
- for( auto b = barieren.getIterator(); b; b++ )
- { // spieler - bariere intersection
- if( b->hatStyle( Bariere::Style::Aktiv ) && ( b->zTeam() != s->zTeam() ) && b->intersectsWith( s ) )
- s->tick( -zeit );
- else if( s->getX() < 0 || s->getY() < 0 || s->getX() + s->getWidth() >= mapSize.x || s->getY() + s->getHeight() >= mapSize.y )
- s->tick( -zeit );
- }
- }
- // barieren bewegung
- for( auto b = barieren.getIterator(); b; b++ )
- b->tick( zeit );
- // geschoss bewegung
- for( int i = 0; i < shots.getEintragAnzahl(); i++ )
- {
- Geschoss *g = shots.z( i );
- g->tick( zeit );
- bool removed = 0;
- // geschoss - bariere intersection
- bool intersectsWithBariere = 0;
- for( auto b = barieren.getIterator(); b; b++ )
- {
- if( b->hatStyle( Bariere::Style::Aktiv ) && b->intersectsWith( g ) )
- {
- intersectsWithBariere = 1;
- break;
- }
- }
- if( intersectsWithBariere || g->getX() < 0 || g->getY() < 0 || g->getX() + g->getWidth() >= mapSize.x || g->getY() + g->getHeight() >= mapSize.y )
- {
- g->tick( -zeit );
- switch( g->getTyp() )
- {
- case GESCHOSS_PFEIL:
- shots.remove( i );
- i--;
- removed = 1;
- break;
- case GESCHOSS_KUGEL:
- case GESCHOSS_DRACHENAUGE:
- g->invertDirection();
- break;
- case GESCHOSS_FEUERBALL:
- if( intersectsWithBariere )
- {
- feuer.add( new FeuerballTreffer( g->getX() - 70, g->getY() - 70, g->getBesitzer(), 10 ) );
- shots.remove( i );
- i--;
- removed = 1;
- }
- else
- g->invertDirection();
- break;
- }
- }
- if( !removed )
- { // geschoss - tunnel intersection
- for( auto t = tunnel.getIterator(); t; t++ )
- {
- if( t->istAktiv() && t->intersectsWith( g ) )
- {
- g->setX( g->getX() + t->getZielX() - t->getX() );
- g->setY( g->getY() + t->getZielY() - t->getY() );
- }
- }
- // geschoss - schalter intersection
- if( g->getTyp() == GESCHOSS_PFEIL )
- {
- for( auto s = schalter.getIterator(); s; s++ )
- {
- if( s->isAktive() && s->intersectsWith( g ) )
- {
- shots.remove( i );
- i--;
- removed = 1;
- activateShalter( s->getId() );
- }
- }
- }
- if( !removed )
- {
- // geschoss - umlenkung intersection
- if( g->getTyp() != GESCHOSS_PFEIL )
- {
- for( auto u = umlenkungen.getIterator(); u; u++ )
- {
- if( u->isAktive() && g->getTyp() != GESCHOSS_PFEIL && u->intersectsWith( g ) )
- {
- g->setRichtung( u->getRichtung() );
- u->addBenutzt();
- }
- }
- }
- // geschoss - spieler intersection
- for( auto s = spieler.getIterator(); s; s++ )
- {
- if( s->istAmLeben() && s != g->zBesitzer() )
- {
- switch( g->getTyp() )
- {
- case GESCHOSS_PFEIL:
- case GESCHOSS_KUGEL:
- s->nimmSchaden( 100 + ( g->zBesitzer() ? g->zBesitzer()->getSchadenBonus() : 0 ) );
- if( g->zBesitzer() )
- {
- g->zBesitzer()->addGemachterSchaden( 100 + g->zBesitzer()->getSchadenBonus() );
- if( !s->istAmLeben() )
- g->zBesitzer()->addKill();
- }
- case GESCHOSS_DRACHENAUGE:
- s->addEffekt( new DrachenAugeEffekt( g->zBesitzer(), s._, 10 ) );
- break;
- case GESCHOSS_FEUERBALL:
- feuer.add( new FeuerballTreffer( g->getX() - 70, g->getY() - 70, g->getBesitzer(), 10 ) );
- }
- if( g->zBesitzer() )
- g->zBesitzer()->addTreffer();
- s->addGetroffen();
- shots.remove( i );
- i--;
- removed = 1;
- }
- }
- }
- }
- }
- // Drop Ticks
- for( auto d = drops.getIterator(); d; d++ )
- d->tick( zeit, this );
- // Timer Ticks
- for( auto t = timer.getIterator(); t; t++ )
- t->tick( zeit, this );
- // Umlenkung Ticks
- for( auto u = umlenkungen.getIterator(); u; u++ )
- u->tick( zeit );
- // Base Ticks
- for( auto b = basen.getIterator(); b; b++ )
- b->tick( zeit, this );
- // aktive trigger Ticks
- for( int i = 0; i < triggerRuns.getEintragAnzahl(); i++ )
- {
- if( !triggerRuns.z( i )->runNext( zeit ) )
- {
- triggerRuns.remove( i );
- i--;
- }
- }
- }
- void Spiel::addVariable( const char *name, Variable * var )
- {
- bool found = 0;
- for( auto v = variablen.getIterator(); v; v++ )
- {
- if( v->zName()->istGleich( name ) )
- {
- found = 1;
- break;
- }
- }
- if( !found )
- variablen.add( new VarPointer( name, var ) );
- else
- var->release();
- }
- void Spiel::setVariable( const char *name, Variable * var )
- {
- bool found = 0;
- for( auto v = variablen.getIterator(); v; v++ )
- {
- if( v->zName()->istGleich( name ) )
- {
- v->setVariable( var );
- break;
- }
- }
- if( !found )
- var->release();
- }
- void Spiel::addTeam( Team * team )
- {
- teams.add( team );
- }
- void Spiel::addSpieler( Spieler * spieler )
- {
- this->spieler.add( spieler );
- }
- void Spiel::addBariere( Bariere * bariere )
- {
- barieren.add( bariere );
- }
- void Spiel::addBase( Base * base )
- {
- basen.add( base );
- }
- void Spiel::addDrop( Drop * drop )
- {
- drops.add( drop );
- }
- void Spiel::addGegenstand( Gegenstand * gegenstand )
- {
- items.add( gegenstand );
- }
- void Spiel::addGeschoss( Geschoss * geschoss )
- {
- shots.add( geschoss );
- }
- void Spiel::addSchalter( Schalter * schalter )
- {
- this->schalter.add( schalter );
- }
- void Spiel::addSchiene( Schiene * schiene )
- {
- schienen.add( schiene );
- }
- void Spiel::addTimer( Timer * timer )
- {
- this->timer.add( timer );
- }
- void Spiel::addTunnel( Tunnel * tunnel )
- {
- this->tunnel.add( tunnel );
- }
- void Spiel::addUmlenkung( Umlenkung * umlenkung )
- {
- umlenkungen.add( umlenkung );
- }
- void Spiel::addTrigger( Trigger * trigger )
- {
- this->trigger.add( trigger );
- }
- void Spiel::addTriggerRun( TriggerRun * tRun )
- {
- triggerRuns.add( tRun );
- }
- Team *Spiel::getTeam( int id ) const
- {
- for( auto t = teams.getIterator(); t; t++ )
- {
- if( t->getTeamNummer() == id )
- return (Team *)t->getThis();
- }
- return 0;
- }
- Variable *Spiel::getVariable( const char *name ) const
- {
- for( auto v = variablen.getIterator(); v; v++ )
- {
- if( v->zName()->istGleich( name ) )
- return v->getVariable();
- }
- return 0;
- }
- Variable *Spiel::zVariable( const char *name ) const
- {
- for( auto v = variablen.getIterator(); v; v++ )
- {
- if( v->zName()->istGleich( name ) )
- return v->zVariable();
- }
- return 0;
- }
- bool Spiel::istPausiert() const
- {
- return pause;
- }
- // constant
- StatistikV *Spiel::getStatistik() const
- {
- return stat->getThis();
- }
- // Reference Counting
- SpielKlasse *Spiel::getThis()
- {
- ref++;
- return this;
- }
- SpielKlasse *Spiel::release()
- {
- if( !--ref )
- delete this;
- return 0;
- }
|