summaryrefslogtreecommitdiffstats
path: root/lskat/lskat/lskatdoc.cpp
diff options
context:
space:
mode:
authortoma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2009-11-25 17:56:58 +0000
committertoma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2009-11-25 17:56:58 +0000
commitc90c389a8a8d9d8661e9772ec4144c5cf2039f23 (patch)
tree6d8391395bce9eaea4ad78958617edb20c6a7573 /lskat/lskat/lskatdoc.cpp
downloadtdegames-c90c389a8a8d9d8661e9772ec4144c5cf2039f23.tar.gz
tdegames-c90c389a8a8d9d8661e9772ec4144c5cf2039f23.zip
Copy the KDE 3.5 branch to branches/trinity for new KDE 3.5 features.
BUG:215923 git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdegames@1054174 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'lskat/lskat/lskatdoc.cpp')
-rw-r--r--lskat/lskat/lskatdoc.cpp817
1 files changed, 817 insertions, 0 deletions
diff --git a/lskat/lskat/lskatdoc.cpp b/lskat/lskat/lskatdoc.cpp
new file mode 100644
index 00000000..8da62ea4
--- /dev/null
+++ b/lskat/lskat/lskatdoc.cpp
@@ -0,0 +1,817 @@
+/***************************************************************************
+ lskatdoc.cpp - description
+ -------------------
+ begin : Tue May 2 15:47:11 CEST 2000
+ copyright : (C) 2000 by Martin Heni
+ email : martin@heni-online.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+// include files for Qt
+#include <qdir.h>
+#include <qfileinfo.h>
+#include <time.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <pwd.h>
+#include <sys/types.h>
+
+
+// include files for KDE
+#include <klocale.h>
+
+// application specific includes
+#include "lskatdoc.h"
+#include "lskat.h"
+#include "lskatview.h"
+#include <kcarddialog.h>
+
+QPtrList<LSkatView> *LSkatDoc::pViewList = 0L;
+
+LSkatDoc::LSkatDoc(QWidget *parent, const char *name) : QObject(parent, name)
+{
+ int i;
+ if(!pViewList)
+ {
+ pViewList = new QPtrList<LSkatView>();
+ }
+
+ pViewList->setAutoDelete(true);
+
+ isrunning=0;
+ wasgame=false;
+ initrandom();
+ // Allow translation of playernames
+ /*
+ names[0]=i18n("Alice");
+ names[1]=i18n("Bob");
+ */
+
+ for (i=0;i<14;i++) cardvalues[i]=0;
+ cardvalues[(int)Ace]=11;
+ cardvalues[(int)Ten]=10;
+ cardvalues[(int)King]=4;
+ cardvalues[(int)Queen]=3;
+ cardvalues[(int)Jack]=2;
+
+ /*
+ computerlevel=2;
+ playedby[1]=KG_INPUTTYPE_INTERACTIVE;
+ playedby[0]=KG_INPUTTYPE_PROCESS;
+ // playedby[1]=KG_INPUTTYPE_INTERACTIVE;
+ */
+
+
+ isintro=1;
+ server=false;
+ port=7432;
+ host="";
+ Name="";
+ remoteswitch=false;
+
+
+ ClearStats();
+}
+
+LSkatDoc::~LSkatDoc()
+{
+}
+
+void LSkatDoc::addView(LSkatView *view)
+{
+ pViewList->append(view);
+}
+
+void LSkatDoc::removeView(LSkatView *view)
+{
+ pViewList->remove(view);
+}
+
+void LSkatDoc::setAbsFilePath(const QString &filename)
+{
+ absFilePath=filename;
+}
+
+const QString &LSkatDoc::getAbsFilePath() const
+{
+ return absFilePath;
+}
+
+void LSkatDoc::setTitle(const QString &_t)
+{
+ title=_t;
+}
+
+const QString &LSkatDoc::getTitle() const
+{
+ return title;
+}
+
+void LSkatDoc::InitMove(LSkatView *sender,int player,int x,int y)
+{
+ LSkatView *w;
+ if(pViewList)
+ {
+ for(w=pViewList->first(); w!=0; w=pViewList->next())
+ {
+ if(w!=sender) w->InitMove(player,x,y);
+ }
+ }
+
+}
+void LSkatDoc::slotUpdateAllViews(LSkatView *sender)
+{
+ LSkatView *w;
+ if(pViewList)
+ {
+ for(w=pViewList->first(); w!=0; w=pViewList->next())
+ {
+ if(w!=sender)
+ w->repaint();
+ }
+ }
+}
+void LSkatDoc::UpdateViews(int mode)
+{
+ LSkatView *w;
+ if (IsIntro()) return ;
+ if(pViewList)
+ {
+ for(w=pViewList->first(); w!=0; w=pViewList->next())
+ {
+ if (mode & UPDATE_STATUS) w->updateStatus();
+ }
+ }
+}
+
+bool LSkatDoc::saveModified()
+{
+ return true;
+}
+
+void LSkatDoc::closeDocument()
+{
+ deleteContents();
+}
+
+bool LSkatDoc::newDocument(KConfig * /*config*/,QString path)
+{
+ int res;
+ modified=false;
+ absFilePath=QDir::homeDirPath();
+ title=i18n("Untitled");
+ if (global_debug>1) printf("path=%s\n",path.latin1());
+ res=LoadBitmap(path);
+ if (res==0) return false;
+ return true;
+}
+
+bool LSkatDoc::LoadGrafix(QString path)
+{
+ int res;
+ res=LoadCards(cardPath);
+ if (res==0) return false;
+ res=LoadDeck(deckPath);
+ if (res==0) return false;
+ return true;
+}
+
+bool LSkatDoc::SetCardDeckPath(QString deck,QString card)
+{
+ bool update=false;
+ if (!deck.isNull() && deck!=deckPath)
+ {
+ update=true;
+ deckPath=deck;
+ LoadDeck(deckPath);
+ }
+ if (!card.isNull() && card!=cardPath)
+ {
+ update=true;
+ cardPath=card;
+ LoadCards(cardPath);
+ }
+ return update;
+}
+
+bool LSkatDoc::openDocument(const QString &filename, const char * /*format*/ /*=0*/)
+{
+ QFileInfo fileInfo(filename);
+ title=fileInfo.fileName();
+ absFilePath=fileInfo.absFilePath();
+ /////////////////////////////////////////////////
+ // TODO: Add your document opening code here
+ /////////////////////////////////////////////////
+
+ modified=false;
+ return true;
+}
+
+bool LSkatDoc::saveDocument(const QString & /*filename*/, const char * /*format*/ /*=0*/)
+{
+ /////////////////////////////////////////////////
+ // TODO: Add your document saving code here
+ /////////////////////////////////////////////////
+
+ modified=false;
+ return true;
+}
+
+void LSkatDoc::deleteContents()
+{
+ /////////////////////////////////////////////////
+ // TODO: Add implementation to delete the document contents
+ /////////////////////////////////////////////////
+
+}
+
+// Called after game ends..give points to players
+void LSkatDoc::EvaluateGame()
+{
+ if (score[0]+score[1]!=120)
+ {
+ printf("Warning: Score does not end up to 120\n");
+ }
+ stat_games[0]++;
+ stat_games[1]++;
+ if (score[0]==score[1]) // drawn
+ {
+ stat_points[0]++;
+ stat_points[1]++;
+ }
+ else if (score[0]>score[1])
+ {
+ stat_won[0]++;
+ stat_points[0]+=2;
+ if (score[0]>=90) stat_points[0]++; // Schneider
+ if (score[0]>=120) stat_points[0]++; // SChwarz
+ }
+ else
+ {
+ stat_won[1]++;
+ stat_points[1]+=2;
+ if (score[1]>=90) stat_points[1]++; // Schneider
+ if (score[1]>=120) stat_points[1]++; // SChwarz
+ }
+}
+
+void LSkatDoc::EndGame(bool aborted)
+{
+ if (aborted)
+ {
+ stat_brk[0]++;
+ stat_brk[1]++;
+ }
+ else
+ {
+ startplayer=1-began_game;
+ }
+ isrunning=0;
+ wasgame=true;
+}
+
+void LSkatDoc::NewGame()
+{
+ int i,r;
+ int num[NO_OF_CARDS];
+
+ isintro=0;
+
+ began_game=startplayer;
+ for (i=0;i<NO_OF_TILES;i++)
+ {
+ cardheight[i]=2;
+ }
+ trump=(CCOLOUR)(random(4));
+ if (global_debug>5) printf("Trump=%d\n",trump);
+ if (random(8)==0) trump=Grand; // grand
+
+ // Fast drawing of random cards
+ for (i=0;i<NO_OF_CARDS;i++)
+ {
+ num[i]=i;
+ }
+ for (i=0;i<NO_OF_CARDS;i++)
+ {
+ r=random(NO_OF_CARDS-i); // cards available 32-i (+1)
+ card[i]=num[r];
+ num[r]=num[NO_OF_CARDS-i-1]; // shift numbers
+ }
+ isrunning=1;
+ movestatus=-1;
+ currentplayer=startplayer;
+ laststartplayer=-1;
+ moveno=0;
+ computerscore=0;
+ lock=false;
+ for (i=0;i<2;i++)
+ {
+ score[i]=0;
+ curmove[i]=-1;
+ }
+}
+
+int LSkatDoc::GetMove(int no) {return curmove[no];}
+
+CCOLOUR LSkatDoc::GetTrump()
+{
+ return trump;
+}
+void LSkatDoc::SetTrump(CCOLOUR i)
+{
+ trump=i;
+}
+
+// pos=0..7, height=2..1..(0 no card left), player=0..1
+int LSkatDoc::GetCard(int player, int pos,int height)
+{
+ int i;
+ if (height==0) return -1;
+ height=2-height;
+
+ i=NO_OF_TILES*player+8*height+pos;
+ return card[i];
+}
+
+// pos=0..7, player=0..1
+int LSkatDoc::GetHeight(int player, int pos)
+{
+ int i;
+ i=8*player+pos;
+ return cardheight[i];
+}
+// pos=0..7, player=0..1
+void LSkatDoc::SetHeight(int player, int pos,int h)
+{
+ int i;
+ i=8*player+pos;
+ cardheight[i]=h;
+}
+
+
+int LSkatDoc::random(int max)
+{
+double value;
+int r;
+ r=rand();
+ value=(double)((double)r*(double)max)/(double)RAND_MAX;
+ return (int)value;
+}
+
+void LSkatDoc::initrandom()
+{
+ srand( (unsigned)time( NULL ) ); // randomize
+}
+
+bool LSkatDoc::IsRunning() {return isrunning;}
+
+bool LSkatDoc::LegalMove(int p1, int p2)
+{
+ CCOLOUR col1,col2,col3;
+ CCARD card1,card2,card3;
+ card1=(CCARD)((p1)/4);
+ col1=(CCOLOUR)((p1)%4);
+ card2=(CCARD)((p2)/4);
+ col2=(CCOLOUR)((p2)%4);
+
+ // force trump colour
+ if (card1==Jack) col1=trump;
+ if (card2==Jack) col2=trump;
+
+ // same colour always ok
+ if (col1==col2) return true;
+
+ // Search for same colour
+ bool flag=true;
+ for (int i=0;i<8;i++)
+ {
+ int h,c;
+ h=GetHeight(1-startplayer,i);
+ if (h==0) continue;
+ c=GetCard(1-startplayer,i,h);
+ card3=(CCARD)((c)/4);
+ col3=(CCOLOUR)((c)%4);
+ if (card3==Jack) col3=trump;
+
+ if (col3==col1)
+ {
+ flag=false;
+ break;
+ }
+ }
+ if (flag) return true;
+
+ return false;
+}
+
+int LSkatDoc::PrepareMove(int player,int pos)
+{
+ int h,card;
+ h=GetHeight(player,pos);
+ if (h==0) return -1; // not possible
+ if (player!=currentplayer) return -2; // wrong player
+
+ card=GetCard(player,pos,h);
+
+ // New round
+ if (currentplayer==startplayer)
+ {
+ curmove[0]=-1;
+ curmove[1]=-1;
+ }
+ else
+ {
+ if (!LegalMove(curmove[startplayer],card))
+ {
+ printf("Illegal move\n");
+ return -3;
+ }
+ }
+ lock=true;
+
+ movestatus=card;
+ SetHeight(player,pos,h-1);
+ return 1;
+}
+int LSkatDoc::MakeMove()
+{
+ lock=false;
+ curmove[currentplayer]=movestatus;
+ if (currentplayer==startplayer)
+ {
+ moveno++;
+ currentplayer=1-startplayer;
+ }
+ else
+ {
+ laststartplayer=startplayer;
+
+ if (WonMove(curmove[startplayer],curmove[1-startplayer]))
+ {
+ // switch startplayer
+ startplayer=1-startplayer;
+ }
+ else
+ {
+ }
+ currentplayer=startplayer;
+ score[startplayer]+=CardValue(curmove[0]);
+ score[startplayer]+=CardValue(curmove[1]);
+ if (moveno==NO_OF_TILES)
+ {
+ EndGame(false);
+ return 2;
+ }
+ }
+ movestatus=-1;
+ return 1;
+}
+int LSkatDoc::CardValue(int card)
+{
+ int card1;
+
+ card1=card/4;
+ return cardvalues[card1];
+}
+
+int LSkatDoc::WonMove(int c1,int c2)
+{
+ CCOLOUR col1,col2;
+ CCARD card1,card2;
+
+ card1=(CCARD)((c1)/4);
+ col1=(CCOLOUR)((c1)%4);
+ card2=(CCARD)((c2)/4);
+ col2=(CCOLOUR)((c2)%4);
+
+ // Two jacks
+ if (card1==Jack && card2==Jack)
+ {
+ if (col1<col2) return 0;
+ else return 1;
+ }
+ // One Jack wins always
+ if (card1==Jack) return 0;
+ if (card2==Jack) return 1;
+
+ // higher one wins if same colour
+ if (col1==col2)
+ {
+ if (card1==Ten)
+ {
+ if (card2==Ace) return 1;
+ else return 0;
+ }
+ if (card2==Ten)
+ {
+ if (card1==Ace) return 0;
+ return 1;
+ }
+
+ if ((int)card1<(int)card2) return 0;
+ return 1;
+ }
+ // trump wins
+ if (col1==trump) return 0;
+ if (col2==trump) return 1;
+
+ // first one wins
+ return 0;
+
+}
+
+int LSkatDoc::GetMoveStatus() {return movestatus;}
+void LSkatDoc::SetMoveStatus(int i) { movestatus=i; }
+int LSkatDoc::GetCurrentPlayer() {return currentplayer;}
+void LSkatDoc::SetCurrentPlayer(int i) {currentplayer=i;}
+int LSkatDoc::GetStartPlayer() {return startplayer;}
+void LSkatDoc::SetStartPlayer(int i) {startplayer=i;}
+
+void LSkatDoc::SetName(int no, QString n) { names[no]=n; }
+QString LSkatDoc::GetName(int no) {return names[no];}
+int LSkatDoc::GetScore(int no) {return score[no];}
+
+int LSkatDoc::GetMoveNo() {return moveno;}
+/*
+void LSkatDoc::SetDeckNo(int no) {deckno=no;}
+int LSkatDoc::GetDeckNo() {return deckno;}
+*/
+
+
+int LSkatDoc::GetLastStartPlayer() {return laststartplayer;}
+
+KG_INPUTTYPE LSkatDoc::GetPlayedBy(int no) {return playedby[no];}
+void LSkatDoc::SetPlayedBy(int no,KG_INPUTTYPE type) {playedby[no]=type;}
+int LSkatDoc::GetComputerLevel() {return computerlevel;}
+void LSkatDoc::SetComputerLevel(int lev) {computerlevel=lev;}
+
+void LSkatDoc::SetComputerScore(int sc) {computerscore=sc;}
+int LSkatDoc::GetComputerScore() {return computerscore;}
+void LSkatDoc::SetLock() {lock=true;}
+void LSkatDoc::ReleaseLock() {lock=false;}
+bool LSkatDoc::IsLocked() {return lock;}
+bool LSkatDoc::IsIntro() {return isintro;}
+bool LSkatDoc::WasRunning() {return wasgame;}
+void LSkatDoc::SetIntro(bool b) {isintro=b;}
+
+int LSkatDoc::LoadBitmap(QString path)
+{
+ int i;
+ QString buf;
+ if (global_debug>5) printf("Loading bitmaps\n");
+ for (i=0;i<NO_OF_TRUMPS;i++)
+ {
+ buf.sprintf("%st%d.png",path.latin1(),i+1);
+ if(!mPixTrump[i].load(buf))
+ {
+ printf("Fatal error: bitmap %s not found \n",buf.latin1());
+ }
+ }
+
+
+ for (i=0;i<3;i++)
+ {
+ buf.sprintf("%stype%d.png",path.latin1(),i+1);
+ if (!mPixType[i].load(buf))
+ {
+ printf("Fatal error: bitmap %s not found \n",buf.latin1());
+ }
+ }
+
+ buf.sprintf("%sbackground.png",path.latin1());
+
+ mPixBackground.load(buf);
+ if (!mPixBackground.load(buf))
+ {
+ printf("Fatal error: bitmap %s not found \n",buf.latin1());
+ }
+
+ for (i=0;i<NO_OF_ANIM;i++)
+ {
+ buf.sprintf("%s4000%02d.png",path.latin1(),i);
+ if(!mPixAnim[i].load(buf))
+ {
+ printf("Fatal error: bitmap %s not found \n",buf.latin1());
+ }
+ }
+ return 1;
+}
+
+
+int LSkatDoc::LoadCards(QString path)
+{
+ QString buf;
+ for (int i=0;i<NO_OF_CARDS;i++)
+ {
+ buf.sprintf("%s%d.png",path.latin1(),i+1);
+ if(!mPixCard[i].load(buf))
+ {
+ printf("Fatal error: bitmap %s not found \n",buf.latin1());
+ return 0;
+ }
+ }
+ cardsize=mPixCard[0].size();
+ return 1;
+}
+
+int LSkatDoc::LoadDeck(QString path)
+{
+ if (!mPixDeck.load(path))return 0;
+ return 1;
+}
+
+void LSkatDoc::SetInputHandler(KEInput *i)
+{
+ inputHandler=i;
+}
+KEInput *LSkatDoc::QueryInputHandler()
+{
+ return inputHandler;
+}
+
+int LSkatDoc::SwitchStartPlayer()
+{
+ startplayer=1-startplayer;
+ return startplayer;
+}
+
+bool LSkatDoc::IsServer()
+{
+ return server;
+}
+void LSkatDoc::SetServer(bool b)
+{
+ server=b;
+}
+void LSkatDoc::SetHost(QString h)
+{
+ host=h;
+}
+void LSkatDoc::SetName(const QString& n)
+{
+ Name=n;
+}
+void LSkatDoc::SetPort(short p)
+{
+ port=p;
+}
+QString LSkatDoc::QueryHost()
+{
+ return host;
+}
+short LSkatDoc::QueryPort()
+{
+ return port;
+}
+QString LSkatDoc::QueryName() const
+{
+ return Name;
+}
+int *LSkatDoc::GetCardP()
+{
+ return card;
+}
+int *LSkatDoc::GetCardHeightP()
+{
+ return cardheight;
+}
+
+void LSkatDoc::SetCard(int no,int c)
+{
+ card[no]=c;
+}
+void LSkatDoc::SetRemoteSwitch(bool b)
+{
+ remoteswitch=b;
+}
+bool LSkatDoc::IsRemoteSwitch()
+{
+ return remoteswitch;
+}
+
+int LSkatDoc::GetStatWon(int no)
+{
+ return stat_won[no];
+}
+int LSkatDoc::GetStatGames(int no)
+{
+ return stat_games[no];
+}
+int LSkatDoc::GetStatAborted(int no)
+{
+ return stat_brk[no];
+}
+int LSkatDoc::GetStatPoints(int no)
+{
+ return stat_points[no];
+}
+
+QString LSkatDoc::GetProcess()
+{
+ return procfile;
+}
+
+void LSkatDoc::ClearStats()
+{
+ for (int j=0;j<2;j++)
+ {
+ stat_won[j]=0;
+ stat_points[j]=0;
+ stat_games[j]=0;
+ stat_brk[j]=0;
+ }
+}
+void LSkatDoc::ReadConfig(KConfig *config)
+{
+ KConfig emailCfg( "emaildefaults", true );
+ emailCfg.setGroup( "UserInfo" );
+ QString name = emailCfg.readEntry( "FullName" );
+ if ( name.isEmpty() )
+ {
+ struct passwd *pw = getpwuid( getuid() );
+ if ( pw )
+ name = QString::fromLocal8Bit( pw->pw_gecos );
+ }
+
+ config->setGroup("Parameter");
+ host=config->readEntry("host");
+ port=(unsigned short)config->readNumEntry("port",7432);
+ procfile=config->readEntry("process",QCString("lskatproc"));
+ Name=config->readEntry("gamename");
+ names[0]=config->readEntry("Name1",i18n("Alice"));
+ // names[1]=config->readEntry("Name2",i18n("Bob"));
+ names[1]=config->readEntry("Name2", name.isEmpty() ? i18n("Bob") : name);
+
+
+ // This is for debug and testing as you can run it from the CVS without
+ // installing the carddecks !
+ // For the release version you can remove the aruments to the following two
+ // functions !!!!
+ cardPath=config->readPathEntry("cardpath", KCardDialog::getDefaultCardDir());
+ deckPath=config->readPathEntry("deckpath", KCardDialog::getDefaultDeck());
+
+ // Debug only
+ if (global_debug>3)
+ printf("cardPath=%s\ndeckPath=%s\n",cardPath.latin1(),deckPath.latin1());
+
+ startplayer=config->readNumEntry("Startplayer",0);
+ if (startplayer>1 || startplayer<0) startplayer=0;
+ began_game=startplayer;
+ computerlevel=config->readNumEntry("Level",2);
+ playedby[0]=(KG_INPUTTYPE)config->readNumEntry("Player1",
+ (int)KG_INPUTTYPE_PROCESS);
+ playedby[1]=(KG_INPUTTYPE)config->readNumEntry("Player2",
+ (int)KG_INPUTTYPE_INTERACTIVE);
+
+ stat_won[0]=config->readNumEntry("Stat1W",0);
+ stat_won[1]=config->readNumEntry("Stat2W",0);
+ stat_brk[0]=config->readNumEntry("Stat1B",0);
+ stat_brk[1]=config->readNumEntry("Stat2B",0);
+ stat_points[0]=config->readNumEntry("Stat1P",0);
+ stat_points[1]=config->readNumEntry("Stat2P",0);
+ stat_games[0]=config->readNumEntry("Stat1G",0);
+ stat_games[1]=config->readNumEntry("Stat2G",0);
+}
+
+/** write config file */
+void LSkatDoc::WriteConfig(KConfig *config)
+{
+ config->setGroup("Parameter");
+ config->writeEntry("host",host);
+ config->writeEntry("port",port);
+ config->writeEntry("process",procfile);
+ config->writePathEntry("tmppath",picpath);
+ config->writeEntry("delpath",delpath);
+ config->writeEntry("Name1",names[0]);
+ config->writeEntry("Name2",names[1]);
+ config->writeEntry("gamename",Name);
+
+ config->writeEntry("Startplayer",startplayer);
+ config->writeEntry("Level",computerlevel);
+ config->writeEntry("Player1",int(playedby[0]));
+ config->writeEntry("Player2",int(playedby[1]));
+
+ config->writeEntry("Stat1W",stat_won[0]);
+ config->writeEntry("Stat2W",stat_won[1]);
+ config->writeEntry("Stat1B",stat_brk[0]);
+ config->writeEntry("Stat2B",stat_brk[1]);
+ config->writeEntry("Stat1P",stat_points[0]);
+ config->writeEntry("Stat2P",stat_points[1]);
+ config->writeEntry("Stat1G",stat_games[0]);
+ config->writeEntry("Stat2G",stat_games[1]);
+
+ config->writePathEntry("cardpath",cardPath);
+ config->writePathEntry("deckpath",deckPath);
+
+ config->sync();
+}
+
+#include "lskatdoc.moc"