~ubuntu-branches/ubuntu/maverick/typespeed/maverick

« back to all changes in this revision

Viewing changes to typespeed.c

  • Committer: Bazaar Package Importer
  • Author(s): Dafydd Harries
  • Date: 2007-12-07 05:14:13 UTC
  • mfrom: (1.1.1 upstream)
  • Revision ID: james.westby@ubuntu.com-20071207051413-zn96fxeem6wknkiz
Tags: 0.6.4-1
* New upstream release. Closes: #375136.
  - High priority due to fix for DoS attack. Closes: #454527
    (CVE-2007-6220).
  - Fixes segfault when $HOME is unset. Closes: #355887.
  - Adds Italian and French word lists, Dutch word file merged.
* New upstream maintainer.
  - Update homepage URL, debian/copyright, debian/watch.
  - This version is not network-compatible with versions prior to 0.5.2.
  - Stricter network code.
  - Improved memory management.
* High score file format has changed: install score conversion program to
  /usr/lib/typespeed and run it when package is configured.
* postinst:
  - Remove obsolete score file backup/create/restore code.
  - Add code to upgrade score files to the new text-based format.
* rules:
  - Update to new autotools build.
  - Put stamp files in debian/.
  - Support DEB_BUILD_OPTS=noopt.
* Remove unnecessary debian/install.
* Update man page installation.
* Change menu file to Games/Action section as per new menu policy.
* Bump to debhelper compat version 5.
* Bump standards version to 3.7.3.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/*
2
 
   typespeed.c - the main code
3
 
 */
4
 
 
5
 
#include "typespeed.h"
6
 
 
7
 
/* globals */
8
 
 
9
 
char *rankki[11] =
10
 
{"None", "Loser", "ADP-Pro", "NoGood", "Average",
11
 
 "Good", "VeryGood", "Pro", "3l33t", "*(GOD)*", "Computer"};
12
 
 
13
 
char *typorank[12] =
14
 
{"XMunkki", "Alien", "Secretary", "Human", "IT Person", "Handicap",
15
 
 "Monkey", "Pencil", "T-Bone", "E-Typo", "TypOmatiC", "TypoKing"};
16
 
 
17
 
 
18
 
opt_struct opt;
19
 
stats_struct now;
20
 
stats_struct best;
21
 
stats_struct other;
22
 
 
23
 
char *word[WORD_MAX];
24
 
int wordcount;
25
 
/* char wordfilename[256]; */
26
 
int wordpos[22];
27
 
char wordstring[22][21];
28
 
 
29
 
int misses;
30
 
/*int warp; */
31
 
int ttss;
32
 
 
33
 
float rate;
34
 
 
35
 
char *usedwordfile;
36
 
char *hakemisto;
37
 
 
38
 
int typesocket = 0;
39
 
 
40
 
 
41
 
void movewords() {
42
 
    int i;
43
 
 
44
 
    dcolor_set(1, NULL);
45
 
 
46
 
    for (i = 0; i < 22; i++) {
47
 
        dcolor_set(1, NULL);
48
 
        if (wordpos[i] > (50 - strlen(wordstring[i])))
49
 
            dcolor_set(7, NULL);
50
 
        if (wordpos[i] > (65 - strlen(wordstring[i])))
51
 
            dcolor_set(3, NULL);
52
 
        if (wordpos[i] > 0) {
53
 
            wordpos[i]++;
54
 
            mvprintw(i, wordpos[i], "%s", wordstring[i]);
55
 
            mvprintw(i, wordpos[i] - 1, " ");
56
 
        }
57
 
        if (wordpos[i] > (79 - strlen(wordstring[i]))) {
58
 
            mvprintw(i, wordpos[i], "                   ");
59
 
            if (i == 21) {
60
 
                dcolor_set(4, NULL);
61
 
                mvprintw(i + 1, 1, "-------------------");
62
 
                dcolor_set(2, NULL);
63
 
            }
64
 
            misses++;
65
 
            wordpos[i] = 0;
66
 
        }
67
 
    }
68
 
    dcolor_set(2, NULL);
69
 
 
70
 
}
71
 
 
72
 
