|
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: 5337 (0x14d9) Types: TextFile Names: »score.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987 └─⟦this⟧ »EUUGD18/X/Xrobots/score.c«
/* * score.c -- xrobots v1.0 * * flock() is used to stop a race condition within... if you don't * have a bsd-like flock(), you could probably comment it out. * The race condition (multiple users writing to the score file) is * probably rare. */ #include <X11/Intrinsic.h> #include <X11/StringDefs.h> #include <X11/Shell.h> #include <X11/Box.h> #include <X11/Command.h> #include <X11/Label.h> #include <stdio.h> #include <sys/file.h> #include "score.h" #include "game.h" /*----------------------------------------------------------------------*/ typedef struct { char score[6], name[26]; } SCORE; static SCORE scores[MAXSCORES]; void show_scores(), new_high_score(), load_scores(), write_out_scores(); static FILE *scorefile = 0; /*----------------------------------------------------------------------*/ void check_score(current_score) int current_score; { load_scores(); if(current_score > atoi(scores[MAXSCORES-1].score)) { new_high_score(current_score); write_out_scores(); } if(scorefile) { flock(scorefile->_file, LOCK_UN); fclose(scorefile); show_scores(); } } static void load_scores() { int i = 0; if( !(scorefile = fopen(SCORE_FILE,"r+")) ) { scorefile = fopen(SCORE_FILE, "w"); return; } flock(scorefile->_file, LOCK_EX); while( fgets(scores[i].score,6,scorefile) /* get score */ && fgets(scores[i].name,26,scorefile) /* get name */ && fgetc(scorefile)) /* and newline */ { i++; if( i > MAXSCORES ) break; } } static void new_high_score(current_score) int current_score; { int i; char textscore[6], name[26]; sprintf(textscore,"%5d",current_score); strncpy(name,getenv("USER"),25); for(i=MAXSCORES-2;i>=0;i--) if( current_score < atoi(scores[i].score) ) { /* move new score into i+1 slot */ strcpy(scores[i+1].score,textscore); strcpy(scores[i+1].name,name); return; } else { strcpy(scores[i+1].score,scores[i].score); strcpy(scores[i+1].name,scores[i].name); } /* if it got here, there is a new number 1 score */ strcpy(scores[0].score,textscore); strcpy(scores[0].name,name); } static void write_out_scores() { int i; if( !scorefile ) return; rewind(scorefile); for(i=0;i<MAXSCORES;i++) fprintf(scorefile,"%5s%25s\n",scores[i].score,scores[i].name); } /*----------------------------------------------------------------------*/ Widget score_popup; Widget score_labels[MAXSCORES]; static Arg arglist_score_title[] = { { XtNborderWidth, (XtArgVal) 0 }, { XtNresize, (XtArgVal) False }, { XtNwidth, (XtArgVal) 300 }, { XtNheight, (XtArgVal) 30 }, { XtNlabel, (XtArgVal) "High Scores" }, { XtNjustify, (XtArgVal) XtJustifyCenter }, }; static Arg arglist_score_label[] = { { XtNlabel, (XtArgVal) 0 }, { XtNborderWidth, (XtArgVal) 0 }, { XtNresize, (XtArgVal) False }, { XtNwidth, (XtArgVal) 300 }, { XtNjustify, (XtArgVal) XtJustifyCenter }, }; static Arg arglist_popdown[] = { /* { XtNborderWidth, (XtArgVal) 2 },*/ { XtNresize, (XtArgVal) False }, { XtNwidth, (XtArgVal) 300 }, { XtNlabel, (XtArgVal) "Pop Down" }, { XtNjustify, (XtArgVal) XtJustifyCenter }, }; /*ARGSUSED*/ static XtCallbackProc popdown_callback(w, closure, call_data) Widget w; caddr_t closure; caddr_t call_data; { XtPopdown(score_popup); } void create_high_score_popup(parent) Widget parent; { int i; Widget score_box, popdown; score_popup = XtCreatePopupShell( "score_popup", transientShellWidgetClass, parent, 0,0); score_box = XtCreateManagedWidget( "score_box", boxWidgetClass, score_popup, 0,0); (void)XtCreateManagedWidget( "score_title", labelWidgetClass, score_box, arglist_score_title, XtNumber(arglist_score_title)); for(i=0;i<MAXSCORES;i++) { score_labels[i] = XtCreateManagedWidget( "alabel", labelWidgetClass, score_box, arglist_score_label, XtNumber(arglist_score_label)); } popdown = XtCreateManagedWidget( "popdown", commandWidgetClass, score_box, arglist_popdown, XtNumber(arglist_popdown)); XtAddCallback(popdown,XtNcallback,popdown_callback,0); } void show_scores() { int i; char tmp_str[31]; Arg tmp_arg; for(i = 0;i<MAXSCORES;i++) { sprintf(tmp_str,"%5s %25s", scores[i].score, scores[i].name); XtSetArg(tmp_arg,XtNlabel,tmp_str); XtSetValues(score_labels[i],&tmp_arg,1); } XtPopup(score_popup, XtGrabNone); } /*----------------------------------------------------------------------*/