This is HighScoreSlot.m in view mode; [Download] [Up]
#import <remote/NXProxy.h> #import <gamekit/gamekit.h> #import <daymisckit/daymisckit.h> #import <appkit/appkit.h> #import <objc/typedstream.h> // highscore tables @implementation HighScoreSlot + initialize { if (self == [HighScoreSlot class]) { [HighScoreSlot setVersion:GKHighScoreSlot_VERSION]; } return self; } - init // implement to generate an empty slot for server { return [self initName:"Nobody" score:0]; } - initName:(const char *)initName score:(int)initScore { // for games that don't use the level variable return [self initName:initName score:initScore endLevel:0]; } - initName:(const char *)initName score:(int)initScore endLevel:(int)initLevel { // designated initializer [super init]; playerName = [[DAYString allocFromZone:[self zone]] initString:initName]; endLevel = initLevel; finalScore = initScore; // make a bunch of empty objects. startTime = [[DAYTime allocFromZone:[self zone]] init]; endTime = [[DAYTime allocFromZone:[self zone]] init]; elapsedTime = [[DAYStopwatch allocFromZone:[self zone]] init]; userName = [[DAYString allocFromZone:[self zone]] init]; machineName = [[DAYString allocFromZone:[self zone]] init]; return self; } - dumpToLog:aLogFile // used by server when logging { // aLogFile must be a kind of the DAYLogFile class char *string = (char *)malloc(256); id tempString = [[DAYString alloc] init]; sprintf(string, " finalScore = %d startLevel = %d endLevel = %d\n startTime = \"%s\" endTime = \"%s\" elapsedTime = \"%s\"\n playerName = \"%s\" userName = \"%s\" machineName = \"%s\"\n", finalScore, startLevel, endLevel, [startTime stringValue], [endTime stringValue], [elapsedTime stringValue], [playerName stringValue], [userName stringValue], [machineName stringValue]); [tempString setStringValue:string]; [aLogFile addLineToLogFile:tempString]; free(string); [tempString free]; return self; } - free { // free all the sub-objects. [startTime free]; [endTime free]; [elapsedTime free]; [playerName free]; [userName free]; [machineName free]; return [super free]; } // The following methods access value of the slot. - (const char *)playerName { return [playerName stringValue]; } - (const char *)userName { return [userName stringValue]; } - (const char *)machineName { return [machineName stringValue]; } - (int)finalScore { return finalScore; } - (int)startLevel { return startLevel; } - (int)endLevel { return endLevel; } - startTime { return startTime; } - endTime { return endTime; } - elapsedTime { return elapsedTime; } // The following methods change the values of the slot. - setFinalScore:(int)t { finalScore = t; return self; } - setStartLevel:(int)t { startLevel = t; return self; } - setEndLevel:(int)t { endLevel = t; return self; } - setPlayerName:(const char *)t { [playerName setStringValue:t]; return self; } - setUserName:(const char *)t { [userName setStringValue:t]; return self; } - setMachineName:(const char *)t { [machineName setStringValue:t]; return self; } - setStartTime:aTime { if (startTime) [startTime free]; startTime = aTime; return self; } - setEndTime:aTime { if (endTime) [endTime free]; endTime = aTime; return self; } - setElapsedTime:aTime { if (elapsedTime) [elapsedTime free]; elapsedTime = aTime; return self; } - (BOOL)isAbove:aSlot { // override this if you want a custom ordering of slots if (finalScore > [aSlot finalScore]) return YES; return NO; } // for archiving to/from a file - read:(NXTypedStream *)stream { [super read:stream]; if (NXTypedStreamClassVersion(stream, "HighScoreSlot") == [HighScoreSlot version]) { // current version read code NXReadTypes(stream, "iii", &finalScore, &startLevel, &endLevel); startTime = NXReadObject(stream); endTime = NXReadObject(stream); elapsedTime = NXReadObject(stream); playerName = NXReadObject(stream); userName = NXReadObject(stream); machineName = NXReadObject(stream); } else { // read old version int pos; // a throwaway char *tmpStr = malloc(1024); // should be plenty big [self init]; // clear all ivars before reading in new NXReadTypes(stream, "iii*", &pos, &endLevel, &finalScore, &tmpStr); [playerName setStringValue:tmpStr]; free(tmpStr); } return self; } - write:(NXTypedStream *)stream { [super write:stream]; NXWriteTypes(stream, "iii", &finalScore, &startLevel, &endLevel); NXWriteObject(stream, startTime); NXWriteObject(stream, endTime); NXWriteObject(stream, elapsedTime); NXWriteObject(stream, playerName); NXWriteObject(stream, userName); NXWriteObject(stream, machineName); return self; } // NXTransport protocol implementation: - encodeUsing:(id <NXEncoding>)portal { [portal encodeObjectBycopy:startTime]; [portal encodeObjectBycopy:endTime]; [portal encodeObjectBycopy:elapsedTime]; [portal encodeObjectBycopy:playerName]; [portal encodeObjectBycopy:userName]; [portal encodeObjectBycopy:machineName]; [portal encodeData:&finalScore ofType:"i"]; [portal encodeData:&startLevel ofType:"i"]; [portal encodeData:&endLevel ofType:"i"]; return self; } - decodeUsing:(id <NXDecoding>)portal { startTime = [portal decodeObject]; endTime = [portal decodeObject]; elapsedTime = [portal decodeObject]; playerName = [portal decodeObject]; userName = [portal decodeObject]; machineName = [portal decodeObject]; [portal decodeData:&finalScore ofType:"i"]; [portal decodeData:&startLevel ofType:"i"]; [portal decodeData:&endLevel ofType:"i"]; return self; } - encodeRemotelyFor:(NXConnection *)connection freeAfterEncoding:(BOOL *)flagp isBycopy:(BOOL)isByCopy { if (isByCopy) { *flagp = NO; // object will copy. return self; //encode object (copy it) } *flagp = NO; // object will copy. // super will encode the proxy otherwise return [super encodeRemotelyFor:connection freeAfterEncoding:flagp isBycopy:isByCopy]; } - copy { // this is to make sure that the id instance vars are actually _copied_ id newObj = [[[self class] alloc] init]; [newObj setPlayerName:[self playerName]]; [newObj setUserName:[self userName]]; [newObj setMachineName:[self machineName]]; [newObj setStartTime:[[self startTime] copy]]; [newObj setEndTime:[[self endTime] copy]]; [newObj setElapsedTime:[[self elapsedTime] copy]]; [newObj setFinalScore:[self finalScore]]; [newObj setStartLevel:[self startLevel]]; [newObj setEndLevel:[self endLevel]]; return newObj; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.