openmohaa/code/game/actorenemy.cpp

344 lines
5.1 KiB
C++
Raw Normal View History

2016-03-27 11:49:47 +02:00
/*
===========================================================================
Copyright (C) 2015 the OpenMoHAA team
This file is part of OpenMoHAA source code.
OpenMoHAA source code 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 2 of the License,
or (at your option) any later version.
OpenMoHAA source code 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 OpenMoHAA source code; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
===========================================================================
*/
// actorenemy.cpp:
#include "actorenemy.h"
2018-08-29 14:41:48 +02:00
#include "world.h"
#include "sentient.h"
#include "actor.h"
2016-03-27 11:49:47 +02:00
ActorEnemy::ActorEnemy()
{
2018-08-29 14:41:48 +02:00
//no need
2016-03-27 11:49:47 +02:00
}
ActorEnemy::~ActorEnemy()
{
2018-08-29 14:41:48 +02:00
//no need
2016-03-27 11:49:47 +02:00
}
float ActorEnemy::UpdateVisibility
(
Actor *pSelf,
bool *pbInFovAndRange,
bool *pbVisible
)
{
2018-08-29 14:41:48 +02:00
float fLMRF, fFrameTime;
fFrameTime = level.time - m_fLastLookTime;
m_fLastLookTime = level.time;
fLMRF = UpdateLMRF(pSelf, pbInFovAndRange, pbVisible);
if (fLMRF < 8.0)
{
m_fVisibility += fFrameTime / fLMRF;
}
else
{
if (m_fVisibility < 1.0)
{
m_fVisibility -= fFrameTime * 0.25;
if (m_fVisibility < 0.0)
m_fVisibility = 0.0;
}
}
m_fTotalVisibility = m_fVisibility + GetEnemy()->m_fPlayerSightLevel;
if (m_fTotalVisibility > 1)
{
m_fVisibility = 1;
m_fTotalVisibility = 1;
}
return m_fTotalVisibility;
2016-03-27 11:49:47 +02:00
}
int ActorEnemy::UpdateThreat
(
Actor *pSelf
)
{
2018-08-29 14:41:48 +02:00
static float fRangeThreatSquared[15];
static int iWeaponThreat[7][5];
m_iThreat = 0;
m_fCurrentRangeSquared = 1e38;
if (m_pEnemy->m_bIsDisguised || m_fTotalVisibility < 1)
return m_iThreat;
m_iThreat = 10000;
if (m_bVisible == true)
m_iThreat = 10500;
// FIXME: stub
STUB();
2016-03-27 11:49:47 +02:00
return NULL;
}
Sentient *ActorEnemy::GetEnemy
(
void
) const
{
2018-08-29 14:41:48 +02:00
return m_pEnemy;
2016-03-27 11:49:47 +02:00
}
float ActorEnemy::GetVisibility
(
void
) const
{
2018-08-29 14:41:48 +02:00
return m_fVisibility;
2016-03-27 11:49:47 +02:00
}
int ActorEnemy::GetThreat
(
void
) const
{
2018-08-29 14:41:48 +02:00
return m_iThreat;
2016-03-27 11:49:47 +02:00
}
float ActorEnemy::GetRangeSquared
(
void
) const
{
2018-08-29 14:41:48 +02:00
return m_fCurrentRangeSquared;
2016-03-27 11:49:47 +02:00
}
2018-08-29 14:41:48 +02:00
float ActorEnemy::UpdateLMRF
(
Actor *pSelf,
bool *pbInFovAndRange,
bool *pbVisible
)
{
//FIXME: variable names, I did my best
Vector vDelta;
float fFarPlane, fLMRF = 8, fMinSightTime, fFovScale, fForward, fNormalizedRange, fRangeScale, fRange, fMaxRange;
float fTmp1, fTmp2, fTmp3;
*pbInFovAndRange = false;
*pbVisible = false;
vDelta = pSelf->origin - GetEnemy()->origin;
fFarPlane = world->farplane_distance;
fRange = pSelf->m_fSight;
if (fFarPlane > 0)
{
fRange = fFarPlane * 0.828;
if (pSelf->m_fSight <= fRange)
fRange = pSelf->m_fSight;
}
if (Square(fRange) < vDelta.lengthXY(true))
{
return fLMRF;
}
fForward = vDelta.lengthXY();
if (-DotProduct2D(vDelta, pSelf->m_vEyeDir) < 0)
{
return fLMRF;
}
fTmp2 = 128.0 - DotProduct2D(vDelta, pSelf->m_vEyeDir);
if (fForward * pSelf->m_fFovDot > fTmp2)
{
return fLMRF;
}
*pbInFovAndRange = true;
if (!pSelf->CanSee(m_pEnemy, 0, 0))
{
return fLMRF;
}
*pbVisible = true;
fTmp1 = fForward + 128.0;
*pbVisible = true;
fTmp3 = fTmp1 / fTmp2;
fRangeScale = fForward
/ fRange
* (((fForward / fRange * 16.0 + -16.0) * (fForward / fRange) + -1.0) * (fForward / fRange) + 7.0)
/ 3.0
* GetEnemy()->stealthMovementScale;
fFovScale = (1 / fTmp3 * -1.3 - (pSelf->m_fFovDot * 0.2 - 1.5)) / (1.0 - pSelf->m_fFovDot);
fLMRF = g_ai_noticescale->value * pSelf->m_fNoticeTimeScale * (fTmp3 * fRangeScale + fTmp3 * fRangeScale);
if (fFovScale > fLMRF)
fLMRF = fFovScale;
return fLMRF;
}
2016-03-27 11:49:47 +02:00
ActorEnemySet::ActorEnemySet()
{
}
ActorEnemySet::~ActorEnemySet()
{
}
ActorEnemy *ActorEnemySet::AddPotentialEnemy
(
Sentient *pEnemy
)
{
// FIXME: stub
STUB();
return NULL;
}
void ActorEnemySet::FlagBadEnemy
(
Sentient *pEnemy
)
{
// FIXME: stub
STUB();
}
void ActorEnemySet::CheckEnemies
(
Actor *pSelf
)
{
// FIXME: stub
STUB();
}
Sentient *ActorEnemySet::GetCurrentEnemy
(
void
) const
{
2018-08-02 15:12:07 +02:00
return m_pCurrentEnemy;
2016-03-27 11:49:47 +02:00
}
float ActorEnemySet::GetCurrentVisibility
(
void
) const
{
2018-08-19 08:26:59 +02:00
return m_fCurrentVisibility;
2016-03-27 11:49:47 +02:00
}
int ActorEnemySet::GetCurrentThreat
(
void
) const
{
2018-08-19 08:26:59 +02:00
return m_iCurrentThreat;
2016-03-27 11:49:47 +02:00
}
qboolean ActorEnemySet::IsEnemyConfirmed
(
void
) const
{
// FIXME: stub
STUB();
return false;
}
bool ActorEnemySet::HasAlternateEnemy
(
void
) const
{
// FIXME: stub
STUB();
return false;
}
void ActorEnemySet::RemoveAll
(
void
)
{
// FIXME: stub
STUB();
}
void ActorEnemySet::ConfirmEnemy
(
Actor *pSelf,
Sentient *pEnemy
)
{
// FIXME: stub
STUB();
}
void ActorEnemySet::ConfirmEnemyIfCanSeeSharerOrEnemy
(
Actor *pSelf,
Actor *pSharer,
Sentient *pEnemy
)
{
// FIXME: stub
STUB();
}
bool ActorEnemySet::CaresAboutPerfectInfo
(
Sentient *pEnemy
)
{
// FIXME: stub
STUB();
return false;
}