mirror of
https://github.com/softdorothy/GliderPRO.git
synced 2024-11-25 10:30:45 +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
19 KiB
C
Executable File
1 line
19 KiB
C
Executable File
|
|
//============================================================================
|
|
//----------------------------------------------------------------------------
|
|
// Modes.c
|
|
//----------------------------------------------------------------------------
|
|
//============================================================================
|
|
|
|
|
|
#include "Externs.h"
|
|
#include "RectUtils.h"
|
|
|
|
|
|
short saidFollow;
|
|
|
|
extern Rect gliderSrc[];
|
|
extern Rect transRect;
|
|
extern short fadeInSequence[], linkedToWhat;
|
|
extern short rightClip, leftClip, transRoom;
|
|
extern Boolean hasMirror, shadowVisible, firstPlayer, twoPlayerGame;
|
|
extern Boolean onePlayerLeft, playerDead;
|
|
|
|
//============================================================== Functions
|
|
//-------------------------------------------------------------- StartGliderFadingIn
|
|
|
|
void StartGliderFadingIn (gliderPtr thisGlider)
|
|
{
|
|
if (foilTotal <= 0)
|
|
showFoil = false;
|
|
|
|
thisGlider->mode = kGliderFadingIn;
|
|
thisGlider->whole = thisGlider->dest;
|
|
thisGlider->frame = 0;
|
|
thisGlider->dontDraw = false;
|
|
if (thisGlider->facing == kFaceLeft)
|
|
{
|
|
thisGlider->src =
|
|
gliderSrc[fadeInSequence[thisGlider->frame] + kLeftFadeOffset];
|
|
thisGlider->mask =
|
|
gliderSrc[fadeInSequence[thisGlider->frame] + kLeftFadeOffset];
|
|
}
|
|
else
|
|
{
|
|
thisGlider->src = gliderSrc[fadeInSequence[thisGlider->frame]];
|
|
thisGlider->mask = gliderSrc[fadeInSequence[thisGlider->frame]];
|
|
}
|
|
}
|
|
|
|
//-------------------------------------------------------------- StartGliderTransportingIn
|
|
|
|
void StartGliderTransportingIn (gliderPtr thisGlider)
|
|
{
|
|
if (foilTotal <= 0)
|
|
showFoil = false;
|
|
|
|
thisGlider->mode = kGliderTransportingIn;
|
|
thisGlider->whole = thisGlider->dest;
|
|
thisGlider->frame = 0;
|
|
thisGlider->dontDraw = false;
|
|
if (thisGlider->facing == kFaceLeft)
|
|
{
|
|
thisGlider->src =
|
|
gliderSrc[fadeInSequence[thisGlider->frame] + kLeftFadeOffset];
|
|
thisGlider->mask =
|
|
gliderSrc[fadeInSequence[thisGlider->frame] + kLeftFadeOffset];
|
|
}
|
|
else
|
|
{
|
|
thisGlider->src = gliderSrc[fadeInSequence[thisGlider->frame]];
|
|
thisGlider->mask = gliderSrc[fadeInSequence[thisGlider->frame]];
|
|
}
|
|
}
|
|
|
|
//-------------------------------------------------------------- StartGliderFadingOut
|
|
|
|
void StartGliderFadingOut (gliderPtr thisGlider)
|
|
{
|
|
Rect tempBounds;
|
|
|
|
if (thisGlider->mode == kGliderFadingOut)
|
|
return;
|
|
|
|
if (thisGlider->mode == kGliderGoingFoil)
|
|
DeckGliderInFoil(thisGlider);
|
|
else if (thisGlider->mode == kGliderLosingFoil)
|
|
RemoveFoilFromGlider(thisGlider);
|
|
|
|
if (RectTall(&thisGlider->dest) > kGliderHigh)
|
|
{
|
|
tempBounds = thisGlider->dest;
|
|
QOffsetRect(&tempBounds, playOriginH, playOriginV);
|
|
AddRectToWorkRects(&tempBounds);
|
|
if (hasMirror)
|
|
{
|
|
tempBounds = thisGlider->dest;
|
|
QOffsetRect(&tempBounds, playOriginH - 20, playOriginV - 16);
|
|
AddRectToWorkRects(&tempBounds);
|
|
}
|
|
thisGlider->dest.right = thisGlider->dest.left + kGliderWide;
|
|
thisGlider->dest.top = thisGlider->dest.bottom - kGliderHigh;
|
|
}
|
|
thisGlider->mode = kGliderFadingOut;
|
|
thisGlider->whole = thisGlider->dest;
|
|
thisGlider->frame = kLastFadeSequence - 1;
|
|
if (thisGlider->facing == kFaceLeft)
|
|
{
|
|
thisGlider->src =
|
|
gliderSrc[fadeInSequence[thisGlider->frame] + kLeftFadeOffset];
|
|
thisGlider->mask =
|
|
gliderSrc[fadeInSequence[thisGlider->frame] + kLeftFadeOffset];
|
|
}
|
|
else
|
|
{
|
|
thisGlider->src = gliderSrc[fadeInSequence[thisGlider->frame]];
|
|
thisGlider->mask = gliderSrc[fadeInSequence[thisGlider->frame]];
|
|
}
|
|
}
|
|
|
|
//-------------------------------------------------------------- StartGliderGoingUpStairs
|
|
|
|
void StartGliderGoingUpStairs (gliderPtr thisGlider)
|
|
{
|
|
if (thisGlider->mode == kGliderGoingFoil)
|
|
DeckGliderInFoil(thisGlider);
|
|
else if (thisGlider->mode == kGliderLosingFoil)
|
|
RemoveFoilFromGlider(thisGlider);
|
|
|
|
if (thisGlider->mode == kGliderBurning)
|
|
thisGlider->frame = kWasBurning;
|
|
else
|
|
thisGlider->frame = 0;
|
|
|
|
thisGlider->mode = kGliderGoingUp;
|
|
}
|
|
|
|
//-------------------------------------------------------------- StartGliderGoingDownStairs
|
|
|
|
void StartGliderGoingDownStairs (gliderPtr thisGlider)
|
|
{
|
|
if (thisGlider->mode == kGliderGoingFoil)
|
|
DeckGliderInFoil(thisGlider);
|
|
else if (thisGlider->mode == kGliderLosingFoil)
|
|
RemoveFoilFromGlider(thisGlider);
|
|
|
|
if (thisGlider->mode == kGliderBurning)
|
|
thisGlider->frame = kWasBurning;
|
|
else
|
|
thisGlider->frame = 0;
|
|
|
|
thisGlider->mode = kGliderGoingDown;
|
|
rightClip = GetUpStairsRightEdge();
|
|
}
|
|
|
|
//-------------------------------------------------------------- StartGliderMailingIn
|
|
|
|
void StartGliderMailingIn (gliderPtr thisGlider, Rect *bounds, hotPtr who)
|
|
{
|
|
short topSought, whoLinked;
|
|
Byte objLinked;
|
|
char wasState;
|
|
|
|
PlayPrioritySound(kTransOutSound, kTransOutPriority);
|
|
|
|
whoLinked = who->who;
|
|
transRoom = masterObjects[whoLinked].roomLink;
|
|
objLinked = masterObjects[whoLinked].objectLink;
|
|
linkedToWhat = WhatAreWeLinkedTo(transRoom, objLinked);
|
|
|
|
wasState = HGetState((Handle)thisHouse);
|
|
HLock((Handle)thisHouse);
|
|
GetObjectRect(&(*thisHouse)->rooms[transRoom].objects[objLinked], &transRect);
|
|
HSetState((Handle)thisHouse, wasState);
|
|
|
|
thisGlider->frame = 0;
|
|
thisGlider->clip = *bounds;
|
|
topSought = bounds->bottom - RectTall(&thisGlider->dest);
|
|
thisGlider->clip.top = topSought;
|
|
}
|
|
|
|
//-------------------------------------------------------------- StartGliderMailingOut
|
|
|
|
void StartGliderMailingOut (gliderPtr thisGlider)
|
|
{
|
|
if (thisGlider->mode == kGliderGoingFoil)
|
|
DeckGliderInFoil(thisGlider);
|
|
else if (thisGlider->mode == kGliderLosingFoil)
|
|
RemoveFoilFromGlider(thisGlider);
|
|
|
|
if (linkedToWhat == kLinkedToLeftMailbox)
|
|
{
|
|
thisGlider->facing = kFaceLeft;
|
|
thisGlider->mode = kGliderMailOutLeft;
|
|
thisGlider->src = gliderSrc[2];
|
|
thisGlider->mask = gliderSrc[2];
|
|
}
|
|
else
|
|
{
|
|
thisGlider->facing = kFaceRight;
|
|
thisGlider->mode = kGliderMailOutRight;
|
|
thisGlider->src = gliderSrc[0];
|
|
thisGlider->mask = gliderSrc[0];
|
|
}
|
|
|
|
thisGlider->hVel = 0;
|
|
thisGlider->vVel = 0;
|
|
thisGlider->hDesiredVel = 0;
|
|
thisGlider->vDesiredVel = 0;
|
|
thisGlider->tipped = false;
|
|
thisGlider->dontDraw = false;
|
|
}
|
|
|
|
//-------------------------------------------------------------- StartGliderDuctingDown
|
|
|
|
void StartGliderDuctingDown (gliderPtr thisGlider, Rect *bounds, hotPtr who)
|
|
{
|
|
short leftSought, whoLinked;
|
|
Byte objLinked;
|
|
char wasState;
|
|
|
|
PlayPrioritySound(kTransOutSound, kTransOutPriority);
|
|
|
|
if (thisGlider->mode == kGliderGoingFoil)
|
|
DeckGliderInFoil(thisGlider);
|
|
else if (thisGlider->mode == kGliderLosingFoil)
|
|
RemoveFoilFromGlider(thisGlider);
|
|
|
|
whoLinked = who->who;
|
|
transRoom = masterObjects[whoLinked].roomLink;
|
|
objLinked = masterObjects[whoLinked].objectLink;
|
|
linkedToWhat = WhatAreWeLinkedTo(transRoom, objLinked);
|
|
|
|
wasState = HGetState((Handle)thisHouse);
|
|
HLock((Handle)thisHouse);
|
|
GetObjectRect(&(*thisHouse)->rooms[transRoom].objects[objLinked], &transRect);
|
|
HSetState((Handle)thisHouse, wasState);
|
|
|
|
thisGlider->frame = 0;
|
|
thisGlider->clip = *bounds;
|
|
leftSought = bounds->left + ((RectWide(bounds) - kGliderWide) / 2);
|
|
thisGlider->clip.left = leftSought;
|
|
|
|
thisGlider->mode = kGliderDuctingDown;
|
|
}
|
|
|
|
//-------------------------------------------------------------- StartGliderDuctingUp
|
|
|
|
void StartGliderDuctingUp (gliderPtr thisGlider, Rect *bounds, hotPtr who)
|
|
{
|
|
short leftSought, whoLinked;
|
|
Byte objLinked;
|
|
char wasState;
|
|
|
|
PlayPrioritySound(kTransOutSound, kTransOutPriority);
|
|
|
|
if (thisGlider->mode == kGliderGoingFoil)
|
|
DeckGliderInFoil(thisGlider);
|
|
else if (thisGlider->mode == kGliderLosingFoil)
|
|
RemoveFoilFromGlider(thisGlider);
|
|
|
|
whoLinked = who->who;
|
|
transRoom = masterObjects[whoLinked].roomLink;
|
|
objLinked = masterObjects[whoLinked].objectLink;
|
|
linkedToWhat = WhatAreWeLinkedTo(transRoom, objLinked);
|
|
|
|
wasState = HGetState((Handle)thisHouse);
|
|
HLock((Handle)thisHouse);
|
|
GetObjectRect(&(*thisHouse)->rooms[transRoom].objects[objLinked], &transRect);
|
|
HSetState((Handle)thisHouse, wasState);
|
|
|
|
thisGlider->frame = 0;
|
|
thisGlider->clip = *bounds;
|
|
leftSought = bounds->left + ((RectWide(bounds) - kGliderWide) / 2);
|
|
thisGlider->clip.left = leftSought;
|
|
|
|
thisGlider->mode = kGliderDuctingUp;
|
|
}
|
|
|
|
//-------------------------------------------------------------- StartGliderDuctingIn
|
|
|
|
void StartGliderDuctingIn (gliderPtr thisGlider)
|
|
{
|
|
thisGlider->mode = kGliderDuctingIn;
|
|
thisGlider->whole = thisGlider->dest;
|
|
thisGlider->dontDraw = false;
|
|
}
|
|
|
|
//-------------------------------------------------------------- StartGliderTransporting
|
|
|
|
void StartGliderTransporting (gliderPtr thisGlider, hotPtr who)
|
|
{
|
|
short whoLinked;
|
|
Byte objLinked;
|
|
char wasState;
|
|
|
|
PlayPrioritySound(kTransOutSound, kTransOutPriority);
|
|
|
|
if (thisGlider->mode == kGliderGoingFoil)
|
|
DeckGliderInFoil(thisGlider);
|
|
else if (thisGlider->mode == kGliderLosingFoil)
|
|
RemoveFoilFromGlider(thisGlider);
|
|
|
|
whoLinked = who->who;
|
|
transRoom = masterObjects[whoLinked].roomLink;
|
|
objLinked = masterObjects[whoLinked].objectLink;
|
|
linkedToWhat = WhatAreWeLinkedTo(transRoom, objLinked);
|
|
|
|
wasState = HGetState((Handle)thisHouse);
|
|
HLock((Handle)thisHouse);
|
|
GetObjectRect(&(*thisHouse)->rooms[transRoom].objects[objLinked], &transRect);
|
|
HSetState((Handle)thisHouse, wasState);
|
|
|
|
thisGlider->dest.right = thisGlider->dest.left + kGliderWide;
|
|
thisGlider->dest.bottom = thisGlider->dest.top + kGliderHigh;
|
|
thisGlider->destShadow.right = thisGlider->destShadow.left + kGliderWide;
|
|
thisGlider->destShadow.bottom = thisGlider->destShadow.top + kShadowHigh;
|
|
thisGlider->mode = kGliderTransporting;
|
|
thisGlider->whole = thisGlider->dest;
|
|
thisGlider->frame = kLastFadeSequence - 1;
|
|
if (thisGlider->facing == kFaceLeft)
|
|
{
|
|
thisGlider->src =
|
|
gliderSrc[fadeInSequence[thisGlider->frame] + kLeftFadeOffset];
|
|
thisGlider->mask =
|
|
gliderSrc[fadeInSequence[thisGlider->frame] + kLeftFadeOffset];
|
|
}
|
|
else
|
|
{
|
|
thisGlider->src = gliderSrc[fadeInSequence[thisGlider->frame]];
|
|
thisGlider->mask = gliderSrc[fadeInSequence[thisGlider->frame]];
|
|
}
|
|
}
|
|
|
|
//-------------------------------------------------------------- FlagGliderNormal
|
|
|
|
void FlagGliderNormal (gliderPtr thisGlider)
|
|
{
|
|
thisGlider->dest.right = thisGlider->dest.left + kGliderWide;
|
|
thisGlider->dest.bottom = thisGlider->dest.top + kGliderHigh;
|
|
thisGlider->destShadow.right = thisGlider->destShadow.left + kGliderWide;
|
|
thisGlider->destShadow.bottom = thisGlider->destShadow.top + kShadowHigh;
|
|
thisGlider->mode = kGliderNormal;
|
|
if (thisGlider->facing == kFaceLeft)
|
|
{
|
|
thisGlider->src = gliderSrc[2];
|
|
thisGlider->mask = gliderSrc[2];
|
|
}
|
|
else
|
|
{
|
|
thisGlider->src = gliderSrc[0];
|
|
thisGlider->mask = gliderSrc[0];
|
|
}
|
|
thisGlider->hVel = 0;
|
|
thisGlider->vVel = 0;
|
|
thisGlider->hDesiredVel = 0;
|
|
thisGlider->vDesiredVel = 0;
|
|
thisGlider->tipped = false;
|
|
thisGlider->ignoreLeft = false;
|
|
thisGlider->ignoreRight = false;
|
|
thisGlider->ignoreGround = false;
|
|
thisGlider->dontDraw = false;
|
|
thisGlider->frame = 0;
|
|
shadowVisible = IsShadowVisible();
|
|
}
|
|
|
|
//-------------------------------------------------------------- FlagGliderShredding
|
|
|
|
void FlagGliderShredding (gliderPtr thisGlider, Rect *bounds)
|
|
{
|
|
PlayPrioritySound(kCaughtFireSound, kCaughtFirePriority);
|
|
thisGlider->dest.left = bounds->left + 36;
|
|
thisGlider->dest.right = thisGlider->dest.left + kGliderWide;
|
|
thisGlider->dest.bottom = thisGlider->dest.top + kGliderHigh;
|
|
if (thisGlider->dest.left > thisGlider->whole.left)
|
|
{
|
|
thisGlider->whole.right = thisGlider->dest.right;
|
|
thisGlider->wholeShadow.right = thisGlider->dest.right;
|
|
}
|
|
else
|
|
{
|
|
thisGlider->whole.left = thisGlider->dest.left;
|
|
thisGlider->wholeShadow.left = thisGlider->dest.left;
|
|
}
|
|
thisGlider->destShadow.left = thisGlider->dest.left;
|
|
thisGlider->destShadow.right = thisGlider->destShadow.left + kGliderWide;
|
|
thisGlider->destShadow.bottom = thisGlider->destShadow.top + kShadowHigh;
|
|
thisGlider->mode = kGliderShredding;
|
|
if (thisGlider->facing == kFaceLeft)
|
|
{
|
|
thisGlider->src = gliderSrc[2];
|
|
thisGlider->mask = gliderSrc[2];
|
|
}
|
|
else
|
|
{
|
|
thisGlider->src = gliderSrc[0];
|
|
thisGlider->mask = gliderSrc[0];
|
|
}
|
|
thisGlider->hVel = 0;
|
|
thisGlider->vVel = 0;
|
|
thisGlider->hDesiredVel = 0;
|
|
thisGlider->vDesiredVel = 0;
|
|
thisGlider->frame = bounds->bottom - 3;
|
|
thisGlider->tipped = false;
|
|
}
|
|
|
|
//-------------------------------------------------------------- FlagGliderBurning
|
|
|
|
void FlagGliderBurning (gliderPtr thisGlider)
|
|
{
|
|
#define kFramesToBurn 60
|
|
|
|
PlayPrioritySound(kCaughtFireSound, kCaughtFirePriority);
|
|
|
|
thisGlider->dest.right = thisGlider->dest.left + kGliderWide;
|
|
thisGlider->dest.top = thisGlider->dest.bottom - kGliderBurningHigh;
|
|
thisGlider->destShadow.right = thisGlider->destShadow.left + kGliderWide;
|
|
thisGlider->destShadow.bottom = thisGlider->destShadow.top + kShadowHigh;
|
|
thisGlider->mode = kGliderBurning;
|
|
if (thisGlider->facing == kFaceLeft)
|
|
{
|
|
thisGlider->src = gliderSrc[25];
|
|
thisGlider->mask = gliderSrc[25];
|
|
}
|
|
else
|
|
{
|
|
thisGlider->src = gliderSrc[21];
|
|
thisGlider->mask = gliderSrc[21];
|
|
}
|
|
thisGlider->hVel = 0;
|
|
thisGlider->vVel = 0;
|
|
thisGlider->hDesiredVel = 0;
|
|
thisGlider->vDesiredVel = 0;
|
|
thisGlider->frame = 0;
|
|
thisGlider->wasMode = kFramesToBurn; // used to count down burning
|
|
thisGlider->tipped = false;
|
|
}
|
|
|
|
//-------------------------------------------------------------- FlagGliderFaceLeft
|
|
|
|
void FlagGliderFaceLeft (gliderPtr thisGlider)
|
|
{
|
|
thisGlider->mode = kGliderFaceLeft;
|
|
thisGlider->frame = kLastAboutFaceFrame;
|
|
thisGlider->src = gliderSrc[kLastAboutFaceFrame];
|
|
thisGlider->mask = gliderSrc[kLastAboutFaceFrame];
|
|
}
|
|
|
|
//-------------------------------------------------------------- FlagGliderFaceRight
|
|
|
|
void FlagGliderFaceRight (gliderPtr thisGlider)
|
|
{
|
|
thisGlider->mode = kGliderFaceRight;
|
|
thisGlider->frame = kFirstAboutFaceFrame;
|
|
thisGlider->src = gliderSrc[kFirstAboutFaceFrame];
|
|
thisGlider->mask = gliderSrc[kFirstAboutFaceFrame];
|
|
}
|
|
|
|
//-------------------------------------------------------------- FlagGliderInLimbo
|
|
|
|
void FlagGliderInLimbo (gliderPtr thisGlider, Boolean sayIt)
|
|
{
|
|
thisGlider->wasMode = thisGlider->mode;
|
|
thisGlider->mode = kGliderInLimbo;
|
|
if ((sayIt) && (saidFollow < 3))
|
|
{
|
|
PlayPrioritySound(kFollowSound, kFollowPriority);
|
|
saidFollow++;
|
|
}
|
|
firstPlayer = thisGlider->which;
|
|
}
|
|
|
|
//-------------------------------------------------------------- UndoGliderLimbo
|
|
|
|
void UndoGliderLimbo (gliderPtr thisGlider)
|
|
{
|
|
if ((twoPlayerGame) && (onePlayerLeft) && (thisGlider->which == playerDead))
|
|
return;
|
|
|
|
if (thisGlider->mode == kGliderInLimbo)
|
|
thisGlider->mode = thisGlider->wasMode;
|
|
thisGlider->dontDraw = false;
|
|
}
|
|
|
|
//-------------------------------------------------------------- ToggleGliderFacing
|
|
|
|
void ToggleGliderFacing (gliderPtr thisGlider)
|
|
{
|
|
if (thisGlider->mode != kGliderNormal)
|
|
return;
|
|
|
|
if (thisGlider->facing == kFaceLeft)
|
|
FlagGliderFaceRight(thisGlider);
|
|
else
|
|
FlagGliderFaceLeft(thisGlider);
|
|
}
|
|
|
|
//-------------------------------------------------------------- InsureGliderFacingRight
|
|
|
|
void InsureGliderFacingRight (gliderPtr thisGlider)
|
|
{
|
|
if ((twoPlayerGame) && (onePlayerLeft) && (thisGlider->which == playerDead))
|
|
return;
|
|
|
|
if ((thisGlider->facing == kFaceLeft) && (thisGlider->mode != kGliderBurning))
|
|
FlagGliderFaceRight(thisGlider);
|
|
}
|
|
|
|
//-------------------------------------------------------------- InsureGliderFacingLeft
|
|
|
|
void InsureGliderFacingLeft (gliderPtr thisGlider)
|
|
{
|
|
if ((twoPlayerGame) && (onePlayerLeft) && (thisGlider->which == playerDead))
|
|
return;
|
|
|
|
if ((thisGlider->facing == kFaceRight) && (thisGlider->mode != kGliderBurning))
|
|
FlagGliderFaceLeft(thisGlider);
|
|
}
|
|
|
|
//-------------------------------------------------------------- ReadyGliderForTripUpStairs
|
|
|
|
void ReadyGliderForTripUpStairs (gliderPtr thisGlider)
|
|
{
|
|
#define kVGliderAppearsComingUp 100
|
|
|
|
if ((twoPlayerGame) && (thisGlider->which == playerDead) && (onePlayerLeft))
|
|
return;
|
|
|
|
thisGlider->facing = kFaceLeft;
|
|
thisGlider->mode = kGliderComingUp;
|
|
thisGlider->src = gliderSrc[2];
|
|
thisGlider->mask = gliderSrc[2];
|
|
thisGlider->hVel = 0;
|
|
thisGlider->vVel = 0;
|
|
thisGlider->hDesiredVel = 0;
|
|
thisGlider->vDesiredVel = 0;
|
|
thisGlider->tipped = false;
|
|
|
|
rightClip = GetUpStairsRightEdge();
|
|
thisGlider->dest = thisGlider->src;
|
|
ZeroRectCorner(&thisGlider->dest);
|
|
QOffsetRect(&thisGlider->dest, rightClip, kVGliderAppearsComingUp);
|
|
thisGlider->whole = thisGlider->dest;
|
|
thisGlider->destShadow.left = thisGlider->dest.left;
|
|
thisGlider->destShadow.right = thisGlider->dest.right;
|
|
thisGlider->wholeShadow = thisGlider->destShadow;
|
|
|
|
FinishGliderUpStairs(thisGlider);
|
|
}
|
|
|
|
//-------------------------------------------------------------- ReadyGliderForTripDownStairs
|
|
|
|
void ReadyGliderForTripDownStairs (gliderPtr thisGlider)
|
|
{
|
|
#define kVGliderAppearsComingDown 100
|
|
|
|
if ((twoPlayerGame) && (thisGlider->which == playerDead) && (onePlayerLeft))
|
|
return;
|
|
|
|
thisGlider->facing = kFaceRight;
|
|
thisGlider->mode = kGliderComingDown;
|
|
thisGlider->src = gliderSrc[0];
|
|
thisGlider->mask = gliderSrc[0];
|
|
thisGlider->hVel = 0;
|
|
thisGlider->vVel = 0;
|
|
thisGlider->hDesiredVel = 0;
|
|
thisGlider->vDesiredVel = 0;
|
|
thisGlider->tipped = false;
|
|
|
|
leftClip = GetDownStairsLeftEdge();
|
|
thisGlider->dest = thisGlider->src;
|
|
ZeroRectCorner(&thisGlider->dest);
|
|
QOffsetRect(&thisGlider->dest, leftClip - kGliderWide, kVGliderAppearsComingDown);
|
|
thisGlider->whole = thisGlider->dest;
|
|
thisGlider->destShadow.left = thisGlider->dest.left;
|
|
thisGlider->destShadow.right = thisGlider->dest.right;
|
|
thisGlider->wholeShadow = thisGlider->destShadow;
|
|
|
|
FinishGliderDownStairs(thisGlider);
|
|
}
|
|
|
|
//-------------------------------------------------------------- StartGliderFoilGoing
|
|
|
|
void StartGliderFoilGoing (gliderPtr thisGlider)
|
|
{
|
|
if ((thisGlider->mode == kGliderGoingFoil) || (thisGlider->mode == kGliderInLimbo))
|
|
return;
|
|
|
|
QuickFoilRefresh(false);
|
|
|
|
thisGlider->mode = kGliderGoingFoil;
|
|
thisGlider->whole = thisGlider->dest;
|
|
thisGlider->frame = 0;
|
|
if (thisGlider->facing == kFaceLeft)
|
|
{
|
|
thisGlider->src = gliderSrc[(10 - thisGlider->frame) + kLeftFadeOffset];
|
|
thisGlider->mask = gliderSrc[(10 - thisGlider->frame) + kLeftFadeOffset];
|
|
}
|
|
else
|
|
{
|
|
thisGlider->src = gliderSrc[10 - thisGlider->frame];
|
|
thisGlider->mask = gliderSrc[10 - thisGlider->frame];
|
|
}
|
|
}
|
|
|
|
//-------------------------------------------------------------- StartGliderFoilLosing
|
|
|
|
void StartGliderFoilLosing (gliderPtr thisGlider)
|
|
{
|
|
if ((thisGlider->mode == kGliderLosingFoil) ||
|
|
(thisGlider->mode == kGliderInLimbo))
|
|
return;
|
|
|
|
QuickFoilRefresh(false);
|
|
PlayPrioritySound(kFizzleSound, kFizzlePriority);
|
|
|
|
thisGlider->mode = kGliderLosingFoil;
|
|
thisGlider->whole = thisGlider->dest;
|
|
thisGlider->frame = 0;
|
|
if (thisGlider->facing == kFaceLeft)
|
|
{
|
|
thisGlider->src = gliderSrc[(10 - thisGlider->frame) + kLeftFadeOffset];
|
|
thisGlider->mask = gliderSrc[(10 - thisGlider->frame) + kLeftFadeOffset];
|
|
}
|
|
else
|
|
{
|
|
thisGlider->src = gliderSrc[10 - thisGlider->frame];
|
|
thisGlider->mask = gliderSrc[10 - thisGlider->frame];
|
|
}
|
|
}
|
|
|
|
//-------------------------------------------------------------- TagGliderIdle
|
|
|
|
void TagGliderIdle (gliderPtr thisGlider)
|
|
{
|
|
if ((twoPlayerGame) && (onePlayerLeft) && (thisGlider->which == playerDead))
|
|
return;
|
|
|
|
thisGlider->wasMode = thisGlider->mode;
|
|
thisGlider->mode = kGliderIdle;
|
|
thisGlider->hVel = 30; // used for 30 frame delay
|
|
}
|
|
|