Pararena2/Sources/PlayUtils.c

1 line
28 KiB
C
Executable File

/*============================================================*/
/*============================================================*/
/*== ==*/
/*== Play Utility Routines ==*/
/*== ==*/
/*============================================================*/
/*============================================================*/
/*======================================================== Includes */
#include "AppleTalkDDP.h"
#include "Globals.h"
#include "UnivUtilities.h"
#include "PlayUtils.h"
#include "Render.h"
#include "Ball.h"
#include "Menu.h"
#include "SoundUtils.h"
#include "CommonPerson.h"
#include "NetOpponent.h"
#include "TeamSetUp.h"
#include "MainWindow.h"
#include "IdleRoutines.h"
#include "Replay.h"
#include "DissBits.h"
/*======================================================== Functions */
/*======================================================== DoEndGame */
void DoEndGame (void)
{
pausing = FALSE;
primaryMode = kIdleMode;
SetMBarToIdle();
}
/*======================================================== UpdateWorldRecords */
void UpdateWorldRecords (void)
{
if (playerScore > mostPoints)
{
mostPoints = playerScore;
GetDateTime((unsigned long *)&mostPointsDate);
PasStringCopy((StringPtr)theNames[whichHumanNumber - 1], (StringPtr)mostPointsName);
}
if ((opponentScore > mostPoints) &&
(theOpponent.persona >= kSimpleGeorge) &&
(theOpponent.persona <= kMissTeak))
{
mostPoints = opponentScore;
GetDateTime((unsigned long *)&mostPointsDate);
GetIndString((StringPtr)mostPointsName, rNamesStringID, theOpponent.persona + 1);
}
if (playerTotalFouls > mostFouls)
{
mostFouls = playerTotalFouls;
GetDateTime((unsigned long *)&mostFoulsDate);
PasStringCopy((StringPtr)theNames[whichHumanNumber - 1], (StringPtr)mostFoulsName);
}
if ((opponentTotalFouls > mostFouls) &&
(theOpponent.persona >= kSimpleGeorge) &&
(theOpponent.persona <= kMissTeak))
{
mostFouls = opponentTotalFouls;
GetDateTime((unsigned long *)&mostFoulsDate);
GetIndString((StringPtr)mostFoulsName, rNamesStringID, theOpponent.persona + 1);
}
if (playerTotalCrits > mostCrits)
{
mostCrits = playerTotalCrits;
GetDateTime((unsigned long *)&mostCritsDate);
PasStringCopy((StringPtr)theNames[whichHumanNumber - 1], (StringPtr)mostCritsName);
}
if ((opponentTotalCrits > mostCrits) &&
(theOpponent.persona >= kSimpleGeorge) &&
(theOpponent.persona <= kMissTeak))
{
mostCrits = opponentTotalCrits;
GetDateTime((unsigned long *)&mostCritsDate);
GetIndString((StringPtr)mostCritsName, rNamesStringID, theOpponent.persona + 1);
}
}
/*======================================================== UpdateStats */
void UpdateStats (void)
{
short statusFlag, didWon, skunked;
if (theStats[whichHumanNumber - 1].played < kMaxShort)
theStats[whichHumanNumber - 1].played++; /* increment # of games played */
if ((theStats[whichHumanNumber - 1].goals + playerTotalGoals) < kMaxShort)
theStats[whichHumanNumber - 1].goals += playerTotalGoals;
else
theStats[whichHumanNumber - 1].goals = kMaxShort;
if ((theStats[whichHumanNumber - 1].oppGoals + opponentTotalGoals) < kMaxShort)
theStats[whichHumanNumber - 1].oppGoals += opponentTotalGoals;
else
theStats[whichHumanNumber - 1].oppGoals = kMaxShort;
if ((theStats[whichHumanNumber - 1].fouls + playerTotalFouls) < kMaxShort)
theStats[whichHumanNumber - 1].fouls += playerTotalFouls;
else
theStats[whichHumanNumber - 1].fouls = kMaxShort;
if ((theStats[whichHumanNumber - 1].oppFouls + opponentTotalFouls) < kMaxShort)
theStats[whichHumanNumber - 1].oppFouls += opponentTotalFouls;
else
theStats[whichHumanNumber - 1].oppFouls = kMaxShort;
if ((theStats[whichHumanNumber - 1].criticals + playerTotalCrits) < kMaxShort)
theStats[whichHumanNumber - 1].criticals += playerTotalCrits;
else
theStats[whichHumanNumber - 1].criticals = kMaxShort;
if ((theStats[whichHumanNumber - 1].oppCriticals + opponentTotalCrits) < kMaxShort)
theStats[whichHumanNumber - 1].oppCriticals += opponentTotalCrits;
else
theStats[whichHumanNumber - 1].oppCriticals = kMaxShort;
if ((playerWonTheGame == kPlayerWon) && (theStats[whichHumanNumber - 1].won <
kMaxShort))
theStats[whichHumanNumber - 1].won++; /* increment # of games won */
if (whichGame == kTournament)
{
if (playerWonTheGame == kPlayerWon)
{
if (opponentTotalGoals == 0)
{
statusFlag = kSkunkedState;
}
else
{
statusFlag = kWonState;
}
}
else
{
statusFlag = kLostState;
}
switch (theOpponent.persona)
{
case kSimpleGeorge:
theStats[whichHumanNumber - 1].georgeState = statusFlag;
break;
case kMadMara:
theStats[whichHumanNumber - 1].maraState = statusFlag;
break;
case kHeavyOtto:
theStats[whichHumanNumber - 1].ottoState = statusFlag;
break;
case kCleverClaire:
theStats[whichHumanNumber - 1].claireState = statusFlag;
break;
case kMisterEaze:
theStats[whichHumanNumber - 1].eazeState = statusFlag;
break;
case kMissTeak:
theStats[whichHumanNumber - 1].teakState = statusFlag;
break;
default:
break;
}
if ((theStats[whichHumanNumber - 1].georgeState != kUnplayedState) &&
(theStats[whichHumanNumber - 1].maraState != kUnplayedState) &&
(theStats[whichHumanNumber - 1].ottoState != kUnplayedState) &&
(theStats[whichHumanNumber - 1].claireState != kUnplayedState) &&
(theStats[whichHumanNumber - 1].eazeState != kUnplayedState) &&
(theStats[whichHumanNumber - 1].teakState != kUnplayedState))
{
didWon = 0;
if (theStats[whichHumanNumber - 1].georgeState >= kWonState)
didWon++;
if (theStats[whichHumanNumber - 1].maraState >= kWonState)
didWon++;
if (theStats[whichHumanNumber - 1].ottoState >= kWonState)
didWon++;
if (theStats[whichHumanNumber - 1].claireState >= kWonState)
didWon++;
if (theStats[whichHumanNumber - 1].eazeState >= kWonState)
didWon++;
if (theStats[whichHumanNumber - 1].teakState >= kWonState)
didWon++;
skunked = 0;
if (theStats[whichHumanNumber - 1].georgeState == kSkunkedState)
skunked++;
if (theStats[whichHumanNumber - 1].maraState == kSkunkedState)
skunked++;
if (theStats[whichHumanNumber - 1].ottoState == kSkunkedState)
skunked++;
if (theStats[whichHumanNumber - 1].claireState == kSkunkedState)
skunked++;
if (theStats[whichHumanNumber - 1].eazeState == kSkunkedState)
skunked++;
if (theStats[whichHumanNumber - 1].teakState == kSkunkedState)
skunked++;
switch (didWon)
{
case 3:
if (theStats[whichHumanNumber - 1].copperTitles < kMaxShort)
theStats[whichHumanNumber - 1].copperTitles++;
break;
case 4:
if (theStats[whichHumanNumber - 1].bronzeTitles < kMaxShort)
theStats[whichHumanNumber - 1].bronzeTitles++;
break;
case 5:
if (theStats[whichHumanNumber - 1].silverTitles < kMaxShort)
theStats[whichHumanNumber - 1].silverTitles++;
break;
case 6:
if (skunked == 6)
{
if (theStats[whichHumanNumber - 1].platinumTitles < kMaxShort)
theStats[whichHumanNumber - 1].platinumTitles++;
}
else
{
if (theStats[whichHumanNumber - 1].goldTitles < kMaxShort)
theStats[whichHumanNumber - 1].goldTitles++;
}
break;
default:
break;
}
if (theStats[whichHumanNumber - 1].goldTitles > mostTitles)
{
mostTitles = theStats[whichHumanNumber - 1].goldTitles;
GetDateTime((unsigned long *)&mostTitlesDate);
PasStringCopy((StringPtr)theNames[whichHumanNumber - 1],
(StringPtr)mostTitlesName);
}
theStats[whichHumanNumber - 1].georgeState = kUnplayedState;
theStats[whichHumanNumber - 1].maraState = kUnplayedState;
theStats[whichHumanNumber - 1].ottoState = kUnplayedState;
theStats[whichHumanNumber - 1].claireState = kUnplayedState;
theStats[whichHumanNumber - 1].eazeState = kUnplayedState;
theStats[whichHumanNumber - 1].teakState = kUnplayedState;
}
}
}
/*======================================================== InitiateGameOver */
void InitiateGameOver (void)
{
if (gameIsOver)
return;
PlaySoundSMS(kBellSound);
if (playerScore > opponentScore)
playerWonTheGame = kPlayerWon;
else if (playerScore < opponentScore)
playerWonTheGame = kOpponentWon;
else
playerWonTheGame = kNoOneWon;
if (playerWonTheGame == kPlayerWon)
{
StartPersonBeamOut(&theOpponent);
lengthOfApplause = kCrowdClosingHoopla;
StartApplauseSound();
}
else if (playerWonTheGame == kOpponentWon)
{
StartPersonBeamOut(&thePlayer);
lengthOfMob = kCrowdClosingHoopla;
StartMobSound();
}
else
{
StartPersonBeamOut(&thePlayer);
StartPersonBeamOut(&theOpponent);
lengthOfMob = kCrowdClosingHoopla;
StartMobSound();
}
if ((theOpponent.persona == kMissTeak) && (thePlayer.persona == kHumanPlayer))
teaksThreshholds[whichHumanNumber - 1] = theOpponent.teaksThresh;
if ((whichGame >= kStandardGame) && (thePlayer.persona == kHumanPlayer))
{
UpdateStats();
UpdateWorldRecords();
}
incidentalQueue.number = kGameSound;
incidentalQueue.when = 180;
incidentalQueue.priority = 100;
gameIsOver = TRUE;
}
/*======================================================== DoSlaveGameOver */
void DoSlaveGameOver (void)
{
if ((gameIsOver) || (imTheMaster))
return;
gameIsOver = TRUE;
if ((whichGame >= kStandardGame) && (thePlayer.persona == kHumanPlayer))
{
UpdateStats();
UpdateWorldRecords();
}
}
/*======================================================== DrawNames */
void DrawNames (void)
{
#define rShortNameStrID 1002
#define kNoOnesName 7
Str255 theName1, theName2, tempStr;
Rect name1Rect, name2Rect;
GrafPtr wasPort;
short i, charsToDisplay, offset;
GetPort(&wasPort);
SetPort((GrafPtr)mainWndo);
switch (displayMode)
{
case kDisplay9Inch:
SetRect(&name1Rect, 0, 0, 64, 6);
SetRect(&name2Rect, 0, 0, 64, 6);
OffsetRect(&name1Rect, 25, 301);
OffsetRect(&name2Rect, 425, 301);
TextFont(202);
TextSize(7);
break;
case kDisplay12Inch:
SetRect(&name1Rect, 0, 0, 69, 9);
SetRect(&name2Rect, 0, 0, 69, 9);
OffsetRect(&name1Rect, 25, 319);
OffsetRect(&name2Rect, 425, 319);
TextFont(systemFont);
TextSize(12);
break;
case kDisplay13Inch:
SetRect(&name1Rect, 0, 0, 69, 9);
SetRect(&name2Rect, 0, 0, 69, 9);
OffsetRect(&name1Rect, 25, 426);
OffsetRect(&name2Rect, 553, 426);
TextFont(systemFont);
TextSize(12);
break;
default:
break;
}
if (leftGoalIsPlayers)
{
if (thePlayer.persona == kHumanPlayer)
PasStringCopy((StringPtr)theNames[whichHumanNumber - 1], (StringPtr)theName1);
else
{
if (whichGame >= kStandardGame)
GetIndString(theName1, rShortNameStrID, thePlayer.persona);
else
GetIndString(theName1, rShortNameStrID, kNoOnesName);
}
}
else
{
if (theOpponent.persona == kNetHuman)
{
PasStringCopy((StringPtr)opponentsName, (StringPtr)theName1);
}
else
{
if (whichGame >= kStandardGame)
GetIndString(theName1, rShortNameStrID, theOpponent.persona);
else
GetIndString(theName1, rShortNameStrID, kNoOnesName);
}
}
UprString(theName1, TRUE);
charsToDisplay = theName1[0];
for (i = 0; i < theName1[0]; i++)
{
PasStringCopyNum((StringPtr)theName1, (StringPtr)tempStr, i + 1);
if ((StringWidth(tempStr)) < (name1Rect.right - name1Rect.left))
charsToDisplay = i + 1;
}
theName1[0] = charsToDisplay;
if (leftGoalIsPlayers)
{
if (theOpponent.persona == kNetHuman)
{
PasStringCopy((StringPtr)opponentsName, (StringPtr)theName2);
}
else
{
if (whichGame >= kStandardGame)
GetIndString(theName2, rShortNameStrID, theOpponent.persona);
else
GetIndString(theName2, rShortNameStrID, kNoOnesName);
}
}
else
{
if (thePlayer.persona == kHumanPlayer)
PasStringCopy((StringPtr)theNames[whichHumanNumber - 1], (StringPtr)theName2);
else
{
if (whichGame >= kStandardGame)
GetIndString(theName2, rShortNameStrID, thePlayer.persona);
else
GetIndString(theName2, rShortNameStrID, kNoOnesName);
}
}
UprString(theName2, TRUE);
charsToDisplay = theName2[0];
for (i = 0; i < theName2[0]; i++)
{
PasStringCopyNum((StringPtr)theName2, (StringPtr)tempStr, i + 1);
if ((StringWidth(tempStr)) < (name2Rect.right - name2Rect.left))
charsToDisplay = i + 1;
}
theName2[0] = charsToDisplay;
FillRect(&name1Rect, black);
FillRect(&name2Rect, black);
TextMode(srcXor);
offset = ((name1Rect.right - name1Rect.left) - StringWidth(theName1)) / 2;
MoveTo(name1Rect.left + offset, name1Rect.bottom);
DrawString(theName1);
offset = ((name2Rect.right - name2Rect.left) - StringWidth(theName2)) / 2;
MoveTo(name2Rect.left + offset, name2Rect.bottom);
DrawString(theName2);
if (isColor)
{
CopyBits(&(((GrafPtr)mainWndo)->portBits), &((GrafPtr)offCWorkPtr)->portBits,
&name1Rect, &name1Rect, srcCopy, nil);
CopyBits(&(((GrafPtr)mainWndo)->portBits), &((GrafPtr)offCBackPtr)->portBits,
&name1Rect, &name1Rect, srcCopy, nil);
CopyBits(&(((GrafPtr)mainWndo)->portBits), &((GrafPtr)offCWorkPtr)->portBits,
&name2Rect, &name2Rect, srcCopy, nil);
CopyBits(&(((GrafPtr)mainWndo)->portBits), &((GrafPtr)offCBackPtr)->portBits,
&name2Rect, &name2Rect, srcCopy, nil);
}
else
{
CopyBits(&(mainWndo->portBits), &offWorkBits, &name1Rect, &name1Rect, srcCopy,
nil);
CopyBits(&(mainWndo->portBits), &offBackBits, &name1Rect, &name1Rect, srcCopy,
nil);
CopyBits(&(mainWndo->portBits), &offWorkBits, &name2Rect, &name2Rect, srcCopy,
nil);
CopyBits(&(mainWndo->portBits), &offBackBits, &name2Rect, &name2Rect, srcCopy,
nil);
}
SetPort((GrafPtr)wasPort);
}
/*======================================================== UpdatePlayerScore */
void UpdatePlayerScore (void)
{
short isOnes, isTens, isHundreds, selector;
playerJustScored = TRUE;
if (leftGoalIsPlayers)
selector = kLeftScoreSelector;
else
selector = kRightScoreSelector;
isHundreds = playerScore / 100;
if (isHundreds == 0)
DisplayScoreDigit(kHundredsPlace, kBlankCharacter, selector);
else
DisplayScoreDigit(kHundredsPlace, isHundreds, selector);
isTens = (playerScore - isHundreds * 100) / 10;
if ((isTens == 0) && (isHundreds == 0))
DisplayScoreDigit(kTensPlace, kBlankCharacter, selector);
else
DisplayScoreDigit(kTensPlace, isTens, selector);
isOnes = playerScore % 10;
DisplayScoreDigit(kOnesPlace, isOnes, selector);
}
/*======================================================== UpdateOpponentScore */
void UpdateOpponentScore (void)
{
short isOnes, isTens, isHundreds, selector;
playerJustScored = FALSE;
if (leftGoalIsPlayers)
selector = kRightScoreSelector;
else
selector = kLeftScoreSelector;
isHundreds = opponentScore / 100;
if (isHundreds == 0)
DisplayScoreDigit(kHundredsPlace, kBlankCharacter, selector);
else
DisplayScoreDigit(kHundredsPlace, isHundreds, selector);
isTens = (opponentScore - isHundreds * 100) / 10;
if ((isTens == 0) && (isHundreds == 0))
DisplayScoreDigit(kTensPlace, kBlankCharacter, selector);
else
DisplayScoreDigit(kTensPlace, isTens, selector);
isOnes = opponentScore % 10;
DisplayScoreDigit(kOnesPlace, isOnes, selector);
}
/*======================================================== DoPlayerScores */
void DoPlayerScores (void)
{
lengthOfApplause = 120;
StartApplauseSound();
PlaySoundSMS(kScoreSound);
playerScore++;
playerTotalGoals++;
if (thePlayer.whichGoal == kLeftGoal)
leftScoredLast = TRUE;
else
leftScoredLast = FALSE;
if (whichGame == kStandardGame)
{
if (playerScore - opponentScore == 4)
{
BeginGamePointSound();
}
else if ((playerScore >= 10) && (playerScore - opponentScore >= 1))
{
BeginGamePointSound();
}
if (playerScore == opponentScore)
{
BeginAllTiedSound();
}
}
else if (whichGame == kTournament)
{
if (playerScore - opponentScore == 6)
{
BeginGamePointSound();
}
else if ((playerScore >= 16) && (playerScore - opponentScore >= 2))
{
BeginGamePointSound();
}
if (playerScore == opponentScore)
{
BeginAllTiedSound();
}
}
UpdatePlayerScore();
DisplayPlayerFouls(playerFouls);
if (thePlayer.persona == kMissTeak)
{
if (thePlayer.strategy == kRunDiagonal)
thePlayer.teaksThresh++;
else if (thePlayer.strategy == kRunCircle)
thePlayer.teaksThresh--;
if (thePlayer.teaksThresh < 4)
thePlayer.teaksThresh = 4;
if (thePlayer.teaksThresh > 95)
thePlayer.teaksThresh = 95;
}
if ((!netGameInSession) && (replayGoals))
replayFlag = -50;
switch (whichGame)
{
case kStandardGame:
if (playerScore >= 11)
{
if (playerScore >= (opponentScore + 2))
{
InitiateGameOver();
}
}
else
{
if (playerScore >= (opponentScore + 5))
{
InitiateGameOver();
}
}
break;
case kTournament:
if (playerScore >= 17)
{
if (playerScore >= (opponentScore + 3))
{
InitiateGameOver();
}
}
else
{
if (playerScore >= (opponentScore + 7))
{
InitiateGameOver();
}
}
break;
default:
break;
}
}
/*======================================================== DoOpponentScores */
void DoOpponentScores (void)
{
lengthOfMob = 120;
StartMobSound();
PlaySoundSMS(kScoreSound);
opponentScore++;
opponentTotalGoals++;
if (theOpponent.whichGoal == kLeftGoal)
leftScoredLast = TRUE;
else
leftScoredLast = FALSE;
if (whichGame == kStandardGame)
{
if (opponentScore - playerScore == 4)
{
BeginGamePointSound();
}
else if ((opponentScore >= 10) && (opponentScore - playerScore >= 1))
{
BeginGamePointSound();
}
if (playerScore == opponentScore)
{
BeginAllTiedSound();
}
}
else if (whichGame == kTournament)
{
if (opponentScore - playerScore == 6)
{
BeginGamePointSound();
}
else if ((opponentScore >= 16) && (opponentScore - playerScore >= 2))
{
BeginGamePointSound();
}
if (playerScore == opponentScore)
{
BeginAllTiedSound();
}
}
UpdateOpponentScore();
DisplayOpponentFouls(opponentFouls);
if (theOpponent.persona == kMissTeak)
{
if (theOpponent.strategy == kRunDiagonal)
theOpponent.teaksThresh++;
else if (theOpponent.strategy == kRunCircle)
theOpponent.teaksThresh--;
if (theOpponent.teaksThresh < 4)
theOpponent.teaksThresh = 4;
if (theOpponent.teaksThresh > 95)
theOpponent.teaksThresh = 95;
}
if ((!netGameInSession) && (replayGoals))
replayFlag = -50;
switch (whichGame)
{
case kStandardGame:
if (opponentScore >= 11)
{
if (opponentScore >= (playerScore + 2))
{
InitiateGameOver();
}
}
else
{
if (opponentScore >= (playerScore + 5))
{
InitiateGameOver();
}
}
break;
case kTournament:
if (opponentScore >= 17)
{
if (opponentScore >= (playerScore + 3))
{
InitiateGameOver();
}
}
else
{
if (opponentScore >= (playerScore + 7))
{
InitiateGameOver();
}
}
break;
default:
break;
}
}
/*======================================================== HandlePlayerFoul */
void HandlePlayerFoul (void)
{
lengthOfMob = 90;
StartMobSound();
if ((whichGame == kPracticeBoardin) || (whichGame == kPracticeScoring))
PlaySoundSMS(kFoulSound);
else
QueueUpIncidental(kFoulSound, 6, 100);
playerFouls++;
playerTotalFouls++;
if (playerFouls == kCriticalFoul)
{
playerTotalCrits++;
playerFouls = 0;
DoOpponentScores();
}
DisplayPlayerFouls(playerFouls);
if ((!netGameInSession) && (replayFouls))
replayFlag = -90;
}
/*======================================================== HandleOpponentFoul */
void HandleOpponentFoul (void)
{
lengthOfApplause = 90;
StartApplauseSound();
QueueUpIncidental(kFoulSound, 6, 100);
opponentFouls++;
opponentTotalFouls++;
if (opponentFouls == kCriticalFoul)
{
opponentTotalCrits++;
opponentFouls = 0;
DoPlayerScores();
}
DisplayOpponentFouls(opponentFouls);
if ((!netGameInSession) && (replayFouls))
replayFlag = -90;
}
/*======================================================== DisplayHoopla */
void DisplayHoopla (void)
{
#define kDisplayHooplaLoops 5
#define kDisplayHooplaDelay 2
long nextTime;
short i, miscShort1;
nextTime = Ticks + kDisplayHooplaDelay;
DisplayPlayerFouls(1);
for (i = 0; i < kDisplayHooplaLoops; i++) /* Blink --> 0:00 X00 000 */
{
miscShort1 = RandomInt(10);
DisplayScoreDigit(0, miscShort1, 0);
while (Ticks < nextTime)
{
}
nextTime = Ticks + kDisplayHooplaDelay;
}
DisplayScoreDigit(0, 10, 0);
DisplayPlayerFouls(2);
for (i = 0; i < kDisplayHooplaLoops; i++) /* Blink --> 0:00 0X0 000 */
{
miscShort1 = RandomInt(10);
DisplayScoreDigit(1, miscShort1, 0);
while (Ticks < nextTime)
{
}
nextTime = Ticks + kDisplayHooplaDelay;
}
DisplayScoreDigit(1, 10, 0);
DisplayPlayerFouls(0);
for (i = 0; i < kDisplayHooplaLoops; i++) /* Blink --> 0:00 00X 000 */
{
miscShort1 = RandomInt(10);
DisplayScoreDigit(2, miscShort1, 0);
while (Ticks < nextTime)
{
}
nextTime = Ticks + kDisplayHooplaDelay;
}
DisplayScoreDigit(2, 10, 0);
DisplayOpponentFouls(1);
for (i = 0; i < kDisplayHooplaLoops; i++) /* Blink --> 0:00 000 X00 */
{
miscShort1 = RandomInt(10);
DisplayScoreDigit(0, miscShort1, 1);
while (Ticks < nextTime)
{
}
nextTime = Ticks + kDisplayHooplaDelay;
}
DisplayScoreDigit(0, 10, 1);
DisplayOpponentFouls(2);
for (i = 0; i < kDisplayHooplaLoops; i++) /* Blink --> 0:00 000 0X0 */
{
miscShort1 = RandomInt(10);
DisplayScoreDigit(1, miscShort1, 1);
while (Ticks < nextTime)
{
}
nextTime = Ticks + kDisplayHooplaDelay;
}
DisplayScoreDigit(1, 10, 1);
DisplayOpponentFouls(0);
for (i = 0; i < kDisplayHooplaLoops; i++) /* Blink --> 0:00 000 00X */
{
miscShort1 = RandomInt(10);
DisplayScoreDigit(2, miscShort1, 1);
while (Ticks < nextTime)
{
}
nextTime = Ticks + kDisplayHooplaDelay;
}
DisplayScoreDigit(2, 10, 1);
}
/*======================================================== DoNetGameSetUp */
Boolean DoNetGameSetUp (void)
{
OSErr theErr;
Boolean itWorked;
masterSendSize = (short)sizeof(masterSendType);
slaveSendSize = (short)sizeof(slaveSendType);
spotPoints = 0;
spottedPoints = 0;
theErr = RegisterNameOnNet();
if (theErr != noErr)
{
MinorError(kMinorRegisterFailed);
return(FALSE);
}
itWorked = SelectNetOpponentAsynch();
if (!itWorked)
{
theErr = DeRegisterName();
return(FALSE);
}
itWorked = SpotPoints();
itWorked = WaitForSynch(3600);
if (!itWorked)
{
MinorError(kMinorSynchFailed);
theErr = DeRegisterName();
return(FALSE);
}
itWorked = ConfirmEnvironmentMatch();
if (!itWorked)
{
theErr = DeRegisterName();
return(FALSE);
}
theErr = DeRegisterName();
netGameInSession = TRUE;
madeThePickUp = FALSE;
loopDelay = 1;
frameCounter = 0;
newFrameCount = 0;
lastFrameCount = 0;
droppedPackets = 0;
sentPackets = 0;
wasLastSound = 0;
lastSoundPriority = 0;
return (TRUE);
}
/*======================================================== CantRepeatTournament */
Boolean CantRepeatTournament (void)
{
Str255 theText;
short sheWants;
GetIndString(theText, rMiscStrings, 23);
ParamText(theText, "\p", "\p", "\p");
CenterAlert(rCantRepeatAlertID);
sheWants = Alert(rCantRepeatAlertID, kNilPointer);
if (sheWants == 1)
return (TRUE);
else
return (FALSE);
}
/*======================================================== MustProLeagueTournament */
Boolean MustProLeagueTournament (void)
{
Str255 theText;
short sheWants;
GetIndString(theText, rMiscStrings, 24);
ParamText(theText, "\p", "\p", "\p");
CenterAlert(rCantRepeatAlertID);
sheWants = Alert(rCantRepeatAlertID, kNilPointer);
if (sheWants == 1)
return (TRUE);
else
return (FALSE);
}
/*======================================================== CanWePlay */
Boolean CanWePlay (void)
{
short statusFlag;
Boolean sheSaid;
if ((netOnly) && (theOpponent.persona != kNetHuman))
{
MinorError(kMinorNetworkOnlyRestrict);
primaryMode = kIdleMode;
return (FALSE);
}
if ((thePlayer.persona == kHumanPlayer) && (theOpponent.persona != kNetHuman) &&
(whichGame == kTournament))
{
switch (theOpponent.persona)
{
case kSimpleGeorge:
statusFlag = theStats[whichHumanNumber - 1].georgeState;
break;
case kMadMara:
statusFlag = theStats[whichHumanNumber - 1].maraState;
break;
case kHeavyOtto:
statusFlag = theStats[whichHumanNumber - 1].ottoState;
break;
case kCleverClaire:
statusFlag = theStats[whichHumanNumber - 1].claireState;
break;
case kMisterEaze:
statusFlag = theStats[whichHumanNumber - 1].eazeState;
break;
case kMissTeak:
statusFlag = theStats[whichHumanNumber - 1].teakState;
break;
default:
break;
}
if (statusFlag != kUnplayedState)
{
sheSaid = CantRepeatTournament();
if (sheSaid)
{
whichGame = kStandardGame;
CheckGameMenu();
}
else
{
primaryMode = kIdleMode;
return (FALSE);
}
}
}
if ((thePlayer.persona == kHumanPlayer) && (theOpponent.persona != kNetHuman) &&
(whichGame == kTournament) && (isLeague != kProfessional))
{
sheSaid = MustProLeagueTournament();
if (sheSaid)
{
whichGame = kStandardGame;
CheckGameMenu();
}
else
{
primaryMode = kIdleMode;
return (FALSE);
}
}
if ((theOpponent.persona == kNetHuman) && (whichGame == kTournament))
{
MinorError(kMinorNetCantTournament);
whichGame = kStandardGame;
CheckGameMenu();
}
if ((thePlayer.persona != kHumanPlayer) && (theOpponent.persona != kHumanPlayer) &&
(whichGame != kStandardGame))
{
MinorError(kMinorNetCantPractice);
whichGame = kStandardGame;
CheckGameMenu();
}
return (TRUE);
}
/*======================================================== PrepareNewGame */
void PrepareNewGame (void)
{
long dummyLong;
OSErr theErr;
short i;
Boolean itWorked;
if (splashIsUp)
{
DissolveWorkToMain();
RefreshMainWindow();
splashIsUp = FALSE;
}
if ((autoTeamsDialog) && (whichGame > kPracticeScoring))
{
itWorked = DoTeamsSetUp();
if (itWorked)
{
WhosOnFirst();
UpdateGoalPicts(FALSE);
}
else
{
primaryMode = kIdleMode;
DrawMenuBar();
return;
}
}
if (!CanWePlay())
{
DrawMenuBar();
return;
}
leftScoredLast = RandomCoin();
netGameInSession = FALSE;
if ((theOpponent.persona == kNetHuman) && (whichGame > kPracticeScoring))
{
itWorked = DoNetGameSetUp();
if (!itWorked)
{
primaryMode = kIdleMode;
DrawMenuBar();
return;
}
WhosOnFirst();
}
ResetBall();
ResetPerson(&thePlayer);
ResetPerson(&theOpponent);
thePlayer.wasRect = thePlayer.isRect;
theOpponent.wasRect = theOpponent.isRect;
theBall.wasRect = theBall.isRect;
SetMBarToPlaying();
HideMenuBar((GrafPtr)mainWndo);
EraseMenuBarRect();
UpdateGoalPicts(FALSE);
RefreshMainWindow();
TurnSMSOn();
FlushSoundQueues();
StartCrowdSound();
if ((enableAnnouncer) && (whichGame > kPracticeScoring))
{
DoOpeningAnnouncer();
}
else
{
lengthOfApplause = 300;
StartApplauseSound();
Delay(kApplauseSwellTicks, &dummyLong);
crowdQueue.when = 1;
HandleCrowdSound();
}
DisplayHoopla();
if (netGameInSession)
{
playerScore = spottedPoints;
opponentScore = spotPoints;
}
else
{
playerScore = 0;
opponentScore = 0;
}
playerFouls = 0;
opponentFouls = 0;
playerTotalGoals = 0;
opponentTotalGoals = 0;
playerTotalFouls = 0;
opponentTotalFouls = 0;
playerTotalCrits = 0;
opponentTotalCrits = 0;
if (thePlayer.persona == kHumanPlayer)
theOpponent.teaksThresh = teaksThreshholds[whichHumanNumber - 1];
replayFlag = 0;
if (canReplay)
{
replayData->frame = 0;
replayData->lastFrame = 0;
}
UpdatePlayerScore();
UpdateOpponentScore();
for (i = 0; i < kMaxReplayFrames; i++)
AmassReplayData();
newGame = FALSE;
gameIsOver = FALSE;
wasBrakeOn = FALSE;
drawThisFrame = TRUE;
baseTime = Ticks / 60;
timeElapsed = 0;
wasTime = 0;
DrawNames();
if (netGameInSession)
{
InitializeMessages();
itWorked = WaitForSynch(3600);
if (!itWorked)
{
MinorError(kMinorSynchFailed);
primaryMode = kIdleMode;
ShowMenuBar((GrafPtr)mainWndo);
FixVisRegion();
InitCursor();
return;
}
}
HideCursor();
}