36 files changed, 3035 insertions, 0 deletions
diff --git a/apps/Games/backgammon.desktop b/apps/Games/backgammon.desktop new file mode 100644 index 0000000..a61be25 --- a/dev/null +++ b/apps/Games/backgammon.desktop | |||
@@ -0,0 +1,6 @@ | |||
1 | [Desktop Entry] | ||
2 | Comment=Backgammon | ||
3 | Exec=backgammon | ||
4 | Icon=backgammon/backgammon | ||
5 | Type=Application | ||
6 | Name=BackGammon | ||
diff --git a/help/en/html/backgammon.html b/help/en/html/backgammon.html new file mode 100755 index 0000000..886a901 --- a/dev/null +++ b/help/en/html/backgammon.html | |||
@@ -0,0 +1,71 @@ | |||
1 | <html> | ||
2 | <head> | ||
3 | <title>Backgammon</title> | ||
4 | </head> | ||
5 | <body> | ||
6 | |||
7 | <a name="top"></a> | ||
8 | <b><u>Backgammon</u></b><br> | ||
9 | version 0.9.5<br> | ||
10 | relased under GPL<br> | ||
11 | (c) Ralf Waspe 2002/2003<br> | ||
12 | rwaspe@web.de<br> | ||
13 | <hr> | ||
14 | <ul> | ||
15 | <li><a href="#how">How the game works</a></li> | ||
16 | <li><a href="#game">The Game menu</a></li> | ||
17 | <li><a href="#theme">The Theme menu</a></li> | ||
18 | <li><a href="#options">The Options menu</a></li> | ||
19 | <li><a href="#todo">ToDo List</a></li> | ||
20 | </ul> | ||
21 | <a href="#top">top</a><br> | ||
22 | <hr> | ||
23 | |||
24 | <a name="how"><b>How the game works</b><br></a> | ||
25 | If you don not know the rules of backgammon try google : "backgammon rules" <br> | ||
26 | Details on how this game works soon<br> | ||
27 | <a href="#top">top</a><br> | ||
28 | <hr> | ||
29 | |||
30 | <a name="game"><b>The Game menu</b><br></a> | ||
31 | <ul> | ||
32 | <li><b>new</b><br> | ||
33 | start a new game</li> | ||
34 | <li><b>load</b><br> | ||
35 | load a previusly saved game here</li> | ||
36 | <li><b>save</b><br> | ||
37 | save the current game.<br> | ||
38 | The game will be named automatically with the current date and time</li> | ||
39 | <li><b>delete</b><br> | ||
40 | delete a saved game</li> | ||
41 | </ul> | ||
42 | <a href="#top">top</a><br> | ||
43 | <hr> | ||
44 | |||
45 | <a name="theme"><b>The Theme menu</b><br></a> | ||
46 | <ul> | ||
47 | <li><b>new</b><br> | ||
48 | create a new theme or alter an existing one based on the componts save on your z.<br> | ||
49 | make sure to give it a unique name, so you do not overwrite an existing theme !</li> | ||
50 | <li><b>load</b><br> | ||
51 | load a theme</li> | ||
52 | <li><b>save</b><br> | ||
53 | save the current theme<br> | ||
54 | <li><b>default</b><br> | ||
55 | make the current theme the default theme (the one that gets loaded when you start the game)</li> | ||
56 | <li><b>delete</b><br> | ||
57 | delete a theme (the theme with the name default can not be deleted)</li> | ||
58 | </ul> | ||
59 | <a href="#top">top</a><br> | ||
60 | <hr> | ||
61 | |||
62 | <a name="options"><b>The Options menu</b><br></a> | ||
63 | blah<br> | ||
64 | <a href="#top">top</a><br> | ||
65 | <hr> | ||
66 | |||
67 | <a name="todo"><b>ToDo list</b><br></a> | ||
68 | eliminate bugs<br> | ||
69 | <a href="#top">top</a><br> | ||
70 | </body> | ||
71 | </html> | ||
diff --git a/noncore/games/backgammon/aidialog.cpp b/noncore/games/backgammon/aidialog.cpp new file mode 100644 index 0000000..9642ca5 --- a/dev/null +++ b/noncore/games/backgammon/aidialog.cpp | |||
@@ -0,0 +1,211 @@ | |||
1 | #include "aidialog.h" | ||
2 | |||
3 | #include <qgroupbox.h> | ||
4 | |||
5 | |||
6 | AI_Dialog::AI_Dialog(QWidget* parent,const char* name,bool modal,WFlags f) | ||
7 | : QDialog(parent,name,modal,f) | ||
8 | { | ||
9 | setCaption("AI Configuration"); | ||
10 | |||
11 | QGroupBox* settings=new QGroupBox("Settings",this); | ||
12 | settings->setGeometry(10,5,220,170); | ||
13 | |||
14 | QLabel* rescue_label=new QLabel("<b>Rescue</b>",settings); | ||
15 | rescue_label->setGeometry(50,20,50,20); | ||
16 | rescue=new QSpinBox(0,6,1,settings); | ||
17 | rescue->setGeometry(100,20,40,20); | ||
18 | QPushButton* rescuehelp=new QPushButton("?",settings); | ||
19 | rescuehelp->setGeometry(140,20,20,20); | ||
20 | connect(rescuehelp,SIGNAL(pressed()),this,SLOT(rescuehelp_pressed())); | ||
21 | connect(rescuehelp,SIGNAL(released()),this,SLOT(rescuehelp_released())); | ||
22 | |||
23 | QLabel* eliminate_label=new QLabel("<b>Eliminate</b>",settings); | ||
24 | eliminate_label->setGeometry(50,40,50,20); | ||
25 | eliminate=new QSpinBox(0,6,1,settings); | ||
26 | eliminate->setGeometry(100,40,40,20); | ||
27 | QPushButton* eliminatehelp=new QPushButton("?",settings); | ||
28 | eliminatehelp->setGeometry(140,40,20,20); | ||
29 | connect(eliminatehelp,SIGNAL(pressed()),this,SLOT(eliminatehelp_pressed())); | ||
30 | connect(eliminatehelp,SIGNAL(released()),this,SLOT(eliminatehelp_released())); | ||
31 | |||
32 | QLabel* expose_label=new QLabel("<b>Expose</b>",settings); | ||
33 | expose_label->setGeometry(50,60,50,20); | ||
34 | expose=new QSpinBox(0,6,1,settings); | ||
35 | expose->setGeometry(100,60,40,20); | ||
36 | QPushButton* exposeehelp=new QPushButton("?",settings); | ||
37 | exposeehelp->setGeometry(140,60,20,20); | ||
38 | connect(exposeehelp,SIGNAL(pressed()),this,SLOT(exposehelp_pressed())); | ||
39 | connect(exposeehelp,SIGNAL(released()),this,SLOT(exposehelp_released())); | ||
40 | |||
41 | QLabel* protect_label=new QLabel("<b>Protect</b>",settings); | ||
42 | protect_label->setGeometry(50,80,50,20); | ||
43 | protect=new QSpinBox(0,6,1,settings); | ||
44 | protect->setGeometry(100,80,40,20); | ||
45 | QPushButton* protecthelp=new QPushButton("?",settings); | ||
46 | protecthelp->setGeometry(140,80,20,20); | ||
47 | connect(protecthelp,SIGNAL(pressed()),this,SLOT(protecthelp_pressed())); | ||
48 | connect(protecthelp,SIGNAL(released()),this,SLOT(protecthelp_released())); | ||
49 | |||
50 | QLabel* safe_label=new QLabel("<b>Safe</b>",settings); | ||
51 | safe_label->setGeometry(50,100,50,20); | ||
52 | safe=new QSpinBox(0,6,1,settings); | ||
53 | safe->setGeometry(100,100,40,20); | ||
54 | QPushButton* safeehelp=new QPushButton("?",settings); | ||
55 | safeehelp->setGeometry(140,100,20,20); | ||
56 | connect(safeehelp,SIGNAL(pressed()),this,SLOT(safehelp_pressed())); | ||
57 | connect(safeehelp,SIGNAL(released()),this,SLOT(safehelp_released())); | ||
58 | |||
59 | QLabel* empty_label=new QLabel("<b>Empty</b>",settings); | ||
60 | empty_label->setGeometry(50,120,50,20); | ||
61 | empty=new QSpinBox(0,6,1,settings); | ||
62 | empty->setGeometry(100,120,40,20); | ||
63 | QPushButton* emptyhelp=new QPushButton("?",settings); | ||
64 | emptyhelp->setGeometry(140,120,20,20); | ||
65 | connect(emptyhelp,SIGNAL(pressed()),this,SLOT(emptyhelp_pressed())); | ||
66 | connect(emptyhelp,SIGNAL(released()),this,SLOT(emptyhelp_released())); | ||
67 | |||
68 | defaultvalues=new QPushButton("Default Values",settings); | ||
69 | defaultvalues->setGeometry(60,140,90,20); | ||
70 | connect(defaultvalues,SIGNAL(clicked()),this,SLOT(setDefaultValues())); | ||
71 | |||
72 | QGroupBox* helpbox=new QGroupBox("Help",this); | ||
73 | helpbox->setGeometry(10,185,220,90); | ||
74 | |||
75 | help=new QLabel(helpbox); | ||
76 | help->setGeometry(10,15,200,65); | ||
77 | |||
78 | setHelpText(); | ||
79 | showMaximized(); | ||
80 | } | ||
81 | |||
82 | |||
83 | AI_Dialog::~AI_Dialog() | ||
84 | { | ||
85 | } | ||
86 | |||
87 | void AI_Dialog::rescuehelp_pressed() | ||
88 | { | ||
89 | setHelpText("rescue"); | ||
90 | } | ||
91 | |||
92 | void AI_Dialog::rescuehelp_released() | ||
93 | { | ||
94 | setHelpText(); | ||
95 | } | ||
96 | |||
97 | void AI_Dialog::eliminatehelp_pressed() | ||
98 | { | ||
99 | setHelpText("eliminate"); | ||
100 | } | ||
101 | |||
102 | void AI_Dialog::eliminatehelp_released() | ||
103 | { | ||
104 | setHelpText(); | ||
105 | } | ||
106 | |||
107 | void AI_Dialog::exposehelp_pressed() | ||
108 | { | ||
109 | setHelpText("expose"); | ||
110 | } | ||
111 | |||
112 | void AI_Dialog::exposehelp_released() | ||
113 | { | ||
114 | setHelpText(); | ||
115 | } | ||
116 | |||
117 | void AI_Dialog::protecthelp_pressed() | ||
118 | { | ||
119 | setHelpText("protect"); | ||
120 | } | ||
121 | |||
122 | void AI_Dialog::protecthelp_released() | ||
123 | { | ||
124 | setHelpText(); | ||
125 | } | ||
126 | |||
127 | void AI_Dialog::safehelp_pressed() | ||
128 | { | ||
129 | setHelpText("safe"); | ||
130 | } | ||
131 | |||
132 | void AI_Dialog::safehelp_released() | ||
133 | { | ||
134 | setHelpText(); | ||
135 | } | ||
136 | |||
137 | void AI_Dialog::emptyhelp_pressed() | ||
138 | { | ||
139 | setHelpText("empty"); | ||
140 | } | ||
141 | |||
142 | void AI_Dialog::emptyhelp_released() | ||
143 | { | ||
144 | setHelpText(); | ||
145 | } | ||
146 | |||
147 | |||
148 | |||
149 | void AI_Dialog::setDefaultValues() | ||
150 | { | ||
151 | rescue->setValue(6); | ||
152 | eliminate->setValue(4); | ||
153 | expose->setValue(1); | ||
154 | protect->setValue(5); | ||
155 | safe->setValue(3); | ||
156 | empty->setValue(2); | ||
157 | } | ||
158 | |||
159 | void AI_Dialog::setAISettings(const AISettings& values) | ||
160 | { | ||
161 | rescue->setValue(values.rescue); | ||
162 | eliminate->setValue(values.eliminate); | ||
163 | expose->setValue(values.expose); | ||
164 | protect->setValue(values.protect); | ||
165 | safe->setValue(values.safe); | ||
166 | empty->setValue(values.empty); | ||
167 | } | ||
168 | |||
169 | AISettings AI_Dialog::getAISettings() | ||
170 | { | ||
171 | AISettings ai; | ||
172 | ai.rescue=rescue->value(); | ||
173 | ai.eliminate=eliminate->value(); | ||
174 | ai.expose=expose->value(); | ||
175 | ai.protect=protect->value(); | ||
176 | ai.safe= safe->value(); | ||
177 | ai.empty=empty->value(); | ||
178 | return ai; | ||
179 | } | ||
180 | |||
181 | void AI_Dialog::setHelpText(const QString& type) | ||
182 | { | ||
183 | if(type=="rescue") | ||
184 | { | ||
185 | help->setText("Bring the pieces out of the endzone"); | ||
186 | } | ||
187 | else if(type=="eliminate") | ||
188 | { | ||
189 | help->setText("Eliminate an opponents piece"); | ||
190 | } | ||
191 | else if(type=="expose") | ||
192 | { | ||
193 | help->setText("Expose you own pieces.\nAfter such a move only one piece will remain in the slot"); | ||
194 | } | ||
195 | else if(type=="protect") | ||
196 | { | ||
197 | help->setText("Protect a single piece by\nputting another one in this slot"); | ||
198 | } | ||
199 | else if(type=="safe") | ||
200 | { | ||
201 | help->setText("Move piece to a slot already\noccupied by the player"); | ||
202 | } | ||
203 | else if(type=="empty") | ||
204 | { | ||
205 | help->setText("Move piece to an empty slot"); | ||
206 | } | ||
207 | else | ||
208 | { | ||
209 | help->setText("Press and hold the ? buttton\nnext to a field for help"); | ||
210 | } | ||
211 | } | ||
diff --git a/noncore/games/backgammon/aidialog.h b/noncore/games/backgammon/aidialog.h new file mode 100644 index 0000000..2597f8b --- a/dev/null +++ b/noncore/games/backgammon/aidialog.h | |||
@@ -0,0 +1,48 @@ | |||
1 | #ifndef AIDIALOG_H_ | ||
2 | #define AIDIALOG_H_ | ||
3 | |||
4 | #include "moveengine.h" | ||
5 | |||
6 | #include <qdialog.h> | ||
7 | #include <qlabel.h> | ||
8 | #include <qpushbutton.h> | ||
9 | #include <qspinbox.h> | ||
10 | |||
11 | class AI_Dialog : public QDialog | ||
12 | { | ||
13 | Q_OBJECT | ||
14 | private: | ||
15 | //GUI stuff | ||
16 | QPushButton* defaultvalues; | ||
17 | QSpinBox* rescue; | ||
18 | QSpinBox* eliminate; | ||
19 | QSpinBox* expose; | ||
20 | QSpinBox* protect; | ||
21 | QSpinBox* safe; | ||
22 | QSpinBox* empty; | ||
23 | QLabel* help; | ||
24 | public: | ||
25 | AI_Dialog(QWidget* parent=0,const char* name=0,bool modal=TRUE,WFlags f=0); | ||
26 | ~AI_Dialog(); | ||
27 | private slots: | ||
28 | void rescuehelp_pressed(); | ||
29 | void rescuehelp_released(); | ||
30 | void eliminatehelp_pressed(); | ||
31 | void eliminatehelp_released(); | ||
32 | void exposehelp_pressed(); | ||
33 | void exposehelp_released(); | ||
34 | void protecthelp_pressed(); | ||
35 | void protecthelp_released(); | ||
36 | void safehelp_pressed(); | ||
37 | void safehelp_released(); | ||
38 | void emptyhelp_pressed(); | ||
39 | void emptyhelp_released(); | ||
40 | void setDefaultValues(); | ||
41 | public: | ||
42 | void setAISettings(const AISettings& values); | ||
43 | AISettings getAISettings(); | ||
44 | private: | ||
45 | void setHelpText(const QString& type="default"); | ||
46 | }; | ||
47 | |||
48 | #endif //AIDIALOG_H | ||
diff --git a/noncore/games/backgammon/backgammon.control b/noncore/games/backgammon/backgammon.control new file mode 100644 index 0000000..528a8c3 --- a/dev/null +++ b/noncore/games/backgammon/backgammon.control | |||
@@ -0,0 +1,9 @@ | |||
1 | Files: bin/backgammon apps/Games/backgammon.desktop pics/backgammon help/en/html/backgammon.html | ||
2 | Priority: optional | ||
3 | Section: opie/games | ||
4 | Maintainer: Ralf Waspe <rwaspe@web.de> | ||
5 | Architecture: arm | ||
6 | Version: $QPE_VERSION-$SUB_VERSION | ||
7 | Depends: opie-base | ||
8 | Description: Backgammon Game | ||
9 | A Backgammon game for the Opie environment. | ||
diff --git a/noncore/games/backgammon/backgammon.cpp b/noncore/games/backgammon/backgammon.cpp new file mode 100644 index 0000000..38ccb49 --- a/dev/null +++ b/noncore/games/backgammon/backgammon.cpp | |||
@@ -0,0 +1,1043 @@ | |||
1 | #include "backgammon.h" | ||
2 | |||
3 | #include "aidialog.h" | ||
4 | #include "displaydialog.h" | ||
5 | #include "filedialog.h" | ||
6 | #include "playerdialog.h" | ||
7 | #include "rulesdialog.h" | ||
8 | #include "themedialog.h" | ||
9 | |||
10 | #include <qdatetime.h> | ||
11 | #include <qfile.h> | ||
12 | #include <qmessagebox.h> | ||
13 | #include <qstring.h> | ||
14 | #include <qtimer.h> | ||
15 | #include <qpe/qpeapplication.h> | ||
16 | #include <qpe/config.h> | ||
17 | #include <qpe/qpemenubar.h> | ||
18 | #include <qpe/resource.h> | ||
19 | |||
20 | #include <stdlib.h> | ||
21 | |||
22 | BackGammonView::BackGammonView(QCanvas* canvas,QWidget* parent) | ||
23 | :QCanvasView(canvas,parent) | ||
24 | { | ||
25 | //do nothing | ||
26 | } | ||
27 | |||
28 | |||
29 | |||
30 | BackGammonView::~BackGammonView() | ||
31 | { | ||
32 | //do nothing | ||
33 | } | ||
34 | |||
35 | |||
36 | |||
37 | void BackGammonView::contentsMousePressEvent(QMouseEvent* e) | ||
38 | { | ||
39 | int x=e->x(); | ||
40 | int y=e->y(); | ||
41 | emit mouse(x,y); | ||
42 | } | ||
43 | |||
44 | BackGammon::BackGammon(QWidget* parent, const char* name, WFlags fl) | ||
45 | : QWidget(parent, name, fl) | ||
46 | { | ||
47 | if (!name) setName("BackGammon"); | ||
48 | setCaption("Backgammon"); | ||
49 | setIcon( Resource::loadPixmap( "backgammon" ) ); | ||
50 | //general counter varaible | ||
51 | int a=0; | ||
52 | //the game engine | ||
53 | move=new MoveEngine(); | ||
54 | |||
55 | //load the default theme | ||
56 | Config conf("backgammon"); | ||
57 | if(!conf.isValid()) | ||
58 | { | ||
59 | qDebug("config file does not exist"); | ||
60 | conf.setGroup("general"); | ||
61 | conf.writeEntry("theme","default"); | ||
62 | conf.setGroup("rules"); | ||
63 | conf.writeEntry("move_with_pieces_out",false); | ||
64 | conf.writeEntry("nice_dice",false); | ||
65 | conf.setGroup("display"); | ||
66 | conf.writeEntry("small",false); | ||
67 | conf.writeEntry("warning",true); | ||
68 | conf.setGroup("ai"); | ||
69 | conf.writeEntry("rescue",6); | ||
70 | conf.writeEntry("eliminate",4); | ||
71 | conf.writeEntry("expose",1); | ||
72 | conf.writeEntry("protect",5); | ||
73 | conf.writeEntry("safe",3); | ||
74 | conf.writeEntry("empty",2); | ||
75 | |||
76 | } | ||
77 | conf.setGroup("general"); | ||
78 | theme_name=conf.readEntry("theme","default"); | ||
79 | QString theme_file=QPEApplication::qpeDir()+"/backgammon/"+theme_name+".theme"; | ||
80 | |||
81 | //the rules | ||
82 | conf.setGroup("rules"); | ||
83 | rules.move_with_pieces_out=conf.readBoolEntry("move_with_pieces_out",false); | ||
84 | rules.generous_dice=conf.readBoolEntry("nice_dice",false); | ||
85 | |||
86 | move->setRules(rules); | ||
87 | |||
88 | //get the AI settings | ||
89 | AISettings ai; | ||
90 | conf.setGroup("ai"); | ||
91 | ai.rescue=conf.readNumEntry("rescue",6); | ||
92 | ai.eliminate=conf.readNumEntry("eliminate",4); | ||
93 | ai.expose=conf.readNumEntry("expose",1); | ||
94 | ai.protect=conf.readNumEntry("protect",5); | ||
95 | ai.safe=conf.readNumEntry("safe",3); | ||
96 | ai.empty=conf.readNumEntry("empty",2); | ||
97 | move->setAISettings(ai); | ||
98 | |||
99 | //non qte styles are smaller | ||
100 | conf.setGroup("display"); | ||
101 | display.small=conf.readBoolEntry("small",false); | ||
102 | display.warning=conf.readBoolEntry("warning",true); | ||
103 | non_qte=display.small; | ||
104 | if(display.warning) | ||
105 | { | ||
106 | Config test("qpe"); | ||
107 | test.setGroup("Appearance"); | ||
108 | if(test.readEntry("Style")!="QPE") | ||
109 | { | ||
110 | displaySettings(); | ||
111 | } | ||
112 | } | ||
113 | offset=(non_qte) ? 5 : 0; | ||
114 | |||
115 | //get the theme component names | ||
116 | Config theme(theme_file,Config::File); | ||
117 | if(!theme.isValid()) | ||
118 | { | ||
119 | qDebug("theme file does not exist"); | ||
120 | theme.setGroup("theme"); | ||
121 | theme.writeEntry("board","casino_board_1"); | ||
122 | theme.writeEntry("pieces1","casino_pieces_blue"); | ||
123 | theme.writeEntry("pieces2","casino_pieces_white"); | ||
124 | theme.writeEntry("dice1","casino_dice"); | ||
125 | theme.writeEntry("dice2","casino_dice"); | ||
126 | theme.writeEntry("table","casino_table_green"); | ||
127 | theme.writeEntry("odds","casino_odds"); | ||
128 | } | ||
129 | theme.setGroup("theme"); | ||
130 | board_name=theme.readEntry("board","casino_board_1"); | ||
131 | piecesA_name=theme.readEntry("pieces1","casino_pieces_blue"); | ||
132 | piecesB_name=theme.readEntry("pieces2","casino_pieces_white"); | ||
133 | diceA_name=theme.readEntry("dice1","casino_dice"); | ||
134 | diceB_name=theme.readEntry("dice2","casino_dice"); | ||
135 | table_name=theme.readEntry("table","casino_table_green"); | ||
136 | odds_name=theme.readEntry("odds","casino_odds"); | ||
137 | |||
138 | |||
139 | //the menu | ||
140 | QPEMenuBar* menuBar = new QPEMenuBar(this); | ||
141 | |||
142 | QPopupMenu* gamemenu= new QPopupMenu(this); | ||
143 | gamemenu->insertItem("New",this,SLOT(newgame())); | ||
144 | gamemenu->insertSeparator(); | ||
145 | gamemenu->insertItem("Load",this,SLOT(loadgame())); | ||
146 | gamemenu->insertItem("Save",this,SLOT(savegame())); | ||
147 | gamemenu->insertSeparator(); | ||
148 | gamemenu->insertItem("Delete",this,SLOT(deletegame())); | ||
149 | menuBar->insertItem("Game",gamemenu); | ||
150 | |||
151 | QPopupMenu* thememenu= new QPopupMenu(this); | ||
152 | thememenu->insertItem("New",this,SLOT(newtheme())); | ||
153 | thememenu->insertSeparator(); | ||
154 | thememenu->insertItem("Load",this,SLOT(loadtheme())); | ||
155 | thememenu->insertItem("Save",this,SLOT(savetheme())); | ||
156 | thememenu->insertSeparator(); | ||
157 | thememenu->insertItem("Default",this,SLOT(themedefault())); | ||
158 | thememenu->insertItem("Delete",this,SLOT(deletetheme())); | ||
159 | menuBar->insertItem("Theme",thememenu); | ||
160 | |||
161 | QPopupMenu* optionmenu=new QPopupMenu(this); | ||
162 | optionmenu->insertItem("Player",this,SLOT(playerselect())); | ||
163 | optionmenu->insertSeparator(); | ||
164 | optionmenu->insertItem("AI",this,SLOT(modify_AI())); | ||
165 | optionmenu->insertItem("Rules",this,SLOT(setrules())); | ||
166 | optionmenu->insertItem("Display",this,SLOT(displaySettings())); | ||
167 | menuBar->insertItem("Options",optionmenu); | ||
168 | |||
169 | //status bar | ||
170 | message=new QLabel("<b>Backgammon</b>",this); | ||
171 | message->setGeometry(0,260,237,20); | ||
172 | message->setAlignment(AlignHCenter); | ||
173 | |||
174 | //the main area | ||
175 | area=new QCanvas(235-2*offset,235-2*offset); | ||
176 | boardview=new BackGammonView(area,this); | ||
177 | connect(boardview,SIGNAL(mouse(int,int)),this,SLOT(mouse(int,int))); | ||
178 | if(non_qte) | ||
179 | { | ||
180 | boardview->setGeometry(5,20,229,229); | ||
181 | } | ||
182 | else | ||
183 | { | ||
184 | boardview->setGeometry(1,20,237,237); | ||
185 | } | ||
186 | |||
187 | //the marker | ||
188 | marker_current=new QCanvasRectangle(area); | ||
189 | marker_current->setBrush(QColor(0,0,255)); | ||
190 | marker_current->setSize(15,5); | ||
191 | marker_current->setZ(1); | ||
192 | |||
193 | for(a=0;a<4;a++) | ||
194 | { | ||
195 | marker_next[a]=new QCanvasRectangle(area); | ||
196 | marker_next[a]->setBrush(QColor(0,255,0)); | ||
197 | marker_next[a]->setSize(15,5); | ||
198 | marker_next[a]->setZ(1); | ||
199 | } | ||
200 | |||
201 | connect(move,SIGNAL(done_dice1()),this,SLOT(done_dice1())); | ||
202 | connect(move,SIGNAL(done_dice2()),this,SLOT(done_dice2())); | ||
203 | connect(move,SIGNAL(done_dice3()),this,SLOT(done_dice3())); | ||
204 | connect(move,SIGNAL(done_dice4()),this,SLOT(done_dice4())); | ||
205 | connect(move,SIGNAL(nomove()),this,SLOT(nomove())); | ||
206 | connect(move,SIGNAL(player_finished(int)),this,SLOT(finished(int))); | ||
207 | |||
208 | //the pieces | ||
209 | p1=new CanvasImageItem*[15]; | ||
210 | p1_side=new CanvasImageItem*[15]; | ||
211 | QImage piece_1_all(Resource::loadImage("backgammon/pieces/"+piecesA_name)); | ||
212 | QImage piece_1_front=piece_1_all.copy(0,0,15,15); | ||
213 | QImage piece_1_side=piece_1_all.copy(0,15,15,5); | ||
214 | |||
215 | p2=new CanvasImageItem*[15]; | ||
216 | p2_side=new CanvasImageItem*[15]; | ||
217 | QImage piece_2_all(Resource::loadImage("backgammon/pieces/"+piecesB_name)); | ||
218 | QImage piece_2_front=piece_2_all.copy(0,0,15,15); | ||
219 | QImage piece_2_side=piece_2_all.copy(0,15,15,5); | ||
220 | |||
221 | |||
222 | for(a=0;a<15;a++) | ||
223 | { | ||
224 | p1[a]=new CanvasImageItem(piece_1_front,area); | ||
225 | p1[a]->setSize(15,15); | ||
226 | p1_side[a]=new CanvasImageItem(piece_1_side,area); | ||
227 | p1_side[a]->setSize(15,5); | ||
228 | |||
229 | p2[a]=new CanvasImageItem(piece_2_front,area); | ||
230 | p2[a]->setSize(15,15); | ||
231 | p2_side[a]=new CanvasImageItem(piece_2_side,area); | ||
232 | p2_side[a]->setSize(15,5); | ||
233 | } | ||
234 | draw(); | ||
235 | |||
236 | //the dice | ||
237 | QImage dicebgA_all(Resource::loadImage("backgammon/dice/"+diceA_name)); | ||
238 | diceA1=new CanvasImageItem*[7]; | ||
239 | diceA2=new CanvasImageItem*[7]; | ||
240 | QImage dicebgB_all(Resource::loadImage("backgammon/dice/"+diceB_name)); | ||
241 | diceB1=new CanvasImageItem*[7]; | ||
242 | diceB2=new CanvasImageItem*[7]; | ||
243 | QImage oddsbg_all=(Resource::loadImage("backgammon/odds/"+odds_name)); | ||
244 | //oddsDice=new CanvasImageItem*[6]; | ||
245 | |||
246 | |||
247 | for(a=0;a<7;a++) | ||
248 | { | ||
249 | QImage dicebgA=dicebgA_all.copy(a*25,0,25,25); | ||
250 | diceA1[a]=new CanvasImageItem(dicebgA,area); | ||
251 | diceA1[a]->setX(5-offset); | ||
252 | diceA1[a]->setY(205-2*offset); | ||
253 | diceA1[a]->setZ(1); | ||
254 | diceA1[a]->setSize(25,25); | ||
255 | diceA2[a]=new CanvasImageItem(dicebgA,area); | ||
256 | diceA2[a]->setX(35-offset); | ||
257 | diceA2[a]->setY(205-2*offset); | ||
258 | diceA2[a]->setZ(1); | ||
259 | diceA2[a]->setSize(25,25); | ||
260 | |||
261 | QImage dicebgB=dicebgB_all.copy(a*25,0,25,25); | ||
262 | diceB1[a]=new CanvasImageItem(dicebgB,area); | ||
263 | diceB1[a]->setX(175-offset); | ||
264 | diceB1[a]->setY(205-2*offset); | ||
265 | diceB1[a]->setZ(1); | ||
266 | diceB1[a]->setSize(25,25); | ||
267 | diceB2[a]=new CanvasImageItem(dicebgB,area); | ||
268 | diceB2[a]->setX(205-offset); | ||
269 | diceB2[a]->setY(205-2*offset); | ||
270 | diceB2[a]->setZ(1); | ||
271 | diceB2[a]->setSize(25,25); | ||
272 | |||
273 | /* | ||
274 | if(a<6) | ||
275 | { | ||
276 | QImage oddsbg=oddsbg_all.copy(a*15,0,15,15); | ||
277 | oddsDice[a]=new CanvasImageItem(oddsbg,area); | ||
278 | oddsDice[a]->setX(110-offset); | ||
279 | oddsDice[a]->setY(210-2*offset); | ||
280 | oddsDice[a]->setZ(1); | ||
281 | oddsDice[a]->setSize(15,15); | ||
282 | oddsDice[a]->hide(); | ||
283 | } | ||
284 | */ | ||
285 | } | ||
286 | //oddsDice[0]->show(); | ||
287 | |||
288 | //set the board | ||
289 | QImage boardbg(Resource::loadImage("backgammon/boards/"+board_name)); | ||
290 | if(non_qte) | ||
291 | { | ||
292 | boardbg=boardbg.copy(offset,offset,235-2*offset,200-2*offset); | ||
293 | } | ||
294 | board=new CanvasImageItem(boardbg,area); | ||
295 | board->setX(0); | ||
296 | board->setY(0); | ||
297 | board->setZ(0); | ||
298 | board->setSize(235-2*offset,200-2*offset); | ||
299 | board->show(); | ||
300 | |||
301 | //the table | ||
302 | QImage tablebg(Resource::loadImage("backgammon/table/"+table_name)); | ||
303 | if(non_qte) | ||
304 | { | ||
305 | tablebg=tablebg.copy(offset,0,235-offset,200); | ||
306 | } | ||
307 | table=new CanvasImageItem(tablebg,area); | ||
308 | table->setX(0); | ||
309 | table->setY(200-2*offset); | ||
310 | table->setZ(0); | ||
311 | table->setSize(235-2*offset,20); | ||
312 | table->show(); | ||
313 | |||
314 | //the no move marker | ||
315 | QImage nomovebg(Resource::loadImage("backgammon/no_move")); | ||
316 | nomove_marker=new CanvasImageItem(nomovebg,area); | ||
317 | nomove_marker->setX(0); | ||
318 | nomove_marker->setY(200); | ||
319 | nomove_marker->setZ(2); | ||
320 | nomove_marker->hide(); | ||
321 | |||
322 | //default human against computer | ||
323 | player1_auto=false; | ||
324 | player2_auto=true; | ||
325 | //start new game | ||
326 | newgame(); | ||
327 | } | ||
328 | |||
329 | BackGammon::~BackGammon() | ||
330 | { | ||
331 | //DESTRUCTOR | ||
332 | } | ||
333 | |||
334 | void BackGammon::newgame() | ||
335 | { | ||
336 | gameFinished=false; | ||
337 | QDateTime now=QDateTime::currentDateTime(); | ||
338 | game_name=now.date().toString()+"_"+now.time().toString(); | ||
339 | move->reset(); | ||
340 | draw(); | ||
341 | diceA1_value=7; | ||
342 | diceA2_value=7; | ||
343 | diceA3_value=7; | ||
344 | diceA4_value=7; | ||
345 | diceB1_value=7; | ||
346 | diceB2_value=7; | ||
347 | diceB3_value=7; | ||
348 | diceB4_value=7; | ||
349 | showdice(); | ||
350 | player=2; | ||
351 | dice1_played=true; | ||
352 | dice2_played=true; | ||
353 | dice3_played=true; | ||
354 | dice4_played=true; | ||
355 | dice_rolled=false; | ||
356 | setplayer(); | ||
357 | area->update(); | ||
358 | } | ||
359 | |||
360 | void BackGammon::playerselect() | ||
361 | { | ||
362 | PlayerDialog* playerdialog=new PlayerDialog(this); | ||
363 | playerdialog->setAuto1(player1_auto); | ||
364 | playerdialog->setAuto2(player2_auto); | ||
365 | if(!playerdialog->exec()) | ||
366 | return; | ||
367 | player1_auto=playerdialog->getAuto1(); | ||
368 | player2_auto=playerdialog->getAuto2(); | ||
369 | } | ||
370 | |||
371 | void BackGammon::loadgame() | ||
372 | { | ||
373 | FileDialog* file=new FileDialog(this,"Load Game",".game"); | ||
374 | if(!file->exec()) | ||
375 | return; | ||
376 | |||
377 | game_name=file->filename(); | ||
378 | QString game_file=QPEApplication::qpeDir()+"/backgammon/"+game_name+".game"; | ||
379 | |||
380 | Config game(game_file,Config::File); | ||
381 | game.setGroup("dice"); | ||
382 | diceA1_value=game.readNumEntry("diceA1_value"); | ||
383 | diceA2_value=game.readNumEntry("diceA2_value"); | ||
384 | diceA3_value=game.readNumEntry("diceA3_value"); | ||
385 | diceA4_value=game.readNumEntry("diceA4_value"); | ||
386 | diceB1_value=game.readNumEntry("diceB1_value"); | ||
387 | diceB2_value=game.readNumEntry("diceB2_value"); | ||
388 | diceB3_value=game.readNumEntry("diceB3_value"); | ||
389 | diceB4_value=game.readNumEntry("diceB4_value"); | ||
390 | player=game.readNumEntry("player"); | ||
391 | dice1_played=game.readBoolEntry("dice1_played"); | ||
392 | dice2_played=game.readBoolEntry("dice2_played"); | ||
393 | dice3_played=game.readBoolEntry("dice3_played"); | ||
394 | dice4_played=game.readBoolEntry("dice4_played"); | ||
395 | dice_rolled=game.readBoolEntry("dice_rolled"); | ||
396 | player1_auto=game.readBoolEntry("player1_auto"); | ||
397 | player2_auto=game.readBoolEntry("player2_auto"); | ||
398 | |||
399 | game.setGroup("pieces"); | ||
400 | QString label; | ||
401 | LoadSave load; | ||
402 | for(int a=0;a<28;a++) | ||
403 | { | ||
404 | label.setNum(a); | ||
405 | load.pop[a].total = game.readNumEntry(label,0); | ||
406 | } | ||
407 | |||
408 | move->loadGame(load); | ||
409 | setplayer(); | ||
410 | showdice(); | ||
411 | draw(); | ||
412 | area->update(); | ||
413 | } | ||
414 | |||
415 | void BackGammon::savegame() | ||
416 | { | ||
417 | QString game_file=QPEApplication::qpeDir()+"/backgammon/"+game_name+".game"; | ||
418 | |||
419 | Config game(game_file,Config::File); | ||
420 | game.setGroup("dice"); | ||
421 | game.writeEntry("diceA1_value",diceA1_value); | ||
422 | game.writeEntry("diceA2_value",diceA2_value); | ||
423 | game.writeEntry("diceA3_value",diceA3_value); | ||
424 | game.writeEntry("diceA4_value",diceA4_value); | ||
425 | game.writeEntry("diceB1_value",diceB1_value); | ||
426 | game.writeEntry("diceB2_value",diceB3_value); | ||
427 | game.writeEntry("diceB3_value",diceB4_value); | ||
428 | game.writeEntry("diceB4_value",diceB4_value); | ||
429 | game.writeEntry("player",player); | ||
430 | game.writeEntry("dice1_played",dice1_played); | ||
431 | game.writeEntry("dice2_played",dice2_played); | ||
432 | game.writeEntry("dice3_played",dice3_played); | ||
433 | game.writeEntry("dice4_played",dice4_played); | ||
434 | game.writeEntry("dice_rolled",dice_rolled); | ||
435 | game.writeEntry("player1_auto",player1_auto); | ||
436 | game.writeEntry("player2_auto",player2_auto); | ||
437 | |||
438 | game.setGroup("pieces"); | ||
439 | QString label; | ||
440 | LoadSave save=move->saveGame(); | ||
441 | for(int a=0;a<28;a++) | ||
442 | { | ||
443 | label.setNum(a); | ||
444 | game.writeEntry(label,save.pop[a].total); | ||
445 | } | ||
446 | QMessageBox::information(this,"Backgammon","Game saved","OK"); | ||
447 | } | ||
448 | |||
449 | void BackGammon::deletegame() | ||
450 | { | ||
451 | FileDialog* file=new FileDialog(this,"Delete Game",".game"); | ||
452 | if(!file->exec()) | ||
453 | return; | ||
454 | |||
455 | game_name=file->filename(); | ||
456 | QString game_file=QPEApplication::qpeDir()+"/backgammon/"+game_name+".game"; | ||
457 | |||
458 | if(!QMessageBox::warning(this,"Backgammon","deleted game\n"+game_name+" ?","OK","Cancel")) | ||
459 | { | ||
460 | QFile(game_file).remove(); | ||
461 | } | ||
462 | } | ||
463 | |||
464 | |||
465 | void BackGammon::newtheme() | ||
466 | { | ||
467 | ThemeDialog* theme=new ThemeDialog(this); | ||
468 | |||
469 | ImageNames names; | ||
470 | names.theme=theme_name; | ||
471 | names.board=board_name; | ||
472 | names.pieces1=piecesA_name; | ||
473 | names.pieces2=piecesB_name; | ||
474 | names.dice1=diceA_name; | ||
475 | names.dice2=diceB_name; | ||
476 | names.odds=odds_name; | ||
477 | names.table=table_name; | ||
478 | |||
479 | theme->setCurrent(names); | ||
480 | if(!theme->exec()) | ||
481 | return; | ||
482 | |||
483 | names=theme->getNames(); | ||
484 | theme_name=names.theme; | ||
485 | board_name=names.board; | ||
486 | piecesA_name=names.pieces1; | ||
487 | piecesB_name=names.pieces2; | ||
488 | diceA_name=names.dice1; | ||
489 | diceB_name=names.dice2; | ||
490 | odds_name=names.odds; | ||
491 | table_name=names.table; | ||
492 | |||
493 | applytheme(); | ||
494 | } | ||
495 | |||
496 | void BackGammon::loadtheme() | ||
497 | { | ||
498 | FileDialog* file=new FileDialog(this,"Load Theme",".theme"); | ||
499 | if(!file->exec()) | ||
500 | return; | ||
501 | |||
502 | theme_name=file->filename(); | ||
503 | QString theme_file=QPEApplication::qpeDir()+"/backgammon/"+theme_name+".theme"; | ||
504 | |||
505 | Config theme(theme_file,Config::File); | ||
506 | theme.setGroup("theme"); | ||
507 | board_name=theme.readEntry("board","board_1"); | ||
508 | piecesA_name=theme.readEntry("pieces1","pieces_1"); | ||
509 | piecesB_name=theme.readEntry("pieces2","pieces_2"); | ||
510 | diceA_name=theme.readEntry("dice1","dice_1"); | ||
511 | diceB_name=theme.readEntry("dice2","dice_2"); | ||
512 | table_name=theme.readEntry("table","table_1"); | ||
513 | odds_name=theme.readEntry("odds","odds_1"); | ||
514 | |||
515 | applytheme(); | ||
516 | |||
517 | } | ||
518 | |||
519 | void BackGammon::savetheme() | ||
520 | { | ||
521 | if(theme_name=="default") | ||
522 | { | ||
523 | QMessageBox::information(this,"Backgammon","Sorry\nCannot overwrite default.theme","OK"); | ||
524 | return; | ||
525 | } | ||
526 | QString theme_file=QPEApplication::qpeDir()+"/backgammon/"+theme_name+".theme"; | ||
527 | if(QMessageBox::information(this,"Backgammon","Save Theme\n"+theme_name,"Yes","No")) | ||
528 | return; | ||
529 | |||
530 | Config theme(theme_file,Config::File); | ||
531 | theme.setGroup("theme"); | ||
532 | theme.writeEntry("board",board_name); | ||
533 | theme.writeEntry("pieces1",piecesA_name); | ||
534 | theme.writeEntry("pieces2",piecesB_name); | ||
535 | theme.writeEntry("dice1",diceA_name); | ||
536 | theme.writeEntry("dice2",diceB_name); | ||
537 | theme.writeEntry("table",table_name); | ||
538 | theme.writeEntry("odds",odds_name); | ||
539 | |||
540 | } | ||
541 | |||
542 | void BackGammon::themedefault() | ||
543 | { | ||
544 | if(QMessageBox::information(this,"Backgammon","Make Theme\n"+theme_name+"\nthe default theme","Yes","No")) | ||
545 | return; | ||
546 | |||
547 | Config conf("backgammon"); | ||
548 | conf.setGroup("general"); | ||
549 | conf.writeEntry("theme",theme_name); | ||
550 | } | ||
551 | |||
552 | void BackGammon::deletetheme() | ||
553 | { | ||
554 | FileDialog* file=new FileDialog(this,"Delete Theme",".theme"); | ||
555 | if(!file->exec()) | ||
556 | return; | ||
557 | |||
558 | theme_name=file->filename(); | ||
559 | QString theme_file=QPEApplication::qpeDir()+"/backgammon/"+theme_name+".theme"; | ||
560 | |||
561 | if(!QMessageBox::warning(this,"Backgammon","deleted theme "+theme_name+" ?","OK","Cancel")) | ||
562 | { | ||
563 | QFile(theme_file).remove(); | ||
564 | } | ||
565 | } | ||
566 | |||
567 | void BackGammon::modify_AI() | ||
568 | { | ||
569 | AI_Dialog* ai_mod=new AI_Dialog(this,"Load Theme",".theme"); | ||
570 | ai_mod->setAISettings(move->getAISettings()); | ||
571 | if(!ai_mod->exec()) | ||
572 | return; | ||
573 | |||
574 | //get the AI settings | ||
575 | AISettings ai=ai_mod->getAISettings(); | ||
576 | move->setAISettings(ai); | ||
577 | //write new settings to conf file | ||
578 | Config conf("backgammon"); | ||
579 | conf.setGroup("ai"); | ||
580 | conf.writeEntry("rescue",ai.rescue); | ||
581 | conf.writeEntry("eliminate",ai.eliminate); | ||
582 | conf.writeEntry("expose",ai.expose); | ||
583 | conf.writeEntry("protect",ai.protect); | ||
584 | conf.writeEntry("safe",ai.safe); | ||
585 | conf.writeEntry("empty",ai.empty); | ||
586 | } | ||
587 | |||
588 | void BackGammon::setrules() | ||
589 | { | ||
590 | RulesDialog* rulesdialog=new RulesDialog(this,"Load Theme",".theme"); | ||
591 | rulesdialog->setRules(rules); | ||
592 | if(!rulesdialog->exec()) | ||
593 | return; | ||
594 | rules=rulesdialog->getRules(); | ||
595 | Config conf("backgammon"); | ||
596 | conf.setGroup("rules"); | ||
597 | conf.writeEntry("move_with_pieces_out",rules.move_with_pieces_out); | ||
598 | conf.writeEntry("nice_dice",rules.generous_dice); | ||
599 | move->setRules(rules); | ||
600 | } | ||
601 | |||
602 | void BackGammon::displaySettings() | ||
603 | { | ||
604 | DisplayDialog* displaydialog=new DisplayDialog(this); | ||
605 | displaydialog->setDisplaySettings(display); | ||
606 | if(!displaydialog->exec()) | ||
607 | return; | ||
608 | display=displaydialog->getDisplaySettings(); | ||
609 | Config conf("backgammon"); | ||
610 | conf.setGroup("display"); | ||
611 | conf.writeEntry("small",display.small); | ||
612 | conf.writeEntry("warning",display.warning); | ||
613 | QMessageBox::warning(this,"Backgammon","changed display settings will\nonly take place after game has\nbeen restarted","OK"); | ||
614 | } | ||
615 | |||
616 | void BackGammon::draw() | ||
617 | { | ||
618 | Pieces pieces; | ||
619 | move->position(pieces,non_qte); | ||
620 | for(int a=0;a<15;a++) | ||
621 | { | ||
622 | if(!pieces.player1[a].side) | ||
623 | { | ||
624 | p1[a]->setX(pieces.player1[a].x); | ||
625 | p1[a]->setY(pieces.player1[a].y); | ||
626 | p1[a]->setZ(pieces.player1[a].z); | ||
627 | p1[a]->show(); | ||
628 | p1_side[a]->hide(); | ||
629 | } | ||
630 | else | ||
631 | { | ||
632 | p1_side[a]->setX(pieces.player1[a].x); | ||
633 | p1_side[a]->setY(pieces.player1[a].y); | ||
634 | p1_side[a]->setZ(pieces.player1[a].z); | ||
635 | p1_side[a]->show(); | ||
636 | p1[a]->hide(); | ||
637 | } | ||
638 | |||
639 | if(!pieces.player2[a].side) | ||
640 | { | ||
641 | p2[a]->setX(pieces.player2[a].x); | ||
642 | p2[a]->setY(pieces.player2[a].y); | ||
643 | p2[a]->setZ(pieces.player2[a].z); | ||
644 | p2[a]->show(); | ||
645 | p2_side[a]->hide(); | ||
646 | } | ||
647 | else | ||
648 | { | ||
649 | p2_side[a]->setX(pieces.player2[a].x); | ||
650 | p2_side[a]->setY(pieces.player2[a].y); | ||
651 | p2_side[a]->setZ(pieces.player2[a].z); | ||
652 | p2_side[a]->show(); | ||
653 | p2[a]->hide(); | ||
654 | } | ||
655 | } | ||
656 | } | ||
657 | |||
658 | void BackGammon::mouse(int x,int y) | ||
659 | { | ||
660 | if(gameFinished) | ||
661 | { | ||
662 | newgame(); | ||
663 | return; | ||
664 | } | ||
665 | if(y<=200) //move pieces | ||
666 | { | ||
667 | if((player==1 && player1_auto) || (player==2 && player2_auto)) | ||
668 | return; | ||
669 | |||
670 | Marker marker; | ||
671 | |||
672 | move->boardpressed(x,y,marker,non_qte); | ||
673 | if(marker.visible_current) | ||
674 | { | ||
675 | marker_current->setX(marker.x_current-offset); | ||
676 | marker_current->setY(marker.y_current); | ||
677 | marker_current->show(); | ||
678 | } | ||
679 | else | ||
680 | { | ||
681 | marker_current->hide(); | ||
682 | } | ||
683 | |||
684 | for(int a=0;a<4;a++) | ||
685 | { | ||
686 | if(marker.visible_next[a]) | ||
687 | { | ||
688 | marker_next[a]->setX(marker.x_next[a]-offset); | ||
689 | marker_next[a]->setY(marker.y_next[a]); | ||
690 | marker_next[a]->show(); | ||
691 | } | ||
692 | else | ||
693 | { | ||
694 | marker_next[a]->hide(); | ||
695 | } | ||
696 | } | ||
697 | area->update(); | ||
698 | } | ||
699 | else //roll dice | ||
700 | { | ||
701 | if(x>=10 && x<=65 && player==1 && !dice_rolled) | ||
702 | { | ||
703 | dice1_played=false; | ||
704 | dice2_played=false; | ||
705 | dice3_played=false; | ||
706 | dice4_played=false; | ||
707 | dice_rolled=true; | ||
708 | srand(QTime::currentTime().msec()); | ||
709 | diceA1_value=1+(int) (6.0*rand()/(RAND_MAX+1.0)); | ||
710 | diceA2_value=1+(int) (6.0*rand()/(RAND_MAX+1.0)); | ||
711 | if(diceA1_value==diceA2_value) | ||
712 | { | ||
713 | diceA3_value=diceA1_value; | ||
714 | diceA4_value=diceA1_value; | ||
715 | } | ||
716 | else | ||
717 | { | ||
718 | diceA3_value=7; | ||
719 | dice3_played=true; | ||
720 | diceA4_value=7; | ||
721 | dice4_played=true; | ||
722 | } | ||
723 | showdice(); | ||
724 | area->update(); | ||
725 | move->diceroll(1,diceA1_value,diceA2_value,diceA3_value,diceA4_value,player1_auto); | ||
726 | |||
727 | } | ||
728 | else if(x>=160 && x<=225 && player==2 && !dice_rolled) | ||
729 | { | ||
730 | dice1_played=false; | ||
731 | dice2_played=false; | ||
732 | dice3_played=false; | ||
733 | dice4_played=false; | ||
734 | dice_rolled=true; | ||
735 | srand(QTime::currentTime().msec()); | ||
736 | diceB1_value=1+(int) (6.0*rand()/(RAND_MAX+1.0)); | ||
737 | diceB2_value=1+(int) (6.0*rand()/(RAND_MAX+1.0)); | ||
738 | if(diceB1_value==diceB2_value) | ||
739 | { | ||
740 | diceB3_value=diceB1_value; | ||
741 | diceB4_value=diceB1_value; | ||
742 | } | ||
743 | else | ||
744 | { | ||
745 | diceB3_value=7; | ||
746 | dice3_played=true; | ||
747 | diceB4_value=7; | ||
748 | dice4_played=true; | ||
749 | } | ||
750 | showdice(); | ||
751 | area->update(); | ||
752 | move->diceroll(2,diceB1_value,diceB2_value,diceB3_value,diceB4_value,player2_auto); | ||
753 | } | ||
754 | } | ||
755 | } | ||
756 | |||
757 | void BackGammon::done_dice1() | ||
758 | { | ||
759 | dice1_played=true; | ||
760 | if(player==1) | ||
761 | diceA1_value=7; | ||
762 | else | ||
763 | diceB1_value=7; | ||
764 | setplayer(); | ||
765 | showdice(); | ||
766 | draw(); | ||
767 | area->update(); | ||
768 | if(!dice2_played || !dice3_played || !dice4_played) | ||
769 | { | ||
770 | if(player==1) | ||
771 | { | ||
772 | move->diceroll(1,diceA1_value,diceA2_value,diceA3_value,diceA4_value,player1_auto); | ||
773 | } | ||
774 | else | ||
775 | { | ||
776 | move->diceroll(2,diceB1_value,diceB2_value,diceB3_value,diceB4_value,player2_auto); | ||
777 | } | ||
778 | } | ||
779 | } | ||
780 | |||
781 | void BackGammon::done_dice2() | ||
782 | { | ||
783 | dice2_played=true; | ||
784 | if(player==1) | ||
785 | diceA2_value=7; | ||
786 | else | ||
787 | diceB2_value=7; | ||
788 | setplayer(); | ||
789 | showdice(); | ||
790 | draw(); | ||
791 | area->update(); | ||
792 | if(!dice1_played || !dice3_played || !dice4_played) | ||
793 | { | ||
794 | if(player==1) | ||
795 | { | ||
796 | move->diceroll(1,diceA1_value,diceA2_value,diceA3_value,diceA4_value,player1_auto); | ||
797 | } | ||
798 | else | ||
799 | { | ||
800 | move->diceroll(2,diceB1_value,diceB2_value,diceB3_value,diceB4_value,player2_auto); | ||
801 | } | ||
802 | } | ||
803 | } | ||
804 | |||
805 | |||
806 | void BackGammon::done_dice3() | ||
807 | { | ||
808 | dice3_played=true; | ||
809 | if(player==1) | ||
810 | diceA3_value=7; | ||
811 | else | ||
812 | diceB3_value=7; | ||
813 | setplayer(); | ||
814 | showdice(); | ||
815 | draw(); | ||
816 | area->update(); | ||
817 | if(!dice1_played || !dice2_played || !dice4_played) | ||
818 | { | ||
819 | if(player==1) | ||
820 | { | ||
821 | move->diceroll(1,diceA1_value,diceA2_value,diceA3_value,diceA4_value,player1_auto); | ||
822 | } | ||
823 | else | ||
824 | { | ||
825 | move->diceroll(2,diceB1_value,diceB2_value,diceB3_value,diceB4_value,player2_auto); | ||
826 | } | ||
827 | } | ||
828 | } | ||
829 | |||
830 | |||
831 | void BackGammon::done_dice4() | ||
832 | { | ||
833 | dice4_played=true; | ||
834 | if(player==1) | ||
835 | diceA4_value=7; | ||
836 | else | ||
837 | diceB4_value=7; | ||
838 | setplayer(); | ||
839 | showdice(); | ||
840 | draw(); | ||
841 | area->update(); | ||
842 | if(!dice1_played || !dice2_played || !dice3_played) | ||
843 | { | ||
844 | if(player==1) | ||
845 | { | ||
846 | move->diceroll(1,diceA1_value,diceA2_value,diceA3_value,diceA4_value,player1_auto); | ||
847 | } | ||
848 | else | ||
849 | { | ||
850 | move->diceroll(2,diceB1_value,diceB2_value,diceB3_value,diceB4_value,player2_auto); | ||
851 | } | ||
852 | } | ||
853 | } | ||
854 | |||
855 | |||
856 | void BackGammon::nomove() | ||
857 | { | ||
858 | if(player==1) | ||
859 | nomove_marker->setX(0); | ||
860 | else | ||
861 | nomove_marker->setX(170); | ||
862 | nomove_marker->show(); | ||
863 | message->setText("<b>no move</b>"); | ||
864 | dice1_played=true; | ||
865 | dice2_played=true; | ||
866 | dice3_played=true; | ||
867 | dice4_played=true; | ||
868 | if(player==1) | ||
869 | { | ||
870 | diceA1_value=7; | ||
871 | diceA2_value=7; | ||
872 | diceA3_value=7; | ||
873 | diceA4_value=7; | ||
874 | } | ||
875 | else | ||
876 | { | ||
877 | diceB1_value=7; | ||
878 | diceB2_value=7; | ||
879 | diceB3_value=7; | ||
880 | diceB4_value=7; | ||
881 | } | ||
882 | area->update(); | ||
883 | QTimer::singleShot(2000,this,SLOT(nomove2())); | ||
884 | } | ||
885 | |||
886 | void BackGammon::nomove2() | ||
887 | { | ||
888 | nomove_marker->hide(); | ||
889 | setplayer(); | ||
890 | showdice(); | ||
891 | draw(); | ||
892 | area->update(); | ||
893 | } | ||
894 | |||
895 | void BackGammon::finished(int theplayer) | ||
896 | { | ||
897 | nomove_marker->hide(); | ||
898 | if(theplayer==1) | ||
899 | message->setText("<b>Player 1 wins. Click on board for new game.</b>"); | ||
900 | else | ||
901 | message->setText("<b>Player 2 wins. Click on board for new game.</b>"); | ||
902 | diceA1_value=7; | ||
903 | diceA2_value=7; | ||
904 | diceB1_value=7; | ||
905 | diceB2_value=7; | ||
906 | player=0; | ||
907 | showdice(); | ||
908 | draw(); | ||
909 | area->update(); | ||
910 | gameFinished=true; | ||
911 | } | ||
912 | |||
913 | void BackGammon::showdice() | ||
914 | { | ||
915 | int value_diceA1=diceA1_value-1; | ||
916 | if(diceA1_value==7 && diceA3_value!=7) | ||
917 | value_diceA1=diceA3_value-1; | ||
918 | |||
919 | int value_diceA2=diceA2_value-1; | ||
920 | if(diceA2_value==7 && diceA4_value!=7) | ||
921 | value_diceA2=diceA4_value-1; | ||
922 | |||
923 | int value_diceB1=diceB1_value-1; | ||
924 | if(diceB1_value==7 && diceB3_value!=7) | ||
925 | value_diceB1=diceB3_value-1; | ||
926 | |||
927 | int value_diceB2=diceB2_value-1; | ||
928 | if(diceB2_value==7 && diceB4_value!=7) | ||
929 | value_diceB2=diceB4_value-1; | ||
930 | |||
931 | for(int index=0;index<7;index++) | ||
932 | { | ||
933 | if(value_diceA1==index) | ||
934 | diceA1[index]->show(); | ||
935 | else | ||
936 | diceA1[index]->hide(); | ||
937 | |||
938 | if(value_diceA2==index) | ||
939 | diceA2[index]->show(); | ||
940 | else | ||
941 | diceA2[index]->hide(); | ||
942 | |||
943 | if(value_diceB1==index) | ||
944 | diceB1[index]->show(); | ||
945 | else | ||
946 | diceB1[index]->hide(); | ||
947 | |||
948 | if(value_diceB2==index) | ||
949 | diceB2[index]->show(); | ||
950 | else | ||
951 | diceB2[index]->hide(); | ||
952 | } | ||
953 | } | ||
954 | |||
955 | void BackGammon::setplayer() | ||
956 | { | ||
957 | if(dice1_played && dice2_played && dice3_played && dice4_played && player==1) | ||
958 | { | ||
959 | message->setText("<b>P2 turn</b>"); | ||
960 | dice_rolled=false; | ||
961 | player=2; | ||
962 | if(player2_auto) | ||
963 | QTimer::singleShot(2000,this,SLOT(autoroll_dice2())); | ||
964 | } | ||
965 | else if(dice1_played && dice2_played && dice3_played && dice4_played && player==2) | ||
966 | { | ||
967 | message->setText("<b>P1 turn</b>"); | ||
968 | dice_rolled=false; | ||
969 | player=1; | ||
970 | if(player1_auto) | ||
971 | QTimer::singleShot(2000,this,SLOT(autoroll_dice1())); | ||
972 | } | ||
973 | } | ||
974 | |||
975 | void BackGammon::autoroll_dice1() | ||
976 | { | ||
977 | mouse(20,210); | ||
978 | } | ||
979 | |||
980 | void BackGammon::autoroll_dice2() | ||
981 | { | ||
982 | mouse(170,210); | ||
983 | } | ||
984 | |||
985 | void BackGammon::applytheme() | ||
986 | { | ||
987 | QImage boardbg(Resource::loadImage("backgammon/boards/"+board_name)); | ||
988 | if(non_qte) | ||
989 | { | ||
990 | boardbg=boardbg.copy(offset,offset,235-2*offset,200-2*offset); | ||
991 | } | ||
992 | board->setImage(boardbg); | ||
993 | |||
994 | QImage tablebg(Resource::loadImage("backgammon/table/"+table_name)); | ||
995 | if(non_qte) | ||
996 | { | ||
997 | tablebg=tablebg.copy(offset,0,235-offset,200); | ||
998 | } | ||
999 | table->setImage(tablebg); | ||
1000 | |||
1001 | QImage piece_1_all(Resource::loadImage("backgammon/pieces/"+piecesA_name)); | ||
1002 | QImage piece_1_front=piece_1_all.copy(0,0,15,15); | ||
1003 | QImage piece_1_side=piece_1_all.copy(0,15,15,5); | ||
1004 | |||
1005 | QImage piece_2_all(Resource::loadImage("backgammon/pieces/"+piecesB_name)); | ||
1006 | QImage piece_2_front=piece_2_all.copy(0,0,15,15); | ||
1007 | QImage piece_2_side=piece_2_all.copy(0,15,15,5); | ||
1008 | |||
1009 | int a=0; | ||
1010 | for(a=0;a<15;a++) | ||
1011 | { | ||
1012 | p1[a]->setImage(piece_1_front); | ||
1013 | p1_side[a]->setImage(piece_1_side); | ||
1014 | |||
1015 | p2[a]->setImage(piece_2_front); | ||
1016 | p2_side[a]->setImage(piece_2_side); | ||
1017 | } | ||
1018 | draw(); | ||
1019 | |||
1020 | QImage dicebgA_all(Resource::loadImage("backgammon/dice/"+diceA_name)); | ||
1021 | QImage dicebgB_all(Resource::loadImage("backgammon/dice/"+diceB_name)); | ||
1022 | QImage oddsbg_all=(Resource::loadImage("backgammon/odds/"+odds_name)); | ||
1023 | |||
1024 | for(a=0;a<7;a++) | ||
1025 | { | ||
1026 | QImage dicebgA=dicebgA_all.copy(a*25,0,25,25); | ||
1027 | diceA1[a]->setImage(dicebgA); | ||
1028 | diceA2[a]->setImage(dicebgA); | ||
1029 | |||
1030 | QImage dicebgB=dicebgB_all.copy(a*25,0,25,25); | ||
1031 | diceB1[a]->setImage(dicebgB); | ||
1032 | diceB2[a]->setImage(dicebgB); | ||
1033 | /* | ||
1034 | if(a<6) | ||
1035 | { | ||
1036 | QImage oddsbg=oddsbg_all.copy(a*15,0,15,15); | ||
1037 | oddsDice[a]->setImage(oddsbg); | ||
1038 | } | ||
1039 | */ | ||
1040 | } | ||
1041 | } | ||
1042 | |||
1043 | |||
diff --git a/noncore/games/backgammon/backgammon.h b/noncore/games/backgammon/backgammon.h new file mode 100644 index 0000000..40dbaba --- a/dev/null +++ b/noncore/games/backgammon/backgammon.h | |||
@@ -0,0 +1,134 @@ | |||
1 | #ifndef BACKGAMMON_H | ||
2 | #define BACKGAMMON_H | ||
3 | |||
4 | #include "canvasimageitem.h" | ||
5 | #include "definition.h" | ||
6 | //#include "rulesdialog.h" | ||
7 | #include "moveengine.h" | ||
8 | |||
9 | #include <qcanvas.h> | ||
10 | #include <qlabel.h> | ||
11 | #include <qlineedit.h> | ||
12 | #include <qwidget.h> | ||
13 | |||
14 | |||
15 | class BackGammonView : public QCanvasView | ||
16 | { | ||
17 | Q_OBJECT | ||
18 | public: | ||
19 | BackGammonView(QCanvas* canvas,QWidget* parent); | ||
20 | ~BackGammonView(); | ||
21 | signals: | ||
22 | void mouse(int,int); | ||
23 | private: | ||
24 | void contentsMousePressEvent(QMouseEvent* e); | ||
25 | }; | ||
26 | |||
27 | class BackGammon : public QWidget | ||
28 | { | ||
29 | Q_OBJECT | ||
30 | private: | ||
31 | //GUI | ||
32 | //is the style not qte ? | ||
33 | bool non_qte; | ||
34 | int offset; | ||
35 | //the "status" bar | ||
36 | QLineEdit* inputfield; | ||
37 | //the main drawing area | ||
38 | QCanvas* area; | ||
39 | BackGammonView* boardview; | ||
40 | CanvasImageItem* board; | ||
41 | CanvasImageItem* table; | ||
42 | CanvasImageItem** p1; | ||
43 | CanvasImageItem** p2; | ||
44 | CanvasImageItem** p1_side; | ||
45 | CanvasImageItem** p2_side; | ||
46 | |||
47 | CanvasImageItem** diceA1; | ||
48 | CanvasImageItem** diceA2; | ||
49 | CanvasImageItem** diceB1; | ||
50 | CanvasImageItem** diceB2; | ||
51 | //CanvasImageItem** oddsDice; | ||
52 | CanvasImageItem* nomove_marker; | ||
53 | |||
54 | QCanvasRectangle* marker_current; | ||
55 | QCanvasRectangle* marker_next[4]; | ||
56 | QLabel* message; | ||
57 | //ENGINE | ||
58 | MoveEngine* move; | ||
59 | //the dice values | ||
60 | int diceA1_value; | ||
61 | int diceA2_value; | ||
62 | int diceA3_value; | ||
63 | int diceA4_value; | ||
64 | int diceB1_value; | ||
65 | int diceB2_value; | ||
66 | int diceB3_value; | ||
67 | int diceB4_value; | ||
68 | |||
69 | int player; | ||
70 | bool dice1_played; | ||
71 | bool dice2_played; | ||
72 | bool dice3_played; | ||
73 | bool dice4_played; | ||
74 | bool dice_rolled; | ||
75 | //computer opponent | ||
76 | bool player1_auto; | ||
77 | bool player2_auto; | ||
78 | |||
79 | //the images; | ||
80 | QString theme_name; | ||
81 | QString board_name; | ||
82 | QString piecesA_name; | ||
83 | QString piecesB_name; | ||
84 | QString diceA_name; | ||
85 | QString diceB_name; | ||
86 | QString odds_name; | ||
87 | QString table_name; | ||
88 | |||
89 | //save game | ||
90 | QString game_name; | ||
91 | |||
92 | //the rules | ||
93 | Rules rules; | ||
94 | |||
95 | //display settings | ||
96 | Display display; | ||
97 | //is the game finished ? | ||
98 | bool gameFinished; | ||
99 | |||
100 | public: | ||
101 | BackGammon( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); | ||
102 | ~BackGammon(); | ||
103 | private slots: | ||
104 | void newgame(); | ||
105 | void playerselect(); | ||
106 | void loadgame(); | ||
107 | void savegame(); | ||
108 | void deletegame(); | ||
109 | void newtheme(); | ||
110 | void loadtheme(); | ||
111 | void savetheme(); | ||
112 | void themedefault(); | ||
113 | void deletetheme(); | ||
114 | void modify_AI(); | ||
115 | void setrules(); | ||
116 | void displaySettings(); | ||
117 | void mouse(int x,int y); | ||
118 | void done_dice1(); | ||
119 | void done_dice2(); | ||
120 | void done_dice3(); | ||
121 | void done_dice4(); | ||
122 | void nomove(); | ||
123 | void nomove2(); | ||
124 | void finished(int theplayer); | ||
125 | void autoroll_dice1(); | ||
126 | void autoroll_dice2(); | ||
127 | private: | ||
128 | void draw(); | ||
129 | void showdice(); | ||
130 | void setplayer(); | ||
131 | void applytheme(); | ||
132 | }; | ||
133 | |||
134 | #endif //BACKGAMMON_H | ||
diff --git a/noncore/games/backgammon/backgammon.pro b/noncore/games/backgammon/backgammon.pro new file mode 100644 index 0000000..6f77a14 --- a/dev/null +++ b/noncore/games/backgammon/backgammon.pro | |||
@@ -0,0 +1,34 @@ | |||
1 | TEMPLATE = app | ||
2 | CONFIG = qt warn_on release | ||
3 | |||
4 | HEADERS = backgammon.h \ | ||
5 | canvasimageitem.h \ | ||
6 | themedialog.h \ | ||
7 | moveengine.h \ | ||
8 | filedialog.h \ | ||
9 | playerdialog.h \ | ||
10 | aidialog.h \ | ||
11 | rulesdialog.h \ | ||
12 | displaydialog.h \ | ||
13 | definition.h | ||
14 | |||
15 | SOURCES = main.cpp \ | ||
16 | backgammon.cpp \ | ||
17 | canvasimageitem.cpp \ | ||
18 | themedialog.cpp \ | ||
19 | moveengine.cpp \ | ||
20 | filedialog.cpp \ | ||
21 | playerdialog.cpp \ | ||
22 | aidialog.cpp \ | ||
23 | rulesdialog.cpp \ | ||
24 | displaydialog.cpp \ | ||
25 | definition.cpp | ||
26 | |||
27 | TARGET = backgammon | ||
28 | INCLUDEPATH+= $(OPIEDIR)/include | ||
29 | DEPENDPATH+= $(OPIEDIR)/include | ||
30 | LIBS += -lqpe -lstdc++ | ||
31 | DESTDIR = $(OPIEDIR)/bin | ||
32 | |||
33 | |||
34 | include ( $(OPIEDIR)/include.pro ) | ||
diff --git a/noncore/games/backgammon/backgammonview.cpp b/noncore/games/backgammon/backgammonview.cpp new file mode 100644 index 0000000..ecbc12b --- a/dev/null +++ b/noncore/games/backgammon/backgammonview.cpp | |||
@@ -0,0 +1,17 @@ | |||
1 | #include "backgammonview.h" | ||
2 | |||
3 | BackGammonView::BackGammonView(QCanvas* canvas,QWidget* parent) | ||
4 | :QCanvasView(canvas,parent) | ||
5 | { | ||
6 | } | ||
7 | |||
8 | BackGammonView::~BackGammonView() | ||
9 | { | ||
10 | } | ||
11 | |||
12 | void BackGammonView::contentsMousePressEvent(QMouseEvent* e) | ||
13 | { | ||
14 | int x=e->x(); | ||
15 | int y=e->y(); | ||
16 | //emit mousepressed(x,y); | ||
17 | } \ No newline at end of file | ||
diff --git a/noncore/games/backgammon/backgammonview.h b/noncore/games/backgammon/backgammonview.h new file mode 100644 index 0000000..e50f2b0 --- a/dev/null +++ b/noncore/games/backgammon/backgammonview.h | |||
@@ -0,0 +1,18 @@ | |||
1 | #ifndef BACKGAMMONVIEW_H | ||
2 | #define BACKGAMMONVIEW_H | ||
3 | |||
4 | #include <qcanvas.h> | ||
5 | |||
6 | class BackGammonView : public QCanvasView | ||
7 | { | ||
8 | Q_OBJECT | ||
9 | public: | ||
10 | BackGammonView(QCanvas* canvas,QWidget* parent); | ||
11 | ~BackGammonView(); | ||
12 | signals: | ||
13 | //void mousepressed(int,int); | ||
14 | private: | ||
15 | void contentsMousePressEvent(QMouseEvent* e); | ||
16 | }; | ||
17 | |||
18 | #endif //BACKGAMMONVIEW_H \ No newline at end of file | ||
diff --git a/noncore/games/backgammon/canvasimageitem.cpp b/noncore/games/backgammon/canvasimageitem.cpp new file mode 100644 index 0000000..8d0297c --- a/dev/null +++ b/noncore/games/backgammon/canvasimageitem.cpp | |||
@@ -0,0 +1,23 @@ | |||
1 | #include "canvasimageitem.h" | ||
2 | |||
3 | CanvasImageItem::CanvasImageItem( QImage img, QCanvas *canvas ) | ||
4 | : QCanvasRectangle( canvas ) | ||
5 | { | ||
6 | image=img; | ||
7 | setSize( image.width(), image.height() ); | ||
8 | } | ||
9 | |||
10 | CanvasImageItem::~CanvasImageItem() | ||
11 | {} | ||
12 | |||
13 | |||
14 | |||
15 | void CanvasImageItem::drawShape( QPainter &p ) | ||
16 | { | ||
17 | p.drawImage( int(x()), int(y()), image, 0, 0, -1, -1, OrderedAlphaDither ); | ||
18 | } | ||
19 | |||
20 | void CanvasImageItem::setImage(QImage newImage) | ||
21 | { | ||
22 | image=newImage; | ||
23 | } | ||
diff --git a/noncore/games/backgammon/canvasimageitem.h b/noncore/games/backgammon/canvasimageitem.h new file mode 100644 index 0000000..60d5498 --- a/dev/null +++ b/noncore/games/backgammon/canvasimageitem.h | |||
@@ -0,0 +1,21 @@ | |||
1 | #ifndef CNAVASIMAGEITEM_H | ||
2 | #define CNAVASIMAGEITEM_H | ||
3 | |||
4 | #include <qcanvas.h> | ||
5 | #include <qimage.h> | ||
6 | |||
7 | |||
8 | class CanvasImageItem: public QCanvasRectangle | ||
9 | { | ||
10 | private: | ||
11 | QImage image; | ||
12 | public: | ||
13 | CanvasImageItem( QImage img, QCanvas *canvas ); | ||
14 | ~CanvasImageItem(); | ||
15 | protected: | ||
16 | void drawShape( QPainter & ); | ||
17 | public: | ||
18 | void setImage(QImage newImage); | ||
19 | }; | ||
20 | |||
21 | #endif //CNAVASIMAGEITEM_H | ||
diff --git a/noncore/games/backgammon/config.in b/noncore/games/backgammon/config.in new file mode 100644 index 0000000..c725fcc --- a/dev/null +++ b/noncore/games/backgammon/config.in | |||
@@ -0,0 +1,4 @@ | |||
1 | config BACKGAMMON | ||
2 | boolean "backgammon" | ||
3 | default "y" | ||
4 | depends ( LIBQPE || LIBQPE-X11 ) && LIBOPIE | ||
diff --git a/noncore/games/backgammon/definition.cpp b/noncore/games/backgammon/definition.cpp new file mode 100644 index 0000000..9e0029d --- a/dev/null +++ b/noncore/games/backgammon/definition.cpp | |||
@@ -0,0 +1,3 @@ | |||
1 | #include "definition.h" | ||
2 | |||
3 | static bool debug=false; | ||
diff --git a/noncore/games/backgammon/definition.h b/noncore/games/backgammon/definition.h new file mode 100644 index 0000000..6a23801 --- a/dev/null +++ b/noncore/games/backgammon/definition.h | |||
@@ -0,0 +1,74 @@ | |||
1 | #ifndef DEFINITION_H | ||
2 | #define DEFINITION_H | ||
3 | |||
4 | |||
5 | struct Coord | ||
6 | { | ||
7 | int x; | ||
8 | int y; | ||
9 | int z; | ||
10 | bool side; | ||
11 | }; | ||
12 | |||
13 | struct Pieces | ||
14 | { | ||
15 | Coord player1[15]; | ||
16 | Coord player2[15]; | ||
17 | }; | ||
18 | |||
19 | struct Population | ||
20 | { | ||
21 | //positive = player 1 | ||
22 | //negative = player 2 | ||
23 | //zero = no pieces | ||
24 | int total; | ||
25 | }; | ||
26 | |||
27 | struct Marker | ||
28 | { | ||
29 | int x_current; | ||
30 | int y_current; | ||
31 | bool visible_current; | ||
32 | |||
33 | int x_next[4]; | ||
34 | int y_next[4]; | ||
35 | bool visible_next[4]; | ||
36 | }; | ||
37 | |||
38 | struct LoadSave | ||
39 | { | ||
40 | Population pop[28]; | ||
41 | }; | ||
42 | |||
43 | struct Possiblilites | ||
44 | { | ||
45 | int weight[4]; | ||
46 | int to[4]; | ||
47 | }; | ||
48 | |||
49 | struct AISettings | ||
50 | { | ||
51 | int rescue; | ||
52 | int eliminate; | ||
53 | int expose; | ||
54 | int protect; | ||
55 | int safe; | ||
56 | int empty; | ||
57 | }; | ||
58 | |||
59 | struct Rules | ||
60 | { | ||
61 | bool move_with_pieces_out; | ||
62 | bool generous_dice; | ||
63 | }; | ||
64 | |||
65 | |||
66 | struct Display | ||
67 | { | ||
68 | bool small; | ||
69 | bool warning; | ||
70 | }; | ||
71 | |||
72 | |||
73 | |||
74 | #endif //DEFINITION_H | ||
diff --git a/noncore/games/backgammon/displaydialog.cpp b/noncore/games/backgammon/displaydialog.cpp new file mode 100644 index 0000000..8b97545 --- a/dev/null +++ b/noncore/games/backgammon/displaydialog.cpp | |||
@@ -0,0 +1,89 @@ | |||
1 | #include "displaydialog.h" | ||
2 | |||
3 | #include <qgroupbox.h> | ||
4 | #include <qlabel.h> | ||
5 | |||
6 | DisplayDialog::DisplayDialog(QWidget* parent,const char* name,bool modal,WFlags f) | ||
7 | : QDialog(parent,name,modal,f) | ||
8 | { | ||
9 | setCaption("Display Configuration"); | ||
10 | QLabel* header=new QLabel("<b>Change the display settings</b>",this); | ||
11 | header->setGeometry(10,10,200,20); | ||
12 | |||
13 | // | ||
14 | QGroupBox* settings_frame=new QGroupBox("Settings",this); | ||
15 | settings_frame->setGeometry(10,10,220,120); | ||
16 | |||
17 | small_box=new QRadioButton("Big display, e.g. for QPE Style",settings_frame); | ||
18 | small_box->setGeometry(10,20,200,20); | ||
19 | connect(small_box,SIGNAL(clicked()),this,SLOT(small_clicked())); | ||
20 | |||
21 | big_box=new QRadioButton("Small display, e.g. for Windows Style",settings_frame); | ||
22 | big_box->setGeometry(10,50,200,20); | ||
23 | connect(big_box,SIGNAL(clicked()),this,SLOT(big_clicked())); | ||
24 | |||
25 | // | ||
26 | QGroupBox* warning_frame=new QGroupBox("Warning",this); | ||
27 | warning_frame->setGeometry(10,140,220,120); | ||
28 | |||
29 | warning_box=new QCheckBox("show style warning",warning_frame); | ||
30 | warning_box->setGeometry(10,20,200,20); | ||
31 | connect(warning_box,SIGNAL(clicked()),this,SLOT(warning_clicked())); | ||
32 | |||
33 | QLabel* warning_help=new QLabel("show style warning at statup if the system style is not QPE\nif not set to small you may have\nscrollbars on the palying area",warning_frame); | ||
34 | warning_help->setGeometry(10,50,200,60); | ||
35 | |||
36 | showMaximized(); | ||
37 | } | ||
38 | |||
39 | |||
40 | DisplayDialog::~DisplayDialog() | ||
41 | { | ||
42 | } | ||
43 | |||
44 | void DisplayDialog::big_clicked() | ||
45 | { | ||
46 | big_box->setChecked(true); | ||
47 | small_box->setChecked(false); | ||
48 | } | ||
49 | |||
50 | void DisplayDialog::small_clicked() | ||
51 | { | ||
52 | big_box->setChecked(false); | ||
53 | small_box->setChecked(true); | ||
54 | } | ||
55 | |||
56 | void DisplayDialog::warning_clicked() | ||
57 | { | ||
58 | } | ||
59 | |||
60 | void DisplayDialog::setDisplaySettings(const Display& display) | ||
61 | { | ||
62 | if(!display.small) | ||
63 | { | ||
64 | big_box->setChecked(false); | ||
65 | small_box->setChecked(true); | ||
66 | } | ||
67 | else | ||
68 | { | ||
69 | big_box->setChecked(true); | ||
70 | small_box->setChecked(false); | ||
71 | } | ||
72 | if(display.warning) | ||
73 | warning_box->setChecked(true); | ||
74 | else | ||
75 | warning_box->setChecked(false); | ||
76 | |||
77 | } | ||
78 | |||
79 | Display DisplayDialog::getDisplaySettings() | ||
80 | { | ||
81 | Display display; | ||
82 | display.small=!small_box->isChecked(); | ||
83 | display.warning=warning_box->isChecked(); | ||
84 | return display; | ||
85 | } | ||
86 | |||
87 | |||
88 | |||
89 | |||
diff --git a/noncore/games/backgammon/displaydialog.h b/noncore/games/backgammon/displaydialog.h new file mode 100644 index 0000000..26b77f0 --- a/dev/null +++ b/noncore/games/backgammon/displaydialog.h | |||
@@ -0,0 +1,30 @@ | |||
1 | #ifndef DISPLAYDLAOG_H | ||
2 | #define DISPLAYDLAOG_H | ||
3 | |||
4 | #include <qcheckbox.h> | ||
5 | #include <qdialog.h> | ||
6 | #include <qradiobutton.h> | ||
7 | |||
8 | #include "definition.h" | ||
9 | |||
10 | |||
11 | class DisplayDialog : public QDialog | ||
12 | { | ||
13 | Q_OBJECT | ||
14 | private: | ||
15 | QRadioButton* small_box; | ||
16 | QRadioButton* big_box; | ||
17 | QCheckBox* warning_box; | ||
18 | public: | ||
19 | DisplayDialog(QWidget* parent=0,const char* name=0,bool modal=TRUE,WFlags f=0); | ||
20 | ~DisplayDialog(); | ||
21 | private slots: | ||
22 | void big_clicked(); | ||
23 | void small_clicked(); | ||
24 | void warning_clicked(); | ||
25 | public: | ||
26 | void setDisplaySettings(const Display& display); | ||
27 | Display getDisplaySettings(); | ||
28 | }; | ||
29 | |||
30 | #endif //DISPLAYDLAOG_H | ||
diff --git a/noncore/games/backgammon/filedialog.cpp b/noncore/games/backgammon/filedialog.cpp new file mode 100644 index 0000000..6c858a2 --- a/dev/null +++ b/noncore/games/backgammon/filedialog.cpp | |||
@@ -0,0 +1,64 @@ | |||
1 | #include "filedialog.h" | ||
2 | |||
3 | #include <qdir.h> | ||
4 | #include <qfileinfo.h> | ||
5 | #include <qmessagebox.h> | ||
6 | #include <qpixmap.h> | ||
7 | #include <qpushbutton.h> | ||
8 | #include <qpe/qpeapplication.h> | ||
9 | |||
10 | FileDialog::FileDialog(QWidget* parent,QString header,QString extension,const char* name,bool modal,WFlags f) | ||
11 | :QDialog(parent,name,modal,f) | ||
12 | { | ||
13 | setCaption(header); | ||
14 | ext=extension; | ||
15 | dirselector=new QListView(this); | ||
16 | dirselector->setGeometry(1,10,235,200); | ||
17 | dirselector->addColumn("Files"); | ||
18 | connect(dirselector,SIGNAL(clicked(QListViewItem*)),this,SLOT(selectorclicked(QListViewItem*))); | ||
19 | |||
20 | getCurrentDir(); | ||
21 | |||
22 | file_name="user"; | ||
23 | fileinput=new QLineEdit(file_name,this); | ||
24 | fileinput->setGeometry(1,220,235,20); | ||
25 | showMaximized(); | ||
26 | } | ||
27 | |||
28 | FileDialog::~FileDialog() | ||
29 | {} | ||
30 | |||
31 | |||
32 | void FileDialog::selectorclicked(QListViewItem* entry) | ||
33 | { | ||
34 | if(entry==NULL) | ||
35 | return; | ||
36 | file_name=entry->text(0); | ||
37 | fileinput->setText(file_name); | ||
38 | } | ||
39 | |||
40 | void FileDialog::getCurrentDir() | ||
41 | { | ||
42 | dirselector->clear(); | ||
43 | QDir dir(QPEApplication::qpeDir()+"/backgammon"); | ||
44 | dir.setFilter(QDir::Files); | ||
45 | QFileInfoListIterator it(*(dir.entryInfoList())); | ||
46 | QFileInfo* fi; | ||
47 | |||
48 | int ext_length=ext.length(); | ||
49 | while((fi=it.current())) // go through all file and subdirs | ||
50 | { | ||
51 | QString file=fi->fileName(); | ||
52 | if(file.right(ext_length)==ext && file) | ||
53 | { | ||
54 | file=file.left(file.length()-ext_length); | ||
55 | new QListViewItem(dirselector,file); | ||
56 | } | ||
57 | ++it; | ||
58 | } | ||
59 | } | ||
60 | |||
61 | QString FileDialog::filename() | ||
62 | { | ||
63 | return file_name; | ||
64 | } | ||
diff --git a/noncore/games/backgammon/filedialog.h b/noncore/games/backgammon/filedialog.h new file mode 100644 index 0000000..2dfa557 --- a/dev/null +++ b/noncore/games/backgammon/filedialog.h | |||
@@ -0,0 +1,30 @@ | |||
1 | #ifndef FILEWIDGET_H | ||
2 | #define FILEWIDGET_H | ||
3 | |||
4 | #include <qdialog.h> | ||
5 | #include <qlineedit.h> | ||
6 | #include <qlistview.h> | ||
7 | #include <qstring.h> | ||
8 | |||
9 | |||
10 | class FileDialog : public QDialog | ||
11 | { | ||
12 | Q_OBJECT | ||
13 | private: | ||
14 | QListView* dirselector; | ||
15 | QLineEdit* fileinput; | ||
16 | QString ext; | ||
17 | QString file_name; | ||
18 | |||
19 | public: | ||
20 | FileDialog(QWidget* parent,QString header,QString extension,const char* name=0,bool modal=TRUE,WFlags f=0); | ||
21 | ~FileDialog(); | ||
22 | private slots: | ||
23 | void selectorclicked(QListViewItem* entry); | ||
24 | private: | ||
25 | void getCurrentDir(); | ||
26 | public: | ||
27 | QString filename(); | ||
28 | }; | ||
29 | |||
30 | #endif //FILEWIDGET_H | ||
diff --git a/noncore/games/backgammon/main.cpp b/noncore/games/backgammon/main.cpp new file mode 100644 index 0000000..86b452d --- a/dev/null +++ b/noncore/games/backgammon/main.cpp | |||
@@ -0,0 +1,14 @@ | |||
1 | #include <qpe/qpeapplication.h> | ||
2 | #include "backgammon.h" | ||
3 | |||
4 | |||
5 | int main( int argc, char** argv ) | ||
6 | { | ||
7 | QPEApplication app( argc, argv ); | ||
8 | |||
9 | BackGammon* view= new BackGammon(); | ||
10 | app.showMainWidget(view); | ||
11 | |||
12 | return app.exec(); | ||
13 | } | ||
14 | |||
diff --git a/noncore/games/backgammon/moveengine.cpp b/noncore/games/backgammon/moveengine.cpp new file mode 100644 index 0000000..009c449 --- a/dev/null +++ b/noncore/games/backgammon/moveengine.cpp | |||
@@ -0,0 +1,558 @@ | |||
1 | #include "moveengine.h" | ||
2 | |||
3 | #include <qmessagebox.h> | ||
4 | |||
5 | #include <qtimer.h> | ||
6 | |||
7 | MoveEngine::MoveEngine() | ||
8 | : QObject() | ||
9 | { | ||
10 | int offset=7; | ||
11 | int a=0; //counter variable | ||
12 | int xfill[]={210,185,170,155,140,125,110,85,70,55,40,25,10,10,25,40,55,70,85,110,125,140,155,170,185,210}; | ||
13 | for(a=0;a<26;a++) | ||
14 | { | ||
15 | x_coord[a]=xfill[a]; | ||
16 | } | ||
17 | |||
18 | int yfill[]={10,25,40,55,70,10+offset,25+offset,40+offset,55+offset,25,40,55, 25+offset,40+offset,40}; | ||
19 | int zfill[]={1,1,1,1,1,2,2,2,2,3,3,3,4,4,5}; | ||
20 | for(a=0;a<15;a++) | ||
21 | { | ||
22 | yup_coord[a]=yfill[a]; | ||
23 | ylow_coord[a]=185-(yfill[a]); | ||
24 | z_coord[a]=zfill[a]; | ||
25 | } | ||
26 | for(a=0;a<5;a++) | ||
27 | { | ||
28 | if(a<3) | ||
29 | { | ||
30 | x_fin1[a]=65+a*15; | ||
31 | x_fin2[a]=155-a*15; | ||
32 | } | ||
33 | y_fin[a]=225-a*5; | ||
34 | } | ||
35 | z_fin=1; | ||
36 | |||
37 | reset(); | ||
38 | } | ||
39 | |||
40 | MoveEngine::~MoveEngine() | ||
41 | {} | ||
42 | |||
43 | void MoveEngine::position(Pieces& pieces,bool non_qte) | ||
44 | { | ||
45 | int player1_counter=0; | ||
46 | int player2_counter=0; | ||
47 | |||
48 | //non qte styles are smaller !! | ||
49 | int offset=(non_qte) ? 5 : 0; | ||
50 | |||
51 | for(int a=0;a<28;a++) | ||
52 | { | ||
53 | for(int b=0;b<abs(population[a].total);b++) | ||
54 | { | ||
55 | if(population[a].total>0) //player 1 pieces | ||
56 | { | ||
57 | pieces.player1[player1_counter].x=x_coord[a]-offset; | ||
58 | if(a>=0 && a<13) | ||
59 | { | ||
60 | pieces.player1[player1_counter].y=yup_coord[b]-offset; | ||
61 | pieces.player1[player1_counter].z=z_coord[b]; | ||
62 | pieces.player1[player1_counter].side=false; | ||
63 | player1_counter++; | ||
64 | } | ||
65 | else if(a>12 && a<26) | ||
66 | { | ||
67 | pieces.player1[player1_counter].y=ylow_coord[b]-offset; | ||
68 | pieces.player1[player1_counter].z=z_coord[b]; | ||
69 | pieces.player1[player1_counter].side=false; | ||
70 | player1_counter++; | ||
71 | } | ||
72 | else if(a==26) | ||
73 | { | ||
74 | if(b<5) | ||
75 | { | ||
76 | pieces.player1[player1_counter].x=x_fin1[0]-offset; | ||
77 | pieces.player1[player1_counter].y=y_fin[b]-offset; | ||
78 | pieces.player1[player1_counter].z=z_fin; | ||
79 | } | ||
80 | else if(b>=5 && b<10) | ||
81 | { | ||
82 | pieces.player1[player1_counter].x=x_fin1[1]-offset; | ||
83 | pieces.player1[player1_counter].y=y_fin[b-5]-offset; | ||
84 | pieces.player1[player1_counter].z=z_fin; | ||
85 | } | ||
86 | else | ||
87 | { | ||
88 | pieces.player1[player1_counter].x=x_fin1[2]-offset; | ||
89 | pieces.player1[player1_counter].y=y_fin[b-10]-offset; | ||
90 | pieces.player1[player1_counter].z=z_fin; | ||
91 | } | ||
92 | pieces.player1[player1_counter].side=true; | ||
93 | player1_counter++; | ||
94 | |||
95 | } | ||
96 | } | ||
97 | |||
98 | else if(population[a].total<0) //player 2 pieces | ||
99 | { | ||
100 | pieces.player2[player2_counter].x=x_coord[a]-offset; | ||
101 | if(a>=0 && a<13) | ||
102 | { | ||
103 | pieces.player2[player2_counter].y=yup_coord[b]-offset; | ||
104 | pieces.player2[player2_counter].z=z_coord[b]; | ||
105 | pieces.player2[player2_counter].side=false; | ||
106 | player2_counter++; | ||
107 | } | ||
108 | else if(a>12 && a<26) | ||
109 | { | ||
110 | pieces.player2[player2_counter].y=ylow_coord[b]-offset; | ||
111 | pieces.player2[player2_counter].z=z_coord[b]; | ||
112 | pieces.player2[player2_counter].side=false; | ||
113 | player2_counter++; | ||
114 | } | ||
115 | else if(a==27) | ||
116 | { | ||
117 | if(b<5) | ||
118 | { | ||
119 | pieces.player2[player2_counter].x=x_fin2[0]-offset; | ||
120 | pieces.player2[player2_counter].y=y_fin[b]-offset; | ||
121 | pieces.player2[player2_counter].z=z_fin; | ||
122 | } | ||
123 | else if(b>=5 && b<10) | ||
124 | { | ||
125 | pieces.player2[player2_counter].x=x_fin2[1]-offset; | ||
126 | pieces.player2[player2_counter].y=y_fin[b-5]-offset; | ||
127 | pieces.player2[player2_counter].z=z_fin; | ||
128 | } | ||
129 | else | ||
130 | { | ||
131 | pieces.player2[player2_counter].x=x_fin2[2]-offset; | ||
132 | pieces.player2[player2_counter].y=y_fin[b-10]-offset; | ||
133 | pieces.player2[player2_counter].z=z_fin; | ||
134 | } | ||
135 | pieces.player2[player2_counter].side=true; | ||
136 | player2_counter++; | ||
137 | |||
138 | } | ||
139 | } | ||
140 | } | ||
141 | } | ||
142 | } | ||
143 | |||
144 | void MoveEngine::diceroll(const int& newplayer,const int& face1,const int& face2,const int& face3,const int& face4,bool computer) | ||
145 | { | ||
146 | checkstate(); | ||
147 | player=newplayer; | ||
148 | otherplayer=(player==1) ? 2 : 1; | ||
149 | dice[0]=face1; | ||
150 | dice[1]=face2; | ||
151 | dice[2]=face3; | ||
152 | dice[3]=face4; | ||
153 | marker_current=-1; | ||
154 | if(getPossibleMoves()==0) | ||
155 | { | ||
156 | emit nomove(); | ||
157 | return; // player will be changed | ||
158 | } | ||
159 | if(!computer) | ||
160 | return; //human intervention required | ||
161 | |||
162 | QTimer::singleShot(2000,this,SLOT(automove())); | ||
163 | } | ||
164 | |||
165 | |||
166 | void MoveEngine::automove() | ||
167 | { | ||
168 | //the maximimum possibility | ||
169 | int maxpos=0; | ||
170 | //the position in the moves array | ||
171 | int from=-1; | ||
172 | int to=-1; | ||
173 | //dice1 or dice 2 ?? | ||
174 | int index_dice=0; | ||
175 | for(int counter=0;counter<26;counter++) | ||
176 | { | ||
177 | int a=(player==1) ? counter : 25-counter; | ||
178 | for(int b=0;b<4;b++) | ||
179 | { | ||
180 | if(moves[a].weight[b]>maxpos) | ||
181 | { | ||
182 | maxpos=moves[a].weight[b]; | ||
183 | from=a; | ||
184 | to=moves[a].to[b]; | ||
185 | index_dice=b+1; | ||
186 | } | ||
187 | } | ||
188 | } | ||
189 | move(from,to,index_dice); | ||
190 | } | ||
191 | |||
192 | |||
193 | void MoveEngine::boardpressed(const int& x,const int& y,Marker& marker,bool non_qte) | ||
194 | { | ||
195 | //get the position of the mouse click | ||
196 | bool upper=true; | ||
197 | bool found=false; | ||
198 | |||
199 | int offset=(non_qte) ? 5 : 0; | ||
200 | |||
201 | if(y<=85) // board slots 0 to 12 | ||
202 | marker.y_current=0; | ||
203 | else if(y>=105) //board slots 13 to 25 | ||
204 | { | ||
205 | marker.y_current=195-2*offset; | ||
206 | upper=false; | ||
207 | } | ||
208 | |||
209 | int index=13; // the clicked board slot | ||
210 | |||
211 | while(index<25 && !found) | ||
212 | { | ||
213 | if(x>=x_coord[index] && x<x_coord[index+1]) | ||
214 | { | ||
215 | marker.x_current=x_coord[index]; | ||
216 | found=true; | ||
217 | ; | ||
218 | } | ||
219 | else | ||
220 | { | ||
221 | index++; | ||
222 | } | ||
223 | } | ||
224 | if(!found) | ||
225 | { | ||
226 | marker.x_current=x_coord[25]; | ||
227 | index=25; | ||
228 | } | ||
229 | if(upper) | ||
230 | { | ||
231 | index=25-index; | ||
232 | } | ||
233 | |||
234 | int a=0; | ||
235 | int usedice=-1; | ||
236 | int dice_value=7; | ||
237 | for(a=0;a<4;a++) | ||
238 | { | ||
239 | if(index==marker_next[a] && marker_next[a]!=-1 && dice_value>dice[a]) | ||
240 | { | ||
241 | usedice=a; | ||
242 | dice_value=dice[0]; | ||
243 | } | ||
244 | } | ||
245 | if(usedice!=-1) | ||
246 | { | ||
247 | move(marker_current,marker_next[usedice],usedice+1); | ||
248 | nomarker(marker); | ||
249 | return; | ||
250 | |||
251 | } | ||
252 | |||
253 | |||
254 | if(dice[0]==7 && dice[1]==7 && dice[2]==7 && dice[3]==7) //no dice rolled | ||
255 | { | ||
256 | nomarker(marker); | ||
257 | return; | ||
258 | } | ||
259 | else if(fieldColor(index)==player) | ||
260 | { | ||
261 | marker.visible_current=true; | ||
262 | marker_current=index; | ||
263 | } | ||
264 | else | ||
265 | { | ||
266 | nomarker(marker); | ||
267 | return; | ||
268 | } | ||
269 | |||
270 | for(a=0;a<4;a++) | ||
271 | { | ||
272 | if(moves[index].weight[a]>0) | ||
273 | { | ||
274 | int nextfield=moves[index].to[a]; | ||
275 | marker.x_next[a]=x_coord[nextfield]; | ||
276 | marker_next[a]=nextfield; | ||
277 | if(nextfield<13) //upper half | ||
278 | marker.y_next[a]=0; | ||
279 | else //lower half | ||
280 | marker.y_next[a]=195-2*offset; | ||
281 | marker.visible_next[a]=true; | ||
282 | } | ||
283 | else | ||
284 | { | ||
285 | marker.x_next[a]=0; | ||
286 | marker.y_next[a]=0; | ||
287 | marker_next[a]=-1; | ||
288 | marker.visible_next[a]=false; | ||
289 | } | ||
290 | } | ||
291 | return; | ||
292 | } | ||
293 | |||
294 | void MoveEngine::reset() | ||
295 | { | ||
296 | int a=0; | ||
297 | for(a=0;a<28;a++) | ||
298 | { | ||
299 | population[a].total=0; | ||
300 | } | ||
301 | |||
302 | int p1_index[]={1,1,12,12,12,12,12,17,17,17,19,19,19,19,19}; | ||
303 | int p2_index[]={24,24,13,13,13,13,13,8,8,8,6,6,6,6,6}; | ||
304 | //int p1_index[]={19,20,21,22,22,23,23,18,18,23,24,24,24,24,24}; | ||
305 | //int p2_index[]={6,5,4,3,3,2,2,2,2,2,1,7,7,1,1}; | ||
306 | for(a=0;a<15;a++) | ||
307 | { | ||
308 | population[p1_index[a]].total++; | ||
309 | population[p2_index[a]].total--; | ||
310 | } | ||
311 | |||
312 | player=0; | ||
313 | dice[0]=7; | ||
314 | dice[1]=7; | ||
315 | dice[2]=7; | ||
316 | dice[3]=7; | ||
317 | |||
318 | marker_current=-1; | ||
319 | marker_next[0]=-1; | ||
320 | marker_next[1]=-1; | ||
321 | marker_next[2]=-1; | ||
322 | marker_next[3]=-1; | ||
323 | //allclear[0]==false; | ||
324 | allclear[1]=false; | ||
325 | allclear[2]=false; | ||
326 | last_piece[1]=0; | ||
327 | last_piece[2]=25; | ||
328 | } | ||
329 | |||
330 | void MoveEngine::loadGame(const LoadSave& load) | ||
331 | { | ||
332 | for(int a=0;a<28;a++) | ||
333 | { | ||
334 | population[a].total=load.pop[a].total; | ||
335 | } | ||
336 | checkstate(); | ||
337 | } | ||
338 | |||
339 | LoadSave MoveEngine::saveGame() | ||
340 | { | ||
341 | LoadSave save; | ||
342 | for(int a=0;a<28;a++) | ||
343 | { | ||
344 | save.pop[a].total=population[a].total; | ||
345 | } | ||
346 | return save; | ||
347 | } | ||
348 | |||
349 | AISettings MoveEngine::getAISettings() | ||
350 | { | ||
351 | return ai; | ||
352 | } | ||
353 | |||
354 | void MoveEngine::setAISettings(const AISettings& new_ai) | ||
355 | { | ||
356 | ai=new_ai; | ||
357 | } | ||
358 | |||
359 | void MoveEngine::setRules(Rules rules) | ||
360 | { | ||
361 | move_with_pieces_out=rules.move_with_pieces_out; | ||
362 | nice_dice=rules.generous_dice; | ||
363 | } | ||
364 | |||
365 | |||
366 | int MoveEngine::getPossibleMoves() | ||
367 | { | ||
368 | int homezone[]={0,25,0}; | ||
369 | int lastToHomeZone=abs(last_piece[player]-homezone[player]); | ||
370 | for(int field=0;field<26;field++) | ||
371 | { | ||
372 | |||
373 | for(int b=0;b<4;b++) | ||
374 | { | ||
375 | int dice_tmp=dice[b]; | ||
376 | if(dice[b]!=7 && dice[b]> lastToHomeZone) | ||
377 | dice_tmp=lastToHomeZone; | ||
378 | |||
379 | int nextfield=(player==1) ? field+dice_tmp : field-dice_tmp; | ||
380 | |||
381 | if(nice_dice) | ||
382 | { | ||
383 | if(player==1 && nextfield>homezone[1]) | ||
384 | nextfield=homezone[1]; | ||
385 | else if(player==2 && nextfield<homezone[2]) | ||
386 | nextfield=homezone[2]; | ||
387 | } | ||
388 | |||
389 | moves[field].weight[b]=0; | ||
390 | moves[field].to[b]=nextfield; | ||
391 | |||
392 | int out_of_board[]={-1,0,25}; | ||
393 | if(!move_with_pieces_out && field!=out_of_board[player] && pieces_out[player]) | ||
394 | { | ||
395 | continue; | ||
396 | } | ||
397 | |||
398 | |||
399 | |||
400 | if(dice[b]!=7 && fieldColor(field)==player ) //player can only move his own pieces | ||
401 | { | ||
402 | if((player==1 && nextfield > homezone[1]) || (player==2 && nextfield < homezone[2])) | ||
403 | { | ||
404 | moves[field].weight[b]=0; //movement would be far out of board | ||
405 | } | ||
406 | else if(nextfield==homezone[player] && !allclear[player]) | ||
407 | { | ||
408 | moves[field].weight[b]=0; //can not rescue pieces until all are in the endzone | ||
409 | } | ||
410 | else if(nextfield==homezone[player] && allclear[player]) | ||
411 | { | ||
412 | moves[field].weight[b]=ai.rescue; //rescue your pieces : nuff said ;-) | ||
413 | } | ||
414 | else if(fieldColor(nextfield)==otherplayer) | ||
415 | { | ||
416 | if(abs(population[nextfield].total)>1) //can not move to this field | ||
417 | moves[field].weight[b]=0; | ||
418 | else if(abs(population[nextfield].total)==1) //eliminate opponent : very nice | ||
419 | moves[field].weight[b]=ai.eliminate; | ||
420 | } | ||
421 | else if(fieldColor(nextfield)==player) //nextfield already occupied by player | ||
422 | { | ||
423 | if(abs(population[field].total)==2) //expose own piece : not diserable | ||
424 | moves[field].weight[b]=ai.expose; | ||
425 | else if(abs(population[nextfield].total)>1) //own pices already there : safe | ||
426 | moves[field].weight[b]=ai.safe; | ||
427 | else if(abs(population[nextfield].total)==1) //protect own piece : most importatnt | ||
428 | moves[field].weight[b]=ai.protect; | ||
429 | } | ||
430 | else if(population[nextfield].total==0) //nextfield empty | ||
431 | { | ||
432 | if(abs(population[field].total)==2) //expose own piece : not diserable | ||
433 | moves[field].weight[b]=ai.expose; | ||
434 | else | ||
435 | moves[field].weight[b]=ai.empty; | ||
436 | } | ||
437 | else | ||
438 | moves[field].weight[b]=0; //default. | ||
439 | } | ||
440 | |||
441 | |||
442 | |||
443 | else | ||
444 | moves[field].weight[b]=0; //dice already used or field not used by player | ||
445 | } | ||
446 | |||
447 | |||
448 | |||
449 | } | ||
450 | |||
451 | int total=0; | ||
452 | for(int field=0;field<26;field++) | ||
453 | { | ||
454 | total+=moves[field].weight[0]+moves[field].weight[1]+moves[field].weight[2]+moves[field].weight[3]; | ||
455 | } | ||
456 | return total; | ||
457 | } | ||
458 | |||
459 | void MoveEngine::move(const int& from, int to, const int& dice) | ||
460 | { | ||
461 | //qDebug("%d moves from %d to %d (%d) with dice %d",player,from,to,to-from,dice); | ||
462 | |||
463 | if(player==1 && to==25) | ||
464 | to=26; | ||
465 | if(player==2 && to==0) | ||
466 | to=27; | ||
467 | |||
468 | //if space is occupied by enemy move pieces to startzone | ||
469 | if(fieldColor(to)==otherplayer) | ||
470 | { | ||
471 | population[to].total=0; | ||
472 | if(otherplayer==1) | ||
473 | population[0].total++; | ||
474 | else | ||
475 | population[25].total--; | ||
476 | } | ||
477 | |||
478 | if(player==1) | ||
479 | { | ||
480 | population[from].total--; | ||
481 | population[to].total++; | ||
482 | } | ||
483 | else //player=2 | ||
484 | { | ||
485 | population[from].total++; | ||
486 | population[to].total--; | ||
487 | } | ||
488 | |||
489 | if(dice==1) | ||
490 | emit done_dice1(); | ||
491 | else if(dice==2) | ||
492 | emit done_dice2(); | ||
493 | else if(dice==3) | ||
494 | emit done_dice3(); | ||
495 | else | ||
496 | emit done_dice4(); | ||
497 | |||
498 | if(abs(population[26].total)==15) | ||
499 | emit player_finished(1); | ||
500 | if(abs(population[27].total)==15) | ||
501 | emit player_finished(2); | ||
502 | } | ||
503 | |||
504 | void MoveEngine::checkstate() | ||
505 | { | ||
506 | //check if pieces are out | ||
507 | pieces_out[1]=(population[0].total>0) ? true : false; | ||
508 | pieces_out[2]=(population[25].total<0) ? true : false; | ||
509 | |||
510 | //check if all pieces are in the endzones | ||
511 | allclear[1]=true; | ||
512 | allclear[2]=true; | ||
513 | |||
514 | last_piece[1]=25; | ||
515 | bool found_last_piece1=false; | ||
516 | last_piece[2]=0; | ||
517 | |||
518 | for(int a=0;a<26;a++) | ||
519 | { | ||
520 | if(a<19 && population[a].total>0) | ||
521 | allclear[1]=false; | ||
522 | if(a>6 && population[a].total<0) | ||
523 | allclear[2]=false; | ||
524 | |||
525 | if(population[a].total>0 && !found_last_piece1) | ||
526 | { | ||
527 | last_piece[1]=a; | ||
528 | found_last_piece1=true; | ||
529 | } | ||
530 | if(population[a].total<0) | ||
531 | last_piece[2]=a; | ||
532 | } | ||
533 | } | ||
534 | |||
535 | void MoveEngine::nomarker(Marker& marker) | ||
536 | { | ||
537 | marker.visible_current=false; | ||
538 | marker_current=-1; | ||
539 | for(int a=0;a<4;a++) | ||
540 | { | ||
541 | marker.x_next[a]=0; | ||
542 | marker.y_next[a]=0; | ||
543 | marker_next[a]=-1; | ||
544 | marker.visible_next[a]=false; | ||
545 | } | ||
546 | } | ||
547 | |||
548 | int MoveEngine::fieldColor(const int& index) const | ||
549 | { | ||
550 | if(population[index].total>0) | ||
551 | return 1; | ||
552 | else if(population[index].total<0) | ||
553 | return 2; | ||
554 | else | ||
555 | return 0; | ||
556 | } | ||
557 | |||
558 | |||
diff --git a/noncore/games/backgammon/moveengine.h b/noncore/games/backgammon/moveengine.h new file mode 100644 index 0000000..a2d4a52 --- a/dev/null +++ b/noncore/games/backgammon/moveengine.h | |||
@@ -0,0 +1,76 @@ | |||
1 | #ifndef MOVEENGINE_H | ||
2 | #define MOVEENGINE_H | ||
3 | |||
4 | #include <qobject.h> | ||
5 | #include "definition.h" | ||
6 | |||
7 | class MoveEngine : public QObject | ||
8 | { | ||
9 | Q_OBJECT | ||
10 | private: | ||
11 | //normal pieses | ||
12 | int x_coord[26]; //26 posssible x-positions or piece is not on the board | ||
13 | int yup_coord[15]; // the 15 posssible y-positions on the upper half of the board | ||
14 | int ylow_coord[15]; // the 15 posssible y-positions on the lower half of the board | ||
15 | int z_coord[15]; //the 15 possible z-positionson the board | ||
16 | //finshed pieces | ||
17 | int x_fin1[3]; | ||
18 | int x_fin2[3]; | ||
19 | int y_fin[5]; | ||
20 | int z_fin; | ||
21 | //the board population | ||
22 | // |12|11|10|09|08|07|06|05|04|03|02|01|00| | ||
23 | // ======================================= | ||
24 | // |13|14|15|16|17|18|19|20|21|22|23|24|25| | ||
25 | // endzones 26 player1, 27 player 2 | ||
26 | Population population[28]; | ||
27 | AISettings ai; | ||
28 | //move information | ||
29 | int player; | ||
30 | int otherplayer; | ||
31 | int dice[4]; | ||
32 | //index of the markers | ||
33 | int marker_current; | ||
34 | int marker_next[4]; | ||
35 | //player pieces are all in the end zone | ||
36 | bool allclear[3]; | ||
37 | //player must bring pieces back into game | ||
38 | bool pieces_out[3]; | ||
39 | bool move_with_pieces_out; | ||
40 | //player can rescue pieces with dice bigger than move, even if there are poeces "behind" it | ||
41 | bool nice_dice; | ||
42 | int last_piece[3]; | ||
43 | //possible moves | ||
44 | Possiblilites moves[26]; | ||
45 | public: | ||
46 | public: | ||
47 | MoveEngine(); | ||
48 | ~MoveEngine(); | ||
49 | signals: | ||
50 | void done_dice1(); | ||
51 | void done_dice2(); | ||
52 | void done_dice3(); | ||
53 | void done_dice4(); | ||
54 | void nomove(); | ||
55 | void player_finished(int); | ||
56 | private slots: | ||
57 | void automove(); | ||
58 | public: | ||
59 | void position(Pieces& pieces,bool non_qte=false); | ||
60 | void diceroll(const int& player,const int& face1,const int& face2,const int& face3,const int& face4,bool computer); | ||
61 | void boardpressed(const int& x,const int& y,Marker& marker,bool non_qte=false); | ||
62 | void reset(); | ||
63 | void loadGame(const LoadSave& load); | ||
64 | LoadSave saveGame(); | ||
65 | AISettings getAISettings(); | ||
66 | void setAISettings(const AISettings& new_ai); | ||
67 | void setRules(Rules rules); | ||
68 | private: | ||
69 | int getPossibleMoves(); | ||
70 | void move(const int& from, int to, const int& dice); | ||
71 | void checkstate(); | ||
72 | void nomarker(Marker& marker); | ||
73 | int fieldColor(const int& index) const; | ||
74 | }; | ||
75 | |||
76 | #endif //MOVEENGINE_H | ||
diff --git a/noncore/games/backgammon/playerdialog.cpp b/noncore/games/backgammon/playerdialog.cpp new file mode 100644 index 0000000..c16f202 --- a/dev/null +++ b/noncore/games/backgammon/playerdialog.cpp | |||
@@ -0,0 +1,114 @@ | |||
1 | #include "playerdialog.h" | ||
2 | |||
3 | #include <qgroupbox.h> | ||
4 | |||
5 | PlayerDialog::PlayerDialog(QWidget* parent,const char* name,bool modal,WFlags f) | ||
6 | :QDialog(parent,name,modal,f) | ||
7 | { | ||
8 | auto2=false; | ||
9 | auto2=true; | ||
10 | setCaption("Player Settings"); | ||
11 | |||
12 | QGroupBox* player1_box=new QGroupBox("Player 1",this); | ||
13 | player1_box->setGeometry(10,30,220,60); | ||
14 | |||
15 | manual_button1=new QRadioButton("Human",player1_box); | ||
16 | connect(manual_button1,SIGNAL(clicked()),this,SLOT(button_manual1())); | ||
17 | manual_button1->setGeometry(10,20,100,20); | ||
18 | auto_button1=new QRadioButton("Computer",player1_box); | ||
19 | connect(auto_button1,SIGNAL(clicked()),this,SLOT(button_auto1())); | ||
20 | auto_button1->setGeometry(110,20,100,20); | ||
21 | button1_state(auto1); | ||
22 | |||
23 | QGroupBox* player2_box=new QGroupBox("Player 2",this); | ||
24 | player2_box->setGeometry(10,150,220,60); | ||
25 | |||
26 | manual_button2=new QRadioButton("Human",player2_box); | ||
27 | connect(manual_button2,SIGNAL(clicked()),this,SLOT(button_manual2())); | ||
28 | manual_button2->setGeometry(10,20,100,20); | ||
29 | auto_button2=new QRadioButton("Computer",player2_box); | ||
30 | connect(auto_button2,SIGNAL(clicked()),this,SLOT(button_auto2())); | ||
31 | auto_button2->setGeometry(110,20,100,20); | ||
32 | button2_state(auto2); | ||
33 | |||
34 | showMaximized(); | ||
35 | } | ||
36 | |||
37 | PlayerDialog::~PlayerDialog() | ||
38 | {} | ||
39 | |||
40 | |||
41 | void PlayerDialog::button_manual1() | ||
42 | { | ||
43 | auto1=false; | ||
44 | button1_state(auto1); | ||
45 | } | ||
46 | |||
47 | void PlayerDialog::button_auto1() | ||
48 | { | ||
49 | auto1=true; | ||
50 | button1_state(auto1); | ||
51 | } | ||
52 | |||
53 | void PlayerDialog::button_manual2() | ||
54 | { | ||
55 | auto2=false; | ||
56 | button2_state(auto2); | ||
57 | } | ||
58 | |||
59 | void PlayerDialog::button_auto2() | ||
60 | { | ||
61 | auto2=true; | ||
62 | button2_state(auto2); | ||
63 | } | ||
64 | |||
65 | void PlayerDialog::button1_state(bool computer) | ||
66 | { | ||
67 | if(computer) | ||
68 | { | ||
69 | manual_button1->setChecked(false); | ||
70 | auto_button1->setChecked(true); | ||
71 | } | ||
72 | else | ||
73 | { | ||
74 | manual_button1->setChecked(true); | ||
75 | auto_button1->setChecked(false); | ||
76 | } | ||
77 | } | ||
78 | |||
79 | void PlayerDialog::button2_state(bool computer) | ||
80 | { | ||
81 | if(computer) | ||
82 | { | ||
83 | manual_button2->setChecked(false); | ||
84 | auto_button2->setChecked(true); | ||
85 | } | ||
86 | else | ||
87 | { | ||
88 | manual_button2->setChecked(true); | ||
89 | auto_button2->setChecked(false); | ||
90 | } | ||
91 | } | ||
92 | |||
93 | |||
94 | void PlayerDialog::setAuto1(bool newstate) | ||
95 | { | ||
96 | auto1=newstate; | ||
97 | button1_state(auto1); | ||
98 | } | ||
99 | |||
100 | bool PlayerDialog::getAuto1() | ||
101 | { | ||
102 | return auto1; | ||
103 | } | ||
104 | |||
105 | void PlayerDialog::setAuto2(bool newstate) | ||
106 | { | ||
107 | auto2=newstate; | ||
108 | button2_state(auto2); | ||
109 | } | ||
110 | |||
111 | bool PlayerDialog::getAuto2() | ||
112 | { | ||
113 | return auto2; | ||
114 | } | ||
diff --git a/noncore/games/backgammon/playerdialog.h b/noncore/games/backgammon/playerdialog.h new file mode 100644 index 0000000..8fccaa7 --- a/dev/null +++ b/noncore/games/backgammon/playerdialog.h | |||
@@ -0,0 +1,35 @@ | |||
1 | #ifndef PLAYERDIALOG_H | ||
2 | #define PLAYERDIALOG_H | ||
3 | |||
4 | #include <qradiobutton.h> | ||
5 | #include <qdialog.h> | ||
6 | |||
7 | class PlayerDialog : public QDialog | ||
8 | { | ||
9 | Q_OBJECT | ||
10 | private: | ||
11 | bool auto1; | ||
12 | bool auto2; | ||
13 | QRadioButton* manual_button1; | ||
14 | QRadioButton* auto_button1; | ||
15 | QRadioButton* manual_button2; | ||
16 | QRadioButton* auto_button2; | ||
17 | public: | ||
18 | PlayerDialog(QWidget* parent=0,const char* name=0,bool modal=TRUE,WFlags f=0); | ||
19 | ~PlayerDialog(); | ||
20 | private slots: | ||
21 | void button_manual1(); | ||
22 | void button_auto1(); | ||
23 | void button_manual2(); | ||
24 | void button_auto2(); | ||
25 | private: | ||
26 | void button1_state(bool computer); | ||
27 | void button2_state(bool computer); | ||
28 | public: | ||
29 | void setAuto1(bool newstate); | ||
30 | bool getAuto1(); | ||
31 | void setAuto2(bool newstate); | ||
32 | bool getAuto2(); | ||
33 | }; | ||
34 | |||
35 | #endif //PLAYERDIALOG_H | ||
diff --git a/noncore/games/backgammon/rulesdialog.cpp b/noncore/games/backgammon/rulesdialog.cpp new file mode 100644 index 0000000..85c3db3 --- a/dev/null +++ b/noncore/games/backgammon/rulesdialog.cpp | |||
@@ -0,0 +1,77 @@ | |||
1 | #include "rulesdialog.h" | ||
2 | |||
3 | #include <qgroupbox.h> | ||
4 | #include <qlabel.h> | ||
5 | |||
6 | RulesDialog::RulesDialog(QWidget* parent,const char* name,bool modal,WFlags f) | ||
7 | : QDialog(parent,name,modal,f) | ||
8 | { | ||
9 | setCaption("Rules Configuration"); | ||
10 | QLabel* header=new QLabel("<b>Change the game rules here</b>",this); | ||
11 | header->setGeometry(10,10,200,20); | ||
12 | |||
13 | // | ||
14 | QGroupBox* pieces_out_box=new QGroupBox("Movement",this); | ||
15 | pieces_out_box->setGeometry(10,10,220,120); | ||
16 | |||
17 | pieces_out=new QCheckBox("Don't care about others",pieces_out_box); | ||
18 | pieces_out->setGeometry(10,20,200,20); | ||
19 | connect(pieces_out,SIGNAL(clicked()),this,SLOT(pieces_out_clicked())); | ||
20 | |||
21 | QLabel* pieces_out_help=new QLabel("allow movement of the pieses\neven if there are pieces knocked\nout by the opponent",pieces_out_box); | ||
22 | pieces_out_help->setGeometry(10,40,200,60); | ||
23 | |||
24 | // | ||
25 | QGroupBox* nice_dice_box=new QGroupBox("Dice",this); | ||
26 | nice_dice_box->setGeometry(10,140,220,120); | ||
27 | |||
28 | nice_dice=new QCheckBox("Big dice for small numbers",nice_dice_box); | ||
29 | nice_dice->setGeometry(10,20,200,20); | ||
30 | connect(nice_dice,SIGNAL(clicked()),this,SLOT(nice_dice_clicked())); | ||
31 | |||
32 | QLabel* nice_dice_help=new QLabel("allow to rescue pieces with dice\nvalues graeter than the distance\nto the players endzone.",nice_dice_box); | ||
33 | nice_dice_help->setGeometry(10,40,200,60); | ||
34 | |||
35 | showMaximized(); | ||
36 | } | ||
37 | |||
38 | |||
39 | RulesDialog::~RulesDialog() | ||
40 | { | ||
41 | } | ||
42 | |||
43 | void RulesDialog::pieces_out_clicked() | ||
44 | { | ||
45 | if(pieces_out->isChecked()) | ||
46 | rules.move_with_pieces_out=true; | ||
47 | else | ||
48 | rules.move_with_pieces_out=false; | ||
49 | } | ||
50 | |||
51 | void RulesDialog::nice_dice_clicked() | ||
52 | { | ||
53 | if(nice_dice->isChecked()) | ||
54 | rules.generous_dice=true; | ||
55 | else | ||
56 | rules.generous_dice=false; | ||
57 | } | ||
58 | |||
59 | void RulesDialog::setRules(const Rules& new_rules) | ||
60 | { | ||
61 | rules=new_rules; | ||
62 | if(rules.move_with_pieces_out) | ||
63 | pieces_out->setChecked(true); | ||
64 | else | ||
65 | pieces_out->setChecked(false); | ||
66 | |||
67 | if(rules.generous_dice) | ||
68 | nice_dice->setChecked(true); | ||
69 | else | ||
70 | nice_dice->setChecked(false); | ||
71 | } | ||
72 | |||
73 | Rules RulesDialog::getRules() | ||
74 | { | ||
75 | return rules; | ||
76 | } | ||
77 | |||
diff --git a/noncore/games/backgammon/rulesdialog.h b/noncore/games/backgammon/rulesdialog.h new file mode 100644 index 0000000..9269a0e --- a/dev/null +++ b/noncore/games/backgammon/rulesdialog.h | |||
@@ -0,0 +1,27 @@ | |||
1 | #ifndef RULESDIALOG_H_ | ||
2 | #define RULESDIALOG_H_ | ||
3 | |||
4 | #include <qcheckbox.h> | ||
5 | #include <qdialog.h> | ||
6 | #include "definition.h" | ||
7 | |||
8 | |||
9 | class RulesDialog : public QDialog | ||
10 | { | ||
11 | Q_OBJECT | ||
12 | private: | ||
13 | QCheckBox* pieces_out; | ||
14 | QCheckBox* nice_dice; | ||
15 | Rules rules; | ||
16 | public: | ||
17 | RulesDialog(QWidget* parent=0,const char* name=0,bool modal=TRUE,WFlags f=0); | ||
18 | ~RulesDialog(); | ||
19 | private slots: | ||
20 | void pieces_out_clicked(); | ||
21 | void nice_dice_clicked(); | ||
22 | public: | ||
23 | void setRules(const Rules& new_rules); | ||
24 | Rules getRules(); | ||
25 | }; | ||
26 | |||
27 | #endif //RULESDIALOG_H | ||
diff --git a/noncore/games/backgammon/themedialog.cpp b/noncore/games/backgammon/themedialog.cpp new file mode 100644 index 0000000..dcb957c --- a/dev/null +++ b/noncore/games/backgammon/themedialog.cpp | |||
@@ -0,0 +1,163 @@ | |||
1 | #include "themedialog.h" | ||
2 | |||
3 | #include <qdir.h> | ||
4 | #include <qfileinfo.h> | ||
5 | #include <qlabel.h> | ||
6 | #include <qpushbutton.h> | ||
7 | #include <qpe/qpeapplication.h> | ||
8 | |||
9 | |||
10 | ThemeDialog::ThemeDialog(QWidget* parent,const char* name,bool modal,WFlags f) | ||
11 | :QDialog(parent,name,modal,f) | ||
12 | { | ||
13 | setCaption("Theme Dialog"); | ||
14 | QLabel* labelname=new QLabel("name",this); | ||
15 | labelname->setGeometry(0,5,40,20); | ||
16 | lineName=new QLineEdit("user",this); | ||
17 | lineName->setGeometry(40,5,195,20); | ||
18 | |||
19 | QLabel* labelboard=new QLabel("board",this); | ||
20 | labelboard->setGeometry(0,30,40,20); | ||
21 | boxboard=new QComboBox(this,""); | ||
22 | boxboard->setGeometry(40,30,195,20); | ||
23 | fillBox("boards",boxboard); | ||
24 | |||
25 | QLabel* labelpiecesA=new QLabel("pieces1",this); | ||
26 | labelpiecesA->setGeometry(0,70,40,20); | ||
27 | boxpiecesA=new QComboBox(this); | ||
28 | boxpiecesA->setGeometry(40,70,195,20); | ||
29 | fillBox("pieces",boxpiecesA); | ||
30 | |||
31 | QLabel* labelpiecesB=new QLabel("pieces2",this); | ||
32 | labelpiecesB->setGeometry(0,95,40,20); | ||
33 | boxpiecesB=new QComboBox(this); | ||
34 | boxpiecesB->setGeometry(40,95,195,20); | ||
35 | fillBox("pieces",boxpiecesB); | ||
36 | |||
37 | QLabel* labeldiceA=new QLabel("dice1",this); | ||
38 | labeldiceA->setGeometry(0,135,40,20); | ||
39 | boxdiceA=new QComboBox(this); | ||
40 | boxdiceA->setGeometry(40,135,195,20); | ||
41 | fillBox("dice",boxdiceA); | ||
42 | |||
43 | QLabel* labeldiceB=new QLabel("dice2",this); | ||
44 | labeldiceB->setGeometry(0,160,40,20); | ||
45 | boxdiceB=new QComboBox(this); | ||
46 | boxdiceB->setGeometry(40,160,195,20); | ||
47 | fillBox("dice",boxdiceB); | ||
48 | |||
49 | QLabel* labelodds=new QLabel("odds",this); | ||
50 | labelodds->setGeometry(0,200,40,20); | ||
51 | boxodds=new QComboBox(this); | ||
52 | boxodds->setGeometry(40,200,195,20); | ||
53 | fillBox("odds",boxodds); | ||
54 | boxodds->setEnabled(false); | ||
55 | |||
56 | QLabel* labeltable=new QLabel("table",this); | ||
57 | labeltable->setGeometry(0,225,40,20); | ||
58 | boxtable=new QComboBox(this); | ||
59 | boxtable->setGeometry(40,225,195,20); | ||
60 | fillBox("table",boxtable); | ||
61 | |||
62 | showMaximized(); | ||
63 | } | ||
64 | |||
65 | ThemeDialog::~ThemeDialog() | ||
66 | {} | ||
67 | |||
68 | |||
69 | ImageNames ThemeDialog::getNames() | ||
70 | { | ||
71 | ImageNames names; | ||
72 | names.theme=lineName->text(); | ||
73 | names.board=boxboard->currentText(); | ||
74 | names.pieces1=boxpiecesA->currentText(); | ||
75 | names.pieces2=boxpiecesB->currentText(); | ||
76 | names.dice1=boxdiceA->currentText(); | ||
77 | names.dice2=boxdiceB->currentText(); | ||
78 | names.odds=boxodds->currentText(); | ||
79 | names.table=boxtable->currentText(); | ||
80 | return names; | ||
81 | } | ||
82 | |||
83 | void ThemeDialog::setCurrent(const ImageNames& current) | ||
84 | { | ||
85 | int a=0; | ||
86 | lineName->setText(current.theme); | ||
87 | for(a=0;a<boxboard->count();a++) | ||
88 | { | ||
89 | if(boxboard->text(a)==current.board) | ||
90 | { | ||
91 | boxboard->setCurrentItem(a); | ||
92 | break; | ||
93 | } | ||
94 | } | ||
95 | for(a=0;a<boxpiecesA->count();a++) | ||
96 | { | ||
97 | if(boxpiecesA->text(a)==current.pieces1) | ||
98 | { | ||
99 | boxpiecesA->setCurrentItem(a); | ||
100 | break; | ||
101 | } | ||
102 | } | ||
103 | for(a=0;a<boxpiecesB->count();a++) | ||
104 | { | ||
105 | if(boxpiecesB->text(a)==current.pieces2) | ||
106 | { | ||
107 | boxpiecesB->setCurrentItem(a); | ||
108 | break; | ||
109 | } | ||
110 | } | ||
111 | for(a=0;a<boxdiceA->count();a++) | ||
112 | { | ||
113 | if(boxdiceA->text(a)==current.dice1) | ||
114 | { | ||
115 | boxdiceA->setCurrentItem(a); | ||
116 | break; | ||
117 | } | ||
118 | } | ||
119 | for(a=0;a<boxdiceB->count();a++) | ||
120 | { | ||
121 | if(boxdiceB->text(a)==current.dice2) | ||
122 | { | ||
123 | boxdiceB->setCurrentItem(a); | ||
124 | break; | ||
125 | } | ||
126 | } | ||
127 | for(a=0;a<boxodds->count();a++) | ||
128 | { | ||
129 | if(boxodds->text(a)==current.odds) | ||
130 | { | ||
131 | boxodds->setCurrentItem(a); | ||
132 | break; | ||
133 | } | ||
134 | } | ||
135 | for(a=0;a<boxtable->count();a++) | ||
136 | { | ||
137 | if(boxtable->text(a)==current.table) | ||
138 | { | ||
139 | boxtable->setCurrentItem(a); | ||
140 | break; | ||
141 | } | ||
142 | } | ||
143 | } | ||
144 | |||
145 | void ThemeDialog::fillBox(QString dirname,QComboBox* thebox) | ||
146 | { | ||
147 | thebox->clear(); | ||
148 | QDir dir(QPEApplication::qpeDir()+"/pics/backgammon/"+dirname); | ||
149 | dir.setFilter(QDir::Dirs | QDir::Files); | ||
150 | QFileInfoListIterator it(*(dir.entryInfoList())); | ||
151 | QFileInfo* fi; | ||
152 | |||
153 | while((fi=it.current())) // go through all file and subdirs | ||
154 | { | ||
155 | QString file=fi->fileName(); | ||
156 | if(file.right(4)==".png") | ||
157 | { | ||
158 | thebox->insertItem(file.left(file.find(".png"))); | ||
159 | } | ||
160 | ++it; | ||
161 | } | ||
162 | delete fi; | ||
163 | } | ||
diff --git a/noncore/games/backgammon/themedialog.h b/noncore/games/backgammon/themedialog.h new file mode 100644 index 0000000..45a61f2 --- a/dev/null +++ b/noncore/games/backgammon/themedialog.h | |||
@@ -0,0 +1,42 @@ | |||
1 | #ifndef THEMEDIALOG_H | ||
2 | #define THEMEDIALOG_H | ||
3 | |||
4 | #include <qcombobox.h> | ||
5 | #include <qdialog.h> | ||
6 | #include <qlineedit.h> | ||
7 | |||
8 | struct ImageNames | ||
9 | { | ||
10 | QString theme; | ||
11 | QString board; | ||
12 | QString pieces1; | ||
13 | QString pieces2; | ||
14 | QString dice1; | ||
15 | QString dice2; | ||
16 | QString odds; | ||
17 | QString table; | ||
18 | }; | ||
19 | |||
20 | class ThemeDialog : public QDialog | ||
21 | { | ||
22 | Q_OBJECT | ||
23 | private: | ||
24 | QLineEdit* lineName; | ||
25 | QComboBox* boxboard; | ||
26 | QComboBox* boxpiecesA; | ||
27 | QComboBox* boxpiecesB; | ||
28 | QComboBox* boxdiceA; | ||
29 | QComboBox* boxdiceB; | ||
30 | QComboBox* boxodds; | ||
31 | QComboBox* boxtable; | ||
32 | public: | ||
33 | ThemeDialog(QWidget* parent=0,const char* name=0,bool modal=TRUE,WFlags f=0); | ||
34 | ~ThemeDialog(); | ||
35 | public: | ||
36 | ImageNames getNames(); | ||
37 | void setCurrent(const ImageNames& current); | ||
38 | private: | ||
39 | void fillBox(QString dirname,QComboBox* thebox); | ||
40 | }; | ||
41 | |||
42 | #endif //THEMEDIALOG_H | ||
diff --git a/pics/backgammon/backgammon.png b/pics/backgammon/backgammon.png new file mode 100644 index 0000000..762994e --- a/dev/null +++ b/pics/backgammon/backgammon.png | |||
Binary files differ | |||
diff --git a/pics/backgammon/boards/casino_board_1.png b/pics/backgammon/boards/casino_board_1.png new file mode 100644 index 0000000..2e5bbaf --- a/dev/null +++ b/pics/backgammon/boards/casino_board_1.png | |||
Binary files differ | |||
diff --git a/pics/backgammon/dice/casino_dice.png b/pics/backgammon/dice/casino_dice.png new file mode 100755 index 0000000..4dfc9c9 --- a/dev/null +++ b/pics/backgammon/dice/casino_dice.png | |||
Binary files differ | |||
diff --git a/pics/backgammon/no_move.png b/pics/backgammon/no_move.png new file mode 100755 index 0000000..5dcf479 --- a/dev/null +++ b/pics/backgammon/no_move.png | |||
Binary files differ | |||
diff --git a/pics/backgammon/odds/casino_odds.png b/pics/backgammon/odds/casino_odds.png new file mode 100644 index 0000000..92cf4b7 --- a/dev/null +++ b/pics/backgammon/odds/casino_odds.png | |||
Binary files differ | |||
diff --git a/pics/backgammon/pieces/casino_pieces_blue.png b/pics/backgammon/pieces/casino_pieces_blue.png new file mode 100755 index 0000000..cf70960 --- a/dev/null +++ b/pics/backgammon/pieces/casino_pieces_blue.png | |||
Binary files differ | |||
diff --git a/pics/backgammon/pieces/casino_pieces_white.png b/pics/backgammon/pieces/casino_pieces_white.png new file mode 100755 index 0000000..c23b6e6 --- a/dev/null +++ b/pics/backgammon/pieces/casino_pieces_white.png | |||
Binary files differ | |||
diff --git a/pics/backgammon/table/casino_table_green.png b/pics/backgammon/table/casino_table_green.png new file mode 100644 index 0000000..003e0d4 --- a/dev/null +++ b/pics/backgammon/table/casino_table_green.png | |||
Binary files differ | |||