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 = 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;
else best = 0.0f;
pBest = nullptr;
@ -271,17 +275,29 @@ CObject* CObjectManager::Radar(CObject* pThis, Math::Vector thisPosition, float
// END OF TODO
}
if ( filter == FILTER_ONLYLANDING )
if ( filter_flying == FILTER_ONLYLANDING )
{
physics = pObj->GetPhysics();
if ( physics != nullptr && !physics->GetLand() ) continue;
}
if ( filter == FILTER_ONLYFLYING )
if ( filter_flying == FILTER_ONLYFLYING )
{
physics = pObj->GetPhysics();
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;
oPos = pObj->GetPosition(0);

View File

@ -48,9 +48,14 @@ class CObjectFactory;
enum RadarFilter
{
FILTER_NONE = 0,
FILTER_ONLYLANDING = 1,
FILTER_ONLYFLYING = 2,
FILTER_NONE = (0b00000000) << 8,
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>>;

View File

@ -1062,7 +1062,7 @@ bool CScriptFunctions::rDelete(CBotVar* var, CBotVar* result, int& exception, vo
}
else
{
if ( exploType )
if ( exploType != 0 )
{
obj->ExplodeObject(static_cast<ExplosionType>(exploType), force);
}
@ -3821,12 +3821,15 @@ void CScriptFunctions::Init()
CBotProgram::DefineNum("FilterNone", FILTER_NONE);
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("ExploBoum", static_cast<long>(ExplosionType::Bang));
CBotProgram::DefineNum("ExploBurn", static_cast<long>(ExplosionType::Burn));
CBotProgram::DefineNum("ExploWater", static_cast<long>(ExplosionType::Water));
CBotProgram::DefineNum("ExplosionNone", 0);
CBotProgram::DefineNum("ExplosionBang", static_cast<int>(ExplosionType::Bang));
CBotProgram::DefineNum("ExplosionBurn", static_cast<int>(ExplosionType::Burn));
CBotProgram::DefineNum("ExplosionWater", static_cast<int>(ExplosionType::Water));
CBotProgram::DefineNum("ResultNotEnded", ERR_MISSION_NOTERM);
CBotProgram::DefineNum("ResultLost", INFO_LOST);