int addnewword(int force, char *newword) {
73
 
    
74
 
    int tmp, tmp2, nwrd, worddupe;
75
 
    int x;
76
 
 
77
 
    if (force) {
78
 
        /* just find a random place to put the word... no dupes though */
79
 
        int free_slots = 0, slot;
80
 
 
81
 
        for (tmp = 0; tmp < 22; tmp++) {
82
 
            if (wordpos[tmp] == 0) {
83
 
                free_slots++;
84
 
            } else {
85
 
                if (strcmp(wordstring[tmp], newword) == 0) {
86
 
                    return FALSE;
87
 
                }
88
 
            }
89
 
        }
90
 
 
91
 
        if (free_slots == 0)
92
 
            return FALSE;
93
 
        /* the player has enough trouble... */
94
 
 
95
 
        slot = r(free_slots);
96
 
 
97
 
        for (tmp = 0; tmp < 22; tmp++) {
98
 
            if (wordpos[tmp] == 0) {
99
 
                if (slot == 0)
100
 
                    break;
101
 
                slot--;
102
 
            }
103
 
        }
104
 
 
105
 
        strncpy(wordstring[tmp], newword, 20);
106
 
        wordstring[tmp][20] = '\0';
107
 
        wordpos[tmp] = 1;
108
 
        return TRUE;
109
 
    }
110
 
    for (tmp = 0; tmp < 22; tmp++) {
111
 
        if (wordpos[tmp] == 0) {
112
 
            worddupe = TRUE;
113
 
            while (worddupe) {
114
 
                worddupe = FALSE;
115
 
                nwrd = r(wordcount);
116
 
                for (tmp2 = 0; tmp2 < 22; tmp2++) {
117
 
                    if (strcmp(wordstring[tmp2],
118
 
                               word[nwrd]) == 0) {
119
 
                        worddupe = TRUE;
120
 
                    }
121
 
                }
122
 
            }
123
 
            worddupe = TRUE;
124
 
            while (worddupe) {
125
 
                tmp = r(22);
126
 
                if (wordpos[tmp] == 0) {
127
 
                    worddupe = FALSE;
128
 
                }
129
 
            }
130
 
            /* loweroi stringi */
131
 
            for (x = 0; x < strlen(word[nwrd]); x++) {
132
 
                word[nwrd][x] = clower(word[nwrd][x]);
133
 
            }
134
 
 
135
 
            strcpy(wordstring[tmp], word[nwrd]);
136
 
            wordpos[tmp] = 1;
137
 
            return TRUE;
138
 
        }
139
 
    }
140
 
    return FALSE;
141
 
}
142
 
 
143
 
void cwords() {
144
 
    int piipaa;
145
 
    int i;
146
 
 
147
 
    piipaa = 0;
148
 
    for (i = 0; i < 22; i++) {
149
 
        if (wordpos[i] > 0) {
150
 
            piipaa += strlen(wordstring[i]) + 1;
151
 
        }
152
 
    }
153
 
    if (piipaa < (now.score / 4 + 1)) {
154
 
        addnewword(FALSE, NULL);
155
 
/*              if (addnewword(FALSE,NULL) == FALSE) {
156
 
   warp = (int) (((now.score / 4) + 1 - piipaa) / 2);
157
 
   if (warp > 28) {
158
 
   warp = 28;
159
 
   /
160
 
 
161
 
   } else {
162
 
   warp = 0;
163
 
   } */
164
 
        //rate = now.score / 100 + 3;
165
 
        rate = now.score / 175 + 3;
166
 
 
167
 
    }
168
 
}
169
 
 
170
 
 
171
 
