• Skip to content
  • Skip to link menu
KDE 4.2 API Reference
  • KDE API Reference
  • API Reference
  • Sitemap
  • Contact Us
 

libkdegames/kgame

kplayer.cpp

Go to the documentation of this file.
00001 /*
00002     This file is part of the KDE games library
00003     Copyright (C) 2001 Martin Heni (kde at heni-online.de)
00004     Copyright (C) 2001 Andreas Beckermann (b_mann@gmx.de)
00005 
00006     This library is free software; you can redistribute it and/or
00007     modify it under the terms of the GNU Library General Public
00008     License version 2 as published by the Free Software Foundation.
00009 
00010     This library is distributed in the hope that it will be useful,
00011     but WITHOUT ANY WARRANTY; without even the implied warranty of
00012     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00013     Library General Public License for more details.
00014 
00015     You should have received a copy of the GNU Library General Public License
00016     along with this library; see the file COPYING.LIB.  If not, write to
00017     the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
00018     Boston, MA 02110-1301, USA.
00019 */
00020 
00021 #include "kplayer.h"
00022 #include "kgame.h"
00023 #include "kgameio.h"
00024 #include "kgamemessage.h"
00025 #include "kgameproperty.h"
00026 #include "kgamepropertyhandler.h"
00027 
00028 #include <kdebug.h>
00029 #include <klocale.h>
00030 
00031 #include <qbuffer.h>
00032 
00033 #include <stdio.h>
00034 #include <assert.h>
00035 
00036 #define KPLAYER_LOAD_COOKIE 7285
00037 
00038 class KPlayerPrivate
00039 {
00040 public:
00041    KPlayerPrivate()
00042    {
00043       mNetworkPlayer = 0;
00044    }
00045 
00046    KGame *mGame;
00047    bool mActive;      // active player
00048    KPlayer::KGameIOList mInputList;
00049 
00050    // GameProperty
00051    KGamePropertyBool mAsyncInput;  // async input allowed
00052    KGamePropertyBool mMyTurn;      // Is it my turn to play (only useful if not async)?
00053    KGamePropertyInt  mUserId;      // a user defined id
00054 
00055    quint32 mId;
00056    bool mVirtual; // virtual player
00057    int mPriority; // tag for replacement
00058 
00059    KPlayer* mNetworkPlayer; // replacement player
00060 
00061    KGamePropertyHandler mProperties;
00062 
00063 // Playerdata
00064    KGamePropertyQString mName;
00065    KGamePropertyQString mGroup;
00066 };
00067 
00068 KPlayer::KPlayer()
00069     : QObject(), d(new KPlayerPrivate)
00070 {
00071  init();
00072 }
00073 
00074 void KPlayer::init()
00075 {
00076 // note that NO KGame object exists here! so we cannot use KGameProperty::send!
00077    kDebug(11001) << ": this=" << this << ", sizeof(this)="<<sizeof(KPlayer);
00078    kDebug(11001) << "sizeof(m_Group)="<<sizeof(d->mGroup);
00079 
00080    d->mProperties.registerHandler(KGameMessage::IdPlayerProperty,
00081                                   this,SLOT(sendProperty(int, QDataStream&, bool*)),
00082                                        SLOT(emitSignal(KGamePropertyBase *)));
00083    d->mVirtual=false;
00084    d->mActive=true;
00085    d->mGame=0;
00086    d->mId=0; // "0" is always an invalid ID!
00087    d->mPriority=0;
00088    // I guess we cannot translate the group otherwise no
00089    // international conenctions are possible
00090 
00091    d->mUserId.registerData(KGamePropertyBase::IdUserId, this, i18n("UserId"));
00092    d->mUserId.setLocal(0);
00093    d->mGroup.registerData(KGamePropertyBase::IdGroup, this, i18n("Group"));
00094    d->mGroup.setLocal(i18n("default"));
00095    d->mName.registerData(KGamePropertyBase::IdName, this, i18n("Name"));
00096    d->mName.setLocal(i18n("default"));
00097 
00098    d->mAsyncInput.registerData(KGamePropertyBase::IdAsyncInput, this, i18n("AsyncInput"));
00099    d->mAsyncInput.setLocal(false);
00100    d->mMyTurn.registerData(KGamePropertyBase::IdTurn, this, i18n("myTurn"));
00101    d->mMyTurn.setLocal(false);
00102    d->mMyTurn.setEmittingSignal(true);
00103    d->mMyTurn.setOptimized(false);
00104 }
00105 
00106 KPlayer::~KPlayer()
00107 {
00108   kDebug(11001) << ": this=" << this <<", id=" << this->id();
00109 
00110   // Delete IODevices
00111   qDeleteAll(d->mInputList);
00112   d->mInputList.clear();
00113   if (game())
00114   {
00115     game()->playerDeleted(this);
00116   }
00117 
00118 // note: mProperties does not use autoDelete or so - user must delete objects
00119 // himself
00120   d->mProperties.clear();
00121   delete d;
00122   kDebug(11001) << "done";
00123 }
00124 
00125 int KPlayer::rtti() const
00126 {
00127   return 0;
00128 }
00129 
00130 KPlayer::KGameIOList* KPlayer::ioList()
00131 {
00132   return &d->mInputList;
00133 }
00134 
00135 void KPlayer::setGame(KGame *game)
00136 {
00137   d->mGame = game;
00138 }
00139 
00140 KGame* KPlayer::game() const
00141 {
00142   return d->mGame;
00143 }
00144 
00145 void KPlayer::setAsyncInput(bool a)
00146 {
00147   d->mAsyncInput = a;
00148 }
00149 
00150 bool KPlayer::asyncInput() const
00151 {
00152   return d->mAsyncInput.value();
00153 }
00154 
00155 bool KPlayer::isActive() const
00156 {
00157   return d->mActive;
00158 }
00159 
00160 void KPlayer::setActive(bool v)
00161 {
00162   d->mActive = v;
00163 }
00164 
00165 int KPlayer::userId() const
00166 {
00167   return d->mUserId.value();
00168 }
00169 
00170 void KPlayer::setUserId(int i)
00171 {
00172   d->mUserId = i;
00173 }
00174 
00175 bool KPlayer::myTurn() const
00176 {
00177   return d->mMyTurn.value();
00178 }
00179 
00180 bool KPlayer::forwardMessage(QDataStream &msg,int msgid,quint32 receiver,quint32 sender)
00181 {
00182   if (!isActive())
00183   {
00184     return false;
00185   }
00186   if (!game())
00187   {
00188     return false;
00189   }
00190   kDebug(11001) << ": to game sender="<<sender<<"" << "recv="<<receiver <<"msgid="<<msgid;
00191   return game()->sendSystemMessage(msg,msgid,receiver,sender);
00192 }
00193 
00194 bool KPlayer::forwardInput(QDataStream &msg,bool transmit,quint32 sender)
00195 {
00196   if (!isActive())
00197   {
00198     return false;
00199   }
00200   if (!game())
00201   {
00202     return false;
00203   }
00204 
00205   kDebug(11001) << ": to game playerInput(sender="<<sender<<")";
00206   if (!asyncInput() && !myTurn())
00207   {
00208     kDebug(11001) << ": rejected cause it is not our turn";
00209     return false;
00210   }
00211 
00212   // AB: I hope I remember the usage correctly:
00213   // this function is called twice (on sender side) - once with transmit = true
00214   // where it sends the input to the comserver and once with transmit = false
00215   // where it really looks at the input
00216   if (transmit)
00217   {
00218     kDebug(11001) << "indirect playerInput";
00219     return game()->sendPlayerInput(msg,this,sender);
00220   }
00221   else
00222   {
00223     kDebug(11001) << "direct playerInput";
00224     return game()->systemPlayerInput(msg,this,sender);
00225   }
00226 }
00227 
00228 void KPlayer::setId(quint32 newid)
00229 {
00230   // Needs to be after the sendProcess
00231   d->mId=newid;
00232 }
00233 
00234 
00235 void KPlayer::setGroup(const QString& group)
00236 { d->mGroup = group; }
00237 
00238 const QString& KPlayer::group() const
00239 { return d->mGroup.value(); }
00240 
00241 void KPlayer::setName(const QString& name)
00242 { d->mName = name; }
00243 
00244 const QString& KPlayer::name() const
00245 { return d->mName.value(); }
00246 
00247 quint32 KPlayer::id() const
00248 { return d->mId; }
00249 
00250 KGamePropertyHandler * KPlayer::dataHandler()
00251 { return &d->mProperties; }
00252 
00253 void KPlayer::setVirtual(bool v)
00254 { d->mVirtual = v; }
00255 
00256 bool KPlayer::isVirtual() const
00257 { return d->mVirtual;}
00258 
00259 void KPlayer::setNetworkPlayer(KPlayer* p)
00260 { d->mNetworkPlayer = p; }
00261 
00262 KPlayer* KPlayer::networkPlayer() const
00263 { return d->mNetworkPlayer; }
00264 
00265 int KPlayer::networkPriority() const
00266 { return d->mPriority; }
00267 
00268 void KPlayer::setNetworkPriority(int p)
00269 { d->mPriority = p; }
00270 
00271 bool KPlayer::addGameIO(KGameIO *input)
00272 {
00273   if (!input)
00274   {
00275     return false;
00276   }
00277   d->mInputList.append(input);
00278   input->initIO(this); // set player and init device
00279   return true;
00280 }
00281 
00282 // input=0, remove all
00283 bool KPlayer::removeGameIO(KGameIO *targetinput,bool deleteit)
00284 {
00285   kDebug(11001) << ":" << targetinput << "delete=" << deleteit;
00286   bool result=true;
00287   if (!targetinput) // delete all
00288   {
00289     KGameIO *input;
00290     while(!d->mInputList.isEmpty())
00291     {
00292       input = d->mInputList.first();
00293       if (input) removeGameIO(input,deleteit);
00294     }
00295   }
00296   else
00297   {
00298 //    kDebug(11001) << "remove IO" << targetinput;
00299     if (deleteit)
00300     {
00301       delete targetinput;
00302     }
00303     else
00304     {
00305       targetinput->setPlayer(0);
00306       result = d->mInputList.removeAll(targetinput);
00307     }
00308   }
00309   return result;
00310 }
00311 
00312 bool KPlayer::hasRtti(int rtti) const
00313 {
00314   return findRttiIO(rtti) != 0;
00315 }
00316 
00317 KGameIO * KPlayer::findRttiIO(int rtti) const
00318 {
00319   QListIterator<KGameIO*> it(d->mInputList);
00320   while (it.hasNext())
00321   {
00322     KGameIO* curGameIO = it.next();
00323     if (curGameIO->rtti() == rtti)
00324     {
00325       return curGameIO;
00326     }
00327   }
00328   return 0;
00329 }
00330 
00331 int KPlayer::calcIOValue()
00332 {
00333   int value=0;
00334   QListIterator<KGameIO*> it(d->mInputList);
00335   while (it.hasNext())
00336   {
00337     value|=it.next()->rtti();
00338   }
00339   return value;
00340 }
00341 
00342 bool KPlayer::setTurn(bool b, bool exclusive)
00343 {
00344   kDebug(11001) << ":" << id() << " (" << this << ") to" << b;
00345   if (!isActive())
00346   {
00347     return false;
00348   }
00349 
00350   // if we get to do an exclusive turn all other players are disallowed
00351   if (exclusive && b && game())
00352   {
00353      for ( KGame::KGamePlayerList::iterator it = game()->playerList()->begin();
00354             it!=game()->playerList()->end();it++)
00355      {
00356        if ((*it)==this)
00357        {
00358          continue;
00359        }
00360        (*it)->setTurn(false,false);
00361      }
00362   }
00363 
00364   // Return if nothing changed
00365   d->mMyTurn = b;
00366 
00367   return true;
00368 }
00369 
00370 bool KPlayer::load(QDataStream &stream)
00371 {
00372   qint32 id,priority;
00373   stream >> id >> priority;
00374   setId(id);
00375   setNetworkPriority(priority);
00376 
00377   // Load Player Data
00378   //FIXME: maybe set all properties setEmitSignal(false) before?
00379   d->mProperties.load(stream);
00380 
00381   qint16 cookie;
00382   stream >> cookie;
00383   if (cookie==KPLAYER_LOAD_COOKIE)
00384   {
00385       kDebug(11001) << "   Player loaded propertly";
00386   }
00387   else
00388   {
00389       kError(11001) << "   Player loading error. probably format error";
00390   }
00391 
00392   // emit signalLoad(stream);
00393   return true;
00394 }
00395 
00396 bool KPlayer::save(QDataStream &stream)
00397 {
00398   stream << (qint32)id() << (qint32)networkPriority();
00399 
00400   d->mProperties.save(stream);
00401 
00402   stream << (qint16)KPLAYER_LOAD_COOKIE;
00403 
00404   //emit signalSave(stream);
00405   return true;
00406 }
00407 
00408 
00409 void KPlayer::networkTransmission(QDataStream &stream,int msgid,quint32 sender)
00410 {
00411   //kDebug(11001) ": msgid=" << msgid << "sender=" << sender << "we are=" << id();
00412   // PlayerProperties processed
00413   bool issender;
00414   if (game())
00415   {
00416     issender=sender==game()->gameId();
00417   }
00418   else
00419   {
00420     issender=true;
00421   }
00422   if (d->mProperties.processMessage(stream,msgid,issender))
00423   {
00424     return ;
00425   }
00426   switch(msgid)
00427   {
00428     case KGameMessage::IdPlayerInput:
00429       {
00430         kDebug(11001) << ": Got player move "
00431             << "KPlayer (virtual) forwards it to the game object";
00432         forwardInput(stream,false);
00433       }
00434     break;
00435     default:
00436         emit signalNetworkData(msgid - KGameMessage::IdUser,
00437             ((QBuffer*)stream.device())->readAll(),sender,this);
00438         kDebug(11001) << ": "
00439             << "User data msgid" << msgid;
00440     break;
00441   }
00442 
00443 }
00444 
00445 KGamePropertyBase* KPlayer::findProperty(int id) const
00446 {
00447   return d->mProperties.find(id);
00448 }
00449 
00450 bool KPlayer::addProperty(KGamePropertyBase* data)
00451 {
00452   return d->mProperties.addProperty(data);
00453 }
00454 
00455 void KPlayer::sendProperty(int msgid, QDataStream& stream, bool* sent)
00456 {
00457   if (game())
00458   {
00459     bool s = game()->sendPlayerProperty(msgid, stream, id());
00460     if (s)
00461     {
00462       *sent = true;
00463     }
00464   }
00465 }
00466 
00467 void KPlayer::emitSignal(KGamePropertyBase *me)
00468 {
00469   // Notify KGameIO (Process) for a new turn
00470   if (me->id()==KGamePropertyBase::IdTurn)
00471   {
00472     //kDebug(11001) << ": for KGamePropertyBase::IdTurn";
00473     QListIterator<KGameIO*> it(d->mInputList);
00474     while (it.hasNext())
00475     {
00476       it.next()->notifyTurn(d->mMyTurn.value());
00477     }
00478   }
00479   emit signalPropertyChanged(me,this);
00480 }
00481 
00482 // --------------------- DEBUG --------------------
00483 void KPlayer::Debug()
00484 {
00485    kDebug(11001) << "------------------- KPLAYER -----------------------";
00486    kDebug(11001) << "this:    " << this;
00487    kDebug(11001) << "rtti:    " << rtti();
00488    kDebug(11001) << "id  :    " << id();
00489    kDebug(11001) << "Name :   " << name();
00490    kDebug(11001) << "Group:   " << group();
00491    kDebug(11001) << "Async:   " << asyncInput();
00492    kDebug(11001) << "myTurn:  " << myTurn();
00493    kDebug(11001) << "Virtual:" << isVirtual();
00494    kDebug(11001) << "Active:  " << isActive();
00495    kDebug(11001) << "Priority:" << networkPriority();
00496    kDebug(11001) << "Game   :" << game();
00497    kDebug(11001) << "#IOs:    " << d->mInputList.count();
00498    kDebug(11001) << "---------------------------------------------------";
00499 }
00500 
00501 #include "kplayer.moc"

libkdegames/kgame

Skip menu "libkdegames/kgame"
  • Main Page
  • Namespace List
  • Class Hierarchy
  • Alphabetical List
  • Class List
  • File List
  • Class Members
  • Related Pages

API Reference

Skip menu "API Reference"
  • kblackbox
  • kgoldrunner
  • kmahjongg
  • ksquares
  • libkdegames
  •   highscore
  •   kgame
  •   kggzgames
  •   kggzmod
  •   kggznet
  • libkmahjongg
Generated for API Reference by doxygen 1.5.4
This website is maintained by Adriaan de Groot and Allen Winter.
KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal