void BuildActionEx::FreeResources(RtsGame &game) { if (_builderId != INVALID_TID) { if (!_buildArea.IsNull() && _buildArea.IsLocked()) { // Special buildings (for example addons) are not associated with build positions so no need to assert in that case. _ASSERTE(game.GetEntityType((EntityClassType)_params[PARAM_EntityClassId])->P(TP_IsSpecialBuilding) || !_buildArea.IsNull()); _buildArea.Unlock(this); } if (!_requiredResources.IsNull() && _requiredResources.IsLocked()) { _requiredResources.Unlock(this); } if (_builderId != INVALID_TID) { GameEntity *pEntity = game.Self()->GetEntity(_builderId); if (pEntity && pEntity->IsLocked()) { pEntity->Unlock(this); } _builderId = INVALID_TID; } } }
bool BuildActionEx::Execute(RtsGame& game, const WorldClock& p_clock) { EntityClassType buildingType = (EntityClassType)_params[PARAM_EntityClassId]; GameEntity *pGameBuilder; AbstractAdapter *pAdapter = g_OnlineCaseBasedPlanner->Reasoner()->Adapter(); bool bOk = false; //// Adapt builder //_builderId = pAdapter->AdaptBuilder(buildingType, true); //// Adapt build position //_buildArea = pAdapter->AdaptPositionForBuilding(buildingType); // Adapt builder // Adapt build position auto adaptedParams = pAdapter->AdaptBuilderAndPosition(buildingType, true); _builderId = adaptedParams.first; _buildArea = adaptedParams.second; if (_builderId != INVALID_TID) { // Initialize build state _buildStarted = false; // Issue build order pGameBuilder = game.Self()->GetEntity(_builderId); LogInfo("Builder=%s was selected to execute build", pGameBuilder->ToString().c_str()); pGameBuilder->Lock(this); // Special buildings (for example addons) are not associated with build positions so no need to assert in that case. if (!game.GetEntityType(buildingType)->P(TP_IsSpecialBuilding)) { _ASSERTE(!_buildArea.IsNull()); _buildArea.Lock(this); } _ASSERTE(!_requiredResources.IsNull()); _requiredResources.Lock(this); bOk = pGameBuilder->Build(buildingType, _buildArea.Pos()); if (bOk) _buildIssued = true; } return bOk; }
void BuildActionEx::HandleMessage(RtsGame& game, Message* p_msg, bool& p_consumed) { if (PlanStepEx::GetState() == ESTATE_Executing && (p_msg->TypeId() == MSG_EntityCreate || p_msg->TypeId() == MSG_EntityRenegade)) { EntityCreateMessage* pMsg = static_cast<EntityCreateMessage*>(p_msg); TID buildingId; GameEntity *pGameBuilding; Vector2 msgBuildPosition; if (pMsg->Data()->OwnerId != PLAYER_Self) return; _ASSERTE(pMsg && pMsg->Data()); buildingId = pMsg->Data()->EntityId; pGameBuilding = game.Self()->GetEntity(buildingId); _ASSERTE(pGameBuilding); msgBuildPosition.X = pMsg->Data()->X; msgBuildPosition.Y = pMsg->Data()->Y; if (pGameBuilding->TypeId() == _params[PARAM_EntityClassId] && ((msgBuildPosition.X == _buildArea.Pos().X && msgBuildPosition.Y == _buildArea.Pos().Y) || game.GetEntityType(pGameBuilding->TypeId())->P(TP_IsSpecialBuilding))) { _buildingId = pGameBuilding->Id(); _buildStarted = true; _ASSERTE(!_requiredResources.IsNull()); _requiredResources.Unlock(this); p_consumed = true; LogInfo("%s started actual building of %s", ToString().c_str(), pGameBuilding->ToString().c_str()); } } }