Support for team filters in radar()

master
krzys-h 2015-07-07 18:54:36 +02:00
parent 9a873c9bea
commit 79c5fabfe6
3 changed files with 35 additions and 11 deletions

View File

@ -228,6 +228,10 @@ CObject* CObjectManager::Radar(CObject* pThis, Math::Vector thisPosition, float
iAngle = thisAngle+angle; iAngle = thisAngle+angle;
iAngle = Math::NormAngle(iAngle); // 0..2*Math::PI iAngle = Math::NormAngle(iAngle); // 0..2*Math::PI
int filter_team = filter & 0xFF;
RadarFilter filter_flying = static_cast<RadarFilter>(filter & (FILTER_ONLYLANDING | FILTER_ONLYFLYING));
RadarFilter filter_enemy = static_cast<RadarFilter>(filter & (FILTER_FRIENDLY | FILTER_ENEMY | FILTER_NEUTRAL));
if ( !furthest ) best = 100000.0f; if ( !furthest ) best = 100000.0f;
else best = 0.0f; else best = 0.0f;
pBest = nullptr; pBest = nullptr;
@ -271,17 +275,29 @@ CObject* CObjectManager::Radar(CObject* pThis, Math::Vector thisPosition, float
// END OF TODO // END OF TODO
} }
if ( filter == FILTER_ONLYLANDING ) if ( filter_flying == FILTER_ONLYLANDING )
{ {
physics = pObj->GetPhysics(); physics = pObj->GetPhysics();
if ( physics != nullptr && !physics->GetLand() ) continue; if ( physics != nullptr && !physics->GetLand() ) continue;
} }
if ( filter == FILTER_ONLYFLYING ) if ( filter_flying == FILTER_ONLYFLYING )
{ {
physics = pObj->GetPhysics(); physics = pObj->GetPhysics();
if ( physics != nullptr && physics->GetLand() ) continue; if ( physics != nullptr && physics->GetLand() ) continue;
} }
if ( filter_team != 0 && pObj->GetTeam() != filter_team )
continue;
if( pThis != nullptr )
{
RadarFilter enemy = FILTER_NONE;
if ( pObj->GetTeam() == 0 ) enemy = static_cast<RadarFilter>(enemy | FILTER_NEUTRAL);
if ( pObj->GetTeam() == pThis->GetTeam() ) enemy = static_cast<RadarFilter>(enemy | FILTER_FRIENDLY);
if ( pObj->GetTeam() != pThis->GetTeam() ) enemy = static_cast<RadarFilter>(enemy | FILTER_ENEMY);
if ( filter_enemy != 0 && (filter_enemy & enemy) == 0 ) continue;
}
if ( std::find(type.begin(), type.end(), oType) == type.end() && type.size() > 0 ) continue; if ( std::find(type.begin(), type.end(), oType) == type.end() && type.size() > 0 ) continue;
oPos = pObj->GetPosition(0); oPos = pObj->GetPosition(0);

View File

@ -48,9 +48,14 @@ class CObjectFactory;
enum RadarFilter enum RadarFilter
{ {
FILTER_NONE = 0, FILTER_NONE = (0b00000000) << 8,
FILTER_ONLYLANDING = 1,
FILTER_ONLYFLYING = 2, FILTER_ONLYLANDING = (0b00000001) << 8,
FILTER_ONLYFLYING = (0b00000010) << 8,
FILTER_FRIENDLY = (0b00000100) << 8,
FILTER_ENEMY = (0b00001000) << 8,
FILTER_NEUTRAL = (0b00010000) << 8,
}; };
using CObjectMap = std::map<int, std::unique_ptr<CObject>>; using CObjectMap = std::map<int, std::unique_ptr<CObject>>;

View File

@ -1062,7 +1062,7 @@ bool CScriptFunctions::rDelete(CBotVar* var, CBotVar* result, int& exception, vo
} }
else else
{ {
if ( exploType ) if ( exploType != 0 )
{ {
obj->ExplodeObject(static_cast<ExplosionType>(exploType), force); obj->ExplodeObject(static_cast<ExplosionType>(exploType), force);
} }
@ -3821,12 +3821,15 @@ void CScriptFunctions::Init()
CBotProgram::DefineNum("FilterNone", FILTER_NONE); CBotProgram::DefineNum("FilterNone", FILTER_NONE);
CBotProgram::DefineNum("FilterOnlyLanding", FILTER_ONLYLANDING); CBotProgram::DefineNum("FilterOnlyLanding", FILTER_ONLYLANDING);
CBotProgram::DefineNum("FilterOnlyFliying", FILTER_ONLYFLYING); CBotProgram::DefineNum("FilterOnlyFlying", FILTER_ONLYFLYING);
CBotProgram::DefineNum("FilterFriendly", FILTER_FRIENDLY);
CBotProgram::DefineNum("FilterEnemy", FILTER_ENEMY);
CBotProgram::DefineNum("FilterNeutral", FILTER_NEUTRAL);
CBotProgram::DefineNum("ExploNone", 0); CBotProgram::DefineNum("ExplosionNone", 0);
CBotProgram::DefineNum("ExploBoum", static_cast<long>(ExplosionType::Bang)); CBotProgram::DefineNum("ExplosionBang", static_cast<int>(ExplosionType::Bang));
CBotProgram::DefineNum("ExploBurn", static_cast<long>(ExplosionType::Burn)); CBotProgram::DefineNum("ExplosionBurn", static_cast<int>(ExplosionType::Burn));
CBotProgram::DefineNum("ExploWater", static_cast<long>(ExplosionType::Water)); CBotProgram::DefineNum("ExplosionWater", static_cast<int>(ExplosionType::Water));
CBotProgram::DefineNum("ResultNotEnded", ERR_MISSION_NOTERM); CBotProgram::DefineNum("ResultNotEnded", ERR_MISSION_NOTERM);
CBotProgram::DefineNum("ResultLost", INFO_LOST); CBotProgram::DefineNum("ResultLost", INFO_LOST);