Pararena2/Sources/Human.c

1 line
7.7 KiB
C
Executable File

/*============================================================*/
/*============================================================*/
/*== ==*/
/*== Human Player Specific Routines ==*/
/*== ==*/
/*============================================================*/
/*============================================================*/
/*======================================================== Includes */
#include "Globals.h"
#include "UnivUtilities.h"
#include "Human.h"
#include "SoundUtils.h"
#include "Dynamics.h"
/*======================================================== Functions */
/*======================================================== DetermineHumanFacing */
void DetermineHumanFacing (playerType *who)
{
#define kLoHThreshhold -12
#define kHiHThreshhold 12
#define kLoVThreshhold -8
#define kHiVThreshhold 8
if (who->hMouse < kLoHThreshhold)
{
if (who->vMouse < kLoVThreshhold)
who->direction = kFacingSouthWest;
else
{
if (who->vMouse > kHiVThreshhold)
who->direction = kFacingNorthWest;
else
who->direction = kFacingWest;
}
}
else
{
if (who->hMouse > kHiHThreshhold)
{
if (who->vMouse < kLoVThreshhold)
who->direction = kFacingSouthEast;
else
{
if (who->vMouse > kHiVThreshhold)
who->direction = kFacingNorthEast;
else
who->direction = kFacingEast;
}
}
else
{
if (who->vMouse < kLoVThreshhold)
who->direction = kFacingSouth;
else
{
if (who->vMouse > kHiVThreshhold)
who->direction = kFacingNorth;
else
who->direction = kFacingRested;
}
}
}
}
/*======================================================== GetHumanInput */
void GetHumanInput (void)
{
Point mousePt;
short boardXForce, boardZForce;
Boolean brakeOn, bashOn;
GetMouse(&mousePt);
LocalToGlobal(&mousePt);
if (ForcePointInRect(&mousePt, &mouseFrame))
SetMouse(mousePt);
thePlayer.hMouse = (mousePt.h - screenHCenter) / kPlayerInputSensitive;
thePlayer.vMouse = (screenVCenter - mousePt.v) / kPlayerInputSensitive;
thePlayer.buttonIs = Button();
brakeOn = BitTst(&theKeyMap, kSpaceBarMap);
bashOn = BitTst(&theKeyMap, kBKeyMap) || BitTst(&theKeyMap, kMKeyMap) ||
BitTst(&theKeyMap, kNKeyMap);
boardXForce = thePlayer.hMouse;
boardZForce = thePlayer.vMouse;
if (boardXForce > maxBoardForce)
boardXForce = maxBoardForce;
else if (boardXForce < -maxBoardForce)
boardXForce = -maxBoardForce;
if (boardZForce > maxBoardForce)
boardZForce = maxBoardForce;
else if (boardZForce < -maxBoardForce)
boardZForce = -maxBoardForce;
thePlayer.bashApplied = FALSE;
if ((whosGotBall != kPlayerHasBall) && (bashOn) && (!brakeOn))
{
thePlayer.bashApplied = bashOn;
boardXForce = boardForceTable[thePlayer.direction][kXComponent];
boardZForce = boardForceTable[thePlayer.direction][kZComponent];
boardXForce *= 3; /* 150% increase in board force */
boardZForce *= 3;
}
if ((thePlayer.buttonIs) && (!thePlayer.bashApplied))
{
boardXForce += boardXForce / kAddForceFract; /* 25% increase in board force */
boardZForce += boardZForce / kAddForceFract; /* tried 50%, but it was harsh */
}
if (thePlayer.justHitWall == 0)
{
thePlayer.xVel += boardXForce;
thePlayer.zVel += boardZForce;
}
if ((brakeOn == TRUE) && (thePlayer.brakeApplied == FALSE))
PlaySoundSMS(kBrakeSound);
thePlayer.brakeApplied = brakeOn;
if (brakeOn)
{
thePlayer.xVel -= thePlayer.xVel / 10; /* a 10% decrease in velocity */
thePlayer.zVel -= thePlayer.zVel / 10;
}
if (thePlayer.buttonIs)
{
if ((theBall.modifier == kPlayerHolding) && (thePlayer.mouseWasLetUp))
DoPersonBallParted(&thePlayer);
thePlayer.posture = kCrouching;
}
else
{
thePlayer.mouseWasLetUp = TRUE;
if (theBall.modifier == kPlayerHolding)
thePlayer.posture = kCarrying;
else
thePlayer.posture = kStanding;
}
}
/*======================================================== PrepareNetHumanInput */
void PrepareNetHumanInput (void)
{
Point mousePt;
GetMouse(&mousePt);
LocalToGlobal(&mousePt);
if (ForcePointInRect(&mousePt, &mouseFrame))
SetMouse(mousePt);
thePlayer.hMouse = (mousePt.h - screenHCenter) / kPlayerInputSensitive;
thePlayer.vMouse = (screenVCenter - mousePt.v) / kPlayerInputSensitive;
thePlayer.buttonIs = Button();
thePlayer.brakeApplied = BitTst(&theKeyMap, kSpaceBarMap);
thePlayer.bashApplied = BitTst(&theKeyMap, kBKeyMap) || BitTst(&theKeyMap, kMKeyMap) ||
BitTst(&theKeyMap, kNKeyMap);
}
/*======================================================== ProcessNetPlayerInput */
void ProcessNetPlayerInput (void)
{
short boardXForce, boardZForce;
boardXForce = theOpponent.hMouse;
boardZForce = theOpponent.vMouse;
if (boardXForce > maxBoardForce)
boardXForce = maxBoardForce;
else if (boardXForce < -maxBoardForce)
boardXForce = -maxBoardForce;
if (boardZForce > maxBoardForce)
boardZForce = maxBoardForce;
else if (boardZForce < -maxBoardForce)
boardZForce = -maxBoardForce;
if ((theOpponent.bashApplied) && (whosGotBall != kOpponentHasBall) &&
(!theOpponent.brakeApplied))
{
boardXForce = boardForceTable[theOpponent.direction][kXComponent];
boardZForce = boardForceTable[theOpponent.direction][kZComponent];
boardXForce *= 3; /* 150% increase in board force */
boardZForce *= 3;
}
if ((theOpponent.buttonIs) && (!theOpponent.bashApplied))
{
boardXForce += boardXForce / kAddForceFract; /* 25% increase in board force */
boardZForce += boardZForce / kAddForceFract; /* tried 50%, but it was harsh */
}
if (theOpponent.justHitWall == 0)
{
theOpponent.xVel += boardXForce;
theOpponent.zVel += boardZForce;
}
if ((wasBrakeOn == FALSE) && (theOpponent.brakeApplied == TRUE))
PlaySoundSMS(kBrakeSound);
wasBrakeOn = theOpponent.brakeApplied;
if (wasBrakeOn)
{
theOpponent.bashApplied = FALSE;
theOpponent.xVel -= theOpponent.xVel / 10; /* a 10% decrease in velocity */
theOpponent.zVel -= theOpponent.zVel / 10;
}
if (theOpponent.buttonIs)
{
if ((theBall.mode == kBallHeld) && (theBall.modifier == kOpponentHolding) &&
(theOpponent.mouseWasLetUp))
DoPersonBallParted(&theOpponent);
theOpponent.posture = kCrouching;
}
else
{
theOpponent.mouseWasLetUp = TRUE;
if (theBall.modifier == kOpponentHolding)
theOpponent.posture = kCarrying;
else
theOpponent.posture = kStanding;
}
}
/*======================================================== HandleBoardCursor */
void HandleBoardCursor (void)
{
short rootHeight, actualHeight;
short indexX, absoluteX, fractionalX;
short indexZ, fractionalZ;
if ((!showBoardCursor) || (disableBoardCursor))
return;
boardCursor.xPos = thePlayer.xPos + (thePlayer.hMouse * 16);
boardCursor.zPos = thePlayer.zPos + (thePlayer.vMouse * 16);
boardCursor.isRect.left = (boardCursor.xPos / 64) + displayHCenter - 5;
if (boardCursor.isRect.left < 0)
boardCursor.isRect.left = 0;
else if (boardCursor.isRect.left + 16 > screenWide)
boardCursor.isRect.left = screenWide - 16;
boardCursor.isRect.right = boardCursor.isRect.left + 16;
absoluteX = boardCursor.xPos;
if (absoluteX < 0)
absoluteX = -absoluteX;
indexX = absoluteX / 512;
fractionalX = absoluteX % 512;
indexZ = (boardCursor.zPos / 512) + 40;
fractionalZ = boardCursor.zPos % 512;
rootHeight = vertTable[indexX][indexZ];
actualHeight = rootHeight + (fractionalX * (vertTable[indexX + 1][indexZ] - rootHeight)) / 512;
actualHeight += (fractionalZ * (vertTable[indexX][indexZ + 1] - rootHeight)) / 512;
boardCursor.isRect.bottom = actualHeight + 4;
if (boardCursor.isRect.bottom > screenHigh)
boardCursor.isRect.bottom = screenHigh;
else if (boardCursor.isRect.bottom < 12)
boardCursor.isRect.bottom = 12;
boardCursor.isRect.top = boardCursor.isRect.bottom - 8;
}