|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T s
Length: 5703 (0x1647) Types: TextFile Names: »scores.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987 └─⟦this⟧ »EUUGD18/General/Wanderer/scores.c«
#include "wand_head.h" #ifdef MSDOS /* M001 */ #define LOCK #define UNLOCK #else #define LOCK while((lock = creat(LOCKPATH,0)) < 0) #define UNLOCK (void) unlink(LOCKPATH) #endif #define ENTRIES 15 #ifndef MSDOS /* M001 */ extern int getuid(); #else #define getuid() 0 #endif extern int saved_game; /* prevent recording of hiscore if */ /* NO_RESTORED_GAME_HISCORES is #def'd */ typedef struct { char howdead[25]; char name[20]; int score; int level; int uid; } score_entry; #ifdef LINT_ARGS /* M001 */ void show_scores(score_entry *,int ); int readtable(score_entry *); #else void show_scores(); int readtable(); #endif void show_scores(table,num) score_entry *table; int num; { int tot = num; printf("\nNo. Score Level Names How they died\n"); printf("=============================================================================\n"); while(num > 0) { num--; printf("%2d %5d %3d %-20s killed by %-s\n",(tot - num),table->score,table->level,table->name,table->howdead); table++; } printf("\n\n"); } int readtable(table_ptr) score_entry *table_ptr; { FILE *fp; int numread; if((fp = fopen(HISCOREPATH,R_BIN)) == NULL) { numread = 0; } else { numread = fread( VOIDSTAR table_ptr, sizeof(score_entry), ENTRIES, fp); fclose(fp); } return numread; } int savescore(howdead,score,level,name) char *howdead, *name; int score,level; { score_entry table[ENTRIES + 2], *table_ptr = table,new_entry,temp_entry; int numread,index = 1, numsaved, lock, already = 0, output_value = 1, user_id; FILE *fp; #ifdef NO_RESTORED_GAME_HISCORES if(saved_game) { printf("No hiscores recorded from restored games.\n"); printf("\nWanderer (C) 1988 S.Shipway.\n\n"); return 1; } #endif user_id = getuid(); strncpy(new_entry.howdead,howdead,25); new_entry.howdead[24] = '\0'; /* M002 strncpy does not null terminate */ strncpy(new_entry.name,name,20); new_entry.name[19] = '\0'; /* M002 strncpy does not null terminate */ new_entry.score = score; new_entry.level = level; new_entry.uid = user_id; LOCK; numread = readtable(table_ptr); if (numread > 0) if(table[numread-1].score > 99999) /* stop system errors messing it up*/ { numread--; printf("Erasing spurious entry in table.\n"); } if(score == 0) { show_scores(table,numread); UNLOCK; return 0; } if (numread > 0) { numread++; /* scan through until correct insertion point */ /* pass table entries with higher scores */ while((table_ptr->score > score)&&(index < numread)) { #ifdef COMPARE_BY_NAME #define SAMEUSER(p) (strcmp((p)->name, name) == 0) #else #define SAMEUSER(p) ((p)->uid == user_id) #endif if(SAMEUSER(table_ptr)) { already = 1; break; } table_ptr++; index++; } /* pass table entries with equal score but higher or equal level */ while((table_ptr->level>=level)&&(index<numread)&&(table_ptr->score==score)) { if(SAMEUSER(table_ptr)) { already = 1; break; } table_ptr++; index++; } /* if already found: done */ if(already == 1) { numread--; show_scores(table,numread); UNLOCK; return numread; } /* shift down score list */ while(index < numread) { /* swap *table_ptr and new_entry */ temp_entry = *table_ptr; *table_ptr = new_entry; new_entry = temp_entry; if(SAMEUSER(&new_entry)) { already = 1; numread--; /* an older entry found */ break; } table_ptr++; index++; } /* if all shifted without finding an older entry */ if(already==0) *table_ptr = new_entry; } else { printf("\nCreating new hiscore table.\n\n"); *table_ptr = new_entry; numread++; } numread = ( (numread > ENTRIES) ? ENTRIES : numread ); fp = fopen(HISCOREPATH,W_BIN); table_ptr = table; numsaved = fwrite( VOIDSTAR table_ptr, sizeof(score_entry), numread, fp); chmod(HISCOREPATH,0666); if(numsaved < numread) { printf("ERROR! Only %d items saved from %d !\n",numsaved,numread); output_value = 0; } fclose(fp); UNLOCK; show_scores(table,numsaved); return output_value; } void delete_entry(num) int num; { score_entry table[ENTRIES + 22], *table_ptr = table, new_entry,temp_entry; int numread,index = 1, numsaved, lock, output_value = 1; FILE *fp; LOCK; numread = readtable(table_ptr); if (numread == 0) { printf("Missing or unreadable hiscore table.\n\n"); UNLOCK; exit(1); } if (num > numread) { printf("Invalid entry, choose again\n"); UNLOCK; return; } while(index < num) { index++; table_ptr++; } while(index < numread) { index++; *table_ptr = *(table_ptr+1); table_ptr++; } numread--; fp = fopen(HISCOREPATH,W_BIN); table_ptr = table; numsaved = fwrite( VOIDSTAR table_ptr, sizeof(score_entry), numread, fp); chmod(HISCOREPATH,0666); if(numsaved < numread) { printf("ERROR! Only %d items saved from %d !\n",numsaved,numread); output_value = 0; } fclose(fp); UNLOCK; show_scores(table,numsaved); } erase_scores() { int erasenum,numread,index = 0; char correct[20],c; score_entry table[ENTRIES + 2], *table_ptr = table; printf("Please enter password:"); while((c = getchar()) != '\n' && index <19) { correct[index++] = c; } correct[index] = 0; if(strcmp(correct,MASTERPASSWORD)) { printf("\nFoo, charlatan!\n"); return 0; } numread = readtable(table_ptr); show_scores(table,numread); printf("\n"); for(;;) { printf("Number to erase (0 to exit): "); scanf("%d",&erasenum); printf("\n"); if(erasenum == 0) break; delete_entry(erasenum); printf("\n"); } printf("Byee!\n"); }