This is HiScore.m in view mode; [Download] [Up]
#import "HiScore.h"
/*
Note: At this time (12-11-94) MiscSortedStorage does not seem to recognize
Misc_DESCENDING order as being different than Misc_ASCENDING order. Thus
some of the strange behavior in the for loops and choice of comparisons.
*/
@implementation HiScore
- init
{
[super initCount:0 elementSize:sizeof (ascore) description :"{@ii}"];
[self setSortEnabled:YES];
[self setSortOrder:Misc_ASCENDING]; /* not that this matters... */
return self;
}
- addElement:(void *)anElement
{
[super addElement:anElement];
if (0 != maxScores)
{
while ([self count] > maxScores)
{
[self removeElementAt:0];
}
}
return self;
}
- (int)compare:(void *)objectA to:(void *)objectB caseCheck:(BOOL)flag
{
if (![self count])
return 1;
if (NULL == objectA)
return -1;
if (NULL == objectB)
return 1;
if (((ascore *) objectA)->score < ((ascore *) objectB)->score)
return -1;
if (((ascore *) objectA)->score > ((ascore *) objectB)->score)
return 1;
return 0;
}
- (BOOL)newScoreForPlayer:(MiscString *) theName Of:(int)thescore At:(int)thelevel
{
ascore newscore;
newscore.playerName = [MiscString alloc];
if (theName)
[newscore.playerName initString:[theName stringValue]];
else
[newscore.playerName initString:[NXApp userRealName]];
newscore.score = thescore;
newscore.level = thelevel;
if (([self count] < maxScores) || (maxScores == 0)
|| (1 == [self compare:&newscore to:[self elementAt:0] caseCheck:NO]))
{
[self addElement:&newscore];
return YES;
}
return NO;
}
- load:sender
{
NXTypedStream *scorestream;
MiscString *aDirectory = [[MiscString alloc] init];
[aDirectory setStringValue:[[NXBundle mainBundle] directory]];
[aDirectory cat:"/highscores"];
scorestream = NXOpenTypedStreamForFile ([aDirectory stringValue],
NX_READONLY);
if (scorestream)
{
[self read:scorestream];
NXCloseTypedStream (scorestream);
}
[aDirectory free];
return self;
}
- save:sender
{
NXTypedStream *scorestream;
MiscString *aDirectory = [[MiscString alloc] init];
[aDirectory setStringValue:[[NXBundle mainBundle] directory]];
[aDirectory cat:"/highscores"];
scorestream = NXOpenTypedStreamForFile ([aDirectory stringValue],
NX_WRITEONLY);
if (scorestream)
{
[self write:scorestream];
NXCloseTypedStream (scorestream);
}
[aDirectory free];
return self;
}
- reset:sender
{
[self empty];
return self;
}
- setMaxScores:(int)maxnumberofscores
{
maxScores = maxnumberofscores;
return self;
}
- (int)browser:sender fillMatrix:matrix inColumn:(int)column
{
ascore *highscore;
int i;
id newCell, cellString = [[MiscString alloc] init];
for (i = [self count] - 1; i >= 0; i--)
{
highscore = [self elementAt:i];
[cellString initFromFormat:"%-.25s Level %2d Score %d",
[highscore->playerName stringValue],
highscore->level, highscore->score];
[matrix addRow];
newCell = [matrix cellAt:[matrix cellCount] - 1:0];
[newCell setStringValue:[cellString stringValue]];
[newCell setLoaded:YES];
[newCell setLeaf:YES];
[newCell setEnabled:YES];
}
[cellString free];
return[self count];
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.