int play() {
172
 
    
173
 
    char *input;
174
 
    char buf[256];
175
 
 
176
 
    clock_t oldtimes, starttime;
177
 
    clock_t pausetime = 0;
178
 
 
179
 
    int inputpos;
180
 
    int i, wordwritten = 0;
181
 
    int nappaykset;
182
 
    int wordswritten = 0;
183
 
    int tra = 0, pause = 0;
184
 
    float min10;
185
 
    float pausespeed = 0, pausespeedtotal = 0;
186
 
    int nappi, escend;
187
 
    srand((unsigned) time(NULL));
188
 
 
189
 
    i = 0;
190
 
    drawscreen();
191
 
    i = choose_wordfile(0);
192
 
    if (i == 1) {
193
 
        return 1;
194
 
    }
195
 
    clear();
196
 
    drawscreen();
197
 
    nodelay(stdscr, 1);
198
 
    cbreak();
199
 
    noecho();
200
 
 
201
 
    if (opt.server || opt.client) {
202
 
                mvprintw(12, 20, "Waiting for the other party to join in...");
203
 
                do {
204
 
                } while ((nappi = getch()) != ERR);
205
 
                net_waitgame(typesocket);
206
 
                flushinp();
207
 
                clear();
208
 
                drawscreen();
209
 
    }
210
 
 
211
 
    misses = 0;
212
 
    min10 = 0;
213
 
    nappaykset = 0;
214
 
    now.score = 0;
215
 
    input = malloc(20 * sizeof(char));
216
 
    inputpos = 0;
217
 
    /*warp = 0; */
218
 
    escend = 0;
219
 
    rate = 1;
220
 
    now.ratio = 0;
221
 
 
222
 
    for (i = 0; i < 22; i++) {
223
 
        wordpos[i] = 0;
224
 
    }
225
 
 
226
 
    halfdelay(1);
227
 
    oldtimes = timenow();
228
 
 
229
 
    starttime = timenow();
230
 
    input[0]=0x00;
231
 
 
232
 
    while (misses < 10 && escend < 1) {
233
 
        /*
234
 
           while ((timenow()) < (oldtimes + 30 - warp)||pause) { */
235
 
        while ((timenow()) < (oldtimes + (1.0 / rate) * 100) || pause) {
236
 
        
237
 
            /* debug: */ 
238
 
            //mvprintw(24,1,"%d %d",inputpos,strlen(input));
239
 
 
240
 
            if ((nappi = getch()) != ERR) {
241
 
                nappi = clower(nappi);
242
 
 
243
 
                switch (nappi) {
244
 
                case 127:
245
 
                    {
246
 
                        if ((inputpos > 0) && (!pause)) {
247
 
                            mvprintw(23, inputpos + 1, " ");
248
 
                            mvprintw(23, inputpos + 1, "");
249
 
                            input[inputpos] = 0x00;
250
 
                            inputpos--;
251
 
                            input[inputpos] = 0x00;
252
 
 
253
 
                        }
254
 
                        break;
255
 
                    }
256
 
                case 27:
257
 
                    {
258
 
                        for (i = 0; i < 3; i++) {
259
 
                            if ((nappi = getch()) != ERR) {
260
 
                                if (nappi == 65 && !opt.client && !opt.server) {
261
 
                                    if (pause == 0) {
262
 
                                        pause = 1;
263
 
                                        pausespeed = now.speed;
264
 
                                        pausespeedtotal = now.totalspeed;
265
 
                                        pausetime = timenow();
266
 
                                        endcursestuff();
267
 
                                        initcursestuff();
268
 
                                        drawscreen();
269
 
                                        mvprintw(23, 8, "PAUSED");
270
 
                                    } else {
271
 
                                        pause = 0;
272
 
                                        now.speed = pausespeed;
273
 
                                        now.totalspeed = pausespeedtotal;
274
 
                                        starttime += timenow() - pausetime;
275
 
                                        mvprintw(23, 8, "      ");
276
 
                                    }
277
 
                                }
278
 
                            } else {
279
 
                                escend = 1;
280
 
                            }
281
 
                        }
282
 
                        break;
283
 
                    }
284
 
                case 21:
285
 
                    {
286
 
                        if ((inputpos > 0) && (!pause)) {
287
 
                                inputpos=0;
288
 
                                input[0] = 0x00;
289
 
                                mvprintw(23, 2, "                   ");
290
 
                        }
291
 
                        break;
292
 
                    }
293
 
                case 32:
294
 
                case 10:
295
 
                    {
296
 
                        nappaykset++;
297
 
                        if ((inputpos > 0) && (!pause)) {
298
 
                            input[inputpos] = 0x00;
299
 
                            if (!opt.cheat)
300
 
                                for (i = 0; i < 22; i++)
301
 
                                    if (strcmp(input, wordstring[i]) == 0) {
302
 
                                        now.score += inputpos;
303
 
                                        wordswritten++;
304
 
                                        mvprintw(i, wordpos[i], "                   ");
305
 
                                        wordpos[i] = 0;
306
 
                                        if (i == 21) {
307
 
                                            dcolor_set(4, NULL);
308
 
                                            mvprintw(i + 1, 1, "-------------------");
309
 
                                            dcolor_set(2, NULL);
310
 
                                        }
311
 
                                        /* send 50% words in multiplayer */
312
 
                                        if (opt.server || opt.client) {
313
 
                                                sprintf(buf, "%s\n", wordstring[i]);
314
 
                                                if (r(2) == 0) send(typesocket, buf, strlen(buf), 0);
315
 
                                        }
316
 
                                        strcpy(wordstring[i], "THIS-IS-NOT-A-CHEAT");
317
 
                                    }
318
 
                            inputpos = 0;
319
 
                            mvprintw(23, 2, "                   ");
320
 
                        }
321
 
                        break;
322
 
                    }
323
 
                case 11: 
324
 
                    {
325
 
                        if (strlen(input)>inputpos && (!pause)) {
326
 
                                for (i=inputpos;i<19;i++) {
327
 
                                        input[i]=0x00;
328
 
                                        mvprintw(23,i + 2, " ");
329
 
                                }
330
 
                                mvprintw(23,inputpos+2,"");
331
 
                        }
332
 
                        
333
 
                        break;
334
 
                    }
335
 
                case 8:
336
 
                    {
337
 
                        if ((inputpos > 0) && (!pause)) {
338
 
                            mvprintw(23, inputpos + 1, " ");
339
 
                            mvprintw(23, inputpos + 1, "");
340
 
                            input[inputpos] = 0x00;
341
 
                            inputpos--;
342
 
                            input[inputpos] = 0x00;
343
 
                        }
344
 
                        break;
345
 
                    }
346
 
                case 6:
347
 
                    {
348
 
                        if ((inputpos < 19) && (strlen(input)>inputpos) && (!pause)) {
349
 
                                inputpos++;
350
 
                                mvprintw(23,inputpos + 2,"");
351
 
                        }
352
 
                        break;
353
 
                    }
354
 
                case 5:
355
 
                    {
356
 
                        if ((inputpos != strlen(input)) && (!pause)) {
357
 
                                inputpos=strlen(input);
358
 
                                mvprintw(23,inputpos + 2,"");
359
 
                        }
360
 
                        break;
361
 
                    }
362
 
                case 2: 
363
 
                    {
364
 
                        if ((inputpos > 0) && (!pause)) {
365
 
                                inputpos--;
366
 
                                mvprintw(23,inputpos + 2,"");
367
 
                        }
368
 
                        break;
369
 
                    }
370
 
                case 1:
371
 
                    {
372
 
                        if ((inputpos > 0) && (!pause)) {
373
 
                                inputpos=0;
374
 
                        }
375
 
                        break;
376
 
                    }
377
 
                default:
378
 
                    {
379
 
                        if (!pause)
380
 
                            nappaykset++;
381
 
                        if ((inputpos < 19) && (!pause)) {
382
 
                            mvprintw(23, 2 + inputpos, "%c", nappi);
383
 
                            if (inputpos==strlen(input)) input[inputpos + 1] = 0x00;
384
 
                            input[inputpos] = nappi;
385
 
                            inputpos++;
386
 
                            if (opt.cheat) {
387
 
                                for (i = 0; i < 22; i++)
388
 
                                    if (strcmp(input, wordstring[i]) == 0) {
389
 
                                        now.score += inputpos;
390
 
                                        mvprintw(i, wordpos[i], "                   ");
391
 
                                        wordpos[i] = 0;
392
 
                                        wordwritten = 1;
393
 
                                        if (i == 21) {
394
 
                                            dcolor_set(4, NULL);
395
 
                                            mvprintw(i + 1, 1, "-------------------");
396
 
                                            dcolor_set(2, NULL);
397
 
                                        }
398
 
                                        strcpy(wordstring[i], "THIS-IS-NOT-A-CHEAT");
399
 
                                    }
400
 
                                if (wordwritten) {
401
 
                                    inputpos = 0;
402
 
                                    wordwritten = 0;
403
 
                                    mvprintw(23, 2, "                   ");
404
 
                                }
405
 
                            }
406
 
                        }
407
 
                        break;
408
 
                    }
409
 
                }
410
 
            }
411
 
        }
412
 
 
413
 
        if (!pause) {
414
 
 
415
 
            oldtimes = timenow();
416
 
 
417
 
            if (!opt.training || opt.client || opt.server) {
418
 
                movewords();
419
 
                cwords();
420
 
            }
421
 
            if (!opt.client && !opt.server) {
422
 
                if (opt.training) {
423
 
                        if (tra == opt.traspeed) {
424
 
                                movewords();
425
 
                                cwords();
426
 
                                tra = 0;
427
 
                        }
428
 
                        tra++;
429
 
                }
430
 
            }
431
 
 
432
 
            now.speed = (now.score + wordswritten) * 100.0 / (timenow() - starttime);
433
 
 
434
 
            now.totalspeed = nappaykset * 100.0 / (timenow() - starttime);
435
 
 
436
 
        }
437
 
        dcolor_set(5, NULL);
438
 
        mvprintw(23, 25,
439
 
              "                                                       ");
440
 
        mvprintw(23, 23, "Rank: ");
441
 
        mvprintw(23, 38, "Score: ");
442
 
        mvprintw(23, 49, "tCPS: ");
443
 
        mvprintw(23, 60, "cCPS: ");
444
 
        mvprintw(23, 71, "Misses: ");
445
 
        /*level(score); */
446
 
        mvprintw(23, 29, "%s", rankki[level(now.score)]);
447
 
        dcolor_set(3, NULL);
448
 
        mvprintw(23, 45, "%d", now.score);
449
 
        mvprintw(23, 55, "%2.2f", now.totalspeed);
450
 
        mvprintw(23, 66, "%2.2f", now.speed);
451
 
        mvprintw(23, 78, "%d", misses);
452
 
        dcolor_set(2, NULL);
453
 
 
454
 
        /* last, we check if the opponent has any new words for us... */
455
 
        
456
 
        if(opt.server || opt.client) {
457
 
 
458
 
                i = recv(typesocket, buf, 256, MSG_PEEK);
459
 
 
460
 
                if (i == -1 && errno != EWOULDBLOCK) {
461
 
                        perror("recv()");
462
 
                        exit(1);
463
 
                }
464
 
 
465
 
                if (i > 0) {
466
 
                        char *j = strchr(buf, '\n');
467
 
 
468
 
                        if (j != NULL) {
469
 
                                j[0] = 0;
470
 
                                addnewword(TRUE, buf);
471
 
                                recv(typesocket, buf, strlen(buf) + 1, 0);
472
 
                                if(strstr(buf,"ENDOFTHEGAME") > 0) {
473
 
                                        escend=2;
474
 
                                }
475
 
                        }
476
 
                }
477
 
 
478
 
        }
479
 
 
480
 
 
481
 
        refresh();
482
 
    }
483
 
    free(input);
484
 
 
485
 
    if (opt.server || opt.client) {
486
 
        if (escend!=2) {
487
 
                strcpy(buf,"ENDOFTHEGAME\n");
488
 
                send(typesocket, buf, strlen(buf), 0);
489
 
        }       
490
 
    }
491
 
 
492
 
    endcursestuff();
493
 
    initcursestuff();
494
 
    drawscreen();
495
 
    now.level = level(now.score);
496
 
    if ((now.level >= best.level) && (now.score >= best.score)) {
497
 
        best.level = now.level;
498
 
        best.score = now.score;
499
 
        best.speed = now.speed;
500
 
        best.totalspeed = now.totalspeed;
501
 
        if ((now.totalspeed != 0) && (now.speed != 0))
502
 
            best.ratio = (now.totalspeed - now.speed) / now.totalspeed;
503
 
    }
504
 
 
505
 
    if (opt.server || opt.client) {
506
 
 
507
 
        net_swapscore(typesocket, &now,&other);
508
 
        do {
509
 
        }
510
 
        while ((nappi = getch()) != ERR);
511
 
    }
512
 
    dcolor_set(5, NULL);
513
 
 
514
 
    mvprintw(12, 30, "GAME OVER!");
515
 
    refresh();
516
 
 
517
 
    sleep(3);
518
 
 
519
 
    /* total speed */
520
 
    min10 = now.speed * 600;
521
 
 
522
 
    /* let's get speed away from your mistakes or not? 
523
 
       min10=min10-(ratio*100)
524
 
     */
525
 
 
526
 
    mvprintw(12, 30, "          ");
527
 
    dcolor_set(5, NULL);
528
 
    mvprintw(3, 20, "Typespeed %s ", TVERSION);
529
 
 
530
 
    mvprintw(5, 20, "Your score was: ");
531
 
    if(opt.client||opt.server) mvprintw(5, 60, "Opponents: ");
532
 
    mvprintw(7, 20, "Rank:\t\t");
533
 
    /*      level(score); */
534
 
    mvprintw(7, 40, "%s", rankki[level(now.score)]);
535
 
    dcolor_set(5, NULL);
536
 
    mvprintw(8, 20, "Score:\t\t%d", now.score);
537
 
    mvprintw(9, 20, "10MRS:\t\t%1.0f", min10);
538
 
    mvprintw(10, 20, "Total CPS:\t\t%2.3f  ", now.totalspeed);
539
 
    mvprintw(11, 20, "Correct CPS:\t%2.3f  ", now.speed);
540
 
    if ((now.totalspeed != 0) && (now.speed != 0))
541
 
        now.ratio = (now.totalspeed - now.speed) / now.totalspeed * 100;
542
 
    mvprintw(12, 20, "Typo ratio:\t\t%2.1f%%\t", now.ratio);
543
 
    mvprintw(13, 20, "Typorank:\t\t");
544
 
 
545
 
    if (now.score!=0) {
546
 
            mvprintw(13, 40, "%s", typorank[typorankkaus(now.ratio)]);
547
 
    } else {
548
 
            mvprintw(13, 40, "None");
549
 
    }
550
 
 
551
 
    if (opt.server || opt.client) {
552
 
 
553
 
        mvprintw(7, 60, "%s", rankki[level(other.score)]);
554
 
        dcolor_set(5, NULL);
555
 
        mvprintw(8, 60, "%d", other.score);
556
 
        mvprintw(9, 60, "%1.0f", other.speed*600);
557
 
        mvprintw(10, 60, "%2.3f  ", other.totalspeed);
558
 
        mvprintw(11, 60, "%2.3f  ", other.speed);
559
 
        if ((other.totalspeed != 0) && (other.speed != 0))
560
 
                other.ratio = (other.totalspeed - other.speed) / other.totalspeed * 100;
561
 
        mvprintw(12, 60, "%2.1f%%", other.ratio);
562
 
        if (other.score!=0) {
563
 
                mvprintw(13, 60, "%s", typorank[typorankkaus(other.ratio)]);
564
 
        } else {
565
 
                mvprintw(13, 60, "None");
566
 
        }
567
 
    }
568
 
 
569
 
    dcolor_set(5, NULL);
570
 
    if (opt.training) {
571
 
        dcolor_set(2, NULL);
572
 
        mvprintw(17, 15, "TRAINING MODE - YOU CANNOT GET TO TOP10");
573
 
        dcolor_set(5, NULL);
574
 
    }
575
 
    if (opt.client || opt.server) {
576
 
        dcolor_set(2, NULL);
577
 
        mvprintw(17, 20, "NETWORK MODE - YOU CANNOT GET TO TOP10");
578
 
        dcolor_set(5, NULL);
579
 
    }
580
 
    nodelay(stdscr, 0);
581
 
    cbreak();
582
 
    flushinp();
583
 
 
584
 
    dcolor_set(4, NULL);
585
 
    mvprintw(15, 20, "Press any key to continue...");
586
 
    do {
587
 
    }
588
 
    while ((nappi = getch()) == ERR);
589
 
 
590
 
    dcolor_set(2, NULL);
591
 
 
592
 
    echo();
593
 
    if (!opt.training && !opt.client && !opt.server) {
594
 
        /*addtop10(usedwordfile, now.score, now.level, now.speed, now.totalspeed, now.ratio); */
595
 
        addtop10(usedwordfile, &now);
596
 
    }
597
 
    loadhighscores(usedwordfile);
598
 
    dcolor_set(4, NULL);
599
 
    mvprintw(16, 3, "Press any key to continue...");
600
 
    do {
601
 
    }
602
 
    while ((nappi = getch()) == ERR);
603
 
    dcolor_set(2, NULL);
604
 
    free(usedwordfile);
605
 
    freewords();
606
 
    return 0;
607
 
}
608
 
 
609
 
