00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
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;
00048 KPlayer::KGameIOList mInputList;
00049
00050
00051 KGamePropertyBool mAsyncInput;
00052 KGamePropertyBool mMyTurn;
00053 KGamePropertyInt mUserId;
00054
00055 quint32 mId;
00056 bool mVirtual;
00057 int mPriority;
00058
00059 KPlayer* mNetworkPlayer;
00060
00061 KGamePropertyHandler mProperties;
00062
00063
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
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;
00087 d->mPriority=0;
00088
00089
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
00111 qDeleteAll(d->mInputList);
00112 d->mInputList.clear();
00113 if (game())
00114 {
00115 game()->playerDeleted(this);
00116 }
00117
00118
00119
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
00213
00214
00215
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
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);
00279 return true;
00280 }
00281
00282
00283 bool KPlayer::removeGameIO(KGameIO *targetinput,bool deleteit)
00284 {
00285 kDebug(11001) << ":" << targetinput << "delete=" << deleteit;
00286 bool result=true;
00287 if (!targetinput)
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
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
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
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
00378
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
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
00405 return true;
00406 }
00407
00408
00409 void KPlayer::networkTransmission(QDataStream &stream,int msgid,quint32 sender)
00410 {
00411
00412
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
00470 if (me->id()==KGamePropertyBase::IdTurn)
00471 {
00472
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
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"