/*
* Copyright (C) 2006-2010 - Frictional Games
*
* This file is part of Penumbra Overture.
*
* Penumbra Overture 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.
*
* Penumbra Overture 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 Penumbra Overture. If not, see .
*/
#ifndef GAME_GAME_ENEMY_WORM_H
#define GAME_GAME_ENEMY_WORM_H
#include "StdAfx.h"
#include "GameEnemy.h"
using namespace hpl;
//-----------------------------------------
class cGameEnemy_Worm;
// BASE STATE
class iGameEnemyState_Worm_Base : public iGameEnemyState
{
public:
iGameEnemyState_Worm_Base(int alId, cInit *apInit, iGameEnemy *apEnemy);
virtual void OnSeePlayer(const cVector3f &avPosition, float afChance);
virtual bool OnHearNoise(const cVector3f &avPosition, float afVolume);
virtual void OnTakeHit(float afDamage);
virtual void OnDeath(float afDamage);
virtual void OnFlashlight(const cVector3f &avPosition);
virtual void OnAnimationOver(const tString& asAnimName){}
virtual void OnDraw(){}
virtual void OnPostSceneDraw(){}
protected:
cGameEnemy_Worm *mpEnemyWorm;
};
//-----------------------------------------
// IDLE STATE
class cGameEnemyState_Worm_Idle : public iGameEnemyState_Worm_Base
{
public:
cGameEnemyState_Worm_Idle(int alId, cInit *apInit, iGameEnemy *apEnemy) :
iGameEnemyState_Worm_Base(alId, apInit,apEnemy){}
void OnEnterState(iGameEnemyState *apPrevState);
void OnLeaveState(iGameEnemyState *apNextState);
void OnUpdate(float afTimeStep);
//void OnSeePlayer(const cVector3f &avPosition, float afChance){}
private:
bool mbStopped;
float mfNextWalkTime;
};
//-----------------------------------------
// HUNT STATE
class cGameEnemyState_Worm_Hunt : public iGameEnemyState_Worm_Base
{
public:
cGameEnemyState_Worm_Hunt(int alId, cInit *apInit, iGameEnemy *apEnemy) :
iGameEnemyState_Worm_Base(alId, apInit,apEnemy){}
void OnEnterState(iGameEnemyState *apPrevState);
void OnLeaveState(iGameEnemyState *apNextState);
void OnUpdate(float afTimeStep);
void OnSeePlayer(const cVector3f &avPosition, float afChance);
bool OnHearNoise(const cVector3f &avPosition, float afVolume);
void OnDraw();
void OnPostSceneDraw();
private:
float mfUpdatePathCount;
float mfUpdateFreq;
bool mbFreePlayerPath;
bool mbLostPlayer;
float mfLostPlayerCount;
float mfMaxLostPlayerCount;
float mfAttackSoundCount;
float mfAttackCount;
float mfSoundCount;
};
//-----------------------------------------
// DEAD STATE
class cGameEnemyState_Worm_Dead : public iGameEnemyState_Worm_Base
{
public:
cGameEnemyState_Worm_Dead(int alId, cInit *apInit, iGameEnemy *apEnemy) :
iGameEnemyState_Worm_Base(alId, apInit,apEnemy){}
void OnEnterState(iGameEnemyState *apPrevState);
void OnLeaveState(iGameEnemyState *apNextState);
void OnUpdate(float afTimeStep){}
void OnSeePlayer(const cVector3f &avPosition, float afChance){}
bool OnHearNoise(const cVector3f &avPosition, float afVolume){ return false;}
private:
};
//-----------------------------------------
class cWormTailSegment
{
public:
cWormTailSegment(){
mpBone = NULL;
mpChildSegment = NULL;
}
std::list mlstPositions;
cVector3f mvPostion;
cVector3f mvGoalForward;
cVector3f mvForward;
cVector3f mvUp;
cVector3f mvRight;
float mfDistToFront;
iPhysicsBody *mpBody;
cBoneState *mpBone;
cMatrixf m_mtxBaseRot;
cWormTailSegment *mpChildSegment;
};
//-----------------------------------------
class cGameEnemy_Worm_MeshCallback : public cMeshEntityCallback
{
public:
cGameEnemy_Worm_MeshCallback(cGameEnemy_Worm *apWorm);
void AfterAnimationUpdate(cMeshEntity *apMeshEntity, float afTimeStep);
private:
cGameEnemy_Worm *mpWorm;
};
//-----------------------------------------
class cVector3Smoother
{
public:
cVector3Smoother();
void Add(const cVector3f& avVec);
cVector3f GetAverage();
void SetMax(int alMax){ mlMaxVecs = alMax;}
private:
int mlMaxVecs;
std::list mlstVecs;
};
//-----------------------------------------
class cGameEnemy_Worm : public iGameEnemy
{
friend class cGameEnemy_Worm_MeshCallback;
public:
cGameEnemy_Worm(cInit *apInit,const tString& asName,TiXmlElement *apGameElem);
~cGameEnemy_Worm();
void OnLoad();
void OnUpdate(float afTimeStep);
void ExtraPostSceneDraw();
void ShowPlayer(const cVector3f& avPlayerFeetPos);
bool MoveToPos(const cVector3f& avFeetPos);
bool IsFighting();
iCollideShape *GetAttackShape(){ return mpAttackShape;}
//Worm specific
void SetupTail();
cSoundEntity *mpMoveSound;
//State properties
tString msMoveSound;
float mfIdleFOV;
tString msIdleFoundPlayerSound;
float mfIdleMinSeeChance;
float mfIdleMinHearVolume;
float mfIdleMinWaitLength;
float mfIdleMaxWaitLength;
float mfHuntFOV;
float mfHuntSpeed;
float mfHuntForLostPlayerTime;
float mfHuntMinSeeChance;
float mfHuntMinHearVolume;
tString msHuntSound;
float mfHuntSoundMinInteraval;
float mfHuntSoundMaxInteraval;
float mfAttackDamage;
float mfAttackInterval;
tString msAttackHitSound;
float mfAttackHitSoundInterval;
float mfAttackMinMass;
float mfAttackMaxMass;
float mfAttackMinImpulse;
float mfAttackMaxImpulse;
int mlAttackStrength;
cVector3f mvAttackDamageSize;
private:
iCollideShape *mpAttackShape;
cBoneState *mpRootBone;
std::list mlstRootPositions;
cVector3Smoother mRootForwards;
cVector3f mvRootPosition;
cVector3f mvRootGoalForward;
cVector3f mvRootForward;
cVector3f mvRootRight;
cVector3f mvRootUp;
cVector3f mvRootBaseForward;
cVector3f mvLastForward;
int mlMaxSegmentPostions;
float mfTurnSpeed;
bool mbFirstUpdate;
cVector3f mvFirstUpdatePos;
cGameEnemy_Worm_MeshCallback *mpMeshCallback;
cWormTailSegment *mpRootSegment;
std::vector mvTailSegments;
};
//-----------------------------------------
#endif // GAME_GAME_ENEMY_WORM_H