struct option options[] = {
610
 
    {"nocolors", no_argument, &opt.usecolors, 0},
611
 
    {"cheat", no_argument, &opt.cheat, 1},
612
 
    {"training", optional_argument, NULL, 't'},
613
 
    {"client", required_argument, NULL, 'o'},
614
 
    {"server", no_argument, &opt.server, 1},
615
 
    {"port", required_argument, NULL, 'p'},
616
 
    {"makescores", no_argument, NULL, 'm'},
617
 
    {"help", no_argument, NULL, 'h'},
618
 
    {0, 0, 0, 0}
619
 
};
620
 
 
621
 
int main(int argc, char *argv[]) {
622
 
 
623
 
    int wheretogo=0;
624
 
    int want_help = 0;
625
 
 
626
 
    char serv[256];
627
 
 
628
 
    opt.cheat = DEFAULT_CHEAT;
629
 
    opt.training = DEFAULT_TRAINING;
630
 
    opt.traspeed = DEFAULT_TRAININGSPEED;
631
 
    opt.usecolors = DEFAULT_COLORS;
632
 
    opt.server = DEFAULT_SERVER;
633
 
    opt.client = DEFAULT_CLIENT;
634
 
    opt.port = DEFAULT_PORT;
635
 
 
636
 
    now.score = 0;
637
 
    now.level = 0;
638
 
    now.speed = 0;
639
 
    now.totalspeed = 0;
640
 
    now.ratio = 0;
641
 
 
642
 
    best.score = 0;
643
 
    best.level = 0;
644
 
    best.speed = 0;
645
 
    best.totalspeed = 0;
646
 
    best.ratio = 0;
647
 
 
648
 
    readconfig();
649
 
    printf("Typespeed %s, Copyright (C) Jani Ollikainen & Jaakko Manelius\n", TVERSION);
650
 
    printf("Typespeed comes with ABSOLUTELY NO WARRANTY; for details read COPYING.\n");
651
 
 
652
 
    for (;;) {
653
 
        int optind = 0;
654
 
        int i;
655
 
 
656
 
        i = getopt_long(argc, argv, "to:h", options, &optind);
657
 
 
658
 
        if (i == -1)
659
 
            break;
660
 
 
661
 
        switch (i) {
662
 
        case 0:
663
 
            /* flag already set by getopt */
664
 
            break;
665
 
        case 't':
666
 
            opt.training = 1;
667
 
            if (optarg)
668
 
                opt.traspeed = atoi(optarg);
669
 
            if (opt.traspeed < 2 || opt.traspeed > 10)
670
 
                opt.traspeed = 2;
671
 
            break;
672
 
        case 'o':
673
 
            opt.client = 1;
674
 
            if (!optarg)
675
 
                abort();        /* getopt should handle this... */
676
 
            strncpy(serv, optarg, 255);
677
 
            break;
678
 
        case 'p':
679
 
            if (optarg) opt.port = atoi(optarg);    
680
 
            if (opt.port <= 1024) {
681
 
                printf("DON'T USE PRIVILEDGED PORT\n");
682
 
                exit(1);
683
 
            }
684
 
            break;
685
 
        case 'm':
686
 
            makescorefiles();      
687
 
            exit(0);
688
 
            break;
689
 
        case ':':
690
 
        case '?':
691
 
            /* getopt already printed error */
692
 
        case 'h':
693
 
        default:
694
 
            want_help = 1;
695
 
        }
696
 
 
697
 
        if (want_help) {
698
 
            printf("\nCommand line options: --nocolors      == don't use colors\n");
699
 
            printf("                      --cheat         == multimedia cheat(?)\n");
700
 
            printf("                      --training[=nm] == training mode\n");
701
 
            printf("                                         (where nm is speed number)\n");
702
 
            printf("                      --server        == start typespeed in server mode\n");
703
 
            printf("                      --client=addr   == IP address of server\n");
704
 
            printf("                      --port=port     == Port number in the network play.\n");
705
 
            printf("                      --makescores    == Reset/Make new scorefiles.\n");
706
 
            printf("                      --help          == this help!\n\n");
707
 
            printf("Usage: %s options\n\n", argv[0]);
708
 
            exit(1);
709
 
        }
710
 
    }
711
 
 
712
 
    do {
713
 
        if (opt.server || opt.client) typesocket = init_network(serv,0);
714
 
    } while(typesocket<0);
715
 
 
716
 
    sleep(1);
717
 
 
718
 
    initcursestuff();
719
 
    noecho();
720
 
 
721
 
    if(typesocket>0) {
722
 
        echo();
723
 
        clear();
724
 
        play();
725
 
        noecho();
726
 
    }
727
 
 
728
 
    clear();
729
 
    drawscreen();
730
 
    /* THIS IS OLD NEWS - LEFT HERE TO PUT SOME FUTURE NEWS IN */
731
 
    // mvprintw(15,20, "NOTE THIS VERSION HAS NEW WAY TO CALCULATE SPEED!");
732
 
    // mvprintw(16,26, "SCORES ARE NOT THE SAME AS THEY WERE");
733
 
    drawmenu();
734
 
 
735
 
 
736
 
    do {
737
 
        nodelay(stdscr, 0);
738
 
        cbreak();
739
 
 
740
 
        wheretogo = getch();
741
 
 
742
 
        switch (wheretogo) {
743
 
        case 53: { 
744
 
            echo();
745
 
            optionmenu();
746
 
            break;
747
 
        }
748
 
        case 52: {
749
 
            echo();
750
 
            showhighscores();
751
 
            break;
752
 
        }
753
 
        case 51: {
754
 
            tell_story();
755
 
            break;
756
 
        }
757
 
        case 50: {
758
 
            multipmenu();
759
 
            if(typesocket>0) {
760
 
                echo();
761
 
                clear();
762
 
                play();
763
 
                echo();
764
 
            }
765
 
            break;
766
 
        }
767
 
        case 49: {
768
 
            echo();
769
 
            clear();
770
 
            play();
771
 
            echo();
772
 
            break;
773
 
        }
774
 
        }
775
 
        clear();
776
 
        drawscreen();
777
 
        drawmenu();
778
 
 
779
 
    }
780
 
    while (wheretogo != 54);
781
 
 
782
 
    endcursestuff();
783
 
 
784
 
    printf("\e[H\e[JTypespeed %s\n\n", TVERSION);
785
 
    printf("Best score was: \n\n");
786
 
    printf("Rank:\t\t%s\n", rankki[best.level]);
787
 
    printf("Score:\t\t%d\n", best.score);
788
 
    printf("Total CPS:\t%2.3f\n", best.totalspeed);
789
 
    printf("Correct CPS:\t%2.3f\n", best.speed);
790
 
    printf("Typo ratio:\t%2.1f%%\n", best.ratio * 100);
791
 
    if (best.score != 0) {
792
 
        printf("Typorank:\t%s\n\n\n", typorank[typorankkaus(best.ratio * 100)]);
793
 
    } else {
794
 
        printf("Typorank:\tNone\n\n\n");
795
 
    }
796
 
    chdir(hakemisto);
797
 
    free(hakemisto);
798
 
    return 0;
799
 
 
800
 
}