mirror of
https://github.com/libretro/scummvm.git
synced 2025-01-25 12:05:53 +00:00
600 lines
10 KiB
C++
600 lines
10 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_HELPER_H
|
|
#define GAME_PLAYER_HELPER_H
|
|
|
|
#include "hpl1/engine/engine.h"
|
|
|
|
using namespace hpl;
|
|
|
|
#include "hpl1/penumbra-overture/GameTypes.h"
|
|
|
|
class cInit;
|
|
class cPlayer;
|
|
|
|
//---------------------------------------------
|
|
|
|
class iPlayerWeaponCallback {
|
|
public:
|
|
virtual ~iPlayerWeaponCallback() = default;
|
|
virtual tString GetModelFile() = 0;
|
|
virtual cMatrixf GetOffsetMatrix() = 0;
|
|
|
|
virtual void OnAttackDown() = 0;
|
|
virtual void OnAttackUp() = 0;
|
|
};
|
|
|
|
//---------------------------------------------
|
|
|
|
class cPlayerGroundRayCallback : public iPhysicsRayCallback {
|
|
public:
|
|
cPlayerGroundRayCallback();
|
|
|
|
void Clear();
|
|
void Reset();
|
|
|
|
void OnWorldExit();
|
|
|
|
bool OnIntersect(iPhysicsBody *pBody, cPhysicsRayParams *apParams);
|
|
|
|
bool mbOnGround;
|
|
iPhysicsMaterial *mpMaterial;
|
|
float mfMinDist;
|
|
};
|
|
|
|
//---------------------------------------------
|
|
|
|
class cPlayerPickRayCallback : public iPhysicsRayCallback {
|
|
public:
|
|
cPlayerPickRayCallback();
|
|
|
|
void OnWorldExit();
|
|
|
|
void Clear();
|
|
|
|
bool OnIntersect(iPhysicsBody *pBody, cPhysicsRayParams *apParams);
|
|
|
|
void CalculateResults();
|
|
|
|
iPhysicsBody *mpPickedBody;
|
|
iPhysicsBody *mpPickedAreaBody;
|
|
|
|
float mfMaxDistance;
|
|
|
|
float mfPickedDist;
|
|
float mfPickedAreaDist;
|
|
|
|
eGameEntityType mLastEntityType;
|
|
|
|
cVector3f mvPickedPos;
|
|
cVector3f mvPickedAreaPos;
|
|
|
|
float mfMinStaticDist;
|
|
};
|
|
|
|
//---------------------------------------------
|
|
|
|
class cPlayerHeadMove {
|
|
public:
|
|
cPlayerHeadMove(cPlayer *apPlayer);
|
|
|
|
void Update(float afTimeStep);
|
|
|
|
void Start();
|
|
void Stop();
|
|
|
|
float GetPos();
|
|
|
|
bool IsActive() { return mbActive; }
|
|
float GetPosition() { return mfPos; }
|
|
float GetClimbPosition() { return mfClimbPos; }
|
|
float GetClimbCount() { return mfClimbCount; }
|
|
|
|
float mfMaxHeadMove;
|
|
float mfMinHeadMove;
|
|
float mfHeadMoveSpeed;
|
|
float mfHeadMoveBackSpeed;
|
|
|
|
float mfFootStepMul;
|
|
|
|
private:
|
|
float mfAdd;
|
|
float mfPos;
|
|
bool mbActive;
|
|
bool mbFootStepped;
|
|
bool mbWasActive;
|
|
|
|
float mfClimbCount;
|
|
float mfClimbPos;
|
|
|
|
cPlayer *mpPlayer;
|
|
};
|
|
|
|
//---------------------------------------------
|
|
|
|
class cPlayerHealth {
|
|
public:
|
|
cPlayerHealth(cInit *apInit);
|
|
|
|
void Reset();
|
|
|
|
void Update(float afTimeStep);
|
|
|
|
void Draw();
|
|
|
|
private:
|
|
cInit *mpInit;
|
|
cGraphicsDrawer *mpDrawer;
|
|
|
|
float mfTimeCount;
|
|
float mfGfxAlpha;
|
|
float mfGfxAlphaAdd;
|
|
float mfGfxGlobalAlpha;
|
|
|
|
cSoundEntry *mpSoundEntry;
|
|
float mfTerrorCheckCount;
|
|
int mlTerrorLevel;
|
|
|
|
cGfxObject *mpDamageGfx;
|
|
};
|
|
|
|
//---------------------------------------------
|
|
|
|
class cPlayerEarRing {
|
|
public:
|
|
cPlayerEarRing(cInit *apInit, cPlayer *apPlayer);
|
|
|
|
void Update(float afTimeStep);
|
|
|
|
void Start(float afTime);
|
|
void Stop(bool abStopDirectly);
|
|
|
|
void Reset();
|
|
|
|
private:
|
|
cInit *mpInit;
|
|
cPlayer *mpPlayer;
|
|
|
|
cSoundEntry *mpSoundEntry;
|
|
|
|
float mfTimeCount;
|
|
float mfDeafTime;
|
|
bool mbDeaf;
|
|
};
|
|
|
|
//---------------------------------------------
|
|
|
|
class cPlayerLean : public iPhysicsRayCallback {
|
|
public:
|
|
cPlayerLean(cInit *apInit, cPlayer *apPlayer);
|
|
|
|
void OnWorldLoad();
|
|
|
|
void Update(float afTimeStep);
|
|
|
|
void Lean(float afMul, float afTimeStep);
|
|
|
|
bool OnIntersect(iPhysicsBody *pBody, cPhysicsRayParams *apParams);
|
|
|
|
void Reset();
|
|
|
|
float mfDir;
|
|
float mfMovement;
|
|
float mfRotation;
|
|
|
|
private:
|
|
cPlayer *mpPlayer;
|
|
cInit *mpInit;
|
|
|
|
iCollideShape *mpHeadShape;
|
|
|
|
float mfMaxMovement;
|
|
float mfMaxRotation;
|
|
float mfMaxTime;
|
|
|
|
float mfMoveSpeed;
|
|
|
|
bool mbIntersect;
|
|
|
|
bool mbPressed;
|
|
};
|
|
|
|
//---------------------------------------------
|
|
|
|
class cPlayerDamage {
|
|
public:
|
|
cPlayerDamage(cInit *apInit);
|
|
~cPlayerDamage();
|
|
|
|
void Start(float afSize, ePlayerDamageType aType);
|
|
|
|
void Update(float afTimeStep);
|
|
|
|
void Draw();
|
|
|
|
private:
|
|
bool mbActive;
|
|
|
|
float mfAlpha;
|
|
float mfAlphaAdd;
|
|
|
|
cVector2f mvHeadSwingAcc;
|
|
cVector2f mvHeadSwingSpeed;
|
|
|
|
float mfSize;
|
|
|
|
cGfxObject *mvHitGfx[ePlayerDamageType_LastEnum];
|
|
|
|
ePlayerDamageType mType;
|
|
|
|
cInit *mpInit;
|
|
cGraphicsDrawer *mpDrawer;
|
|
cRendererPostEffects *mpPostEffects;
|
|
};
|
|
|
|
//---------------------------------------------
|
|
|
|
class cPlayerDeath {
|
|
public:
|
|
cPlayerDeath(cInit *apInit);
|
|
~cPlayerDeath();
|
|
|
|
void Reset();
|
|
|
|
void Start();
|
|
|
|
void Update(float afTimeStep);
|
|
|
|
void Draw();
|
|
|
|
bool IsActive() { return mbActive; }
|
|
|
|
float GetHeighAdd() { return mfHeightAdd; }
|
|
|
|
private:
|
|
bool mbActive;
|
|
|
|
float mfHeightAdd;
|
|
float mfRoll;
|
|
|
|
float mfMinHeightAdd;
|
|
|
|
cGfxObject *mpFadeGfx;
|
|
cGfxObject *mpBlackGfx;
|
|
|
|
bool mbStartFade;
|
|
float mfFadeAlpha;
|
|
float mfBlackAlpha;
|
|
|
|
cInit *mpInit;
|
|
cGraphicsDrawer *mpDrawer;
|
|
cRendererPostEffects *mpPostEffects;
|
|
};
|
|
|
|
//---------------------------------------------
|
|
|
|
class cPlayerFlashLight : iPhysicsRayCallback {
|
|
public:
|
|
cPlayerFlashLight(cInit *apInit);
|
|
~cPlayerFlashLight();
|
|
|
|
void Reset();
|
|
|
|
bool OnIntersect(iPhysicsBody *pBody, cPhysicsRayParams *apParams);
|
|
|
|
void OnWorldLoad();
|
|
|
|
void Update(float afTimeStep);
|
|
|
|
void SetActive(bool abX);
|
|
bool IsActive() { return mbActive; }
|
|
|
|
void SetDisabled(bool abX);
|
|
bool IsDisabled() { return mbDisabled; }
|
|
|
|
void OnPostSceneDraw();
|
|
|
|
private:
|
|
bool mbActive;
|
|
|
|
bool mbDisabled;
|
|
|
|
float mfAlpha;
|
|
|
|
float mfFlickerTime;
|
|
|
|
float mfRayCastTime;
|
|
float mfClosestDist;
|
|
iPhysicsBody *mpClosestBody;
|
|
|
|
//iTexture *mpTextureCache;
|
|
|
|
cInit *mpInit;
|
|
|
|
cVector3f mvStart;
|
|
cVector3f mvEnd;
|
|
};
|
|
|
|
//---------------------------------------------
|
|
|
|
class cPlayerGlowStick {
|
|
public:
|
|
cPlayerGlowStick(cInit *apInit);
|
|
~cPlayerGlowStick();
|
|
|
|
void Reset();
|
|
|
|
void OnWorldLoad();
|
|
void Destroy();
|
|
|
|
void Update(float afTimeStep);
|
|
|
|
void SetActive(bool abX);
|
|
bool IsActive() { return mbActive; }
|
|
|
|
private:
|
|
bool mbActive;
|
|
|
|
cInit *mpInit;
|
|
};
|
|
|
|
//---------------------------------------------
|
|
|
|
class iHudModel;
|
|
class cPlayerFlare {
|
|
public:
|
|
cPlayerFlare(cInit *apInit);
|
|
~cPlayerFlare();
|
|
|
|
void Reset();
|
|
|
|
void OnWorldLoad();
|
|
|
|
void Update(float afTimeStep);
|
|
|
|
void SetActive(bool abX);
|
|
bool IsActive() { return mbActive; }
|
|
|
|
float GetTime() { return mfTime; }
|
|
void SetTime(float afX) { mfTime = afX; }
|
|
|
|
private:
|
|
bool mbActive;
|
|
|
|
float mfTime;
|
|
|
|
iLight3D *mpLight;
|
|
iHudModel *mpModel;
|
|
|
|
float mfMaxLightRadius;
|
|
float mfLightRadius;
|
|
float mfLightPulse;
|
|
float mfLightPulseAdd;
|
|
|
|
cInit *mpInit;
|
|
};
|
|
|
|
//---------------------------------------------
|
|
|
|
class cPlayerNoiseFilter {
|
|
public:
|
|
cPlayerNoiseFilter(cInit *apInit);
|
|
~cPlayerNoiseFilter();
|
|
|
|
void Draw();
|
|
|
|
void Update(float afTimeStep);
|
|
|
|
void SetActive(bool abX);
|
|
bool IsActive() { return mbActive; }
|
|
|
|
private:
|
|
bool mbActive;
|
|
|
|
float mfAlpha;
|
|
float mfTimeCount;
|
|
|
|
int mlAmount;
|
|
|
|
//cLight3DPoint *mpLight;
|
|
//cMeshEntity *mpMeshEntity;
|
|
|
|
cInit *mpInit;
|
|
cGraphicsDrawer *mpDrawer;
|
|
|
|
Common::Array<cGfxObject *> mvGfxNoise;
|
|
tIntVec mvCurrentGfx;
|
|
};
|
|
|
|
//---------------------------------------------
|
|
|
|
class cPlayerFearFilter {
|
|
public:
|
|
cPlayerFearFilter(cInit *apInit);
|
|
~cPlayerFearFilter();
|
|
|
|
void Draw();
|
|
|
|
void Update(float afTimeStep);
|
|
|
|
void Reset();
|
|
|
|
void SetActive(bool abX);
|
|
bool IsActive() { return mbActive; }
|
|
|
|
private:
|
|
bool mbActive;
|
|
|
|
float mfAlpha;
|
|
float mfMaxAlpha;
|
|
|
|
cInit *mpInit;
|
|
};
|
|
|
|
//---------------------------------------------
|
|
|
|
class cPlayerLookAt {
|
|
public:
|
|
cPlayerLookAt(cPlayer *apPlayer);
|
|
~cPlayerLookAt();
|
|
|
|
void Update(float afTimeStep);
|
|
|
|
void Reset();
|
|
|
|
void SetTarget(const cVector3f &avTargetPos, float afSpeedMul, float afMaxSpeed);
|
|
|
|
void SetActive(bool abX);
|
|
bool IsActive() { return mbActive; }
|
|
|
|
private:
|
|
bool mbActive;
|
|
cVector3f mvTargetPos;
|
|
|
|
float mfSpeedMul;
|
|
float mfMaxSpeed;
|
|
|
|
cPlayer *mpPlayer;
|
|
};
|
|
|
|
//---------------------------------------------
|
|
|
|
class cPlayerHidden : public iPhysicsRayCallback {
|
|
public:
|
|
cPlayerHidden(cInit *apInit);
|
|
~cPlayerHidden();
|
|
|
|
void Draw();
|
|
|
|
void Update(float afTimeStep);
|
|
|
|
void Reset();
|
|
|
|
void OnWorldLoad();
|
|
void OnWorldExit();
|
|
|
|
bool InShadows();
|
|
bool IsHidden() { return mbHidden; }
|
|
void UnHide();
|
|
|
|
bool OnIntersect(iPhysicsBody *pBody, cPhysicsRayParams *apParams);
|
|
|
|
bool HasLineOfSight(iLight3D *pLight, iPhysicsWorld *pPhysicsWorld);
|
|
|
|
private:
|
|
void UpdateEnemyTooClose(float afTimeStep);
|
|
|
|
cInit *mpInit;
|
|
cRenderer3D *mpRenderer;
|
|
cGraphicsDrawer *mpDrawer;
|
|
cSoundHandler *mpSoundHandler;
|
|
|
|
cGfxObject *mpInShadowGfx;
|
|
|
|
iLight3D *mpLight;
|
|
|
|
float mfInShadowAlpha;
|
|
float mfInShadowPulse;
|
|
float mfInShadowPulseAdd;
|
|
|
|
float mfStartAspect;
|
|
float mfHiddenAspect;
|
|
float mfAspect;
|
|
float mfAspectAdd;
|
|
|
|
float mfStartFov;
|
|
float mfHiddenFov;
|
|
float mfFov;
|
|
float mfFovAdd;
|
|
|
|
float mfStartEffectOffset;
|
|
float mfHiddenEffectOffset;
|
|
float mfEffectOffset;
|
|
float mfEffectOffsetAdd;
|
|
|
|
float mfHiddenOnTime;
|
|
float mfHiddenOffTime;
|
|
|
|
float mfCheckEnemyCloseCount;
|
|
float mfEnemyTooCloseCount;
|
|
float mfEnemyTooCloseMax;
|
|
bool mbEnemyTooClose;
|
|
|
|
float mfCloseEffectFov;
|
|
float mfCloseEffectFovAdd;
|
|
float mfCloseEffectFovMax;
|
|
float mfCloseEffectFovMin;
|
|
|
|
float mbInShadows;
|
|
|
|
float mfUpdateCount;
|
|
|
|
float mfLight;
|
|
float mfMaxLight;
|
|
|
|
float mfHiddenCount;
|
|
float mfHiddenTime;
|
|
bool mbHidden;
|
|
float mfHiddenOnCount;
|
|
|
|
bool mbIntersected;
|
|
|
|
FontData *mpFont;
|
|
};
|
|
|
|
//---------------------------------------------
|
|
|
|
class cPlayerBodyCallback : public iCharacterBodyCallback {
|
|
public:
|
|
cPlayerBodyCallback(cPlayer *apPlayer);
|
|
virtual ~cPlayerBodyCallback() = default;
|
|
|
|
void OnHitGround(iCharacterBody *apCharBody, const cVector3f &avVel);
|
|
void OnGravityCollide(iCharacterBody *apCharBody, iPhysicsBody *apCollideBody,
|
|
cCollideData *apCollideData) {}
|
|
|
|
private:
|
|
cPlayer *mpPlayer;
|
|
|
|
float mfFallSpeed_Min;
|
|
float mfFallDamage_Min;
|
|
tString msFallSound_Min;
|
|
|
|
float mfFallSpeed_Med;
|
|
float mfFallDamage_Med;
|
|
tString msFallSound_Med;
|
|
|
|
float mfFallSpeed_Max;
|
|
float mfFallDamage_Max;
|
|
tString msFallSound_Max;
|
|
};
|
|
|
|
//---------------------------------------------
|
|
|
|
#endif // GAME_PLAYER_HELPER_H
|