Files
scummvm-cursorfix/engines/hpl1/penumbra-overture/GameEnemy_Dog.h
2026-02-02 04:50:13 +01:00

463 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_GAME_ENEMY_DOG_H
#define GAME_GAME_ENEMY_DOG_H
#include "hpl1/engine/engine.h"
#include "hpl1/penumbra-overture/GameEnemy.h"
using namespace hpl;
//-----------------------------------------
class cGameEnemy_Dog;
// BASE STATE
class iGameEnemyState_Dog_Base : public iGameEnemyState {
public:
iGameEnemyState_Dog_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_Dog *mpEnemyDog;
};
//-----------------------------------------
// IDLE STATE
class cGameEnemyState_Dog_Idle : public iGameEnemyState_Dog_Base {
public:
cGameEnemyState_Dog_Idle(int alId, cInit *apInit, iGameEnemy *apEnemy) : iGameEnemyState_Dog_Base(alId, apInit, apEnemy) {}
void OnEnterState(iGameEnemyState *apPrevState);
void OnLeaveState(iGameEnemyState *apNextState);
void OnUpdate(float afTimeStep);
};
//-----------------------------------------
// ATTENTION STATE
class cGameEnemyState_Dog_Attention : public iGameEnemyState_Dog_Base {
public:
cGameEnemyState_Dog_Attention(int alId, cInit *apInit, iGameEnemy *apEnemy) : iGameEnemyState_Dog_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 OnFlashlight(const cVector3f &avPosition);
void OnDraw();
private:
float mfTime;
};
//-----------------------------------------
// HUNT STATE
class cGameEnemyState_Dog_Hunt : public iGameEnemyState_Dog_Base {
public:
cGameEnemyState_Dog_Hunt(int alId, cInit *apInit, iGameEnemy *apEnemy) : iGameEnemyState_Dog_Base(alId, apInit, apEnemy) {
mbBreakingDoor = false;
}
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 OnFlashlight(const cVector3f &avPosition) {}
void OnDraw();
private:
float mfUpdatePathCount;
float mfUpdateFreq;
bool mbFreePlayerPath;
bool mbLostPlayer;
float mfLostPlayerCount;
float mfMaxLostPlayerCount;
bool mbFoundNoPath;
int mlStuckAtMaxCount;
int mlBreakDoorCount;
bool mbBreakingDoor;
};
//-----------------------------------------
// ATTACK STATE
class cGameEnemyState_Dog_Attack : public iGameEnemyState_Dog_Base {
public:
cGameEnemyState_Dog_Attack(int alId, cInit *apInit, iGameEnemy *apEnemy) : iGameEnemyState_Dog_Base(alId, apInit, apEnemy) {}
void OnEnterState(iGameEnemyState *apPrevState);
void OnLeaveState(iGameEnemyState *apNextState);
void OnUpdate(float afTimeStep);
void OnAnimationOver(const tString &asName);
void OnPostSceneDraw();
void OnSeePlayer(const cVector3f &avPosition, float afChance) {}
bool OnHearNoise(const cVector3f &avPosition, float afVolume) { return false; }
void OnFlashlight(const cVector3f &avPosition) {}
private:
float mfDamageTimer;
float mfJumpTimer;
bool mbAttacked;
};
//-----------------------------------------
// BREAK DOOR STATE
class cGameEnemyState_Dog_BreakDoor : public iGameEnemyState_Dog_Base {
public:
cGameEnemyState_Dog_BreakDoor(int alId, cInit *apInit, iGameEnemy *apEnemy) : iGameEnemyState_Dog_Base(alId, apInit, apEnemy) {}
void OnEnterState(iGameEnemyState *apPrevState);
void OnLeaveState(iGameEnemyState *apNextState);
void OnUpdate(float afTimeStep);
void OnAnimationOver(const tString &asName);
void OnPostSceneDraw();
void OnSeePlayer(const cVector3f &avPosition, float afChance) {}
bool OnHearNoise(const cVector3f &avPosition, float afVolume) { return false; }
void OnFlashlight(const cVector3f &avPosition) {}
private:
float mfDamageTimer;
float mfStopMoveTimer;
bool mbAttacked;
bool mbStopped;
int mlCount;
};
//-----------------------------------------
// FLEE STATE
class cGameEnemyState_Dog_Flee : public iGameEnemyState_Dog_Base {
public:
cGameEnemyState_Dog_Flee(int alId, cInit *apInit, iGameEnemy *apEnemy) : iGameEnemyState_Dog_Base(alId, apInit, apEnemy) {}
void OnEnterState(iGameEnemyState *apPrevState);
void OnLeaveState(iGameEnemyState *apNextState);
void OnUpdate(float afTimeStep);
bool OnHearNoise(const cVector3f &avPosition, float afVolume) { return false; }
void OnSeePlayer(const cVector3f &avPosition, float afChance) {}
void OnFlashlight(const cVector3f &avPosition) {}
private:
float mfTimer;
float mfBackAngle;
bool mbBackwards;
float mfCheckBehindTime;
bool mbBackingFromBreakDoor;
};
//-----------------------------------------
// CALL BACKUP STATE
class cGameEnemyState_Dog_CallBackup : public iGameEnemyState_Dog_Base {
public:
cGameEnemyState_Dog_CallBackup(int alId, cInit *apInit, iGameEnemy *apEnemy) : iGameEnemyState_Dog_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; }
// void OnTakeHit(float afDamage){}
void OnFlashlight(const cVector3f &avPosition) {}
void OnAnimationOver(const tString &asName);
private:
// bool mbCheckAnim;
};
//-----------------------------------------
// KNOCKDOWN STATE
class cGameEnemyState_Dog_KnockDown : public iGameEnemyState_Dog_Base {
public:
cGameEnemyState_Dog_KnockDown(int alId, cInit *apInit, iGameEnemy *apEnemy) : iGameEnemyState_Dog_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; }
void OnTakeHit(float afDamage) {}
void OnFlashlight(const cVector3f &avPosition) {}
void OnAnimationOver(const tString &asName);
private:
float mfTimer;
bool mbCheckAnim;
int mlPrevToughness;
// int mlStuckAtMaxCount;
};
//-----------------------------------------
// DEAD STATE
class cGameEnemyState_Dog_Dead : public iGameEnemyState_Dog_Base {
public:
cGameEnemyState_Dog_Dead(int alId, cInit *apInit, iGameEnemy *apEnemy) : iGameEnemyState_Dog_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; }
void OnTakeHit(float afDamage) {}
void OnFlashlight(const cVector3f &avPosition) {}
};
//-----------------------------------------
// PATROL STATE
class cGameEnemyState_Dog_Patrol : public iGameEnemyState_Dog_Base {
public:
cGameEnemyState_Dog_Patrol(int alId, cInit *apInit, iGameEnemy *apEnemy) : iGameEnemyState_Dog_Base(alId, apInit, apEnemy) {}
void OnEnterState(iGameEnemyState *apPrevState);
void OnLeaveState(iGameEnemyState *apNextState);
void OnUpdate(float afTimeStep);
void OnAnimationOver(const tString &asName);
private:
bool mbWaiting;
bool mbAnimation;
float mfIdleSoundTime;
int mlStuckAtMaxCount;
};
//-----------------------------------------
// INVESTIGATE STATE
class cGameEnemyState_Dog_Investigate : public iGameEnemyState_Dog_Base {
public:
cGameEnemyState_Dog_Investigate(int alId, cInit *apInit, iGameEnemy *apEnemy) : iGameEnemyState_Dog_Base(alId, apInit, apEnemy) {
mlKnockCount = 0;
}
void OnEnterState(iGameEnemyState *apPrevState);
void OnLeaveState(iGameEnemyState *apNextState);
void OnUpdate(float afTimeStep);
bool OnHearNoise(const cVector3f &avPosition, float afVolume);
float mfIdleSoundTime;
float mfHearSoundCount;
float mfHighestVolume;
int mlKnockCount;
};
//-----------------------------------------
// MOVETO STATE
class cGameEnemyState_Dog_MoveTo : public iGameEnemyState_Dog_Base {
public:
cGameEnemyState_Dog_MoveTo(int alId, cInit *apInit, iGameEnemy *apEnemy) : iGameEnemyState_Dog_Base(alId, apInit, apEnemy) {}
void OnEnterState(iGameEnemyState *apPrevState);
void OnLeaveState(iGameEnemyState *apNextState);
void OnUpdate(float afTimeStep);
float mfIdleSoundTime;
int mlBreakCount;
};
//-----------------------------------------
// EAT STATE
class cGameEnemyState_Dog_Eat : public iGameEnemyState_Dog_Base {
public:
cGameEnemyState_Dog_Eat(int alId, cInit *apInit, iGameEnemy *apEnemy) : iGameEnemyState_Dog_Base(alId, apInit, apEnemy) {}
void OnEnterState(iGameEnemyState *apPrevState);
void OnLeaveState(iGameEnemyState *apNextState);
void OnUpdate(float afTimeStep);
bool OnHearNoise(const cVector3f &avPosition, float afVolume);
void OnSeePlayer(const cVector3f &avPosition, float afChance);
float mfTime;
};
//-----------------------------------------
class cGameEnemy_Dog : public iGameEnemy {
public:
cGameEnemy_Dog(cInit *apInit, const tString &asName, TiXmlElement *apGameElem);
~cGameEnemy_Dog();
void OnLoad();
void OnUpdate(float afTimeStep);
void ShowPlayer(const cVector3f &avPlayerFeetPos);
bool MoveToPos(const cVector3f &avFeetPos);
bool IsFighting();
iCollideShape *GetAttackShape() { return mpAttackShape; }
iCollideShape *GetBreakDoorShape() { return mpBreakDoorShape; }
float mfMinKnockDamage;
float mfCertainKnockDamage;
float mfLengthBodyToAss;
// State properties
float mfIdleFOV;
tString msIdleFoundPlayerSound;
float mfIdleMinSeeChance;
float mfIdleMinHearVolume;
tString msIdleSound;
float mfIdleSoundMinInteraval;
float mfIdleSoundMaxInteraval;
float mfIdleCallBackupChance;
tString msInvestigateSound;
tString msAttentionSound;
float mfAttentionTime;
float mfAttentionMinDist;
float mfHuntFOV;
float mfHuntSpeed;
float mfHuntForLostPlayerTime;
float mfHuntMinSeeChance;
float mfHuntMinHearVolume;
float mfAttackDistance;
float mfAttackSpeed;
float mfAttackJumpTime;
float mfAttackDamageTime;
cVector3f mvAttackDamageSize;
float mfAttackDamageRange;
float mfAttackMinDamage;
float mfAttackMaxDamage;
tString msAttackStartSound;
tString msAttackHitSound;
float mfAttackMinMass;
float mfAttackMaxMass;
float mfAttackMinImpulse;
float mfAttackMaxImpulse;
int mlAttackStrength;
tString msBreakDoorAnimation;
float mfBreakDoorSpeed;
float mfBreakDoorDamageTime;
cVector3f mvBreakDoorDamageSize;
float mfBreakDoorDamageRange;
float mfBreakDoorMinDamage;
float mfBreakDoorMaxDamage;
tString msBreakDoorStartSound;
tString msBreakDoorHitSound;
float mfBreakDoorMinMass;
float mfBreakDoorMaxMass;
float mfBreakDoorMinImpulse;
float mfBreakDoorMaxImpulse;
int mlBreakDoorStrength;
bool mbBreakDoorRiseAtEnd;
tString msKnockDownSound;
tString msDeathSound;
float mfFleePositionChance;
float mfFleePositionMaxTime;
float mfFleePositionMinDistance;
float mfFleePositionMaxDistance;
float mfFleeBackChance;
float mfFleeBackTime;
float mfFleeBackSpeed;
tString msCallBackupAnimation;
tString msCallBackupSound;
float mfCallBackupRange;
float mfEatFOV;
float mfEatMinSeeChance;
float mfEatMinHearVolume;
private:
iCollideShape *mpAttackShape;
iCollideShape *mpBreakDoorShape;
};
//-----------------------------------------
#endif // GAME_GAME_ENEMY_DOG_H