This is Controller.m in view mode; [Download] [Up]
// Kismet
// Copyright (C) 1994, Joseph W. Reiss, All Rights Reserved
// jreiss@magnus.acs.ohio-state.edu
/////////////////////////////////////////////////////////////////////////////
// You are free to modify this code as you wish for your own personal use.
// You may only REDISTRIBUTE the code unaltered, with this copyright notice
// and all documentation intact.
//
// If you make any significant changes to this program, please drop me a
// line and let me know!
#import <stdio.h>
#import <ctype.h>
#import "Controller.h"
#import "Die.h"
extern int scoreThis(id dice[5], int tag);
static char *rollStrs[] = {
"No Rolls Left",
"1 Roll Left",
"2 Rolls Left",
"3 Rolls Left"
};
@implementation Controller(ApplicationDelegate)
- appDidInit:sender
{
[kismetWindow makeKeyAndOrderFront:self];
usedX = [NXImage findImageNamed:"UsedX"];
dieView[0] = die1;
dieView[1] = die2;
dieView[2] = die3;
dieView[3] = die4;
dieView[4] = die5;
[self readHighScores];
[self newGame:self];
return self;
}
@end
@implementation Controller(HighScorePanelDelegate)
- windowWillClose:sender
{
id cell;
if ((sender == highScorePanel) &&
(cell = [highNames selectedCell]) != nil)
{
[cell setEditable:NO];
[cell setSelectable:NO];
[cell setBackgroundGray:NX_WHITE];
[NXApp stopModal];
}
return self;
}
@end
@implementation Controller
- newGame:sender
{
id cell;
int i;
for (i=0; i<5; i++)
[dieView[i] setValue:i+1];
for (i=0; i<6; i++)
{
cell = [basicSection findCellWithTag:i];
[cell setIconPosition:NX_TITLEONLY];
[cell setTitle:""];
[cell setBordered:YES];
scores[i] = -1;
}
[self updateBasicTotal];
for (i=6; i<NUMHANDS; i++)
{
cell = [kismetSection findCellWithTag:i];
[cell setIconPosition:NX_TITLEONLY];
[cell setTitle:""];
[cell setBordered:YES];
scores[i] = -1;
}
handsLeft = NUMHANDS;
lastHand = -1;
[self updateKismetTotal];
[self newHand];
return self;
}
- endGame
{
int i;
[self endHand];
lastHand = -1; // Can't undo the last hand
for (i=NUMSCORES-1;
i>=0 && basicScore+kismetScore > highScoreNums[i];
i--)
;
if (i<NUMSCORES-1) // User got a high score?
[self newHighScore:i+1];
return self;
}
- newHand
{
id cell;
int i;
for (i=0; i<5; i++)
{
[dieView[i] setState:0];
[dieView[i] setEnabled:NO];
}
scoredHand = YES;
rollsLeft = NUMROLLS;
for (i=0; i<NUMHANDS; i++)
{
if (scores[i] < 0)
{
cell = [i<6 ? basicSection : kismetSection findCellWithTag:i];
[cell setType:NX_MOMENTARYCHANGE];
}
}
[rollCount setStringValue:rollStrs[rollsLeft]];
[roller setEnabled:YES];
return self;
}
- rollDice:sender
{
id cell;
int i,j;
if (rollsLeft==0 || handsLeft==0)
return self;
for (j=0; j<4; j++)
{
for (i=0; i<5; i++)
if (![dieView[i] state])
[dieView[i] roll];
usleep(250);
}
if (scoredHand)
{
for (i=0; i<5; i++)
[dieView[i] setEnabled:YES];
for (i=0; i<NUMHANDS; i++)
{
if (scores[i] < 0)
{
cell = [i<6 ? basicSection : kismetSection findCellWithTag:i];
[cell setType:NX_MOMENTARYPUSH];
}
}
}
scoredHand = NO;
lastHand = -1;
rollsLeft--;
[rollCount setStringValue:rollStrs[rollsLeft]];
if (rollsLeft == 0)
[self endHand];
return self;
}
- scoreHand:sender
{
int i,curHand=[[sender selectedCell] tag];
if (scoredHand || // Already scored this hand?
scores[curHand] >= 0) // Already used this entry?
return self; // Don't do it again
lastHand = curHand;
lastRolls = rollsLeft;
for (i=0; i<5; i++)
lastSel[i] = [dieView[i] state];
scores[lastHand] = scoreThis(dieView, lastHand);
if (scores[lastHand] == 0)
[[[sender selectedCell] setIconPosition:NX_ICONONLY] setImage:usedX];
else
{
char scoreStr[4];
sprintf(scoreStr,"%d",scores[lastHand]);
[[[sender selectedCell] setIconPosition:NX_TITLEONLY]
setTitle:scoreStr];
}
[[[sender selectedCell] setBordered:NO] setType:NX_MOMENTARYCHANGE];
if ([sender tag]) // Kismet section
[self updateKismetTotal];
else
[self updateBasicTotal];
if (--handsLeft) // Haven't filled all the hands
[self newHand];
else // We've done it all
[self endGame];
return self;
}
- endHand
{
int i;
for (i=0; i<5; i++)
{
[dieView[i] setState:1];
[dieView[i] setEnabled:NO];
}
[roller setEnabled:NO];
return self;
}
- undo:sender
{
id cell;
int i;
if (lastHand >= 0)
{
cell = [lastHand < 6 ? basicSection : kismetSection
findCellWithTag:lastHand];
if (scores[lastHand] >= 0)
{
[cell setIconPosition:NX_TITLEONLY];
[cell setTitle:""];
[cell setBordered:YES];
[cell setType:NX_MOMENTARYPUSH];
scores[lastHand] = -1;
for (i=0; i<5; i++)
{
[dieView[i] setState:lastSel[i]];
[dieView[i] setEnabled:lastRolls>0];
}
handsLeft++;
scoredHand = NO;
rollsLeft = lastRolls;
[rollCount setStringValue:rollStrs[rollsLeft]];
[roller setEnabled:rollsLeft>0];
}
else
{
scores[lastHand] = scoreThis(dieView, lastHand);
if (scores[lastHand] == 0)
[[cell setIconPosition:NX_ICONONLY] setImage:usedX];
else
{
char scoreStr[4];
sprintf(scoreStr,"%d",scores[lastHand]);
[[cell setIconPosition:NX_TITLEONLY] setTitle:scoreStr];
}
[[cell setBordered:NO] setType:NX_MOMENTARYCHANGE];
if (--handsLeft) // Haven't filled all the hands
[self newHand];
else
[self endGame];
}
if (lastHand < 6)
[self updateBasicTotal];
else
[self updateKismetTotal];
}
return self;
}
- newHighScore:(int)rank
{
int i,j;
if (highScorePanel == nil)
{
if (![NXApp loadNibSection:"HighScores.nib"
owner: self
withNames: NO])
return nil;
}
for (i=0; i<NUMSCORES; i++)
{
if (i==rank)
{
[[[highNames cellAt:i:0]
setStringValue:NXUserName()]
setBackgroundGray:NX_LTGRAY];
[[highNames cellAt:i:0] setEditable:YES];
[highNames selectTextAt:i:0];
[[highScores cellAt:i:0] setIntValue:basicScore+kismetScore];
}
else
{
j = i>rank ? i-1 : i;
if (highScoreNums[j] > 0)
{
[[highNames cellAt:i:0] setStringValue:highScoreNames[j]];
[[highScores cellAt:i:0] setIntValue:highScoreNums[j]];
}
else
{
[[highNames cellAt:i:0] setStringValue:""];
[[highScores cellAt:i:0] setStringValue:""];
}
}
}
[NXApp runModalFor:[highScorePanel makeKeyAndOrderFront: nil]];
[self writeHighScores];
return self;
}
- newHighName:sender
{
int rank,i;
id cell;
cell = [sender selectedCell];
rank = [cell tag];
for (i=NUMSCORES-1; i>rank; i--)
{
strcpy(highScoreNames[i],highScoreNames[i-1]);
highScoreNums[i] = highScoreNums[i-1];
}
strcpy(highScoreNames[rank], [cell stringValue]);
highScoreNums[rank] = basicScore+kismetScore;
[cell setEditable:NO];
[cell setSelectable:NO];
[cell setBackgroundGray:NX_WHITE];
[NXApp stopModal];
return self;
}
- showInfoPanel:sender
{
if (infoPanel == nil)
{
if (![NXApp loadNibSection:"Info.nib"
owner: self
withNames: NO])
return nil;
}
[infoPanel makeKeyAndOrderFront: nil];
return self;
}
- showRefCardPanel:sender
{
if (refCardPanel == nil)
{
if (![NXApp loadNibSection:"RefCard.nib"
owner: self
withNames: NO])
return nil;
}
[refCardPanel makeKeyAndOrderFront: nil];
return self;
}
- showScoresPanel:sender
{
int i;
if (highScorePanel == nil)
{
if (![NXApp loadNibSection:"HighScores.nib"
owner: self
withNames: NO])
return nil;
}
for (i=0; i<NUMSCORES; i++)
{
if (highScoreNums[i] > 0)
{
[[highNames cellAt:i:0] setStringValue:highScoreNames[i]];
[[highScores cellAt:i:0] setIntValue:highScoreNums[i]];
}
else
{
[[highNames cellAt:i:0] setStringValue:""];
[[highScores cellAt:i:0] setStringValue:""];
}
}
[highScorePanel makeKeyAndOrderFront: nil];
return self;
}
- updateBasicTotal
{
int extra=0,i;
basicScore = 0;
for (i=0; i<6; i++)
if (scores[i] >= 0)
basicScore += scores[i];
[basicTotal setIntValue:basicScore];
extra=0;
if (basicScore >= 78)
extra = 75;
else if (basicScore >= 71)
extra = 55;
else if (basicScore >= 63)
extra = 35;
[bonus setIntValue:extra];
basicScore += extra;
[basicSectionTotal setIntValue:basicScore];
[basicSectionTotal2 setIntValue:basicScore];
[self updateGrandTotal];
return self;
}
- updateGrandTotal
{
[grandTotal setIntValue:basicScore+kismetScore];
return self;
}
- updateKismetTotal
{
int i;
kismetScore = 0;
for (i=6; i<NUMHANDS; i++)
if (scores[i] >= 0)
kismetScore += scores[i];
[kismetSectionTotal setIntValue:kismetScore];
[self updateGrandTotal];
return self;
}
- readHighScores
{
char path[MAXPATHLEN];
FILE *hiFile;
int i;
sprintf(path, "%s/%s", NXHomeDirectory(), HIGHSCOREFILE);
if ((hiFile = fopen(path, "r")) == NULL)
{
for (i=0; i<NUMSCORES; i++)
{
highScoreNames[i][0] = '\0';
highScoreNums[i] = 0;
}
}
else
{
for (i=0; i<NUMSCORES; i++)
{
fscanf(hiFile, "%d", &highScoreNums[i]);
while (isspace(highScoreNames[i][0] = fgetc(hiFile)))
;
fgets(highScoreNames[i]+1, 80, hiFile);
highScoreNames[i][strlen(highScoreNames[i])-1]='\0';
}
fclose(hiFile);
}
return self;
}
- writeHighScores
{
char path[MAXPATHLEN];
FILE *hiFile;
int i;
sprintf(path, "%s/%s", NXHomeDirectory(), HIGHSCOREFILE);
if ((hiFile = fopen(path, "w")) != NULL)
{
for (i=0; i<NUMSCORES; i++)
{
fprintf(hiFile, "%d %s\n",
highScoreNums[i], highScoreNames[i]);
}
fclose(hiFile);
}
return self;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.