GliderPRO/Sources/Modes.c

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
}