00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "kgame.h"
00026 #include "kgameio.h"
00027 #include "kplayer.h"
00028 #include "kgamemessage.h"
00029 #include "kgamepropertyhandler.h"
00030
00031 #include <kdebug.h>
00032 #include <klocale.h>
00033
00034 #include <qbuffer.h>
00035
00036 #include <stdio.h>
00037 #include <assert.h>
00038
00039 #define KPLAYER_LOAD_COOKIE 7285
00040
00041 class KPlayerPrivate
00042 {
00043 public:
00044 KPlayerPrivate()
00045 {
00046 mNetworkPlayer = 0;
00047 }
00048
00049 Q_UINT32 mId;
00050 bool mVirtual;
00051 int mPriority;
00052
00053 KPlayer* mNetworkPlayer;
00054
00055 KGamePropertyHandler mProperties;
00056
00057
00058 KGamePropertyQString mName;
00059 KGamePropertyQString mGroup;
00060 };
00061
00062 KPlayer::KPlayer() : QObject(0,0)
00063 {
00064 init();
00065 }
00066
00067 KPlayer::KPlayer(KGame* game) : QObject(0, 0)
00068 {
00069 init();
00070 game->addPlayer(this);
00071 }
00072
00073 void KPlayer::init()
00074 {
00075
00076 kdDebug(11001) << k_funcinfo << ": this=" << this << ", sizeof(this)="<<sizeof(KPlayer) << endl;
00077 kdDebug(11001) << "sizeof(m_Group)="<<sizeof(d->mGroup)<<endl;
00078 d = new KPlayerPrivate;
00079
00080 d->mProperties.registerHandler(KGameMessage::IdPlayerProperty,
00081 this,SLOT(sendProperty(int, QDataStream&, bool*)),
00082 SLOT(emitSignal(KGamePropertyBase *)));
00083 d->mVirtual=false;
00084 mActive=true;
00085 mGame=0;
00086 d->mId=0;
00087 d->mPriority=0;
00088
00089
00090
00091 mUserId.registerData(KGamePropertyBase::IdUserId, this, i18n("UserId"));
00092 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 mAsyncInput.registerData(KGamePropertyBase::IdAsyncInput, this, i18n("AsyncInput"));
00099 mAsyncInput.setLocal(false);
00100 mMyTurn.registerData(KGamePropertyBase::IdTurn, this, i18n("myTurn"));
00101 mMyTurn.setLocal(false);
00102 mMyTurn.setEmittingSignal(true);
00103 mMyTurn.setOptimized(false);
00104 }
00105
00106 KPlayer::~KPlayer()
00107 {
00108 kdDebug(11001) << k_funcinfo << ": this=" << this <<", id=" << this->id() << endl;
00109
00110
00111 KGameIO *input;
00112 while((input=mInputList.first()))
00113 {
00114 delete input;
00115 }
00116 if (game())
00117 {
00118 game()->playerDeleted(this);
00119 }
00120
00121
00122
00123 d->mProperties.clear();
00124 delete d;
00125
00126 }
00127
00128 bool KPlayer::forwardMessage(QDataStream &msg,int msgid,Q_UINT32 receiver,Q_UINT32 sender)
00129 {
00130 if (!isActive())
00131 {
00132 return false;
00133 }
00134 if (!game())
00135 {
00136 return false;
00137 }
00138 kdDebug(11001) << k_funcinfo << ": to game sender="<<sender<<"" << "recv="<<receiver <<"msgid="<<msgid << endl;
00139 return game()->sendSystemMessage(msg,msgid,receiver,sender);
00140 }
00141
00142 bool KPlayer::forwardInput(QDataStream &msg,bool transmit,Q_UINT32 sender)
00143 {
00144 if (!isActive())
00145 {
00146 return false;
00147 }
00148 if (!game())
00149 {
00150 return false;
00151 }
00152
00153 kdDebug(11001) << k_funcinfo << ": to game playerInput(sender="<<sender<<")" << endl;
00154 if (!asyncInput() && !myTurn())
00155 {
00156 kdDebug(11001) << k_funcinfo << ": rejected cause it is not our turn" << endl;
00157 return false;
00158 }
00159
00160
00161
00162
00163
00164 if (transmit)
00165 {
00166 kdDebug(11001) << "indirect playerInput" << endl;
00167 return game()->sendPlayerInput(msg,this,sender);
00168 }
00169 else
00170 {
00171 kdDebug(11001) << "direct playerInput" << endl;
00172 return game()->systemPlayerInput(msg,this,sender);
00173 }
00174 }
00175
00176 void KPlayer::setId(Q_UINT32 newid)
00177 {
00178
00179 d->mId=newid;
00180 }
00181
00182
00183 void KPlayer::setGroup(const QString& group)
00184 { d->mGroup = group; }
00185
00186 const QString& KPlayer::group() const
00187 { return d->mGroup.value(); }
00188
00189 void KPlayer::setName(const QString& name)
00190 { d->mName = name; }
00191
00192 const QString& KPlayer::name() const
00193 { return d->mName.value(); }
00194
00195 Q_UINT32 KPlayer::id() const
00196 { return d->mId; }
00197
00198 KGamePropertyHandler * KPlayer::dataHandler()
00199 { return &d->mProperties; }
00200
00201 void KPlayer::setVirtual(bool v)
00202 { d->mVirtual = v; }
00203
00204 bool KPlayer::isVirtual() const
00205 { return d->mVirtual;}
00206
00207 void KPlayer::setNetworkPlayer(KPlayer* p)
00208 { d->mNetworkPlayer = p; }
00209
00210 KPlayer* KPlayer::networkPlayer() const
00211 { return d->mNetworkPlayer; }
00212
00213 int KPlayer::networkPriority() const
00214 { return d->mPriority; }
00215
00216 void KPlayer::setNetworkPriority(int p)
00217 { d->mPriority = p; }
00218
00219 bool KPlayer::addGameIO(KGameIO *input)
00220 {
00221 if (!input)
00222 {
00223 return false;
00224 }
00225 mInputList.append(input);
00226 input->initIO(this);
00227 return true;
00228 }
00229
00230
00231 bool KPlayer::removeGameIO(KGameIO *targetinput,bool deleteit)
00232 {
00233 kdDebug(11001) << k_funcinfo << ": " << targetinput << " delete=" << deleteit<< endl;
00234 bool result=true;
00235 if (!targetinput)
00236 {
00237 KGameIO *input;
00238 while((input=mInputList.first()))
00239 {
00240 if (input) removeGameIO(input,deleteit);
00241 }
00242 }
00243 else
00244 {
00245
00246 if (deleteit)
00247 {
00248 delete targetinput;
00249 }
00250 else
00251 {
00252 targetinput->setPlayer(0);
00253 result=mInputList.remove(targetinput);
00254 }
00255 }
00256 return result;
00257 }
00258
00259 KGameIO * KPlayer::findRttiIO(int rtti) const
00260 {
00261 QPtrListIterator<KGameIO> it(mInputList);
00262 while (it.current())
00263 {
00264 if (it.current()->rtti() == rtti)
00265 {
00266 return it.current();
00267 }
00268 ++it;
00269 }
00270 return 0;
00271 }
00272
00273 int KPlayer::calcIOValue()
00274 {
00275 int value=0;
00276 QPtrListIterator<KGameIO> it(mInputList);
00277 while (it.current())
00278 {
00279 value|=it.current()->rtti();
00280 ++it;
00281 }
00282 return value;
00283 }
00284
00285 bool KPlayer::setTurn(bool b, bool exclusive)
00286 {
00287 kdDebug(11001) << k_funcinfo << ": " << id() << " (" << this << ") to " << b << endl;
00288 if (!isActive())
00289 {
00290 return false;
00291 }
00292
00293
00294 if (exclusive && b && game())
00295 {
00296 KPlayer *player;
00297 KGame::KGamePlayerList *list=game()->playerList();
00298 for ( player=list->first(); player != 0; player=list->next() )
00299 {
00300 if (player==this)
00301 {
00302 continue;
00303 }
00304 player->setTurn(false,false);
00305 }
00306 }
00307
00308
00309 mMyTurn = b;
00310
00311 return true;
00312 }
00313
00314 bool KPlayer::load(QDataStream &stream)
00315 {
00316 Q_INT32 id,priority;
00317 stream >> id >> priority;
00318 setId(id);
00319 setNetworkPriority(priority);
00320
00321
00322
00323 d->mProperties.load(stream);
00324
00325 Q_INT16 cookie;
00326 stream >> cookie;
00327 if (cookie==KPLAYER_LOAD_COOKIE)
00328 {
00329 kdDebug(11001) << " Player loaded propertly"<<endl;
00330 }
00331 else
00332 {
00333 kdError(11001) << " Player loading error. probably format error"<<endl;
00334 }
00335
00336
00337 return true;
00338 }
00339
00340 bool KPlayer::save(QDataStream &stream)
00341 {
00342 stream << (Q_INT32)id() << (Q_INT32)networkPriority();
00343
00344 d->mProperties.save(stream);
00345
00346 stream << (Q_INT16)KPLAYER_LOAD_COOKIE;
00347
00348
00349 return true;
00350 }
00351
00352
00353 void KPlayer::networkTransmission(QDataStream &stream,int msgid,Q_UINT32 sender)
00354 {
00355
00356
00357 bool issender;
00358 if (game())
00359 {
00360 issender=sender==game()->gameId();
00361 }
00362 else
00363 {
00364 issender=true;
00365 }
00366 if (d->mProperties.processMessage(stream,msgid,issender))
00367 {
00368 return ;
00369 }
00370 switch(msgid)
00371 {
00372 case KGameMessage::IdPlayerInput:
00373 {
00374 kdDebug(11001) << k_funcinfo << ": Got player move "
00375 << "KPlayer (virtual) forwards it to the game object" << endl;
00376 forwardInput(stream,false);
00377 }
00378 break;
00379 default:
00380 emit signalNetworkData(msgid - KGameMessage::IdUser,
00381 ((QBuffer*)stream.device())->readAll(),sender,this);
00382 kdDebug(11001) << k_funcinfo << ": "
00383 << "User data msgid " << msgid << endl;
00384 break;
00385 }
00386
00387 }
00388
00389 KGamePropertyBase* KPlayer::findProperty(int id) const
00390 {
00391 return d->mProperties.find(id);
00392 }
00393
00394 bool KPlayer::addProperty(KGamePropertyBase* data)
00395 {
00396 return d->mProperties.addProperty(data);
00397 }
00398
00399 void KPlayer::sendProperty(int msgid, QDataStream& stream, bool* sent)
00400 {
00401 if (game())
00402 {
00403 bool s = game()->sendPlayerProperty(msgid, stream, id());
00404 if (s)
00405 {
00406 *sent = true;
00407 }
00408 }
00409 }
00410
00411 void KPlayer::emitSignal(KGamePropertyBase *me)
00412 {
00413
00414 if (me->id()==KGamePropertyBase::IdTurn)
00415 {
00416
00417 QPtrListIterator<KGameIO> it(mInputList);
00418 while (it.current())
00419 {
00420 it.current()->notifyTurn(mMyTurn.value());
00421 ++it;
00422 }
00423 }
00424 emit signalPropertyChanged(me,this);
00425 }
00426
00427
00428 void KPlayer::Debug()
00429 {
00430 kdDebug(11001) << "------------------- KPLAYER -----------------------" << endl;
00431 kdDebug(11001) << "this: " << this << endl;
00432 kdDebug(11001) << "rtti: " << rtti() << endl;
00433 kdDebug(11001) << "id : " << id() << endl;
00434 kdDebug(11001) << "Name : " << name() << endl;
00435 kdDebug(11001) << "Group: " << group() << endl;
00436 kdDebug(11001) << "Async: " << asyncInput() << endl;
00437 kdDebug(11001) << "myTurn: " << myTurn() << endl;
00438 kdDebug(11001) << "Virtual: " << isVirtual() << endl;
00439 kdDebug(11001) << "Active: " << isActive() << endl;
00440 kdDebug(11001) << "Priority:" << networkPriority() << endl;
00441 kdDebug(11001) << "Game : " << game() << endl;
00442 kdDebug(11001) << "#IOs: " << mInputList.count() << endl;
00443 kdDebug(11001) << "---------------------------------------------------" << endl;
00444 }
00445
00446 #include "kplayer.moc"