Pararena2/Sources/CommonPerson.c

1 line
12 KiB
C
Executable File

//============================================================
//============================================================
//== ==
//== Common Person Handling Routines ==
//== ==
//============================================================
//============================================================
//======================================================== Includes
#include "Globals.h"
#include "UnivUtilities.h"
#include "CommonPerson.h"
#include "SoundUtils.h"
#include "Dynamics.h"
#include "Computer.h"
#include "Human.h"
#include "PlayUtils.h"
#include "Ball.h"
#include "Render.h"
//======================================================== Functions
//======================================================== PersonRectFromPosition
void PersonRectFromPosition (playerType *who)
{
short rootHeight, actualHeight;
short indexX, absoluteX, fractionalX;
short indexZ, fractionalZ;
who->isRect.left = (who->xPos / 64) - 16 + displayHCenter;
who->isRect.right = who->isRect.left + 32;
absoluteX = who->xPos;
if (absoluteX < 0)
absoluteX = -absoluteX;
indexX = absoluteX / 512;
fractionalX = absoluteX % 512;
indexZ = (who->zPos / 512) + 40;
fractionalZ = who->zPos % 512;
rootHeight = vertTable[indexX][indexZ];
actualHeight = rootHeight + (fractionalX * (vertTable[indexX + 1][indexZ] -
rootHeight)) / 512;
actualHeight += (fractionalZ * (vertTable[indexX][indexZ + 1] - rootHeight)) / 512;
who->isRect.bottom = actualHeight + 4;
who->isRect.top = who->isRect.bottom - 44;
if ((who->isRect.bottom > screenHigh) || (who->isRect.top < 0) ||
(who->isRect.right > screenWide) || (who->isRect.left < 0))
{
who->isRect = who->wasRect;
}
}
//======================================================== ResetPerson
void ResetPerson (playerType *who)
{
if (who->selector == kPlayerSelector)
{
who->dirFlagSrc = kFacingRested;
who->postFlagSrc = kStanding;
who->arrayFlagMask = kFadeMask;
who->dirFlagMask = fadeMaskSequence[0];
who->postFlagMask = kStanding;
}
else
{
who->dirFlagSrc = kFacingRested;
who->postFlagSrc = kStanding;
who->arrayFlagMask = kFadeMask;
who->dirFlagMask = fadeMaskSequence[0];
who->postFlagMask = kStanding;
}
who->xPos = who->initXPos;
who->zPos = who->initZPos;
who->xVel = 0;
who->zVel = 0;
who->direction = kFacingRested;
who->mode = kInStasis;
who->posture = kStanding;
who->flag = kLengthOfPenalty;
who->justHitWall = 0;
who->justHitBall = 0;
who->justHitOpponent = 0;
who->loopsBallHeld = 0;
who->brakeApplied = FALSE;
who->bashApplied = FALSE;
if ((who->persona == kHumanPlayer) || (who->persona == kNetHuman))
who->mouseWasLetUp = TRUE;
PersonRectFromPosition(who);
}
//======================================================== StartPersonBeamOut
void StartPersonBeamOut (playerType *who)
{
PlaySoundSMS(kBeamOutSound);
who->mode = kBeamingOut;
who->flag = 0;
}
//======================================================== MovePerson
void MovePerson (playerType *who)
{
short indexX, indexZ;
short signX, signZ;
short forceX, forceZ;
short frictionX, frictionZ;
indexX = who->xPos;
if (indexX < 0)
{
indexX = -indexX;
signX = -1;
}
else
{
signX = 1;
}
indexX /= 512;
indexZ = who->zPos;
if (indexZ < 0)
{
indexZ = -indexZ;
signZ = -1;
}
else
{
signZ = 1;
}
indexZ /= 512;
if (who->xPos < 0)
{
switch (leftGoalLeague)
{
case kLittleLeague:
forceX = *(littleForceTable + indexX * 82 + indexZ * 2 + kXComponent);
break;
case kJuniorVarsity:
forceX = *(juniorForceTable + indexX * 82 + indexZ * 2 + kXComponent);
break;
case kVarsity:
forceX = *(varsityForceTable + indexX * 82 + indexZ * 2 + kXComponent);
break;
case kMinorLeague:
forceX = *(minorForceTable + indexX * 82 + indexZ * 2 + kXComponent);
break;
case kProfessional:
forceX = *(proForceTable + indexX * 82 + indexZ * 2 + kXComponent);
break;
default:
forceX = 0;
break;
}
}
else
{
switch (rightGoalLeague)
{
case kLittleLeague:
forceX = *(littleForceTable + indexX * 82 + indexZ * 2 + kXComponent);
break;
case kJuniorVarsity:
forceX = *(juniorForceTable + indexX * 82 + indexZ * 2 + kXComponent);
break;
case kVarsity:
forceX = *(varsityForceTable + indexX * 82 + indexZ * 2 + kXComponent);
break;
case kMinorLeague:
forceX = *(minorForceTable + indexX * 82 + indexZ * 2 + kXComponent);
break;
case kProfessional:
forceX = *(proForceTable + indexX * 82 + indexZ * 2 + kXComponent);
break;
default:
forceX = 0;
break;
}
}
switch (forceX)
{
case kOutOBounds:
who->flag = kIsOutOfBounds;
break;
case kGoalPath:
case kBackBoard:
if (who->zPos < 0)
{
who->flag = kIsOutOfBounds;
}
else
{
HandlePersonWallCollision(who);
who->xPos += (who->xVel / kVelocitySensitive);
who->zPos += (who->zVel / kVelocitySensitive);
}
break;
default:
who->flag = kIsNormal;
forceX *= signX;
if (who->xPos < 0)
{
switch (leftGoalLeague)
{
case kLittleLeague:
forceZ = *(littleForceTable + indexX * 82 + indexZ * 2 +
kZComponent) * signZ;
break;
case kJuniorVarsity:
forceZ = *(juniorForceTable + indexX * 82 + indexZ * 2 +
kZComponent) * signZ;
break;
case kVarsity:
forceZ = *(varsityForceTable + indexX * 82 + indexZ * 2 +
kZComponent) * signZ;
break;
case kMinorLeague:
forceZ = *(minorForceTable + indexX * 82 + indexZ * 2 +
kZComponent) * signZ;
break;
case kProfessional:
forceZ = *(proForceTable + indexX * 82 + indexZ * 2 +
kZComponent) * signZ;
break;
default:
forceZ = 0;
break;
}
}
else
{
switch (rightGoalLeague)
{
case kLittleLeague:
forceZ = *(littleForceTable + indexX * 82 + indexZ * 2 +
kZComponent) * signZ;
break;
case kJuniorVarsity:
forceZ = *(juniorForceTable + indexX * 82 + indexZ * 2 +
kZComponent) * signZ;
break;
case kVarsity:
forceZ = *(varsityForceTable + indexX * 82 + indexZ * 2 +
kZComponent) * signZ;
break;
case kMinorLeague:
forceZ = *(minorForceTable + indexX * 82 + indexZ * 2 +
kZComponent) * signZ;
break;
case kProfessional:
forceZ = *(proForceTable + indexX * 82 + indexZ * 2 +
kZComponent) * signZ;
break;
default:
forceZ = 0;
break;
}
}
who->xVel -= forceX;
who->zVel -= forceZ;
if (who->justHitWall == 0)
{
frictionX = who->xVel / kFrictionFraction;
frictionZ = who->zVel / kFrictionFraction;
who->xVel -= frictionX;
who->zVel -= frictionZ;
}
who->xPos += (who->xVel / kVelocitySensitive);
who->zPos += (who->zVel / kVelocitySensitive);
break;
}
PersonRectFromPosition(who);
}
//======================================================== OpponentDecides
void OpponentDecides (playerType *who)
{
switch (who->persona)
{
case kSimpleGeorge:
GeorgeDecides(who);
break;
case kMadMara:
MaraDecides(who);
break;
case kHeavyOtto:
OttoDecides(who);
break;
case kCleverClaire:
ClaireDecides(who);
break;
case kMisterEaze:
EazeDecides(who);
break;
case kMissTeak:
TeakDecides(who);
break;
case kNetHuman:
DetermineHumanFacing(who);
ProcessNetPlayerInput();
break;
default:
break;
}
}
//======================================================== DoPersonInArena
void DoPersonInArena (playerType *who)
{
switch (who->flag)
{
case kIsNormal:
case kIsRebounding:
if (who->persona == kHumanPlayer)
{
DetermineHumanFacing(who);
GetHumanInput();
}
else
{
OpponentDecides(who);
}
MovePerson(who);
break;
case kIsOutOfBounds:
if ((theBall.modifier == kPlayerHolding) &&
(who->selector == kPlayerSelector))
{
HandlePlayerFoul();
ResetBall();
}
else if ((theBall.modifier == kOpponentHolding) &&
(who->selector == kOpponentSelector))
{
HandleOpponentFoul();
ResetBall();
}
StartPersonBeamOut(who);
break;
}
if (((theBall.modifier == kPlayerHolding) && (who->selector == kPlayerSelector)) ||
((theBall.modifier == kOpponentHolding) &&
(who->selector == kOpponentSelector)))
{
if (who->loopsBallHeld != 0)
{
who->loopsBallHeld--;
UpdateBallTimers(who);
if (who->loopsBallHeld == 120)
{
PlaySoundSMS(kHoldingSound);
}
else if (who->loopsBallHeld == 0)
{
if (whosGotBall == kPlayerHasBall)
{
HandlePlayerFoul();
}
else
{
HandleOpponentFoul();
}
theBall.eraseTheBall = TRUE;
ResetBall();
}
}
}
if (who->selector == kPlayerSelector)
{
who->dirFlagSrc = who->direction;
who->postFlagSrc = who->posture;
who->arrayFlagMask = kMask;
who->dirFlagMask = who->direction;
who->postFlagMask = who->posture;
}
else
{
who->dirFlagSrc = who->direction;
who->postFlagSrc = who->posture;
who->arrayFlagMask = kMask;
who->dirFlagMask = who->direction;
who->postFlagMask = who->posture;
}
}
//======================================================== DoPersonBeamingIn
void DoPersonBeamingIn (playerType *who)
{
who->flag--;
if (who->flag < 0) // person has fully faded in
{
who->mode = kInArena;
who->flag = kIsNormal;
if (who->selector == kPlayerSelector)
{
who->dirFlagSrc = who->direction;
who->postFlagSrc = who->posture;
who->arrayFlagMask = kMask;
who->dirFlagMask = who->direction;
who->postFlagMask = who->posture;
}
else
{
who->dirFlagSrc = who->direction;
who->postFlagSrc = who->posture;
who->arrayFlagMask = kMask;
who->dirFlagMask = who->direction;
who->postFlagMask = who->posture;
}
}
else // person is still fading in
{
if (who->selector == kPlayerSelector)
{
who->dirFlagSrc = kFacingRested;
who->postFlagSrc = who->posture;
who->arrayFlagMask = kFadeMask;
who->dirFlagMask = fadeMaskSequence[who->flag];
who->postFlagMask = who->posture;
}
else
{
who->dirFlagSrc = kFacingRested;
who->postFlagSrc = who->posture;
who->arrayFlagMask = kFadeMask;
who->dirFlagMask = fadeMaskSequence[who->flag];
who->postFlagMask = who->posture;
}
}
}
//======================================================== DoPersonBeamingOut
void DoPersonBeamingOut (playerType *who)
{
who->flag++;
if (who->flag > kEndOfFadeSequence) // person has fully faded out
{
drawThisFrame = TRUE;
who->flag = kEndOfFadeSequence;
ResetPerson(who);
}
else
{
if (who->flag == kEndOfFadeSequence)
drawThisFrame = TRUE;
if (who->selector == kPlayerSelector)
{
who->dirFlagSrc = kFacingRested;
who->postFlagSrc = who->posture;
who->arrayFlagMask = kFadeMask;
who->dirFlagMask = fadeMaskSequence[who->flag];
who->postFlagMask = who->posture;
}
else
{
who->dirFlagSrc = kFacingRested;
who->postFlagSrc = who->posture;
who->arrayFlagMask = kFadeMask;
who->dirFlagMask = fadeMaskSequence[who->flag];
who->postFlagMask = who->posture;
}
}
}
//======================================================== PersonStasisToBeamIn
void PersonStasisToBeamIn (playerType *who)
{
PlaySoundSMS(kBeamInSound);
who->mode = kBeamingIn;
who->flag = kEndOfFadeSequence;
if (who->selector == kPlayerSelector)
{
who->dirFlagSrc = kFacingRested;
who->postFlagSrc = who->posture;
who->arrayFlagMask = kFadeMask;
who->dirFlagMask = fadeMaskSequence[who->flag];
who->postFlagMask = who->posture;
}
else
{
who->dirFlagSrc = kFacingRested;
who->postFlagSrc = who->posture;
who->arrayFlagMask = kFadeMask;
who->dirFlagMask = fadeMaskSequence[who->flag];
who->postFlagMask = who->posture;
}
}
//======================================================== DoPersonInStasis
void DoPersonInStasis (playerType *who)
{
who->flag--;
if (who->flag < 1)
PersonStasisToBeamIn(who);
}
//======================================================== HandlePerson
void HandlePerson (playerType *who)
{
switch (who->mode)
{
case kInArena:
DoPersonInArena(who);
break;
case kBeamingIn:
DoPersonBeamingIn(who);
break;
case kBeamingOut:
DoPersonBeamingOut(who);
break;
case kInStasis:
DoPersonInStasis(who);
break;
}
}