1 line
7.7 KiB
C
Executable File
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;
|
|
}
|
|
|
|
|
|
|