1 1.2 kamil /* Header: /usr/src/games/warp/RCS/score.c,v 1.1 87/07/03 02:13:26 games Exp */ 2 1.1 kamil 3 1.2 kamil /* Log: score.c,v 4 1.1 kamil * Revision 7.0.1.2a 87/07/03 02:13:26 games 5 1.1 kamil * Fixed numerous long vs. int bugs in printfs, etc. 6 1.7 rillig * 7 1.1 kamil * Revision 7.0.1.2 86/10/20 12:06:56 lwall 8 1.1 kamil * Made all exits reset tty. 9 1.7 rillig * 10 1.1 kamil * Revision 7.0.1.1 86/10/16 10:52:47 lwall 11 1.1 kamil * Added Damage. Fixed random bugs. 12 1.7 rillig * 13 1.1 kamil * Revision 7.0 86/10/08 15:13:14 lwall 14 1.1 kamil * Split into separate files. Added amoebas and pirates. 15 1.7 rillig * 16 1.1 kamil */ 17 1.1 kamil 18 1.1 kamil #include "EXTERN.h" 19 1.1 kamil #include "warp.h" 20 1.1 kamil #include "intrp.h" 21 1.1 kamil #include "object.h" 22 1.1 kamil #include "play.h" 23 1.1 kamil #include "sig.h" 24 1.1 kamil #include "term.h" 25 1.1 kamil #include "us.h" 26 1.1 kamil #include "util.h" 27 1.1 kamil #include "weapon.h" 28 1.1 kamil #include "INTERN.h" 29 1.1 kamil #include "score.h" 30 1.1 kamil 31 1.1 kamil void 32 1.4 christos score_init(void) 33 1.1 kamil { 34 1.4 christos char *s; 35 1.4 christos int i; 36 1.1 kamil FILE *savfil; 37 1.1 kamil 38 1.1 kamil if (stat(SAVEDIR,&filestat)) { 39 1.1 kamil printf("Cannot access %s\r\n",SAVEDIR); 40 1.1 kamil finalize(1); 41 1.1 kamil } 42 1.6 christos if (filestat.st_gid != getegid() && geteuid() != 0) { 43 1.5 christos printf("Warp will not run right without being setgid.\r\n"); 44 1.1 kamil finalize(1); 45 1.1 kamil } 46 1.1 kamil if ((filestat.st_mode & 0605) != 0605) { 47 1.1 kamil printf("%s is not protected correctly (must be u+rw o+rx).\r\n",SAVEDIR); 48 1.1 kamil finalize(1); 49 1.1 kamil } 50 1.7 rillig 51 1.1 kamil #ifdef SCOREFULL 52 1.1 kamil interp(longlognam, sizeof longlognam, "%N"); 53 1.1 kamil for (i=strlen(longlognam); i<24; i++) 54 1.1 kamil longlognam[i] = ' '; /* make sure it is 24 long for strncmp */ 55 1.1 kamil longlognam[24] = '\0'; 56 1.1 kamil #else 57 1.1 kamil interp(longlognam, sizeof longlognam, "%L"); 58 1.1 kamil for (i=strlen(longlognam); i<8; i++) 59 1.1 kamil longlognam[i] = ' '; /* make sure it is 8 long for strncmp */ 60 1.1 kamil longlognam[8] = '\0'; 61 1.1 kamil #endif 62 1.7 rillig 63 1.1 kamil if (scorespec) 64 1.1 kamil wscore(); 65 1.1 kamil 66 1.6 christos snprintf(savefilename, sizeof(savefilename), "%s/save.%s", 67 1.6 christos SAVEDIR, logname); 68 1.1 kamil 69 1.1 kamil savfil = experimenting ? NULL : fopen(savefilename,"r"); 70 1.1 kamil if (savfil != NULL && fgets(spbuf,100,savfil) != NULL) { 71 1.1 kamil char tmpbuf[80]; 72 1.1 kamil 73 1.1 kamil spbuf[strlen(spbuf)-1] = '\0'; 74 1.1 kamil if (fgets(tmpbuf,80,savfil) != NULL) { 75 1.1 kamil int processnum; 76 1.1 kamil 77 1.1 kamil tmpbuf[strlen(tmpbuf)-1] = '\0'; 78 1.1 kamil printf("You seem to have left a game %s.\r\n",tmpbuf+9); 79 1.6 christos s = strchr(tmpbuf+9, ','); 80 1.1 kamil *s = '\0'; 81 1.1 kamil processnum = atoi(s+11); 82 1.1 kamil if (kill(processnum, SIGINT)) { 83 1.1 kamil /* does process not exist? */ 84 1.1 kamil /* (warp ignores SIGINT) */ 85 1.1 kamil printf("\r\n\ 86 1.1 kamil That process does not seem to exist anymore, so you'll have to start the\r\n"); 87 1.1 kamil printf( 88 1.1 kamil "last wave over.\r\n\n"); 89 1.1 kamil printf( 90 1.1 kamil " [type anything to continue]"); 91 1.4 christos fflush(stdout); 92 1.1 kamil eat_typeahead(); 93 1.1 kamil getcmd(tmpbuf); 94 1.1 kamil if (*tmpbuf == INTRCH) 95 1.1 kamil finalize(0); 96 1.1 kamil printf("\r\n"); 97 1.1 kamil } 98 1.1 kamil else { 99 1.1 kamil if (strcmp(term+8,tmpbuf+23)) { 100 1.1 kamil printf( 101 1.1 kamil "That is not your current terminal--you are on %s.\r\n", term+5); 102 1.1 kamil printf("\r\nYour options:\r\n"); 103 1.1 kamil printf(" 1) Exit and find the terminal it's running on\r\n"); 104 1.1 kamil } 105 1.1 kamil else { 106 1.1 kamil printf("\r\nYour options:\r\n"); 107 1.1 kamil printf(" 1) Exit and try to foreground it\r\n"); 108 1.1 kamil } 109 1.1 kamil printf(" 2) Let me terminate the other game\r\n\n"); 110 1.1 kamil printf("What do you want to do? "); 111 1.4 christos fflush(stdout); 112 1.1 kamil eat_typeahead(); 113 1.1 kamil getcmd(tmpbuf); 114 1.1 kamil printf("\r\n"); 115 1.1 kamil if (*tmpbuf == INTRCH) 116 1.1 kamil finalize(0); 117 1.1 kamil if (*tmpbuf == '1') { 118 1.1 kamil printf( 119 1.1 kamil "If you don't succeed, come back and do option 2 instead. Good luck.\r\n"); 120 1.1 kamil finalize(0); 121 1.1 kamil } 122 1.1 kamil printf( 123 1.1 kamil "Ok, hang on a few moments \r\n"); 124 1.4 christos fclose(savfil); 125 1.1 kamil if (kill(processnum, SIGQUIT)) { 126 1.1 kamil printf("Unable to kill process #%d!\r\n",processnum); 127 1.1 kamil roundsleep(2); 128 1.1 kamil } 129 1.1 kamil else { 130 1.1 kamil #ifdef SIGCONT 131 1.1 kamil kill(processnum, SIGCONT); 132 1.1 kamil #endif 133 1.1 kamil for (i=15; i; --i) { 134 1.1 kamil sleep(1); 135 1.1 kamil if (kill(processnum,SIGINT)) 136 1.1 kamil /* does process not exist? */ 137 1.1 kamil /* (warp ignores SIGINT) */ 138 1.1 kamil break; 139 1.1 kamil } 140 1.4 christos didkill = true; 141 1.1 kamil } 142 1.1 kamil savfil = fopen(savefilename,"r"); 143 1.1 kamil if (savfil != NULL) { 144 1.4 christos fgets(spbuf,100,savfil); 145 1.1 kamil } 146 1.1 kamil } 147 1.1 kamil } 148 1.1 kamil } 149 1.1 kamil else 150 1.1 kamil savfil = NULL; 151 1.1 kamil if (savfil == NULL) { 152 1.1 kamil totalscore = smarts = cumsmarts = wave = 0; 153 1.1 kamil numents = 5; 154 1.1 kamil numbases = 3; 155 1.1 kamil } 156 1.1 kamil else { 157 1.1 kamil totalscore = atol(spbuf+9); 158 1.1 kamil smarts = atoi(spbuf+20); 159 1.1 kamil cumsmarts = atoi(spbuf+24); 160 1.1 kamil numents = atoi(spbuf+30); 161 1.1 kamil numbases = atoi(spbuf+33); 162 1.1 kamil wave = atoi(spbuf+36); 163 1.1 kamil apolspec = (spbuf[40] == 'a'); 164 1.1 kamil beginner = (spbuf[41] == 'b'); 165 1.1 kamil crushspec = (spbuf[42] == 'c'); 166 1.1 kamil gornspec = (spbuf[43] == 'g'); 167 1.1 kamil massacre = (spbuf[44] == 'm'); 168 1.1 kamil romspec = (spbuf[45] == 'r'); 169 1.1 kamil tholspec = (spbuf[46] == 't'); 170 1.1 kamil lowspeed = (spbuf[47] == 'l') || lowspeed; 171 1.1 kamil amoebaspec = (spbuf[48] == '&'); 172 1.4 christos fclose(savfil); 173 1.1 kamil } 174 1.1 kamil 175 1.1 kamil if (!ismarts) { 176 1.1 kamil ismarts = 1; 177 1.1 kamil clear(); 178 1.4 christos page(NEWSFILE,false); 179 1.1 kamil if (smarts) { 180 1.1 kamil printf("\r\nSaved game: SCORE DIFF CUMDIFF ENTERPRISES BASES WAVE"); 181 1.1 kamil printf("\r\n %7ld %2d %4d %1d %1d %3d", 182 1.1 kamil totalscore,smarts,cumsmarts,numents,numbases,wave); 183 1.1 kamil } 184 1.1 kamil printf("\r\nWould you like instructions? "); 185 1.4 christos fflush(stdout); 186 1.1 kamil eat_typeahead(); 187 1.1 kamil getcmd(buf); 188 1.1 kamil printf("\r\n"); 189 1.1 kamil if (*buf == INTRCH) 190 1.1 kamil finalize(0); 191 1.1 kamil if (*buf == 'Y' || *buf == 'y') { 192 1.4 christos page(HELPFILE,false); 193 1.1 kamil printf("\r\nWould you like to play easy games for a while? "); 194 1.4 christos fflush(stdout); 195 1.1 kamil eat_typeahead(); 196 1.1 kamil getcmd(buf); 197 1.1 kamil printf("\r\n"); 198 1.1 kamil if (*buf == 'Y' || *buf == 'y') { 199 1.4 christos beginner = true; 200 1.4 christos lowspeed = true; 201 1.1 kamil } 202 1.1 kamil } 203 1.1 kamil } 204 1.1 kamil if (!smarts) 205 1.1 kamil smarts = ismarts; 206 1.1 kamil } 207 1.1 kamil 208 1.1 kamil void 209 1.4 christos wscore(void) 210 1.1 kamil { 211 1.1 kamil clear(); 212 1.1 kamil printf(" TOP WARPISTS\r\n\n"); 213 1.1 kamil printf("RANK WHO AKA SCORE DIFF CUMDIFF WHEN\r\n"); 214 1.4 christos page(SCOREBOARD,true); 215 1.1 kamil printf(" [Type anything to continue]"); 216 1.4 christos fflush(stdout); 217 1.1 kamil getcmd(spbuf); 218 1.1 kamil if (*spbuf == INTRCH) 219 1.1 kamil finalize(0); 220 1.1 kamil clear(); 221 1.1 kamil printf(" TOP LOW-SPEED WARPISTS\r\n\n"); 222 1.1 kamil printf("RANK WHO AKA SCORE DIFF CUMDIFF WHEN\r\n"); 223 1.4 christos page(LSCOREBOARD,true); 224 1.1 kamil printf(" [Type anything to continue]"); 225 1.4 christos fflush(stdout); 226 1.1 kamil getcmd(spbuf); 227 1.1 kamil if (*spbuf == INTRCH) 228 1.1 kamil finalize(0); 229 1.1 kamil clear(); 230 1.1 kamil printf(" TOP FUNNY WARPISTS\r\n\n"); 231 1.1 kamil printf("RANK WHO AKA SCORE DIFF CUMDIFF WHEN\r\n"); 232 1.4 christos page(FSCOREBOARD,true); 233 1.1 kamil printf(" [Type anything to continue]"); 234 1.4 christos fflush(stdout); 235 1.1 kamil getcmd(spbuf); 236 1.1 kamil if (*spbuf == INTRCH) 237 1.1 kamil finalize(0); 238 1.1 kamil clear(); 239 1.1 kamil printf(" GAMES SAVED OR IN PROGRESS\r\n\n"); 240 1.1 kamil printf("WHO SCORE DF CDF E B WV FLAGS\r\n"); 241 1.1 kamil resetty(); 242 1.4 christos snprintf(spbuf, sizeof(spbuf), "/bin/cat %ssave.*",SAVEDIR); 243 1.4 christos execl("/bin/sh", "sh", "-c", spbuf, NULL); 244 1.1 kamil finalize(1); 245 1.1 kamil } 246 1.1 kamil 247 1.1 kamil 248 1.1 kamil void 249 1.4 christos display_status(void) 250 1.1 kamil { 251 1.4 christos int tmp; 252 1.4 christos static const char *status_names[] = {"Impl", "Warp", "Base", "****" }; 253 1.1 kamil 254 1.1 kamil if (oldstatus != status) { 255 1.4 christos snprintf(spbuf, sizeof(spbuf), "%-4s",status_names[status]); 256 1.1 kamil mvaddstr(0,0, spbuf); 257 1.1 kamil oldstatus = status; 258 1.1 kamil } 259 1.1 kamil if (ent) { 260 1.1 kamil if (ent->energy != oldeenergy) { 261 1.1 kamil oldeenergy = ent->energy; 262 1.4 christos snprintf(spbuf, sizeof(spbuf), "%4ld",oldeenergy); 263 1.1 kamil mvaddstr(0,8, spbuf); 264 1.1 kamil } 265 1.1 kamil if (etorp != oldetorp) { 266 1.4 christos snprintf(spbuf, sizeof(spbuf), "%2d",etorp); 267 1.1 kamil mvaddstr(0,13, spbuf); 268 1.1 kamil oldetorp = etorp; 269 1.1 kamil } 270 1.1 kamil } 271 1.1 kamil else { 272 1.1 kamil if (etorp >= 0) { 273 1.1 kamil etorp = -1; 274 1.1 kamil mvaddstr(0,8,"*******"); 275 1.1 kamil damage = 0; 276 1.1 kamil } 277 1.1 kamil } 278 1.1 kamil if (base) { 279 1.1 kamil if (base->energy != oldbenergy) { 280 1.1 kamil oldbenergy = base->energy; 281 1.4 christos snprintf(spbuf, sizeof(spbuf), "%5ld",oldbenergy); 282 1.1 kamil mvaddstr(0,19, spbuf); 283 1.1 kamil } 284 1.1 kamil if (btorp != oldbtorp) { 285 1.4 christos snprintf(spbuf, sizeof(spbuf), "%3d",btorp); 286 1.1 kamil mvaddstr(0,25, spbuf); 287 1.1 kamil oldbtorp = btorp; 288 1.1 kamil } 289 1.1 kamil } 290 1.1 kamil else { 291 1.1 kamil if (btorp >= 0) { 292 1.1 kamil btorp = -1; 293 1.1 kamil mvaddstr(0,19,"*********"); 294 1.1 kamil } 295 1.1 kamil } 296 1.1 kamil if (damage) { 297 1.1 kamil if (!olddamage) 298 1.1 kamil mvaddstr(0,42,"*** "); 299 1.1 kamil if (damage > 1 || !damflag[dam]) { 300 1.1 kamil do { 301 1.1 kamil if (++dam == MAXDAMAGE) 302 1.1 kamil dam = 0; 303 1.1 kamil } while (!damflag[dam]); 304 1.1 kamil } 305 1.1 kamil if (!--damflag[dam]) { 306 1.1 kamil olddamage = damage; 307 1.1 kamil damage--; 308 1.4 christos snprintf(spbuf, sizeof(spbuf), "%s OK *** ",dammess[dam]); 309 1.1 kamil spbuf[15] = '\0'; 310 1.1 kamil mvaddstr(0,46,spbuf); 311 1.1 kamil } 312 1.1 kamil else if (dam == NOSHIELDS) { 313 1.1 kamil olddamage = damage; 314 1.1 kamil tmp = (34 - damflag[dam]) * 3 - rand_mod(3); 315 1.1 kamil if (tmp < 0) 316 1.1 kamil tmp = 0; 317 1.4 christos snprintf(spbuf, sizeof(spbuf), "%d%% %s *** ",tmp,dammess[dam]); 318 1.1 kamil spbuf[15] = '\0'; 319 1.1 kamil mvaddstr(0,46,spbuf); 320 1.1 kamil } 321 1.1 kamil else if (dam != lastdam || !olddamage) { 322 1.1 kamil olddamage = damage; 323 1.4 christos snprintf(spbuf, sizeof(spbuf), "NO %s *** ",dammess[dam]); 324 1.1 kamil spbuf[15] = '\0'; 325 1.1 kamil mvaddstr(0,46,spbuf); 326 1.1 kamil } 327 1.1 kamil if (status < 2) { 328 1.1 kamil if (dam == NOIMPULSE && !entmode) 329 1.1 kamil status = entmode = 1; 330 1.1 kamil if (dam == NOWARP && entmode) 331 1.1 kamil status = entmode = 0; 332 1.1 kamil } 333 1.1 kamil tmp = damflag[dam] * damage; 334 1.4 christos snprintf(spbuf, sizeof(spbuf), "%3d.%1d ETR",tmp/10,tmp%10); 335 1.1 kamil mvaddstr(0,69,spbuf); 336 1.1 kamil lastdam = dam; 337 1.1 kamil } 338 1.1 kamil else { 339 1.1 kamil if (olddamage) { 340 1.4 christos snprintf(spbuf, sizeof(spbuf), "Stars: %-3d Stardate",numstars); 341 1.1 kamil mvaddstr(0,42,spbuf); 342 1.1 kamil lastdam = -1; 343 1.1 kamil olddamage = 0; 344 1.1 kamil oldcurscore = -1; 345 1.1 kamil } 346 1.1 kamil else if (numstars != oldstrs) { 347 1.4 christos snprintf(spbuf, sizeof(spbuf), "%-3d",numstars); 348 1.1 kamil mvaddstr(0,49, spbuf); 349 1.1 kamil } 350 1.1 kamil oldstrs = numstars; 351 1.1 kamil } 352 1.1 kamil if (numenemies != oldenemies) { 353 1.4 christos snprintf(spbuf, sizeof(spbuf), "%-3d",numenemies); 354 1.1 kamil mvaddstr(0,38, spbuf); 355 1.1 kamil oldenemies = numenemies; 356 1.1 kamil } 357 1.4 christos if ((tmp = timer%10) != 0) { 358 1.4 christos snprintf(spbuf, sizeof(spbuf), "%1d",tmp); 359 1.1 kamil mvaddstr(0,67, spbuf); 360 1.1 kamil } 361 1.1 kamil else { 362 1.4 christos snprintf(spbuf, sizeof(spbuf), "%5d.%1d",timer/10+smarts*100,tmp); 363 1.1 kamil mvaddstr(0,61, spbuf); 364 1.1 kamil } 365 1.1 kamil if ((!damage || !damflag[dam]) && curscore != oldcurscore) { 366 1.4 christos snprintf(spbuf, sizeof(spbuf), "%9ld",curscore); 367 1.1 kamil mvaddstr(0,69, spbuf); 368 1.1 kamil oldcurscore = curscore; 369 1.1 kamil } 370 1.1 kamil } 371 1.1 kamil 372 1.1 kamil void 373 1.4 christos wavescore(void) 374 1.1 kamil { 375 1.1 kamil double power, effectscore, starscore, pi_over_2; 376 1.1 kamil long bonuses; 377 1.1 kamil long tmp; 378 1.1 kamil FILE *mapfp; 379 1.1 kamil int row; 380 1.1 kamil 381 1.1 kamil clear(); 382 1.1 kamil if (curscore > possiblescore) 383 1.1 kamil curscore = possiblescore; 384 1.1 kamil pi_over_2 = 3.14159265 / 2.0; 385 1.1 kamil power = pow((double)inumenemies+ /* total number of enemies */ 386 1.1 kamil inumroms*2+ /* count roms 3 times */ 387 1.1 kamil inumgorns+ /* count gorns 2 times */ 388 1.1 kamil inumthols+ /* count thols 2 times */ 389 1.1 kamil inumapollos*4+ /* count apollo 5 times */ 390 1.1 kamil inumcrushes*3+ /* count crushers 4 times */ 391 1.1 kamil inumamoebas*5 /* count amoebas 6 times */ 392 1.1 kamil , 0.50) * /* skew it a little */ 393 1.1 kamil (double)smarts; /* average energy and intelligence */ 394 1.1 kamil if (inumstars < 350 && inumenemies > 5) 395 1.1 kamil power += (350.0 - (double)inumstars) * ((double)inumenemies - 5.0); 396 1.1 kamil if (inumstars > 850 && inumenemies > 2) 397 1.1 kamil power += ((double)inumstars - 850.0) * ((double)inumenemies - 2.0); 398 1.1 kamil effectscore = ((double)curscore / possiblescore) * 399 1.1 kamil atan2(power, (double) timer + 1.0) / pi_over_2; 400 1.1 kamil if (inumstars) 401 1.1 kamil starscore = (double) numstars / (double) inumstars; 402 1.1 kamil else 403 1.1 kamil starscore = 1.0; 404 1.1 kamil wave++; 405 1.4 christos snprintf(spbuf, sizeof(spbuf), "Wave = %d, Difficulty = %d, cumulative difficulty = %d", 406 1.1 kamil wave, smarts, cumsmarts); 407 1.1 kamil mvaddstr(1, 13+(smarts<10), spbuf); 408 1.1 kamil mvaddstr( 4, 68, " BONUS"); 409 1.4 christos snprintf(spbuf, sizeof(spbuf), "Efficiency rating: %1.8f (diff=%0.2f,time=%d)", 410 1.1 kamil effectscore, power, timer + 1); 411 1.1 kamil mvaddstr( 5,5, spbuf); 412 1.1 kamil if (effectscore < 0.8) 413 1.1 kamil bonuses = tmp = 0; 414 1.1 kamil else 415 1.1 kamil bonuses = tmp = (long) ((effectscore-0.8) * smarts * 1000); 416 1.4 christos snprintf(spbuf, sizeof(spbuf), "%6ld", tmp); 417 1.1 kamil mvaddstr( 5, 68, spbuf); 418 1.4 christos snprintf(spbuf, sizeof(spbuf), "Star save ratio: %1.8f (%d/%d)", 419 1.1 kamil starscore, numstars, inumstars); 420 1.1 kamil mvaddstr( 6,5, spbuf); 421 1.1 kamil bonuses += tmp = (long) (((double)curscore / possiblescore) * 422 1.1 kamil (starscore*starscore) * smarts * 20); 423 1.4 christos snprintf(spbuf, sizeof(spbuf), "%6ld", tmp); 424 1.1 kamil mvaddstr( 6, 68, spbuf); 425 1.1 kamil row = 7; 426 1.1 kamil if (inuminhab != numinhab) { 427 1.4 christos snprintf(spbuf, sizeof(spbuf), "Inhabited stars depopulated: %5d", inuminhab-numinhab); 428 1.1 kamil mvaddstr(row,5, spbuf); 429 1.1 kamil bonuses += tmp = (long) (inuminhab-numinhab) * -500; 430 1.4 christos snprintf(spbuf, sizeof(spbuf), "%6ld", tmp); 431 1.1 kamil mvaddstr(row, 68, spbuf); 432 1.1 kamil row++; 433 1.1 kamil } 434 1.1 kamil if (inumfriends != numfriends) { 435 1.4 christos snprintf(spbuf, sizeof(spbuf), "Friendly craft destroyed: %5d", 436 1.1 kamil inumfriends-numfriends); 437 1.1 kamil mvaddstr(row,5, spbuf); 438 1.1 kamil bonuses += tmp = (long) (inumfriends-numfriends) * -250; 439 1.4 christos snprintf(spbuf, sizeof(spbuf), "%6ld", tmp); 440 1.1 kamil mvaddstr(row, 68, spbuf); 441 1.1 kamil row++; 442 1.1 kamil } 443 1.1 kamil if (deadmudds) { 444 1.1 kamil mvaddstr(row,5,"For destroying Harry Mudd:"); 445 1.1 kamil bonuses += tmp = (long) rand_mod(deadmudds * 20 + 1) - deadmudds*10; 446 1.4 christos snprintf(spbuf, sizeof(spbuf), "%6ld", tmp); 447 1.1 kamil mvaddstr(row, 68, spbuf); 448 1.1 kamil row++; 449 1.1 kamil } 450 1.1 kamil if (bombed_out) { 451 1.1 kamil mvaddstr(row,5, "For running away from reality:"); 452 1.1 kamil bonuses += tmp = (long) -possiblescore/2; 453 1.4 christos snprintf(spbuf, sizeof(spbuf), "%6ld", tmp); 454 1.1 kamil mvaddstr(row, 68, spbuf); 455 1.1 kamil row++; 456 1.1 kamil } 457 1.1 kamil if (row < 9) 458 1.1 kamil row++; 459 1.4 christos snprintf(spbuf, sizeof(spbuf), "Enterprise: %-9s%5d remaining", 460 1.1 kamil !ient?"":ent?"saved":"destroyed", numents); 461 1.1 kamil mvaddstr(row,5, spbuf); 462 1.1 kamil bonuses += tmp = ent && !bombed_out ? (smarts+1)*15 : 0; 463 1.4 christos snprintf(spbuf, sizeof(spbuf), "%6ld", tmp); 464 1.1 kamil mvaddstr(row, 68, spbuf); 465 1.1 kamil row++; 466 1.4 christos snprintf(spbuf, sizeof(spbuf), "Base: %-9s %5d remaining", 467 1.1 kamil !ibase?"":base?"saved":"destroyed", numbases); 468 1.1 kamil mvaddstr(row,5, spbuf); 469 1.1 kamil bonuses += tmp = base && !bombed_out ? (smarts+1)*10 : 0; 470 1.4 christos snprintf(spbuf, sizeof(spbuf), "%6ld", tmp); 471 1.1 kamil mvaddstr(row, 68, spbuf); 472 1.1 kamil if (beginner) { 473 1.1 kamil mvaddstr(13+(row>11),19, "(Special games count only a tenth as much)"); 474 1.1 kamil curscore /= 10; 475 1.1 kamil bonuses /= 10; 476 1.1 kamil } 477 1.4 christos snprintf(spbuf, sizeof(spbuf), "Previous point total:%10ld",lastscore); 478 1.1 kamil mvaddstr(15,24, spbuf); 479 1.4 christos snprintf(spbuf, sizeof(spbuf), "Points this round: %10ld",curscore); 480 1.1 kamil mvaddstr(16,24, spbuf); 481 1.4 christos snprintf(spbuf, sizeof(spbuf), "Bonuses: %10ld",bonuses); 482 1.1 kamil mvaddstr(17,24, spbuf); 483 1.1 kamil totalscore = lastscore + curscore + bonuses; 484 1.4 christos snprintf(spbuf, sizeof(spbuf), "New point total: %10ld",totalscore); 485 1.1 kamil mvaddstr(18,24, spbuf); 486 1.1 kamil if (lastscore / ENTBOUNDARY < totalscore / ENTBOUNDARY) { 487 1.1 kamil mvaddstr(row-1,42,"+ 1 new"); 488 1.1 kamil numents++; 489 1.1 kamil } 490 1.1 kamil else if (numents>0 && 491 1.1 kamil lastscore / ENTBOUNDARY > totalscore / ENTBOUNDARY) { 492 1.1 kamil mvaddstr(row-1,42,"- 1 obsolete"); 493 1.1 kamil numents--; 494 1.1 kamil } 495 1.1 kamil if (lastscore / BASEBOUNDARY < totalscore / BASEBOUNDARY) { 496 1.1 kamil mvaddstr(row,42,"+ 1 new"); 497 1.1 kamil numbases++; 498 1.1 kamil } 499 1.1 kamil else if (numbases>0 && 500 1.1 kamil lastscore / BASEBOUNDARY > totalscore / BASEBOUNDARY) { 501 1.1 kamil mvaddstr(row,42,"- 1 obsolete"); 502 1.1 kamil numbases--; 503 1.1 kamil } 504 1.1 kamil if (starscore < 0.8 && inumstars > 200 && numstars > 50) { 505 1.4 christos snprintf(spbuf, sizeof(spbuf), "smap.%d",rand_mod(MAPS-PERMMAPS)+PERMMAPS); 506 1.4 christos if ((mapfp = fopen(spbuf, "w")) != NULL) { 507 1.4 christos OBJECT *obj; 508 1.1 kamil 509 1.1 kamil fprintf(mapfp,"%d\n",numstars); 510 1.1 kamil for (obj = root.next; obj != &root; obj = obj->next) { 511 1.1 kamil if (obj->type == Star) { 512 1.1 kamil fprintf(mapfp,"%d %d\n",obj->posy,obj->posx); 513 1.1 kamil } 514 1.1 kamil } 515 1.4 christos fclose(mapfp); 516 1.1 kamil } 517 1.1 kamil } 518 1.1 kamil } 519 1.1 kamil 520 1.1 kamil void 521 1.4 christos score(void) 522 1.1 kamil { 523 1.1 kamil char tmp, *retval, cdate[30]; 524 1.4 christos FILE *logfd; 525 1.4 christos FILE *outfd; 526 1.4 christos int i; 527 1.3 kamil time_t nowtime; 528 1.4 christos const char *scoreboard; 529 1.1 kamil 530 1.1 kamil for (i=0; link(LOGFILE, LOCKFILE) == -1 && i<10; i++) 531 1.1 kamil sleep(1); 532 1.3 kamil nowtime = time(NULL); 533 1.1 kamil strcpy(cdate,ctime(&nowtime)); 534 1.1 kamil if ((logfd = fopen(LOGFILE,"a")) != NULL) { 535 1.1 kamil fprintf(logfd, 536 1.1 kamil "%-24s%-9s%7ld%c%2d %4d %s", 537 1.1 kamil realname, logname, totalscore, c,smarts, cumsmarts, cdate); 538 1.4 christos fclose(logfd); 539 1.1 kamil } 540 1.1 kamil strcpy(cdate+11,cdate+20); 541 1.1 kamil if (beginner) 542 1.1 kamil scoreboard = FSCOREBOARD; 543 1.1 kamil else if (lowspeed) 544 1.1 kamil scoreboard = LSCOREBOARD; 545 1.1 kamil else 546 1.1 kamil scoreboard = SCOREBOARD; 547 1.1 kamil if (eaccess(scoreboard,0)) { 548 1.1 kamil if ((logfd = fopen(scoreboard,"w")) != NULL) 549 1.4 christos fclose(logfd); 550 1.1 kamil } 551 1.1 kamil if ((logfd = fopen(scoreboard,"r")) != NULL && 552 1.1 kamil (outfd = fopen(TMPSCOREBOARD,"w")) != NULL) { 553 1.1 kamil for (i=0; i<20; i++) { 554 1.1 kamil if ((retval = fgets(buf, 100, logfd)) == NULL) 555 1.1 kamil break; 556 1.1 kamil if (atol(buf+32) < totalscore) 557 1.1 kamil break; 558 1.1 kamil if (strnEQ(buf+COMPOFF,COMPNAME,COMPLEN)) { 559 1.1 kamil i = 100; 560 1.1 kamil break; 561 1.1 kamil } 562 1.1 kamil fprintf(outfd, "%s", buf); 563 1.1 kamil } 564 1.1 kamil if (i == 100) { 565 1.1 kamil mvaddstr(20,21, "You did not better your previous score"); 566 1.4 christos fclose(outfd); 567 1.1 kamil unlink(TMPSCOREBOARD); 568 1.1 kamil } 569 1.1 kamil else if (i < 20) { 570 1.1 kamil fprintf(outfd, "%-24s%-8s%8ld%c %2d %4d %s", 571 1.1 kamil realname, logname, totalscore, c,smarts, cumsmarts, cdate); 572 1.1 kamil i++; 573 1.4 christos snprintf(spbuf, sizeof(spbuf), " Congratulations--you've placed %d%s", 574 1.1 kamil i, i==1?"st":(i==2?"nd":(i==3?"rd":"th"))); 575 1.1 kamil if (retval != NULL) { 576 1.1 kamil if (strnNE(buf+COMPOFF,COMPNAME,COMPLEN)) { 577 1.1 kamil fprintf(outfd, "%s", buf); 578 1.1 kamil i++; 579 1.1 kamil } 580 1.1 kamil else 581 1.4 christos strcpy(spbuf, "Congratulations--you've bettered your score"); 582 1.1 kamil while (i<20) { 583 1.1 kamil if (fgets(buf, 100, logfd) == NULL) 584 1.1 kamil break; 585 1.1 kamil if (strnNE(buf+COMPOFF,COMPNAME,COMPLEN)) { 586 1.1 kamil fprintf(outfd, "%s", buf); 587 1.1 kamil i++; 588 1.1 kamil } 589 1.1 kamil } 590 1.1 kamil } 591 1.1 kamil mvaddstr(20,19, spbuf); 592 1.4 christos fclose(logfd); 593 1.4 christos fclose(outfd); 594 1.1 kamil while (unlink(scoreboard) == 0) 595 1.1 kamil ; 596 1.1 kamil link(TMPSCOREBOARD,scoreboard); 597 1.1 kamil unlink(TMPSCOREBOARD); 598 1.1 kamil logfd = fopen(scoreboard,"r"); 599 1.1 kamil } 600 1.1 kamil else { 601 1.1 kamil mvaddstr(20,22,"You did not place within the top 20"); 602 1.4 christos fclose(outfd); 603 1.1 kamil } 604 1.1 kamil } 605 1.1 kamil else { 606 1.4 christos snprintf(spbuf, sizeof(spbuf), "(Cannot access %s file, error %d)", 607 1.1 kamil (logfd==NULL?"log":"tmp"),errno); 608 1.1 kamil mvaddstr(20,22,spbuf); 609 1.1 kamil } 610 1.1 kamil move(23,0,0); 611 1.1 kamil erase_eol(); 612 1.1 kamil mvaddstr(23,11, 613 1.1 kamil "[Hit space for scoreboard, 'r' for new game, 'q' to quit]"); 614 1.1 kamil unlink(LOCKFILE); 615 1.4 christos fflush(stdout); 616 1.1 kamil eat_typeahead(); 617 1.1 kamil do { 618 1.1 kamil getcmd(&tmp); 619 1.6 christos } while (tmp != INTRCH && tmp != BREAKCH && !strchr(" rqQ",tmp)); 620 1.6 christos if (strchr("qQr",tmp)) { 621 1.1 kamil justonemoretime = (tmp == 'r'); 622 1.1 kamil if (logfd != NULL) 623 1.4 christos fclose(logfd); 624 1.1 kamil } 625 1.1 kamil else { 626 1.1 kamil clear(); 627 1.1 kamil if (logfd != NULL) { 628 1.1 kamil fseek(logfd, 0L, 0); 629 1.1 kamil if (beginner) 630 1.1 kamil mvaddstr(0,31,"TOP FUNNY WARPISTS"); 631 1.1 kamil else if (lowspeed) 632 1.1 kamil mvaddstr(0,29,"TOP LOW-SPEED WARPISTS"); 633 1.1 kamil else 634 1.1 kamil mvaddstr(0,33,"TOP WARPISTS"); 635 1.1 kamil mvaddstr(2,0,"RANK WHO AKA SCORE DIFF CUMDIFF WHEN"); 636 1.1 kamil for (i=1; i<=20; i++) { 637 1.1 kamil if (fgets(buf, 100, logfd) == NULL) 638 1.1 kamil break; 639 1.1 kamil buf[strlen(buf)-1] = '\0'; 640 1.4 christos snprintf(spbuf, sizeof(spbuf), " %2d %s", i, buf); 641 1.1 kamil mvaddstr(i+2,0, spbuf); 642 1.1 kamil } 643 1.4 christos fclose(logfd); 644 1.1 kamil } 645 1.1 kamil roundsleep(1); 646 1.1 kamil mvaddstr(23,25,"Would you like to play again?"); 647 1.1 kamil eat_typeahead(); 648 1.1 kamil do { 649 1.1 kamil getcmd(&tmp); 650 1.6 christos } while (tmp != INTRCH && tmp != BREAKCH && !strchr("nNyY \n\r",tmp)); 651 1.1 kamil if (tmp == 'n' || tmp == 'N' || tmp == INTRCH || tmp == BREAKCH) 652 1.4 christos justonemoretime = false; 653 1.1 kamil } 654 1.1 kamil 655 1.1 kamil smarts = ismarts; 656 1.1 kamil totalscore = cumsmarts = wave = 0; 657 1.1 kamil numents = 5; 658 1.1 kamil numbases = 3; 659 1.4 christos apolspec = false; 660 1.4 christos beginner = false; 661 1.4 christos crushspec = false; 662 1.4 christos gornspec = false; 663 1.1 kamil massacre = (ismarts >= 40); 664 1.4 christos romspec = false; 665 1.4 christos tholspec = false; 666 1.1 kamil } 667 1.1 kamil 668 1.1 kamil void 669 1.4 christos save_game(void) 670 1.1 kamil { 671 1.1 kamil FILE *savfil; 672 1.1 kamil 673 1.1 kamil if (experimenting) 674 1.1 kamil return; 675 1.1 kamil if ((savfil = fopen(savefilename,"w")) == NULL) { 676 1.6 christos int e = errno; 677 1.1 kamil resetty(); 678 1.6 christos printf("Cannot save game in %s (%s)\r\n", savefilename, strerror(e)); 679 1.1 kamil finalize(1); 680 1.1 kamil } 681 1.4 christos fprintf(savfil, "%-8s %10ld, %2d,%5d,%2d,%2d,%3d %c%c%c%c%c%c%c%c%c\n", 682 1.1 kamil logname, totalscore, smarts, cumsmarts, numents, numbases, wave, 683 1.1 kamil apolspec ? 'a' : ' ', 684 1.1 kamil beginner ? 'b' : ' ', 685 1.1 kamil crushspec ? 'c' : ' ', 686 1.1 kamil gornspec ? 'g' : ' ', 687 1.1 kamil massacre ? 'm' : ' ', 688 1.1 kamil romspec ? 'r' : ' ', 689 1.1 kamil tholspec ? 't' : ' ', 690 1.1 kamil lowspeed ? 'l' : ' ', 691 1.1 kamil amoebaspec ? '&' : ' ' 692 1.1 kamil ); 693 1.4 christos fclose(savfil); 694 1.1 kamil resetty(); 695 1.1 kamil if (panic) 696 1.1 kamil finalize(0); 697 1.1 kamil clear(); 698 1.1 kamil finalize(0); 699 1.1 kamil } 700