/// Funktion erteilt einen Kolonisierungsbefehl, sofern dies auch möglich ist. /// @param pShip Zeiger des Schiffes /// @return <code>true</code> wenn ein Kolonisierungsbefehl gegeben werden könnte bool CShipAI::DoColonize(CShips* pShip) { if (!pShip) { ASSERT(pShip); return false; } // Kolonieschiffe eine Kolonisierung vorschlagen if (pShip->GetShipType() != SHIP_TYPE::COLONYSHIP) return false; CSector* pSector = &m_pDoc->GetSector(pShip->GetKO().x, pShip->GetKO().y); // Gehört der Sektor aktuell auch keiner Minorrace (also niemanden oder uns selbst) if (pSector->GetOwnerOfSector() != "" && pSector->GetOwnerOfSector() != pShip->GetOwnerOfShip()) return false; // Kolonisierungsbefehl geben for (int i = 0; i < pSector->GetNumberOfPlanets(); i++) { if (pSector->GetPlanet(i)->GetTerraformed() && !pSector->GetPlanet(i)->GetColonized()) { // Hier muss als erstes ein möglicher neuer Kurs gelöscht werden pShip->SetTargetKO(CPoint(-1, -1)); pShip->SetCurrentOrder(SHIP_ORDER::COLONIZE); return true; } } return false; }
/// Funktion erteilt einen Terraformbefehl, sofern dies auch möglich ist. /// @param pShip Zeiger des Schiffes /// @return <code>true</code> wenn ein Terraformbefehl gegeben werden könnte bool CShipAI::DoTerraform(CShips* pShip) { if (!pShip) { ASSERT(pShip); return false; } // Es wird jeder Planet sofort genommen, welcher weniger als 8 Runden zum Terraformen // benötigt. Planeten welche mehr Runden zum Terraformen benötigen werden nur ausgewählt, // wenn in dem Sektor kein Planet zum sofortigen Kolonisieren zur Verfügung steht int nTerraPoints = pShip->GetColonizePoints(); if (nTerraPoints <= 0) return false; CSector* pSector = &m_pDoc->GetSector(pShip->GetKO().x, pShip->GetKO().y); // nur wenn der Sektor noch niemandem gehört bzw. uns selbst ist, sollen Planeten terraformt werden if (pSector->GetOwnerOfSector() != "" && pSector->GetOwnerOfSector() != pShip->GetOwnerOfShip()) return false; int nMinTerraPoints = INT_MAX; short nPlanet = -1; bool bColonizable = false; for (int j = 0; j < pSector->GetNumberOfPlanets(); j++) { const CPlanet* pPlanet = pSector->GetPlanet(j); // Planet überhaupt bewohnbar? if (!pPlanet->GetHabitable()) continue; // Planet schon terraformt? if (pPlanet->GetTerraformed()) { // und noch nicht kolonisiert? if (!pPlanet->GetColonized()) bColonizable = true; } else if (pPlanet->GetNeededTerraformPoints() < nMinTerraPoints) { nMinTerraPoints = pPlanet->GetNeededTerraformPoints(); nPlanet = j; } } // Wurde ein zu terraformender Planet gefunden und würden weniger als 6 Runden // zum Terraformen benötigt werden oder es gibt keinen Planeten, der // sofort kolonisiert werden könnte, dann den gefundenen Planeten terraformen if (nPlanet != -1 && (!bColonizable || nMinTerraPoints / nTerraPoints < 8)) { // Hier muss als erstes ein möglicher neuer Kurs gelöscht werden pShip->SetTargetKO(CPoint(-1, -1)); pShip->SetTerraform(nPlanet); return true; } return false; }