This is HighScoreTable.m in view mode; [Download] [Up]
//
#import "HighScoreTable.h"
// 8/26/93 init: strcpy(defaultPlayerName,NXUserName()); by cat
// 8/26/93 NXBundle support; by cat
//#import "PreferencesBrain.h"
//#import "GameBrain.h"
#import <appkit/appkit.h>
@implementation HighScoreTable
- init // designated initializer sets up game variables
{ // to sensible values.
int i;
for (i=0; i<MAXSCORES; i++) { // get space to store names of high scorers
highNames[i] = malloc(256);
}
if( !highScorePanel)
[NXApp loadNibSection:"HighScore.nib" owner:self withNames:NO];
defaultPlayerName = malloc(64);
strcpy(defaultPlayerName,NXUserName());
scoreFileName = malloc(strlen(NXArgv[0]) + 16);
// get name of highscore file (inside app wrapper)
if(NO ==
[[NXBundle mainBundle] getPath:scoreFileName forResource:"highscores" ofType:""])
{ *scoreFileName = 0;
[self writeHighScores];
}
[self readHighScores];
return self;
}
/* methods to get at important variables */
- highScorePanel { return highScorePanel; }
- setHighScorePanel:(id)panel { highScorePanel = panel; return self; }
- highScoreDispMatrix { return highScoreDispMatrix; }
- setHighScoreDispMatrix:(id)matrix {highScoreDispMatrix=matrix; return self;}
- (int)highScore:(int)num { return highScores[num]; }
- (const char *)defaultPlayerName { return defaultPlayerName; }
- setDefaultPlayerName:(const char *)name
{
strcpy(defaultPlayerName,name);
return self;
}
- findHighScoreText:sender // used by below method to update cells
{
int tag = [sender tag];
if ((tag % 2) == 0) { // name
[sender setStringValue:highNames[tag / 2]];
} else { // score
[sender setIntValue:highScores[tag / 2]];
}
return self;
}
- showHighScores // update display matrix
{
return [highScoreDispMatrix sendAction:@selector(findHighScoreText:)
to:self forAllCells:YES];
}
- zeroHighScores // wipes out high scores
{
int i;
char *tempStr;
for (i=0; i<MAXSCORES; i++) {
highScores[i] = (MAXSCORES - i) * 100;
tempStr = malloc(16);
sprintf(tempStr, "Nobody #%d", i + 1);
strcpy(highNames[i], tempStr);
free(tempStr);
}
[self showHighScores];
return self;
}
- putInHighScores:(int)score // put player in high score table if applicable
{
int i, j;
id nameText;
if( !highScorePanel)
[self init];
for (i=0; i<MAXSCORES; i++) {
if (score >= highScores[i]) break;
}
if (i == MAXSCORES) {
[self displayHighScores:self]; // high score panel out
return self; // not a new high score
}
for (j=9; j>i; j--) { // shift old scores down
strcpy(highNames[j],highNames[j-1]);
highScores[j] = highScores[j-1];
}
highScores[i] = score;
strcpy(highNames[i], defaultPlayerName);
// set up textfield to accept player's name
if (highCell != nil) { // still hasn't entered previous name, so lost
// the chance -- we put in default now.
[highCell setBackgroundGray:NX_LTGRAY];
[highCell setBezeled:NO];
[highCell setEditable:NO];
highCell = nil;
}
nameText = [highScoreDispMatrix findCellWithTag:i*2];
[nameText setBackgroundGray:NX_WHITE];
[nameText setEditable:YES];
[nameText setBezeled:YES];
[nameText setStringValue:highNames[i]];
highCell = nameText;
[self showHighScores]; // update matrix (like doing displayHighScores:)
[highScorePanel makeKeyAndOrderFront:self]; // want user to enter name
[highScoreDispMatrix selectCellWithTag:i*2];
return self;
}
- displayHighScores:sender // bring up high scores w/info loaded into it
{
if( !highScorePanel)
[self init];
[self showHighScores];
[highScorePanel orderFront:self];
return self;
}
- readHighScores // read scores from file
{
NXTypedStream *typedStream;
int i; char *tmpStr;
[self zeroHighScores];
typedStream = NXOpenTypedStreamForFile(scoreFileName, NX_READONLY);
if (typedStream == NULL) {
NXRunAlertPanel("readHighScores","No highscore file.",NULL,NULL,"OK");
return self;
}
for (i=0; i<MAXSCORES; i++) {
NXReadTypes(typedStream, "i*", &highScores[i], &tmpStr);
strcpy(highNames[i], tmpStr);
}
NXCloseTypedStream(typedStream);
return self;
}
- writeHighScores // write scores to file
{
NXStream* stream;
NXTypedStream *typedStream;
int i;
if(*scoreFileName == 0)
{ strcpy(scoreFileName,[[NXBundle mainBundle] directory]);
strcat(scoreFileName,"/highscores");
[self zeroHighScores];
}
stream = NXMapFile(scoreFileName,NX_WRITEONLY);
if (!stream)
stream = NXOpenMemory(0,0,NX_WRITEONLY);
typedStream = NXOpenTypedStream(stream,NX_WRITEONLY);
for (i=0; i<MAXSCORES; i++)
NXWriteTypes(typedStream, "i*", &highScores[i], &highNames[i]);
NXCloseTypedStream(typedStream);
if(-1 == NXSaveToFile(stream,scoreFileName))
{ NXRunAlertPanel("High Scores",
"Cannot save high scores. Check path & permissions to:\n%s",0,0,0,scoreFileName);
return [self free];
}
NXCloseMemory(stream,NX_FREEBUFFER);
return self;
}
- clearHighScores:sender // zeroes the high scores -- IB method
{
[self zeroHighScores];
[self showHighScores]; // make game brain update "high score" field
return [self writeHighScores];
}
- acceptHighScore:sender // accept name into high score table - sent by
{ // name matrix when user fills in his/her name
int i;
if (highCell != nil) { // should always be true, but check just in case
i = [highCell tag]/2;
strcpy(highNames[i], [highCell stringValue]);
strcpy(defaultPlayerName, highNames[i]);
//[preferences setDefaultPlayerName:defaultPlayerName];
[highCell setBackgroundGray:NX_LTGRAY];
[highCell setEditable:NO];
[highCell setBezeled:NO];
highCell = nil;
}
[self writeHighScores]; // be sure that highscore file is updated
//[gameWindow makeKeyAndOrderFront:self];
return self;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.