mirror of
https://github.com/softdorothy/GliderPRO.git
synced 2024-11-22 20:31:19 +00:00
7a70d18ba6
Sources for Glider PRO, a Macintosh game written by John Calhoun and published by Casady & Greene, Inc. I believe it was using CodeWarrior IDE to create a fat (68K and PowerPC) binary.
1 line
14 KiB
C
Executable File
1 line
14 KiB
C
Executable File
|
|
//============================================================================
|
|
//----------------------------------------------------------------------------
|
|
// Transit.c
|
|
//----------------------------------------------------------------------------
|
|
//============================================================================
|
|
|
|
|
|
#include "Externs.h"
|
|
#include "Environ.h"
|
|
#include "RectUtils.h"
|
|
|
|
|
|
void HandleRoomVisitation (void);
|
|
|
|
|
|
short linkedToWhat;
|
|
Boolean takingTheStairs, firstPlayer;
|
|
|
|
|
|
extern Rect justRoomsRect, transRect;
|
|
extern short transRoom, otherPlayerEscaped;
|
|
extern short localNumbers[9];
|
|
extern Boolean topOpen, twoPlayerGame, onePlayerLeft;
|
|
extern Boolean playerDead, playerSuicide, tvOn;
|
|
|
|
|
|
//============================================================== Functions
|
|
//-------------------------------------------------------------- WhatAreWeLinkedTo
|
|
|
|
short WhatAreWeLinkedTo (short where, Byte who)
|
|
{
|
|
short what, whatType;
|
|
char wasState;
|
|
|
|
wasState = HGetState((Handle)thisHouse);
|
|
HLock((Handle)thisHouse);
|
|
what = (*thisHouse)->rooms[where].objects[who].what;
|
|
HSetState((Handle)thisHouse, wasState);
|
|
|
|
switch (what)
|
|
{
|
|
case kMailboxLf:
|
|
whatType = kLinkedToLeftMailbox;
|
|
break;
|
|
|
|
case kMailboxRt:
|
|
whatType = kLinkedToRightMailbox;
|
|
break;
|
|
|
|
case kCeilingTrans:
|
|
whatType = kLinkedToCeilingDuct;
|
|
break;
|
|
|
|
default:
|
|
whatType = kLinkedToOther;
|
|
break;
|
|
}
|
|
|
|
return (whatType);
|
|
}
|
|
|
|
//-------------------------------------------------------------- ReadyGliderFromTransit
|
|
|
|
void ReadyGliderFromTransit (gliderPtr thisGlider, short toWhat)
|
|
{
|
|
Rect tempRect;
|
|
|
|
if ((twoPlayerGame) && (onePlayerLeft) && (thisGlider->which == playerDead))
|
|
return;
|
|
|
|
FlagGliderNormal(thisGlider);
|
|
|
|
switch (toWhat)
|
|
{
|
|
case kLinkedToOther:
|
|
StartGliderTransportingIn(thisGlider); // set glider's mode
|
|
tempRect = thisGlider->dest; // position glider
|
|
CenterRectInRect(&tempRect, &transRect);
|
|
thisGlider->dest.left = tempRect.left;
|
|
thisGlider->dest.right = tempRect.right;
|
|
thisGlider->dest.top = tempRect.top;
|
|
thisGlider->dest.bottom = tempRect.bottom;
|
|
thisGlider->destShadow.left = tempRect.left;
|
|
thisGlider->destShadow.right = tempRect.right;
|
|
thisGlider->whole = thisGlider->dest;
|
|
thisGlider->wholeShadow = thisGlider->destShadow;
|
|
thisGlider->enteredRect = thisGlider->dest;
|
|
break;
|
|
|
|
case kLinkedToLeftMailbox:
|
|
StartGliderMailingOut(thisGlider);
|
|
thisGlider->clip = transRect; // fix clip
|
|
thisGlider->clip.right -= 64;
|
|
thisGlider->clip.bottom -= 25;
|
|
tempRect = thisGlider->dest;
|
|
thisGlider->dest.left = thisGlider->clip.right;
|
|
thisGlider->dest.right = thisGlider->dest.left;
|
|
thisGlider->dest.bottom = thisGlider->clip.bottom - 4;
|
|
thisGlider->dest.top = thisGlider->dest.bottom - RectTall(&tempRect);
|
|
thisGlider->destShadow.left = thisGlider->dest.left;
|
|
thisGlider->destShadow.right = thisGlider->dest.right;
|
|
thisGlider->whole = thisGlider->dest;
|
|
thisGlider->wholeShadow = thisGlider->destShadow;
|
|
break;
|
|
|
|
case kLinkedToRightMailbox:
|
|
StartGliderMailingOut(thisGlider);
|
|
thisGlider->clip = transRect; // fix clip
|
|
thisGlider->clip.left += 79;
|
|
thisGlider->clip.bottom -= 25;
|
|
tempRect = thisGlider->dest;
|
|
thisGlider->dest.right = thisGlider->clip.left;
|
|
thisGlider->dest.left = thisGlider->dest.right;
|
|
thisGlider->dest.bottom = thisGlider->clip.bottom - 4;
|
|
thisGlider->dest.top = thisGlider->dest.bottom - RectTall(&tempRect);
|
|
thisGlider->destShadow.left = thisGlider->dest.left;
|
|
thisGlider->destShadow.right = thisGlider->dest.right;
|
|
thisGlider->whole = thisGlider->dest;
|
|
thisGlider->wholeShadow = thisGlider->destShadow;
|
|
break;
|
|
|
|
case kLinkedToCeilingDuct:
|
|
StartGliderDuctingIn(thisGlider);
|
|
tempRect = thisGlider->dest; // set glider's position
|
|
CenterRectInRect(&tempRect, &transRect);
|
|
thisGlider->dest.left = tempRect.left;
|
|
thisGlider->dest.right = tempRect.right;
|
|
thisGlider->dest.top = tempRect.top;
|
|
thisGlider->dest.bottom = thisGlider->dest.top;
|
|
QOffsetRect(&thisGlider->dest, 0, -RectTall(&tempRect));
|
|
thisGlider->destShadow.left = tempRect.left;
|
|
thisGlider->destShadow.right = tempRect.right;
|
|
thisGlider->whole = thisGlider->dest;
|
|
thisGlider->wholeShadow = thisGlider->destShadow;
|
|
break;
|
|
|
|
case kLinkedToFloorDuct:
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
if ((twoPlayerGame) && (thisGlider->which != firstPlayer))
|
|
TagGliderIdle(thisGlider);
|
|
}
|
|
|
|
//-------------------------------------------------------------- MoveRoomToRoom
|
|
|
|
void MoveRoomToRoom (gliderPtr thisGlider, short where)
|
|
{
|
|
Rect enterRect;
|
|
|
|
HandleRoomVisitation();
|
|
switch (where)
|
|
{
|
|
case kToRight:
|
|
SetMusicalMode(kProdGameScoreMode);
|
|
if (twoPlayerGame)
|
|
{
|
|
UndoGliderLimbo(&theGlider);
|
|
UndoGliderLimbo(&theGlider2);
|
|
InsureGliderFacingRight(&theGlider);
|
|
InsureGliderFacingRight(&theGlider2);
|
|
}
|
|
else
|
|
InsureGliderFacingRight(thisGlider);
|
|
ForceThisRoom(localNumbers[kEastRoom]);
|
|
if (twoPlayerGame)
|
|
{
|
|
OffsetGlider(&theGlider, kToLeft);
|
|
OffsetGlider(&theGlider2, kToLeft);
|
|
QSetRect(&enterRect, 0, 0, 48, 20);
|
|
QOffsetRect(&enterRect, 0,
|
|
kGliderStartsDown + (short)thisRoom->leftStart - 2);
|
|
theGlider.enteredRect = enterRect;
|
|
theGlider2.enteredRect = enterRect;
|
|
}
|
|
else
|
|
{
|
|
OffsetGlider(thisGlider, kToLeft);
|
|
QSetRect(&enterRect, 0, 0, 48, 20);
|
|
QOffsetRect(&enterRect, 0,
|
|
kGliderStartsDown + (short)thisRoom->leftStart - 2);
|
|
thisGlider->enteredRect = enterRect;
|
|
}
|
|
break;
|
|
|
|
case kToLeft:
|
|
SetMusicalMode(kProdGameScoreMode);
|
|
if (twoPlayerGame)
|
|
{
|
|
UndoGliderLimbo(&theGlider);
|
|
UndoGliderLimbo(&theGlider2);
|
|
InsureGliderFacingLeft(&theGlider);
|
|
InsureGliderFacingLeft(&theGlider2);
|
|
}
|
|
else
|
|
InsureGliderFacingLeft(thisGlider);
|
|
ForceThisRoom(localNumbers[kWestRoom]);
|
|
if (twoPlayerGame)
|
|
{
|
|
OffsetGlider(&theGlider, kToRight);
|
|
OffsetGlider(&theGlider2, kToRight);
|
|
QSetRect(&enterRect, 0, 0, 48, 20);
|
|
QOffsetRect(&enterRect, kRoomWide - 48,
|
|
kGliderStartsDown + (short)thisRoom->rightStart - 2);
|
|
theGlider.enteredRect = enterRect;
|
|
theGlider2.enteredRect = enterRect;
|
|
}
|
|
else
|
|
{
|
|
OffsetGlider(thisGlider, kToRight);
|
|
QSetRect(&enterRect, 0, 0, 48, 20);
|
|
QOffsetRect(&enterRect, kRoomWide - 48,
|
|
kGliderStartsDown + (short)thisRoom->rightStart - 2);
|
|
thisGlider->enteredRect = enterRect;
|
|
}
|
|
break;
|
|
|
|
case kAbove:
|
|
SetMusicalMode(kKickGameScoreMode);
|
|
ForceThisRoom(localNumbers[kNorthRoom]);
|
|
if (!takingTheStairs)
|
|
{
|
|
if (twoPlayerGame)
|
|
{
|
|
UndoGliderLimbo(&theGlider);
|
|
UndoGliderLimbo(&theGlider2);
|
|
OffsetGlider(&theGlider, kBelow);
|
|
OffsetGlider(&theGlider2, kBelow);
|
|
theGlider.enteredRect = theGlider.dest;
|
|
theGlider2.enteredRect = theGlider2.dest;
|
|
}
|
|
else
|
|
{
|
|
OffsetGlider(thisGlider, kBelow);
|
|
thisGlider->enteredRect = thisGlider->dest;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (twoPlayerGame)
|
|
{
|
|
ReadyGliderForTripUpStairs(&theGlider);
|
|
ReadyGliderForTripUpStairs(&theGlider2);
|
|
}
|
|
else
|
|
ReadyGliderForTripUpStairs(thisGlider);
|
|
}
|
|
break;
|
|
|
|
case kBelow:
|
|
SetMusicalMode(kKickGameScoreMode);
|
|
ForceThisRoom(localNumbers[kSouthRoom]);
|
|
if (!takingTheStairs)
|
|
{
|
|
if (twoPlayerGame)
|
|
{
|
|
UndoGliderLimbo(&theGlider);
|
|
UndoGliderLimbo(&theGlider2);
|
|
OffsetGlider(&theGlider, kAbove);
|
|
OffsetGlider(&theGlider2, kAbove);
|
|
theGlider.enteredRect = theGlider.dest;
|
|
theGlider2.enteredRect = theGlider2.dest;
|
|
}
|
|
else
|
|
{
|
|
OffsetGlider(thisGlider, kAbove);
|
|
thisGlider->enteredRect = thisGlider->dest;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (twoPlayerGame)
|
|
{
|
|
ReadyGliderForTripDownStairs(&theGlider);
|
|
ReadyGliderForTripDownStairs(&theGlider2);
|
|
}
|
|
else
|
|
ReadyGliderForTripDownStairs(thisGlider);
|
|
}
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
if ((twoPlayerGame) && (!onePlayerLeft))
|
|
{
|
|
if (firstPlayer == kPlayer1)
|
|
TagGliderIdle(&theGlider2);
|
|
else
|
|
TagGliderIdle(&theGlider);
|
|
}
|
|
|
|
ReadyLevel();
|
|
RefreshScoreboard(kNormalTitleMode);
|
|
WipeScreenOn(where, &justRoomsRect);
|
|
|
|
#ifdef COMPILEQT
|
|
RenderFrame();
|
|
if ((thisMac.hasQT) && (hasMovie) && (tvInRoom) && (tvOn))
|
|
{
|
|
GoToBeginningOfMovie(theMovie);
|
|
StartMovie(theMovie);
|
|
}
|
|
#endif
|
|
}
|
|
|
|
//-------------------------------------------------------------- TransportRoomToRoom
|
|
|
|
void TransportRoomToRoom (gliderPtr thisGlider)
|
|
{
|
|
Boolean sameRoom;
|
|
|
|
SetMusicalMode(kKickGameScoreMode);
|
|
HandleRoomVisitation();
|
|
|
|
sameRoom = (transRoom == thisRoomNumber);
|
|
if (!sameRoom)
|
|
ForceThisRoom(transRoom);
|
|
if (twoPlayerGame)
|
|
{
|
|
UndoGliderLimbo(&theGlider); // turn off limbo if needed
|
|
UndoGliderLimbo(&theGlider2); // turn off limbo if needed
|
|
ReadyGliderFromTransit(&theGlider, linkedToWhat);
|
|
ReadyGliderFromTransit(&theGlider2, linkedToWhat);
|
|
}
|
|
else
|
|
ReadyGliderFromTransit(thisGlider, linkedToWhat);
|
|
|
|
if (!sameRoom)
|
|
ReadyLevel();
|
|
RefreshScoreboard(kNormalTitleMode);
|
|
if (!sameRoom)
|
|
WipeScreenOn(kAbove, &justRoomsRect);
|
|
|
|
#ifdef COMPILEQT
|
|
RenderFrame();
|
|
if ((thisMac.hasQT) && (hasMovie) && (tvInRoom) && (tvOn))
|
|
{
|
|
GoToBeginningOfMovie(theMovie);
|
|
StartMovie(theMovie);
|
|
}
|
|
#endif
|
|
}
|
|
|
|
//-------------------------------------------------------------- MoveDuctToDuct
|
|
|
|
void MoveDuctToDuct (gliderPtr thisGlider)
|
|
{
|
|
Boolean sameRoom;
|
|
|
|
SetMusicalMode(kKickGameScoreMode);
|
|
HandleRoomVisitation();
|
|
|
|
sameRoom = (transRoom == thisRoomNumber);
|
|
if (!sameRoom)
|
|
ForceThisRoom(transRoom);
|
|
|
|
if (twoPlayerGame)
|
|
{
|
|
UndoGliderLimbo(&theGlider); // turn off limbo if needed
|
|
UndoGliderLimbo(&theGlider2); // turn off limbo if needed
|
|
ReadyGliderFromTransit(&theGlider, linkedToWhat);
|
|
ReadyGliderFromTransit(&theGlider2, linkedToWhat);
|
|
}
|
|
else
|
|
ReadyGliderFromTransit(thisGlider, linkedToWhat);
|
|
|
|
if (!sameRoom)
|
|
ReadyLevel();
|
|
RefreshScoreboard(kNormalTitleMode);
|
|
if (!sameRoom)
|
|
WipeScreenOn(kAbove, &justRoomsRect);
|
|
|
|
#ifdef COMPILEQT
|
|
RenderFrame();
|
|
if ((thisMac.hasQT) && (hasMovie) && (tvInRoom) && (tvOn))
|
|
{
|
|
GoToBeginningOfMovie(theMovie);
|
|
StartMovie(theMovie);
|
|
}
|
|
#endif
|
|
}
|
|
|
|
//-------------------------------------------------------------- MoveMailToMail
|
|
|
|
void MoveMailToMail (gliderPtr thisGlider)
|
|
{
|
|
Boolean sameRoom;
|
|
|
|
SetMusicalMode(kKickGameScoreMode);
|
|
HandleRoomVisitation();
|
|
|
|
sameRoom = (transRoom == thisRoomNumber);
|
|
if (!sameRoom)
|
|
ForceThisRoom(transRoom);
|
|
|
|
if (twoPlayerGame)
|
|
{
|
|
UndoGliderLimbo(&theGlider); // turn off limbo if needed
|
|
UndoGliderLimbo(&theGlider2); // turn off limbo if needed
|
|
ReadyGliderFromTransit(&theGlider, linkedToWhat);
|
|
ReadyGliderFromTransit(&theGlider2, linkedToWhat);
|
|
}
|
|
else
|
|
ReadyGliderFromTransit(thisGlider, linkedToWhat);
|
|
|
|
if (!sameRoom)
|
|
ReadyLevel();
|
|
RefreshScoreboard(kNormalTitleMode);
|
|
if (!sameRoom)
|
|
WipeScreenOn(kAbove, &justRoomsRect);
|
|
|
|
#ifdef COMPILEQT
|
|
RenderFrame();
|
|
if ((thisMac.hasQT) && (hasMovie) && (tvInRoom) && (tvOn))
|
|
{
|
|
GoToBeginningOfMovie(theMovie);
|
|
StartMovie(theMovie);
|
|
}
|
|
#endif
|
|
}
|
|
|
|
//-------------------------------------------------------------- HandleRoomVisitation
|
|
|
|
void HandleRoomVisitation (void)
|
|
{
|
|
houseType *thisHousePtr;
|
|
char wasState;
|
|
|
|
if (!thisRoom->visited)
|
|
{
|
|
wasState = HGetState((Handle)thisHouse);
|
|
HLock((Handle)thisHouse);
|
|
thisHousePtr = *thisHouse;
|
|
thisHousePtr->rooms[localNumbers[kCentralRoom]].visited = true;
|
|
HSetState((Handle)thisHouse, wasState);
|
|
theScore += kRoomVisitScore;
|
|
thisRoom->visited = true;
|
|
}
|
|
}
|
|
|
|
//-------------------------------------------------------------- ForceKillGlider
|
|
|
|
void ForceKillGlider (void)
|
|
{
|
|
if (theGlider.mode == kGliderInLimbo)
|
|
{
|
|
if (theGlider2.mode != kGliderFadingOut)
|
|
{
|
|
StartGliderFadingOut(&theGlider2);
|
|
PlayPrioritySound(kFadeOutSound, kFadeOutPriority);
|
|
playerSuicide = true;
|
|
}
|
|
}
|
|
else if (theGlider2.mode == kGliderInLimbo)
|
|
{
|
|
if (theGlider.mode != kGliderFadingOut)
|
|
{
|
|
StartGliderFadingOut(&theGlider);
|
|
PlayPrioritySound(kFadeOutSound, kFadeOutPriority);
|
|
playerSuicide = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
//-------------------------------------------------------------- FollowTheLeader
|
|
|
|
void FollowTheLeader (void)
|
|
{
|
|
short wasEscaped;
|
|
Boolean oneOrTwo;
|
|
|
|
playerSuicide = false;
|
|
wasEscaped = otherPlayerEscaped;
|
|
otherPlayerEscaped = kNoOneEscaped;
|
|
|
|
if (theGlider.mode == kGliderInLimbo)
|
|
{
|
|
oneOrTwo = true;
|
|
theGlider2.dest = theGlider.dest;
|
|
theGlider2.destShadow = theGlider.destShadow;
|
|
theGlider2.whole = theGlider2.dest;
|
|
theGlider2.wholeShadow = theGlider2.destShadow;
|
|
}
|
|
else if (theGlider2.mode == kGliderInLimbo)
|
|
{
|
|
oneOrTwo = false;
|
|
theGlider.dest = theGlider2.dest;
|
|
theGlider.destShadow = theGlider2.destShadow;
|
|
theGlider.whole = theGlider.dest;
|
|
theGlider.wholeShadow = theGlider.destShadow;
|
|
}
|
|
|
|
switch (wasEscaped)
|
|
{
|
|
case kPlayerEscapedUp:
|
|
case kPlayerEscapingUpStairs:
|
|
case kPlayerEscapedUpStairs:
|
|
if (oneOrTwo)
|
|
MoveRoomToRoom(&theGlider2, kAbove);
|
|
else
|
|
MoveRoomToRoom(&theGlider, kAbove);
|
|
break;
|
|
|
|
case kPlayerEscapedDown:
|
|
case kPlayerEscapingDownStairs:
|
|
case kPlayerEscapedDownStairs:
|
|
if (oneOrTwo)
|
|
MoveRoomToRoom(&theGlider2, kBelow);
|
|
else
|
|
MoveRoomToRoom(&theGlider, kBelow);
|
|
break;
|
|
|
|
case kPlayerEscapedLeft:
|
|
if (oneOrTwo)
|
|
MoveRoomToRoom(&theGlider2, kToLeft);
|
|
else
|
|
MoveRoomToRoom(&theGlider, kToLeft);
|
|
break;
|
|
|
|
case kPlayerEscapedRight:
|
|
if (oneOrTwo)
|
|
MoveRoomToRoom(&theGlider2, kToRight);
|
|
else
|
|
MoveRoomToRoom(&theGlider, kToRight);
|
|
break;
|
|
|
|
case kPlayerTransportedOut:
|
|
if (oneOrTwo)
|
|
TransportRoomToRoom(&theGlider2);
|
|
else
|
|
TransportRoomToRoom(&theGlider);
|
|
break;
|
|
|
|
case kPlayerMailedOut:
|
|
if (oneOrTwo)
|
|
MoveMailToMail(&theGlider2);
|
|
else
|
|
MoveMailToMail(&theGlider);
|
|
break;
|
|
|
|
case kPlayerDuckedOut:
|
|
if (oneOrTwo)
|
|
MoveDuctToDuct(&theGlider2);
|
|
else
|
|
MoveDuctToDuct(&theGlider);
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|