• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdegames API Reference
  • KDE Home
  • Contact Us
 

libkdegames/libkdegamesprivate/kgame

  • sources
  • kde-4.14
  • kdegames
  • libkdegames
  • libkdegamesprivate
  • kgame
kplayer.cpp
Go to the documentation of this file.
1 /*
2  This file is part of the KDE games library
3  Copyright (C) 2001 Martin Heni (kde at heni-online.de)
4  Copyright (C) 2001 Andreas Beckermann (b_mann@gmx.de)
5 
6  This library is free software; you can redistribute it and/or
7  modify it under the terms of the GNU Library General Public
8  License version 2 as published by the Free Software Foundation.
9 
10  This library is distributed in the hope that it will be useful,
11  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13  Library General Public License for more details.
14 
15  You should have received a copy of the GNU Library General Public License
16  along with this library; see the file COPYING.LIB. If not, write to
17  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18  Boston, MA 02110-1301, USA.
19 */
20 
21 #include "kplayer.h"
22 #include "kgame.h"
23 #include "kgameio.h"
24 #include "kgamemessage.h"
25 #include "kgameproperty.h"
26 #include "kgamepropertyhandler.h"
27 
28 #include <kdebug.h>
29 #include <klocale.h>
30 
31 #include <qbuffer.h>
32 
33 #include <stdio.h>
34 #include <assert.h>
35 
36 #define KPLAYER_LOAD_COOKIE 7285
37 
38 class KPlayerPrivate
39 {
40 public:
41  KPlayerPrivate()
42  {
43  mNetworkPlayer = 0;
44  }
45 
46  KGame *mGame;
47  bool mActive; // active player
48  KPlayer::KGameIOList mInputList;
49 
50  // GameProperty
51  KGamePropertyBool mAsyncInput; // async input allowed
52  KGamePropertyBool mMyTurn; // Is it my turn to play (only useful if not async)?
53  KGamePropertyInt mUserId; // a user defined id
54 
55  quint32 mId;
56  bool mVirtual; // virtual player
57  int mPriority; // tag for replacement
58 
59  KPlayer* mNetworkPlayer; // replacement player
60 
61  KGamePropertyHandler mProperties;
62 
63 // Playerdata
64  KGamePropertyQString mName;
65  KGamePropertyQString mGroup;
66 };
67 
68 KPlayer::KPlayer()
69  : QObject(), d(new KPlayerPrivate)
70 {
71  init();
72 }
73 
74 void KPlayer::init()
75 {
76 // note that NO KGame object exists here! so we cannot use KGameProperty::send!
77  kDebug(11001) << ": this=" << this << ", sizeof(this)="<<sizeof(KPlayer);
78  kDebug(11001) << "sizeof(m_Group)="<<sizeof(d->mGroup);
79 
80  d->mProperties.registerHandler(KGameMessage::IdPlayerProperty,
81  this,SLOT(sendProperty(int,QDataStream&,bool*)),
82  SLOT(emitSignal(KGamePropertyBase*)));
83  d->mVirtual=false;
84  d->mActive=true;
85  d->mGame=0;
86  d->mId=0; // "0" is always an invalid ID!
87  d->mPriority=0;
88  // I guess we cannot translate the group otherwise no
89  // international conenctions are possible
90 
91  d->mUserId.registerData(KGamePropertyBase::IdUserId, this, i18n("UserId"));
92  d->mUserId.setLocal(0);
93  d->mGroup.registerData(KGamePropertyBase::IdGroup, this, i18n("Group"));
94  d->mGroup.setLocal(i18n("default"));
95  d->mName.registerData(KGamePropertyBase::IdName, this, i18n("Name"));
96  d->mName.setLocal(i18n("default"));
97 
98  d->mAsyncInput.registerData(KGamePropertyBase::IdAsyncInput, this, i18n("AsyncInput"));
99  d->mAsyncInput.setLocal(false);
100  d->mMyTurn.registerData(KGamePropertyBase::IdTurn, this, i18n("myTurn"));
101  d->mMyTurn.setLocal(false);
102  d->mMyTurn.setEmittingSignal(true);
103  d->mMyTurn.setOptimized(false);
104 }
105 
106 KPlayer::~KPlayer()
107 {
108  kDebug(11001) << ": this=" << this <<", id=" << this->id();
109 
110  // Delete IODevices
111  qDeleteAll(d->mInputList);
112  d->mInputList.clear();
113  if (game())
114  {
115  game()->playerDeleted(this);
116  }
117 
118 // note: mProperties does not use autoDelete or so - user must delete objects
119 // himself
120  d->mProperties.clear();
121  delete d;
122  kDebug(11001) << "done";
123 }
124 
125 int KPlayer::rtti() const
126 {
127  return 0;
128 }
129 
130 KPlayer::KGameIOList* KPlayer::ioList()
131 {
132  return &d->mInputList;
133 }
134 
135 void KPlayer::setGame(KGame *game)
136 {
137  d->mGame = game;
138 }
139 
140 KGame* KPlayer::game() const
141 {
142  return d->mGame;
143 }
144 
145 void KPlayer::setAsyncInput(bool a)
146 {
147  d->mAsyncInput = a;
148 }
149 
150 bool KPlayer::asyncInput() const
151 {
152  return d->mAsyncInput.value();
153 }
154 
155 bool KPlayer::isActive() const
156 {
157  return d->mActive;
158 }
159 
160 void KPlayer::setActive(bool v)
161 {
162  d->mActive = v;
163 }
164 
165 int KPlayer::userId() const
166 {
167  return d->mUserId.value();
168 }
169 
170 void KPlayer::setUserId(int i)
171 {
172  d->mUserId = i;
173 }
174 
175 bool KPlayer::myTurn() const
176 {
177  return d->mMyTurn.value();
178 }
179 
180 bool KPlayer::forwardMessage(QDataStream &msg,int msgid,quint32 receiver,quint32 sender)
181 {
182  if (!isActive())
183  {
184  return false;
185  }
186  if (!game())
187  {
188  return false;
189  }
190  kDebug(11001) << ": to game sender="<<sender<<"" << "recv="<<receiver <<"msgid="<<msgid;
191  return game()->sendSystemMessage(msg,msgid,receiver,sender);
192 }
193 
194 bool KPlayer::forwardInput(QDataStream &msg,bool transmit,quint32 sender)
195 {
196  if (!isActive())
197  {
198  return false;
199  }
200  if (!game())
201  {
202  return false;
203  }
204 
205  kDebug(11001) << ": to game playerInput(sender="<<sender<<")";
206  if (!asyncInput() && !myTurn())
207  {
208  kDebug(11001) << ": rejected cause it is not our turn";
209  return false;
210  }
211 
212  // AB: I hope I remember the usage correctly:
213  // this function is called twice (on sender side) - once with transmit = true
214  // where it sends the input to the comserver and once with transmit = false
215  // where it really looks at the input
216  if (transmit)
217  {
218  kDebug(11001) << "indirect playerInput";
219  return game()->sendPlayerInput(msg,this,sender);
220  }
221  else
222  {
223  kDebug(11001) << "direct playerInput";
224  return game()->systemPlayerInput(msg,this,sender);
225  }
226 }
227 
228 void KPlayer::setId(quint32 newid)
229 {
230  // Needs to be after the sendProcess
231  d->mId=newid;
232 }
233 
234 
235 void KPlayer::setGroup(const QString& group)
236 { d->mGroup = group; }
237 
238 const QString& KPlayer::group() const
239 { return d->mGroup.value(); }
240 
241 void KPlayer::setName(const QString& name)
242 { d->mName = name; }
243 
244 const QString& KPlayer::name() const
245 { return d->mName.value(); }
246 
247 quint32 KPlayer::id() const
248 { return d->mId; }
249 
250 KGamePropertyHandler * KPlayer::dataHandler()
251 { return &d->mProperties; }
252 
253 void KPlayer::setVirtual(bool v)
254 { d->mVirtual = v; }
255 
256 bool KPlayer::isVirtual() const
257 { return d->mVirtual;}
258 
259 void KPlayer::setNetworkPlayer(KPlayer* p)
260 { d->mNetworkPlayer = p; }
261 
262 KPlayer* KPlayer::networkPlayer() const
263 { return d->mNetworkPlayer; }
264 
265 int KPlayer::networkPriority() const
266 { return d->mPriority; }
267 
268 void KPlayer::setNetworkPriority(int p)
269 { d->mPriority = p; }
270 
271 bool KPlayer::addGameIO(KGameIO *input)
272 {
273  if (!input)
274  {
275  return false;
276  }
277  d->mInputList.append(input);
278  input->initIO(this); // set player and init device
279  return true;
280 }
281 
282 // input=0, remove all
283 bool KPlayer::removeGameIO(KGameIO *targetinput,bool deleteit)
284 {
285  kDebug(11001) << ":" << targetinput << "delete=" << deleteit;
286  bool result=true;
287  if (!targetinput) // delete all
288  {
289  KGameIO *input;
290  while(!d->mInputList.isEmpty())
291  {
292  input = d->mInputList.first();
293  if (input) removeGameIO(input,deleteit);
294  }
295  }
296  else
297  {
298 // kDebug(11001) << "remove IO" << targetinput;
299  if (deleteit)
300  {
301  delete targetinput;
302  }
303  else
304  {
305  targetinput->setPlayer(0);
306  result = d->mInputList.removeAll(targetinput);
307  }
308  }
309  return result;
310 }
311 
312 bool KPlayer::hasRtti(int rtti) const
313 {
314  return findRttiIO(rtti) != 0;
315 }
316 
317 KGameIO * KPlayer::findRttiIO(int rtti) const
318 {
319  QListIterator<KGameIO*> it(d->mInputList);
320  while (it.hasNext())
321  {
322  KGameIO* curGameIO = it.next();
323  if (curGameIO->rtti() == rtti)
324  {
325  return curGameIO;
326  }
327  }
328  return 0;
329 }
330 
331 int KPlayer::calcIOValue()
332 {
333  int value=0;
334  QListIterator<KGameIO*> it(d->mInputList);
335  while (it.hasNext())
336  {
337  value|=it.next()->rtti();
338  }
339  return value;
340 }
341 
342 bool KPlayer::setTurn(bool b, bool exclusive)
343 {
344  kDebug(11001) << ":" << id() << " (" << this << ") to" << b;
345  if (!isActive())
346  {
347  return false;
348  }
349 
350  // if we get to do an exclusive turn all other players are disallowed
351  if (exclusive && b && game())
352  {
353  for ( KGame::KGamePlayerList::iterator it = game()->playerList()->begin();
354  it!=game()->playerList()->end(); ++it)
355  {
356  if ((*it)==this)
357  {
358  continue;
359  }
360  (*it)->setTurn(false,false);
361  }
362  }
363 
364  // Return if nothing changed
365  d->mMyTurn = b;
366 
367  return true;
368 }
369 
370 bool KPlayer::load(QDataStream &stream)
371 {
372  qint32 id,priority;
373  stream >> id >> priority;
374  setId(id);
375  setNetworkPriority(priority);
376 
377  // Load Player Data
378  //FIXME: maybe set all properties setEmitSignal(false) before?
379  d->mProperties.load(stream);
380 
381  qint16 cookie;
382  stream >> cookie;
383  if (cookie==KPLAYER_LOAD_COOKIE)
384  {
385  kDebug(11001) << " Player loaded propertly";
386  }
387  else
388  {
389  kError(11001) << " Player loading error. probably format error";
390  }
391 
392  // emit signalLoad(stream);
393  return true;
394 }
395 
396 bool KPlayer::save(QDataStream &stream)
397 {
398  stream << (qint32)id() << (qint32)networkPriority();
399 
400  d->mProperties.save(stream);
401 
402  stream << (qint16)KPLAYER_LOAD_COOKIE;
403 
404  //emit signalSave(stream);
405  return true;
406 }
407 
408 
409 void KPlayer::networkTransmission(QDataStream &stream,int msgid,quint32 sender)
410 {
411  //kDebug(11001) ": msgid=" << msgid << "sender=" << sender << "we are=" << id();
412  // PlayerProperties processed
413  bool issender;
414  if (game())
415  {
416  issender=sender==game()->gameId();
417  }
418  else
419  {
420  issender=true;
421  }
422  if (d->mProperties.processMessage(stream,msgid,issender))
423  {
424  return ;
425  }
426  switch(msgid)
427  {
428  case KGameMessage::IdPlayerInput:
429  {
430  kDebug(11001) << ": Got player move "
431  << "KPlayer (virtual) forwards it to the game object";
432  forwardInput(stream,false);
433  }
434  break;
435  default:
436  emit signalNetworkData(msgid - KGameMessage::IdUser,
437  ((QBuffer*)stream.device())->readAll(),sender,this);
438  kDebug(11001) << ": "
439  << "User data msgid" << msgid;
440  break;
441  }
442 
443 }
444 
445 KGamePropertyBase* KPlayer::findProperty(int id) const
446 {
447  return d->mProperties.find(id);
448 }
449 
450 bool KPlayer::addProperty(KGamePropertyBase* data)
451 {
452  return d->mProperties.addProperty(data);
453 }
454 
455 void KPlayer::sendProperty(int msgid, QDataStream& stream, bool* sent)
456 {
457  if (game())
458  {
459  bool s = game()->sendPlayerProperty(msgid, stream, id());
460  if (s)
461  {
462  *sent = true;
463  }
464  }
465 }
466 
467 void KPlayer::emitSignal(KGamePropertyBase *me)
468 {
469  // Notify KGameIO (Process) for a new turn
470  if (me->id()==KGamePropertyBase::IdTurn)
471  {
472  //kDebug(11001) << ": for KGamePropertyBase::IdTurn";
473  QListIterator<KGameIO*> it(d->mInputList);
474  while (it.hasNext())
475  {
476  it.next()->notifyTurn(d->mMyTurn.value());
477  }
478  }
479  emit signalPropertyChanged(me,this);
480 }
481 
482 // --------------------- DEBUG --------------------
483 void KPlayer::Debug()
484 {
485  kDebug(11001) << "------------------- KPLAYER -----------------------";
486  kDebug(11001) << "this: " << this;
487  kDebug(11001) << "rtti: " << rtti();
488  kDebug(11001) << "id : " << id();
489  kDebug(11001) << "Name : " << name();
490  kDebug(11001) << "Group: " << group();
491  kDebug(11001) << "Async: " << asyncInput();
492  kDebug(11001) << "myTurn: " << myTurn();
493  kDebug(11001) << "Virtual:" << isVirtual();
494  kDebug(11001) << "Active: " << isActive();
495  kDebug(11001) << "Priority:" << networkPriority();
496  kDebug(11001) << "Game :" << game();
497  kDebug(11001) << "#IOs: " << d->mInputList.count();
498  kDebug(11001) << "---------------------------------------------------";
499 }
500 
501 #include "kplayer.moc"
KGameIO::rtti
virtual int rtti() const =0
Run time idendification.
KPlayer::setNetworkPriority
void setNetworkPriority(int b)
Set whether this player can be replaced by a network player.
Definition: kplayer.cpp:268
KPlayer::networkPlayer
KPlayer * networkPlayer() const
Returns the player which got inactivated to allow this player to be set up via network.
Definition: kplayer.cpp:262
KGameMessage::IdPlayerProperty
Definition: kgamemessage.h:150
KPlayer::signalNetworkData
void signalNetworkData(int msgid, const QByteArray &buffer, quint32 sender, KPlayer *me)
The player object got a message which was targeted at it but has no default method to process it...
KPlayer::setVirtual
void setVirtual(bool v)
Definition: kplayer.cpp:253
KPlayer::id
quint32 id() const
Returns the id of the player.
Definition: kplayer.cpp:247
KPlayer::addProperty
bool addProperty(KGamePropertyBase *data)
Adds a property to a player.
Definition: kplayer.cpp:450
KGameMessage::IdUser
Definition: kgamemessage.h:169
KGame::systemPlayerInput
virtual bool systemPlayerInput(QDataStream &msg, KPlayer *player, quint32 sender=0)
Called when a player input arrives from KMessageServer.
Definition: kgame.cpp:739
KPlayer::~KPlayer
virtual ~KPlayer()
Definition: kplayer.cpp:106
KGamePropertyBase::IdName
Definition: kgameproperty.h:54
QListIterator::next
const T & next()
kgame.h
KPlayer::setTurn
bool setTurn(bool b, bool exclusive=true)
Sets whether this player is the next to turn.
Definition: kplayer.cpp:342
KPlayer::calcIOValue
int calcIOValue()
Calculates a checksum over the IO devices.
Definition: kplayer.cpp:331
QDataStream
KGamePropertyHandler
A collection class for KGameProperty objects.
Definition: kgamepropertyhandler.h:73
QObject::sender
QObject * sender() const
KPlayer::ioList
KGameIOList * ioList()
Returns a list of input devices.
Definition: kplayer.cpp:130
KPlayer::game
KGame * game() const
Query to which game the player belongs to.
Definition: kplayer.cpp:140
KPlayer::forwardMessage
virtual bool forwardMessage(QDataStream &msg, int msgid, quint32 receiver=0, quint32 sender=0)
Forwards Message to the game object..internal use only.
Definition: kplayer.cpp:180
KGamePropertyBase::IdTurn
Definition: kgameproperty.h:53
KPlayer::Debug
void Debug()
Gives debug output of the game status.
Definition: kplayer.cpp:483
QBuffer
KPlayer::emitSignal
void emitSignal(KGamePropertyBase *me)
Called by KGameProperty only! Internal function!
Definition: kplayer.cpp:467
KPlayer::setId
void setId(quint32 i)
Definition: kplayer.cpp:228
KPlayer::myTurn
bool myTurn() const
is it my turn to go
Definition: kplayer.cpp:175
KPlayer::isVirtual
bool isVirtual() const
Is this player a virtual player, ie is it created by mirroring a real player from another network gam...
Definition: kplayer.cpp:256
KPlayer::signalPropertyChanged
void signalPropertyChanged(KGamePropertyBase *property, KPlayer *me)
This signal is emmited if a player property changes its value and the property is set to notify this ...
KGameIO::setPlayer
void setPlayer(KPlayer *p)
Sets the player to which this IO belongs to.
Definition: kgameio.cpp:86
KPlayer::setUserId
void setUserId(int i)
Definition: kplayer.cpp:170
kgamepropertyhandler.h
KPlayer::findRttiIO
KGameIO * findRttiIO(int rtti) const
Finds the KGameIO devies with the given rtti code.
Definition: kplayer.cpp:317
KPlayer::name
virtual const QString & name() const
Definition: kplayer.cpp:244
KPlayer::userId
int userId() const
Returns the user defined id of the player This value can be used arbitrary by you to have some user i...
Definition: kplayer.cpp:165
kgameproperty.h
KPlayer::setActive
void setActive(bool v)
Set an player as active (true) or inactive (false)
Definition: kplayer.cpp:160
KPlayer::addGameIO
bool addGameIO(KGameIO *input)
Adds an IO device for the player.
Definition: kplayer.cpp:271
KGame::sendPlayerProperty
bool sendPlayerProperty(int msgid, QDataStream &s, quint32 playerId)
This is called by KPlayer::sendProperty only! Internal function!
Definition: kgame.cpp:1455
QObject
KPlayer::load
virtual bool load(QDataStream &stream)
Load a saved player, from file OR network.
Definition: kplayer.cpp:370
KPLAYER_LOAD_COOKIE
#define KPLAYER_LOAD_COOKIE
Definition: kplayer.cpp:36
KPlayer::setGroup
void setGroup(const QString &group)
A group the player belongs to.
Definition: kplayer.cpp:235
KPlayer::group
virtual const QString & group() const
Query the group the player belongs to.
Definition: kplayer.cpp:238
KPlayer::asyncInput
bool asyncInput() const
Query whether this player does asynchronous input.
Definition: kplayer.cpp:150
KPlayer::networkPriority
int networkPriority() const
Returns whether this player can be replaced by a network connection player.
Definition: kplayer.cpp:265
KGameMessage::IdPlayerInput
Definition: kgamemessage.h:162
KPlayer::hasRtti
bool hasRtti(int rtti) const
Checks whether this player has a IO device of the given rtti type.
Definition: kplayer.cpp:312
KPlayer::save
virtual bool save(QDataStream &stream)
Save a player to a file OR to network.
Definition: kplayer.cpp:396
QString
kgameio.h
QList< KGameIO * >
KGameIO::initIO
virtual void initIO(KPlayer *p)
Init this device by setting the player and e.g.
Definition: kgameio.cpp:91
kgamemessage.h
KPlayer
Base class for a game player.
Definition: kplayer.h:69
QList::end
iterator end()
KGamePropertyBase
Base class of KGameProperty.
Definition: kgameproperty.h:45
KPlayer::setNetworkPlayer
void setNetworkPlayer(KPlayer *p)
Sets this network player replacement.
Definition: kplayer.cpp:259
KPlayer::setGame
void setGame(KGame *game)
sets the game the player belongs to.
Definition: kplayer.cpp:135
KGame::sendPlayerInput
virtual bool sendPlayerInput(QDataStream &msg, KPlayer *player, quint32 sender=0)
Called by KPlayer to send a player input to the KMessageServer.
Definition: kgame.cpp:721
KPlayer::findProperty
KGamePropertyBase * findProperty(int id) const
Searches for a property of the player given its id.
Definition: kplayer.cpp:445
KGame
The main KDE game object.
Definition: kgame.h:60
KGamePropertyBase::IdGroup
Definition: kgameproperty.h:50
KPlayer::dataHandler
KGamePropertyHandler * dataHandler()
Definition: kplayer.cpp:250
kplayer.h
KGame::playerList
KGamePlayerList * playerList()
Returns a list of all active players.
Definition: kgame.cpp:711
KPlayer::networkTransmission
void networkTransmission(QDataStream &stream, int msgid, quint32 sender)
Receives a message.
Definition: kplayer.cpp:409
KPlayer::removeGameIO
bool removeGameIO(KGameIO *input=0, bool deleteit=true)
remove (and delete) a game IO device
Definition: kplayer.cpp:283
KGameNetwork::gameId
quint32 gameId() const
The unique ID of this game.
Definition: kgamenetwork.cpp:86
KPlayer::KPlayer
KPlayer()
Create a new player object.
Definition: kplayer.cpp:68
KPlayer::forwardInput
virtual bool forwardInput(QDataStream &msg, bool transmit=true, quint32 sender=0)
Forwards input to the game object..internal use only.
Definition: kplayer.cpp:194
KPlayer::setAsyncInput
void setAsyncInput(bool a)
Set whether this player can make turns/input all the time (true) or only when it is its turn (false) ...
Definition: kplayer.cpp:145
QListIterator
KGameIO
Base class for IO devices for games.
Definition: kgameio.h:65
KPlayer::isActive
bool isActive() const
Is this player an active player.
Definition: kplayer.cpp:155
QDataStream::device
QIODevice * device() const
KPlayer::rtti
virtual int rtti() const
The idendification of the player.
Definition: kplayer.cpp:125
KPlayer::setName
void setName(const QString &name)
Sets the name of the player.
Definition: kplayer.cpp:241
KGameNetwork::sendSystemMessage
bool sendSystemMessage(const QByteArray &buffer, int msgid, quint32 receiver=0, quint32 sender=0)
Sends a network message msg with a given msg id msgid to all clients.
Definition: kgamenetwork.cpp:408
KGameProperty< qint8 >
KGame::playerDeleted
void playerDeleted(KPlayer *player)
Called by the destructor of KPlayer to remove itself from the game.
Definition: kgame.cpp:500
KGamePropertyBase::id
int id() const
Definition: kgameproperty.h:241
KGamePropertyBase::IdUserId
Definition: kgameproperty.h:51
KPlayer::sendProperty
void sendProperty(int msgid, QDataStream &stream, bool *sent)
Called by KGameProperty only! Internal function!
Definition: kplayer.cpp:455
KGamePropertyBase::IdAsyncInput
Definition: kgameproperty.h:52
QListIterator::hasNext
bool hasNext() const
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:18:54 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

libkdegames/libkdegamesprivate/kgame

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

kdegames API Reference

Skip menu "kdegames API Reference"
  • granatier
  • kapman
  • kblackbox
  • kgoldrunner
  • kigo
  • kmahjongg
  • KShisen
  • ksquares
  • libkdegames
  •   highscore
  •   libkdegamesprivate
  •     kgame
  • libkmahjongg
  • palapeli
  •   libpala

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal