2
typespeed.c - the main code
10
{"None", "Loser", "ADP-Pro", "NoGood", "Average",
11
"Good", "VeryGood", "Pro", "3l33t", "*(GOD)*", "Computer"};
14
{"XMunkki", "Alien", "Secretary", "Human", "IT Person", "Handicap",
15
"Monkey", "Pencil", "T-Bone", "E-Typo", "TypOmatiC", "TypoKing"};
25
/* char wordfilename[256]; */
27
char wordstring[22][21];
46
for (i = 0; i < 22; i++) {
48
if (wordpos[i] > (50 - strlen(wordstring[i])))
50
if (wordpos[i] > (65 - strlen(wordstring[i])))
54
mvprintw(i, wordpos[i], "%s", wordstring[i]);
55
mvprintw(i, wordpos[i] - 1, " ");
57
if (wordpos[i] > (79 - strlen(wordstring[i]))) {
58
mvprintw(i, wordpos[i], " ");
61
mvprintw(i + 1, 1, "-------------------");
72
int addnewword(int force, char *newword) {
74
int tmp, tmp2, nwrd, worddupe;
78
/* just find a random place to put the word... no dupes though */
79
int free_slots = 0, slot;
81
for (tmp = 0; tmp < 22; tmp++) {
82
if (wordpos[tmp] == 0) {
85
if (strcmp(wordstring[tmp], newword) == 0) {
93
/* the player has enough trouble... */
97
for (tmp = 0; tmp < 22; tmp++) {
98
if (wordpos[tmp] == 0) {
105
strncpy(wordstring[tmp], newword, 20);
106
wordstring[tmp][20] = '\0';
110
for (tmp = 0; tmp < 22; tmp++) {
111
if (wordpos[tmp] == 0) {
116
for (tmp2 = 0; tmp2 < 22; tmp2++) {
117
if (strcmp(wordstring[tmp2],
126
if (wordpos[tmp] == 0) {
130
/* loweroi stringi */
131
for (x = 0; x < strlen(word[nwrd]); x++) {
132
word[nwrd][x] = clower(word[nwrd][x]);
135
strcpy(wordstring[tmp], word[nwrd]);
148
for (i = 0; i < 22; i++) {
149
if (wordpos[i] > 0) {
150
piipaa += strlen(wordstring[i]) + 1;
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);
164
//rate = now.score / 100 + 3;
165
rate = now.score / 175 + 3;
176
clock_t oldtimes, starttime;
177
clock_t pausetime = 0;
180
int i, wordwritten = 0;
182
int wordswritten = 0;
183
int tra = 0, pause = 0;
185
float pausespeed = 0, pausespeedtotal = 0;
187
srand((unsigned) time(NULL));
191
i = choose_wordfile(0);
201
if (opt.server || opt.client) {
202
mvprintw(12, 20, "Waiting for the other party to join in...");
204
} while ((nappi = getch()) != ERR);
205
net_waitgame(typesocket);
215
input = malloc(20 * sizeof(char));
222
for (i = 0; i < 22; i++) {
227
oldtimes = timenow();
229
starttime = timenow();
232
while (misses < 10 && escend < 1) {
234
while ((timenow()) < (oldtimes + 30 - warp)||pause) { */
235
while ((timenow()) < (oldtimes + (1.0 / rate) * 100) || pause) {
238
//mvprintw(24,1,"%d %d",inputpos,strlen(input));
240
if ((nappi = getch()) != ERR) {
241
nappi = clower(nappi);
246
if ((inputpos > 0) && (!pause)) {
247
mvprintw(23, inputpos + 1, " ");
248
mvprintw(23, inputpos + 1, "");
249
input[inputpos] = 0x00;
251
input[inputpos] = 0x00;
258
for (i = 0; i < 3; i++) {
259
if ((nappi = getch()) != ERR) {
260
if (nappi == 65 && !opt.client && !opt.server) {
263
pausespeed = now.speed;
264
pausespeedtotal = now.totalspeed;
265
pausetime = timenow();
269
mvprintw(23, 8, "PAUSED");
272
now.speed = pausespeed;
273
now.totalspeed = pausespeedtotal;
274
starttime += timenow() - pausetime;
275
mvprintw(23, 8, " ");
286
if ((inputpos > 0) && (!pause)) {
289
mvprintw(23, 2, " ");
297
if ((inputpos > 0) && (!pause)) {
298
input[inputpos] = 0x00;
300
for (i = 0; i < 22; i++)
301
if (strcmp(input, wordstring[i]) == 0) {
302
now.score += inputpos;
304
mvprintw(i, wordpos[i], " ");
308
mvprintw(i + 1, 1, "-------------------");
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);
316
strcpy(wordstring[i], "THIS-IS-NOT-A-CHEAT");
319
mvprintw(23, 2, " ");
325
if (strlen(input)>inputpos && (!pause)) {
326
for (i=inputpos;i<19;i++) {
328
mvprintw(23,i + 2, " ");
330
mvprintw(23,inputpos+2,"");
337
if ((inputpos > 0) && (!pause)) {
338
mvprintw(23, inputpos + 1, " ");
339
mvprintw(23, inputpos + 1, "");
340
input[inputpos] = 0x00;
342
input[inputpos] = 0x00;
348
if ((inputpos < 19) && (strlen(input)>inputpos) && (!pause)) {
350
mvprintw(23,inputpos + 2,"");
356
if ((inputpos != strlen(input)) && (!pause)) {
357
inputpos=strlen(input);
358
mvprintw(23,inputpos + 2,"");
364
if ((inputpos > 0) && (!pause)) {
366
mvprintw(23,inputpos + 2,"");
372
if ((inputpos > 0) && (!pause)) {
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;
387
for (i = 0; i < 22; i++)
388
if (strcmp(input, wordstring[i]) == 0) {
389
now.score += inputpos;
390
mvprintw(i, wordpos[i], " ");
395
mvprintw(i + 1, 1, "-------------------");
398
strcpy(wordstring[i], "THIS-IS-NOT-A-CHEAT");
403
mvprintw(23, 2, " ");
415
oldtimes = timenow();
417
if (!opt.training || opt.client || opt.server) {
421
if (!opt.client && !opt.server) {
423
if (tra == opt.traspeed) {
432
now.speed = (now.score + wordswritten) * 100.0 / (timenow() - starttime);
434
now.totalspeed = nappaykset * 100.0 / (timenow() - starttime);
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: ");
446
mvprintw(23, 29, "%s", rankki[level(now.score)]);
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);
454
/* last, we check if the opponent has any new words for us... */
456
if(opt.server || opt.client) {
458
i = recv(typesocket, buf, 256, MSG_PEEK);
460
if (i == -1 && errno != EWOULDBLOCK) {
466
char *j = strchr(buf, '\n');
470
addnewword(TRUE, buf);
471
recv(typesocket, buf, strlen(buf) + 1, 0);
472
if(strstr(buf,"ENDOFTHEGAME") > 0) {
485
if (opt.server || opt.client) {
487
strcpy(buf,"ENDOFTHEGAME\n");
488
send(typesocket, buf, strlen(buf), 0);
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;
505
if (opt.server || opt.client) {
507
net_swapscore(typesocket, &now,&other);
510
while ((nappi = getch()) != ERR);
514
mvprintw(12, 30, "GAME OVER!");
520
min10 = now.speed * 600;
522
/* let's get speed away from your mistakes or not?
523
min10=min10-(ratio*100)
526
mvprintw(12, 30, " ");
528
mvprintw(3, 20, "Typespeed %s ", TVERSION);
530
mvprintw(5, 20, "Your score was: ");
531
if(opt.client||opt.server) mvprintw(5, 60, "Opponents: ");
532
mvprintw(7, 20, "Rank:\t\t");
534
mvprintw(7, 40, "%s", rankki[level(now.score)]);
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");
546
mvprintw(13, 40, "%s", typorank[typorankkaus(now.ratio)]);
548
mvprintw(13, 40, "None");
551
if (opt.server || opt.client) {
553
mvprintw(7, 60, "%s", rankki[level(other.score)]);
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)]);
565
mvprintw(13, 60, "None");
572
mvprintw(17, 15, "TRAINING MODE - YOU CANNOT GET TO TOP10");
575
if (opt.client || opt.server) {
577
mvprintw(17, 20, "NETWORK MODE - YOU CANNOT GET TO TOP10");
585
mvprintw(15, 20, "Press any key to continue...");
588
while ((nappi = getch()) == ERR);
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);
597
loadhighscores(usedwordfile);
599
mvprintw(16, 3, "Press any key to continue...");
602
while ((nappi = getch()) == ERR);
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'},
621
int main(int argc, char *argv[]) {
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;
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");
656
i = getopt_long(argc, argv, "to:h", options, &optind);
663
/* flag already set by getopt */
668
opt.traspeed = atoi(optarg);
669
if (opt.traspeed < 2 || opt.traspeed > 10)
675
abort(); /* getopt should handle this... */
676
strncpy(serv, optarg, 255);
679
if (optarg) opt.port = atoi(optarg);
680
if (opt.port <= 1024) {
681
printf("DON'T USE PRIVILEDGED PORT\n");
691
/* getopt already printed error */
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]);
713
if (opt.server || opt.client) typesocket = init_network(serv,0);
714
} while(typesocket<0);
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");
780
while (wheretogo != 54);
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)]);
794
printf("Typorank:\tNone\n\n\n");