mirror of
https://github.com/libretro/scummvm.git
synced 2025-02-02 17:03:13 +00:00
488 lines
12 KiB
C++
488 lines
12 KiB
C++
/* ScummVM - Graphic Adventure Engine
|
|
*
|
|
* ScummVM is the legal property of its developers, whose names
|
|
* are too numerous to list here. Please refer to the COPYRIGHT
|
|
* file distributed with this source distribution.
|
|
*
|
|
* This program is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*
|
|
*/
|
|
|
|
/*
|
|
* Copyright (C) 2006-2010 - Frictional Games
|
|
*
|
|
* This file is part of Penumbra Overture.
|
|
*/
|
|
|
|
#ifndef GAME_PLAYER_H
|
|
#define GAME_PLAYER_H
|
|
|
|
#include "hpl1/engine/engine.h"
|
|
|
|
using namespace hpl;
|
|
|
|
#include "hpl1/penumbra-overture/GameTypes.h"
|
|
|
|
class cInit;
|
|
class iPlayerMoveState;
|
|
class iPlayerState;
|
|
class cPlayer;
|
|
|
|
class iPlayerWeaponCallback;
|
|
class cPlayerGroundRayCallback;
|
|
class cPlayerPickRayCallback;
|
|
class cPlayerHeadMove;
|
|
class cPlayerHealth;
|
|
class cPlayerEarRing;
|
|
class cPlayerLean;
|
|
class cPlayerDamage;
|
|
class cPlayerDeath;
|
|
class cPlayerFlashLight;
|
|
class cPlayerGlowStick;
|
|
class cPlayerFlare;
|
|
class cPlayerNoiseFilter;
|
|
class cPlayerFearFilter;
|
|
class cPlayerLookAt;
|
|
class cPlayerHidden;
|
|
class cPlayerAmbientLight;
|
|
|
|
class cPlayerBodyCallback;
|
|
|
|
typedef Common::Array<iPlayerState *> tPlayerStateVec;
|
|
typedef tPlayerStateVec::iterator tPlayerStateVecIt;
|
|
|
|
typedef Common::Array<iPlayerMoveState *> tPlayerMoveStateVec;
|
|
typedef tPlayerMoveStateVec::iterator tPlayerMoveStateVecIt;
|
|
|
|
class cInventoryItem;
|
|
class cPlayer_GlobalSave;
|
|
class cSavedWorld;
|
|
|
|
//---------------------------------------------
|
|
|
|
kSaveData_BaseClass(cPlayer) {
|
|
kSaveData_ClassInit(cPlayer) public :
|
|
|
|
int mlStat_NumOfSaves;
|
|
|
|
cContainerList<cSaveGame_cGameCollideScript> mlstCollideCallbacks;
|
|
|
|
virtual iSaveObject *CreateSaveObject(cSaveObjectHandler * apSaveObjectHandler, cGame * apGame);
|
|
virtual int GetSaveCreatePrio();
|
|
};
|
|
|
|
//---------------------------------------------
|
|
|
|
class iPlayerMoveState {
|
|
public:
|
|
iPlayerMoveState(cPlayer *apPlayer, cInit *apInit);
|
|
virtual ~iPlayerMoveState() = default;
|
|
|
|
void SetupBody();
|
|
|
|
void InitState(iPlayerMoveState *apPrevState);
|
|
|
|
void Update(float afTimeStep);
|
|
|
|
void Stop();
|
|
|
|
void Start();
|
|
|
|
virtual void EnterState(iPlayerMoveState *apPrevState) {}
|
|
virtual void LeaveState(iPlayerMoveState *apNextState) {}
|
|
|
|
virtual void OnUpdate(float afTimeStep) {}
|
|
|
|
bool mbActive;
|
|
|
|
float mfForwardSpeed;
|
|
float mfBackwardSpeed;
|
|
float mfSidewaySpeed;
|
|
|
|
float mfForwardAcc;
|
|
float mfForwardDeacc;
|
|
float mfSidewayAcc;
|
|
float mfSidewayDeacc;
|
|
|
|
float mfMaxHeadMove;
|
|
float mfMinHeadMove;
|
|
float mfHeadMoveSpeed;
|
|
float mfHeadMoveBackSpeed;
|
|
|
|
float mfFootStepMul;
|
|
|
|
tString msStepType;
|
|
|
|
float mfSpeedMul;
|
|
|
|
float mfHeightAddCount;
|
|
float mfHeightAdd;
|
|
float mfHeightAddSpeed;
|
|
|
|
cPlayer *mpPlayer;
|
|
cPlayerHeadMove *mpHeadMove;
|
|
|
|
cInit *mpInit;
|
|
cConfigFile *mpGameConfig;
|
|
|
|
ePlayerMoveState mPrevMoveState;
|
|
|
|
ePlayerMoveState mType;
|
|
};
|
|
//---------------------------------------------
|
|
|
|
class cPlayer : public iUpdateable {
|
|
friend class cSaveData_cPlayer;
|
|
|
|
public:
|
|
cPlayer(cInit *apInit);
|
|
~cPlayer();
|
|
|
|
////////////////////////////////////////
|
|
// Interaction
|
|
|
|
void MoveForwards(float afMul, float afTimeStep);
|
|
void MoveSideways(float afMul, float afTimeStep);
|
|
void AddYaw(float afVal);
|
|
void AddPitch(float afVal);
|
|
void Lean(float afMul, float afTimeStep);
|
|
|
|
void StartInteract();
|
|
void StopInteract();
|
|
void StartExamine();
|
|
void StopExamine();
|
|
void StartHolster();
|
|
|
|
void Jump();
|
|
|
|
void StartRun();
|
|
void StopRun();
|
|
|
|
void StartCrouch();
|
|
void StopCrouch();
|
|
|
|
void StartInteractMode();
|
|
|
|
void StartInventory();
|
|
|
|
void StartInventoryShortCut(int alNum);
|
|
|
|
void StartFlashLightButton();
|
|
|
|
void StartGlowStickButton();
|
|
|
|
////////////////////////////////
|
|
// Actions
|
|
void SetStartPos(const tString &asName);
|
|
|
|
void FootStep(float afMul, const tString &asType = "", bool abSkipCount = false);
|
|
|
|
void ChangeState(ePlayerState aState);
|
|
void ChangeMoveState(ePlayerMoveState aState, bool abSetHeadHeightDirectly = false);
|
|
|
|
void AddCollideScript(eGameCollideScriptType aType, const tString &asFunc, const tString &asEntity);
|
|
void RemoveCollideScript(eGameCollideScriptType aType, const tString &asFunc);
|
|
void RemoveCollideScriptWithChildEntity(iGameEntity *apEntity);
|
|
void ClearCollideScripts();
|
|
|
|
void SetHealth(float afX);
|
|
void AddHealth(float afX);
|
|
float GetHealth() { return mfHealth; }
|
|
void Damage(float afDamage, ePlayerDamageType aType);
|
|
|
|
void DestroyWorldObjects();
|
|
|
|
iSaveData *CreateSaveData();
|
|
|
|
/////////////////////////////////////////
|
|
// Events
|
|
void OnWorldLoad();
|
|
void OnWorldExit();
|
|
void OnStart();
|
|
void Update(float afTimeStep);
|
|
void Reset();
|
|
void OnDraw();
|
|
void OnPostSceneDraw();
|
|
|
|
/////////////////////////////////////////
|
|
// Saving
|
|
|
|
void AddSaveData(cSavedWorld *apSavedWorld);
|
|
void LoadSaveData(cSavedWorld *apSavedWorld);
|
|
|
|
void SaveToGlobal(cPlayer_GlobalSave *apSave);
|
|
void LoadFromGlobal(cPlayer_GlobalSave *apSave);
|
|
|
|
/////////////////////////////////////////
|
|
// Properties
|
|
bool IsDead();
|
|
|
|
void SetActive(bool abActive);
|
|
bool IsActive() { return mbActive; }
|
|
|
|
void SetPushBody(iPhysicsBody *apBody) { mpPushBody = apBody; }
|
|
iPhysicsBody *GetPushBody() { return mpPushBody; }
|
|
|
|
float GetDefaultMass() { return mfDefaultMass; }
|
|
|
|
float GetMass() { return mfMass; }
|
|
void SetMass(float afX);
|
|
|
|
void SetPower(float afX);
|
|
void AddPower(float afX);
|
|
float GetPower() { return mfPower; }
|
|
|
|
iCharacterBody *GetCharacterBody() { return mpCharBody; }
|
|
cCamera3D *GetCamera() { return mpCamera; }
|
|
|
|
cVector3f GetSize() { return mvSize; }
|
|
float GetCrouchHeight() { return mfCrouchHeight; }
|
|
|
|
float GetMaxPushDist() { return mfMaxPushDist; }
|
|
float GetMaxPushSpeed() { return mfMaxPushSpeed; }
|
|
cVector2f GetMaxPushHeadMovement() { return mvMaxPushHeadMovement; }
|
|
cVector2f GetMinPushHeadMovement() { return mvMinPushHeadMovement; }
|
|
|
|
float GetMaxMoveDist() { return mfMaxMoveDist; }
|
|
|
|
float GetMaxGrabDist() { return mfMaxGrabDist; }
|
|
|
|
float GetMaxUseItemDist() { return mfMaxUseItemDist; }
|
|
|
|
void SetPrevMoveState(ePlayerMoveState aState);
|
|
iPlayerMoveState *GetMoveStateData(ePlayerMoveState aState) { return mvMoveStates[aState]; }
|
|
ePlayerMoveState GetMoveState() { return mMoveState; }
|
|
ePlayerState GetState() { return mState; }
|
|
|
|
iPlayerState *GetStateData(ePlayerState aState) { return mvStates[aState]; }
|
|
|
|
float GetSpeedMul() { return mfSpeedMul; }
|
|
void SetSpeedMul(float afSpeedMul);
|
|
|
|
float GetHealthSpeedMul() { return mfHealthSpeedMul; }
|
|
void SetHealthSpeedMul(float afHealthSpeedMul);
|
|
|
|
void SetHeadMoveSizeMul(float afX) { mfHeadMoveSizeMul = afX; }
|
|
void SetHeadMoveSpeedMul(float afX) { mfHeadMoveSpeedMul = afX; }
|
|
float GetHeadMoveSizeMul() { return mfHeadMoveSizeMul; }
|
|
float GetHeadMoveSpeedMul() { return mfHeadMoveSpeedMul; }
|
|
|
|
float GetLookSpeed() { return mfLookSpeed; }
|
|
|
|
void SetCrossHairState(eCrossHairState aState) { mCrossHairState = aState; }
|
|
eCrossHairState GetCrossHairState() { return mCrossHairState; }
|
|
|
|
iPhysicsBody *GetPickedBody();
|
|
void SetPickedBody(iPhysicsBody *apBody);
|
|
float GetPickedDist();
|
|
const cVector3f &GetPickedPos();
|
|
cPlayerPickRayCallback *GetPickRay();
|
|
|
|
float GetCameraHeightAdd() { return mfCameraHeightAdd; }
|
|
bool IsMoving() { return mbMoving; }
|
|
|
|
cPlayerFlashLight *GetFlashLight() { return mpFlashLight; }
|
|
|
|
cPlayerHeadMove *GetHeadMove() { return mpHeadMove; }
|
|
|
|
cPlayerEarRing *GetEarRing() { return mpEarRing; }
|
|
|
|
cPlayerGlowStick *GetGlowStick() { return mpGlowStick; }
|
|
|
|
cPlayerFlare *GetFlare() { return mpFlare; }
|
|
|
|
cPlayerNoiseFilter *GetNoiseFilter() { return mpNoiseFilter; }
|
|
|
|
cPlayerFearFilter *GetFearFilter() { return mpFearFilter; }
|
|
|
|
cPlayerLookAt *GetLookAt() { return mpLookAt; }
|
|
|
|
cPlayerHidden *GetHidden() { return mpHidden; }
|
|
|
|
float GetHeightAdd() { return mfHeightAdd; }
|
|
void SetHeightAdd(float afX) { mfHeightAdd = afX; }
|
|
|
|
cInit *GetInit() { return mpInit; }
|
|
|
|
cVector2f GetInteractMoveBorder() { return mvInteractMoveBorder; }
|
|
|
|
cVector2f GetCrossHairPos() { return mvCrossHairPos; }
|
|
void SetCrossHairPos(const cVector2f &avPos) { mvCrossHairPos = avPos; }
|
|
bool AddCrossHairPos(const cVector2f &avPos);
|
|
void ResetCrossHairPos() { mvCrossHairPos = cVector2f(400, 300); }
|
|
|
|
void SetCurrentItem(cInventoryItem *apItem) { mpCurrentItem = apItem; }
|
|
cInventoryItem *GetCurrentItem() { return mpCurrentItem; }
|
|
void SetItemFlash(bool abX) { mbItemFlash = abX; }
|
|
|
|
void SetWeaponCallback(iPlayerWeaponCallback *apCallback) { mpWeaponCallback = apCallback; }
|
|
iPlayerWeaponCallback *GetWeaponCallback() { return mpWeaponCallback; }
|
|
|
|
bool GetLandedFromJump() { return mbLandedFromJump; }
|
|
void SetLandedFromJump(bool abX) { mbLandedFromJump = abX; }
|
|
|
|
void SetJumpButtonDown(bool abX);
|
|
bool GetJumpButtonDown() { return mbJumpButtonDown; }
|
|
float GetJumpCount() { return mfJumpCount; }
|
|
float GetMaxJumpCount() { return mfMaxJumpCount; }
|
|
|
|
/////////////////////////////////////////
|
|
// Stats
|
|
int mlStat_NumOfSaves;
|
|
|
|
/////////////////////////////////////////
|
|
// State properties
|
|
float mfForwardUpMul;
|
|
float mfForwardRightMul;
|
|
|
|
float mfUpMul;
|
|
float mfRightMul;
|
|
|
|
bool mbPickAtPoint;
|
|
bool mbRotateWithPlayer;
|
|
bool mbUseNormalMass;
|
|
|
|
float mfGrabMassMul;
|
|
|
|
bool mbCanBeThrown;
|
|
bool mbCanBePulled;
|
|
|
|
float mfCurrentMaxInteractDist;
|
|
|
|
// Haptic
|
|
bool mbGrabbingMoveBody;
|
|
bool mbProxyTouching;
|
|
float mfHapticTorqueMul;
|
|
|
|
bool mbDamageFromPos;
|
|
cVector3f mvDamagePos;
|
|
|
|
// Debug
|
|
cVector3f mvLineStart;
|
|
cVector3f mvLineEnd;
|
|
|
|
private:
|
|
cInit *mpInit;
|
|
|
|
cScene *mpScene;
|
|
cGraphics *mpGraphics;
|
|
cResources *mpResources;
|
|
cGraphicsDrawer *mpGfxDrawer;
|
|
|
|
FontData *mpFont;
|
|
|
|
cNode3D mFeetNode;
|
|
|
|
bool mbActive;
|
|
|
|
cCamera3D *mpCamera;
|
|
float mfLookSpeed;
|
|
float mfCameraHeightAdd;
|
|
|
|
cVector3f mvSize;
|
|
float mfCrouchHeight;
|
|
|
|
bool mbJumpButtonDown;
|
|
float mfJumpCount;
|
|
float mfMaxJumpCount;
|
|
|
|
bool mbLandedFromJump;
|
|
|
|
cVector2f mvInteractMoveBorder;
|
|
|
|
float mfHeightAdd;
|
|
|
|
float mfMaxPushDist;
|
|
float mfMaxPushSpeed;
|
|
|
|
float mfMaxMoveDist;
|
|
|
|
float mfMaxGrabDist;
|
|
//float mfMaxGrabForce;
|
|
|
|
float mfMaxUseItemDist;
|
|
|
|
float mfSpeedMul;
|
|
float mfHealthSpeedMul;
|
|
|
|
float mfHeadMoveSizeMul;
|
|
float mfHeadMoveSpeedMul;
|
|
|
|
iPhysicsBody *mpPushBody;
|
|
|
|
Common::Array<cGfxObject *> mvCrossHairs;
|
|
|
|
cVector2f mvMaxPushHeadMovement;
|
|
cVector2f mvMinPushHeadMovement;
|
|
|
|
bool mbMoving;
|
|
|
|
int mlGroundCount;
|
|
|
|
iCharacterBody *mpCharBody;
|
|
|
|
cPlayerGroundRayCallback *mpGroundRayCallback;
|
|
cPlayerPickRayCallback *mpPickRayCallback;
|
|
|
|
cPlayerBodyCallback *mpBodyCallback;
|
|
|
|
cPlayerHeadMove *mpHeadMove;
|
|
cPlayerDamage *mpDamage;
|
|
cPlayerDeath *mpDeath;
|
|
cPlayerFlashLight *mpFlashLight;
|
|
cPlayerLean *mpLean;
|
|
cPlayerEarRing *mpEarRing;
|
|
cPlayerGlowStick *mpGlowStick;
|
|
cPlayerFlare *mpFlare;
|
|
cPlayerHealth *mpHealth;
|
|
cPlayerNoiseFilter *mpNoiseFilter;
|
|
cPlayerFearFilter *mpFearFilter;
|
|
cPlayerLookAt *mpLookAt;
|
|
cPlayerHidden *mpHidden;
|
|
|
|
iPlayerWeaponCallback *mpWeaponCallback;
|
|
|
|
ePlayerState mState;
|
|
tPlayerStateVec mvStates;
|
|
|
|
ePlayerMoveState mMoveState;
|
|
tPlayerMoveStateVec mvMoveStates;
|
|
|
|
eCrossHairState mCrossHairState;
|
|
cVector2f mvCrossHairPos;
|
|
|
|
cInventoryItem *mpCurrentItem;
|
|
cLinearOscillation mItemFlash;
|
|
bool mbItemFlash;
|
|
|
|
float mfHealth;
|
|
|
|
float mfPower;
|
|
|
|
float mfDefaultMass;
|
|
float mfMass;
|
|
|
|
bool mbUpdatingCollisionCallbacks;
|
|
|
|
tSoundEntityList mlstFootStepSounds;
|
|
|
|
// Debug
|
|
bool mbShowHealth;
|
|
bool mbShowSoundsPlaying;
|
|
|
|
tGameCollideScriptMap m_mapCollideCallbacks;
|
|
};
|
|
|
|
#endif // GAME_PLAYER_H
|