source: titan/plugins/sudoku/sudoku.c @ 29501

Last change on this file since 29501 was 29501, checked in by tobayer, 9 years ago

[sudoku plugin] add config menu and help

File size: 10.6 KB
Line 
1#include "../titan/struct.h"
2#include "../titan/debug.h"
3#include "../titan/header.h"
4
5char pluginname[] = "Sudoku";
6char plugindesc[] = "Sudoku Game";
7char pluginpic[] = "%pluginpath%/sudoku/plugin.png";
8int pluginaktiv = 0;
9int pluginversion = 999999;
10
11char* g_sudoku_puzzle[81];
12char* g_sudoku_solved[81];
13char* g_SudokuCorePath = NULL;
14int g_initialized = 0;
15int g_checks = 0;
16
17int gColInput = 16777215;
18int gColPuzzle = 1;
19int gColOK = 3193392;//65280;
20int gColNG = 12067104;//16711680;
21int gColSelect = 7041655;
22
23void sudokunew(struct skin* sudoku_grid, struct skin* sudoku_checks, struct skin* sudoku_level, int iLevel) {
24        struct skin* node = sudoku_grid;
25        struct skin* checks = sudoku_checks;
26        struct skin* level = sudoku_level;
27
28        int count=0;
29        int i=0;
30        char* tmpstr = NULL;
31        char* tmpstr1 = NULL;
32
33        FILE *ptr_file;
34        char buf[10];
35
36        g_checks = 0;
37        if(checks != NULL) {
38                tmpstr1 = ostrcat(oitoa(g_checks), " Checks", 0, 0);
39                changetext(checks, tmpstr1);
40        }
41
42        if(level != NULL) {
43                if ( iLevel == 1 ) {
44                        changetext(level, "Level: Hard");
45                } else {
46                        changetext(level, "Level: Easy");
47                }
48        }
49
50        if ( iLevel == 1 ) {
51                tmpstr = ostrcat(g_SudokuCorePath, " --create-hard >/tmp/.sudoku_puzzle", 0, 0);
52        } else {
53                tmpstr = ostrcat(g_SudokuCorePath, " --create-easy >/tmp/.sudoku_puzzle", 0, 0);
54        }
55        //debug(10, "(%s)",tmpstr);
56        system(tmpstr);
57        free(tmpstr); tmpstr = NULL;
58
59        tmpstr = ostrcat(g_SudokuCorePath, " </tmp/.sudoku_puzzle >/tmp/.sudoku_solved", 0, 0);
60        //debug(10, "%s",tmpstr);
61        system(tmpstr);
62        free(tmpstr); tmpstr = NULL;
63
64        ptr_file =fopen("/tmp/.sudoku_puzzle","r");
65        if (!ptr_file) {
66                debug(10, "shit");
67                return;
68        }
69        i = 0;
70        while ( (fgets(buf,2, ptr_file)!=NULL) && (i < 81) ) {
71                g_sudoku_puzzle[i] = ostrcat(buf, NULL, 0, 0);
72                //debug(10, "sudoku_puzzle %d: %s", i, g_sudoku_puzzle[i]);
73                i++;
74        }
75        fclose(ptr_file);
76        system("rm /tmp/.sudoku_puzzle");
77
78        ptr_file =fopen("/tmp/.sudoku_solved","r");
79        if (!ptr_file) {
80                debug(10, "shit");
81                return;
82        }
83        i = 0;
84        while ( (fgets(buf,2, ptr_file)!=NULL) && (i < 81) ) {
85                g_sudoku_solved[i] = ostrcat(buf, NULL, 0, 0);
86                //debug(10, "sudoku_solved %d: %s", i, g_sudoku_solved[i]);
87                i++;
88        }
89        fclose(ptr_file);
90        system("rm /tmp/.sudoku_solved");
91
92//      for(i = 0; i < 81; i++) {
93//              debug(10, "%d: %s - %s", i+1, g_sudoku_puzzle[i], g_sudoku_solved[i]);
94//      }
95
96        count = 0;
97        while(node != NULL) {
98                if(ostrcmp(node->parent, "grid") == 0) {
99                        if ( ostrcmp(g_sudoku_puzzle[count], "-") != NULL ) {
100                                changetext(node, g_sudoku_puzzle[count]);
101                                node->fontcol = gColPuzzle;
102                        } else {
103                                changetext(node, "");
104                                node->fontcol = gColInput;
105                        }
106                        count++;
107                }
108                node = node->next;
109        }
110
111        free(tmpstr); tmpstr = NULL;
112        free(tmpstr1); tmpstr1 = NULL;
113        g_initialized = 1;
114}
115
116void sudokucheck(struct skin* sudoku_grid, struct skin* sudoku_checks) {
117        struct skin* node = sudoku_grid;
118        struct skin* checks = sudoku_checks;
119        int count=0;
120        char* tmpstr = NULL;
121        char* tmpstr1 = NULL;
122
123        g_checks++;
124        if(checks != NULL) {
125                tmpstr1 = ostrcat(oitoa(g_checks), " Checks", 0, 0);
126                changetext(checks, tmpstr1);
127        }
128
129        count = 0;
130        while(node != NULL) {
131                if(ostrcmp(node->parent, "grid") == 0) {
132                        if( (ostrcmp(node->text, "") != 0) && (node->fontcol != gColPuzzle) ) {
133                                tmpstr = oitoa(node->fontcol);
134                                //debug(10, "%d: %s (%s)", count+1, node->text, tmpstr);
135                                if( ostrcmp(g_sudoku_solved[count], node->text) == 0 ) {
136                                        node->fontcol = gColOK;
137                                } else {
138                                        node->fontcol = gColNG;
139                                }
140                        } else if (ostrcmp(node->text, "") == 0) {
141                                node->fontcol = gColInput;
142                        }
143                        count++;
144                }
145                node = node->next;
146        }
147
148        free(tmpstr); tmpstr = NULL;
149        free(tmpstr1); tmpstr1 = NULL;
150}
151
152void screensudoku_settings() {
153        int rcret = 0;
154        struct skin* sudoku_settings = getscreen("sudoku_settings");
155        struct skin* set_listbox = getscreennode(sudoku_settings, "listbox");
156        struct skin* set_posx = getscreennode(sudoku_settings, "posx");
157        struct skin* tmp = NULL;
158
159        struct clist *myconfig[LISTHASHSIZE] = {NULL};
160        char* sudokucfg = NULL;
161
162        sudokucfg = createpluginpath("/sudoku/sudoku.cfg", 0);
163        readconfig(sudokucfg, myconfig);
164        //debug(10, "config: (%s)", sudokucfg);
165        //debug(10, "config: (%s)", getlist(myconfig, "xpos", NULL));
166
167        addchoicebox(set_posx, "left", _("left"));
168        addchoicebox(set_posx, "center", _("center"));
169        addchoicebox(set_posx, "right", _("right"));
170        setchoiceboxselection(set_posx, getlist(myconfig, "xpos", NULL));
171
172        if ( ostrcmp(getlist(myconfig, "xpos", NULL), "right")  == 0 ) {
173                sudoku_settings->posx = RIGHT;
174        } else if ( ostrcmp(getlist(myconfig, "xpos", NULL), "center")  == 0 ) {
175                sudoku_settings->posx = CENTER;
176        } else {
177                sudoku_settings->posx = LEFT;
178        }
179
180        drawscreen(sudoku_settings, 0, 0);
181        addscreenrc(sudoku_settings, set_listbox);
182
183        tmp = set_listbox->select;
184        while(1) {
185                addscreenrc(sudoku_settings, tmp);
186                rcret = waitrc(sudoku_settings, 0, 0);
187                tmp = set_listbox->select;
188
189                if ( rcret == getrcconfigint("rcexit", NULL) || rcret == getrcconfigint("rcmenu", NULL) ) break;
190
191                if (rcret == getrcconfigint("rcok", NULL) ) {
192                        //debug(10, "posx new: (%s)", set_posx->ret);
193                        addlist(myconfig, "xpos", set_posx->ret);
194                        writelist(myconfig, sudokucfg);
195                        break;
196                }
197        }
198
199        freelist(myconfig);
200        free(sudokucfg); sudokucfg = NULL;
201
202        delownerrc(sudoku_settings);
203        clearscreen(sudoku_settings);
204}
205
206void screensudoku_help() {
207        int rcret = 0;
208        struct skin* sudoku_help = getscreen("sudoku_help");
209
210        struct clist *myconfig[LISTHASHSIZE] = {NULL};
211        char* sudokucfg = NULL;
212
213        sudokucfg = createpluginpath("/sudoku/sudoku.cfg", 0);
214        readconfig(sudokucfg, myconfig);
215
216        if ( ostrcmp(getlist(myconfig, "xpos", NULL), "right")  == 0 ) {
217                sudoku_help->posx = RIGHT;
218        } else if ( ostrcmp(getlist(myconfig, "xpos", NULL), "center")  == 0 ) {
219                sudoku_help->posx = CENTER;
220        } else {
221                sudoku_help->posx = LEFT;
222        }
223
224        freelist(myconfig);
225        free(sudokucfg); sudokucfg = NULL;
226
227        drawscreen(sudoku_help, 0, 0);
228
229        while(1) {
230                rcret = waitrc(sudoku_help, 0, 0);
231                if ( rcret == getrcconfigint("rcexit", NULL) || rcret == getrcconfigint("rchelp", NULL) ) break;
232        }
233
234        delownerrc(sudoku_help);
235        clearscreen(sudoku_help);
236}
237
238void screensudoku() {
239        int rcret = 0, iLevel = 0;
240        struct skin* sudoku = getscreen("sudoku");
241        struct skin* grid = getscreennode(sudoku, "grid");
242        struct skin* level = getscreennode(sudoku, "level");
243        struct skin* checks = getscreennode(sudoku, "checks");
244        struct skin* wait = getscreen("wait");
245
246
247        struct clist *myconfig[LISTHASHSIZE] = {NULL};
248        char* sudokucfg = NULL;
249
250        sudokucfg = createpluginpath("/sudoku/sudoku.cfg", 0);
251        readconfig(sudokucfg, myconfig);
252        //debug(10, "config: (%s)", sudokucfg);
253        //debug(10, "config: (%s)", getlist(myconfig, "xpos", NULL));
254
255        if ( ostrcmp(getlist(myconfig, "xpos", NULL), "right")  == 0 ) {
256                sudoku->posx = RIGHT;
257                wait->posx = RIGHT;
258        } else if ( ostrcmp(getlist(myconfig, "xpos", NULL), "center")  == 0 ) {
259                sudoku->posx = CENTER;
260                wait->posx = CENTER;
261        } else {
262                sudoku->posx = LEFT;
263                wait->posx = LEFT;
264        }
265
266        freelist(myconfig);
267        free(sudokucfg); sudokucfg = NULL;
268
269        drawscreen(sudoku, 0, 0);
270        if ( g_initialized == 0 ) {
271                changetext(level, "");
272                changetext(checks, "");
273                drawscreen(wait, 0, 0);
274                sudokunew(grid, checks, level, iLevel);
275                clearscreen(wait);
276                drawscreen(sudoku, 0, 0);
277        }
278        addscreenrc(sudoku, grid);
279
280        while(1) {
281                rcret = waitrc(sudoku, 0, 0);
282
283                if(rcret == getrcconfigint("rchelp", NULL)) {
284                        screensudoku_help();
285                        drawscreen(sudoku, 0, 0);
286                        continue;
287                }
288
289                if(rcret == getrcconfigint("rcmenu", NULL)) {
290                        screensudoku_settings();
291
292                        sudokucfg = createpluginpath("/sudoku/sudoku.cfg", 0);
293                        readconfig(sudokucfg, myconfig);
294                        //debug(10, "config: (%s)", sudokucfg);
295                        //debug(10, "config: (%s)", getlist(myconfig, "xpos", NULL));
296
297                        if ( ostrcmp(getlist(myconfig, "xpos", NULL), "right")  == 0 ) {
298                                sudoku->posx = RIGHT;
299                                wait->posx = RIGHT;
300                        } else if ( ostrcmp(getlist(myconfig, "xpos", NULL), "center")  == 0 ) {
301                                sudoku->posx = CENTER;
302                                wait->posx = CENTER;
303                        } else {
304                                sudoku->posx = LEFT;
305                                wait->posx = LEFT;
306                        }
307
308                        freelist(myconfig);
309                        free(sudokucfg); sudokucfg = NULL;
310
311                        drawscreen(sudoku, 0, 0);
312                        continue;
313                }
314
315                if(rcret == getrcconfigint("rcexit", NULL)) break;
316
317                if(rcret == getrcconfigint("rcok", NULL)) {
318                        sudokucheck(grid, checks);
319                        drawscreen(sudoku, 0, 0);
320                        continue;
321                }
322
323                if(rcret == getrcconfigint("rcred", NULL)) {
324                        drawscreen(wait, 0, 0);
325                        iLevel = 1;
326                        sudokunew(grid, checks, level, iLevel);
327                        clearscreen(wait);
328                        drawscreen(sudoku, 0, 0);
329                        continue;
330                }
331
332                if(rcret == getrcconfigint("rcgreen", NULL)) {
333                        drawscreen(wait, 0, 0);
334                        iLevel = 0;
335                        sudokunew(grid, checks, level, iLevel);
336                        clearscreen(wait);
337                        drawscreen(sudoku, 0, 0);
338                        continue;
339                }
340
341                if( rcret == getrcconfigint("rc0", NULL) || rcret == getrcconfigint("rc1", NULL) ||
342                        rcret == getrcconfigint("rc2", NULL) || rcret == getrcconfigint("rc3", NULL) ||
343                        rcret == getrcconfigint("rc4", NULL) || rcret == getrcconfigint("rc5", NULL) ||
344                        rcret == getrcconfigint("rc6", NULL) || rcret == getrcconfigint("rc7", NULL) ||
345                        rcret == getrcconfigint("rc8", NULL) || rcret == getrcconfigint("rc9", NULL) ) {
346
347                        if(grid->select != NULL && grid->select->fontcol != gColPuzzle && grid->select->fontcol != gColOK) {
348                                if( rcret == getrcconfigint("rc0", NULL) ) changetext(grid->select, "");
349                                if( rcret == getrcconfigint("rc1", NULL) ) changetext(grid->select, "1");
350                                if( rcret == getrcconfigint("rc2", NULL) ) changetext(grid->select, "2");
351                                if( rcret == getrcconfigint("rc3", NULL) ) changetext(grid->select, "3");
352                                if( rcret == getrcconfigint("rc4", NULL) ) changetext(grid->select, "4");
353                                if( rcret == getrcconfigint("rc5", NULL) ) changetext(grid->select, "5");
354                                if( rcret == getrcconfigint("rc6", NULL) ) changetext(grid->select, "6");
355                                if( rcret == getrcconfigint("rc7", NULL) ) changetext(grid->select, "7");
356                                if( rcret == getrcconfigint("rc8", NULL) ) changetext(grid->select, "8");
357                                if( rcret == getrcconfigint("rc9", NULL) ) changetext(grid->select, "9");
358                                grid->select->fontcol = gColInput;
359                                drawscreen(sudoku, 0, 0);
360                        }
361                        continue;
362                }
363
364        }
365
366        delownerrc(sudoku);
367        clearscreen(sudoku);
368}
369
370//wird beim Laden ausgefuehrt
371void init(void) {
372        char* tmpstr = NULL;
373
374        g_SudokuCorePath = createpluginpath("/sudoku/sudoku_core", 0);
375
376        tmpstr = createpluginpath("/sudoku/skin.xml", 0);
377        readscreen(tmpstr, 208, 1);
378        free(tmpstr); tmpstr = NULL;
379
380        pluginaktiv = 1;
381        debug(10, "sudoku plugin loaded!");
382}
383
384//wird beim Entladen ausgefuehrt
385void deinit(void) {
386        delmarkedscreen(208);
387        pluginaktiv = 0;
388        debug(10, "sudoku plugin removed!");
389}
390
391//wird in der Pluginverwaltung bzw Menue ausgefuehrt
392void start(void) {
393        long tmplistboxselectcol = status.listboxselectcol;
394        status.listboxselectcol = gColSelect;
395
396        screensudoku();
397
398        //reset
399        status.listboxselectcol = tmplistboxselectcol;
400}
Note: See TracBrowser for help on using the repository browser.