TID AdapterEx::AdaptTargetEntity(EntityClassType p_targetType, const PlanStepParameters& p_parameters) { GamePlayer *pPlayer; GameEntity *pEntity; vector<TID> entityIds; TID adaptedTargetId = INVALID_TID; double bestDistance = numeric_limits<double>::max(); CellFeature *pTarGetCellFeatureFromWorldPosition = new CellFeature(p_parameters); pPlayer = g_Game->Enemy(); assert(pPlayer); pPlayer->Entities(entityIds); for (size_t i = 0, size = entityIds.size(); i < size; ++i) { pEntity = pPlayer->GetEntity(entityIds[i]); assert(pEntity); if (p_targetType == pEntity->Type()) { CellFeature *pCandidateCellFearure = g_Game->Map()->GetCellFeatureFromWorldPosition(pEntity->GetPosition()); double dist = pTarGetCellFeatureFromWorldPosition->GetDistance(pCandidateCellFearure); if (dist <= bestDistance) { bestDistance = dist; adaptedTargetId = pEntity->Id(); } } } return adaptedTargetId; }
TID AdapterEx::AdaptBuildingForTraining(EntityClassType p_traineeType) { // Gets first building to train entity from type p_traineeType // If no empty building is found, last non-idle building will be returned GamePlayer *pPlayer; GameEntity *pEntity; vector<TID> entityIds; EntityClassType trainerType; TID id = INVALID_TID; trainerType = g_Game->Self()->TechTree()->SourceEntity(p_traineeType); pPlayer = g_Game->Self(); assert(pPlayer); pPlayer->Entities(entityIds); for (size_t i = 0, size = entityIds.size(); i < size; ++i) { pEntity = pPlayer->GetEntity(entityIds[i]); assert(pEntity); if (trainerType == pEntity->Type()) { id = pEntity->Id(); if (pEntity->Attr(EOATTR_State) == OBJSTATE_Idle) { id = pEntity->Id(); break; } } } return id; }
GameEntity* InfluenceMap::GetObj(RegObjEntry* p_pObjEntry) { GameEntity *pGameObj = nullptr; GamePlayer *pPlayer = nullptr; pPlayer = g_Game->GetPlayer(p_pObjEntry->OwnerId); _ASSERTE(pPlayer); pGameObj = pPlayer->GetEntity(p_pObjEntry->ObjId); _ASSERTE(pGameObj); return pGameObj; }
TID AdapterEx::GetEntityObjectId(EntityClassType p_entityType,const RankedStates& p_rankedStates) { /* Entity Object Adaptation Algorithm: IF player has Type THEN return the entity with the best state (based on input ranked states) ELSE adaptation failed and return nullptr entity Id */ GamePlayer *pPlayer; GameEntity *pEntity; vector<TID> entityIds; EntityClassType entityTypeId; ObjectStateType curEntityState; TID adaptedEntityId = INVALID_TID; vector<UnitEntry> validEntities; if(!IsRankedStatesInitialized) initializePredefinedRankedStates(); pPlayer = g_Game->Self(); assert(pPlayer); pPlayer->Entities(entityIds); for (size_t i = 0, size = entityIds.size(); i < size; ++i) { pEntity = pPlayer->GetEntity(entityIds[i]); assert(pEntity); if (p_entityType == pEntity->Type() && !pEntity->IsLocked()) { curEntityState = (ObjectStateType)pEntity->Attr(EOATTR_State); if (IsValidEntityState(curEntityState,p_rankedStates)) validEntities.push_back(MakePair(pEntity->Id(), curEntityState)); } } if (!validEntities.empty()) { sort(validEntities.begin(), validEntities.end(), [p_rankedStates](UnitEntry leftEntity,UnitEntry rightEntity) { return GetEntityStateIndex(leftEntity.second,p_rankedStates) < GetEntityStateIndex(rightEntity.second,p_rankedStates); }); adaptedEntityId = validEntities[0].first; } return adaptedEntityId; }
IStrategizer::TID IStrategizer::AdapterEx::AdaptResourceForGathering(ResourceType p_resourceType, const PlanStepParameters& p_parameters) { GamePlayer *pPlayer; GameEntity *pEntity; vector<TID> entityIds; TID adaptedResourceId = INVALID_TID; double bestDistance = numeric_limits<double>::max(); CellFeature *pResourceCellFeatureFromWorldPosition = new CellFeature(p_parameters); DefinitionCrossMapping pDefinitionCrossMapping = DefinitionCrossMapping::Instance(); pPlayer = g_Game->GetPlayer(PLAYER_Neutral); assert(pPlayer); pPlayer->Entities(entityIds); TID fetchedResourceId; if(pDefinitionCrossMapping.ResourceMapping.TryGetBySecond(p_resourceType, fetchedResourceId) == true) { for (size_t i = 0, size = entityIds.size(); i < size; ++i) { if (fetchedResourceId == entityIds[i]) { pEntity = pPlayer->GetEntity(entityIds[i]); assert(pEntity); CellFeature *pCandidateCellFearure = g_Game->Map()->GetCellFeatureFromWorldPosition(pEntity->GetPosition()); double dist = pResourceCellFeatureFromWorldPosition->GetDistance(pCandidateCellFearure); if (dist <= bestDistance) { bestDistance = dist; adaptedResourceId = pEntity->Id(); } } } } return adaptedResourceId; }
IStrategizer::TID IStrategizer::AdapterEx::GetEntityObjectId(EntityClassType p_entityType ) { GamePlayer *pPlayer; GameEntity *pEntity; vector<TID> entityIds; EntityClassType entityTypeId; TID adaptedEntityId = INVALID_TID; pPlayer = g_Game->Self(); assert(pPlayer); pPlayer->Entities(entityIds); for (size_t i = 0, size = entityIds.size(); i < size; ++i) { pEntity = pPlayer->GetEntity(entityIds[i]); assert(pEntity); if (p_entityType == pEntity->Type() && !pEntity->IsLocked()) { return pEntity->Id(); } } return adaptedEntityId; }