Als nächstes will ich die Funktion erarbeiten, welche entscheidet ob das entsprechende Feld überhaupt bombardiert werden kann. Diese Funktion wird beim Anzeigen des Zielwahl Interfaces aufgerufen um zu entscheiden ob der Cursor grün anzeigen soll. Außerdem wird diese Funktion bei der eigendlichen Bombardierroutine aufgerufen um sicher zu gehen, dass überhaupt bombardiert werden darf.
Dazu muss ich die Funktion CvUnit::bombard in der Datei CvUnit.cpp etwas umschreiben. Es müssen jetzt Parameter übergeben werden, welche das Zielfeld angeben und es muss mit canBombardAt überprüft werden, ob bombardiert werden kann. Dieser Funktion wird das Feld übergeben auf dem sich die Einheit befindet und die beiden Zielkoordinaten.
Ist das bombardieren nicht möglich wird die Funktion bombard nun abgebrochen und es wird keine Textnachricht ausgegeben.
PHP-Code:
bool CvUnit::bombard(int iX, int iY)
{
CvWString szBuffer;
if (!canBombardAt(plot(), iX, iY))
{
return false;
}
//! Zeigt die Bombardierungsnachricht an
szBuffer = "BOOOOM!! (getroffen) ;) ";
gDLL->getInterfaceIFace()->addMessage(getOwnerINLINE(), true, GC.getDefineINT("EVENT_MESSAGE_TIME"), szBuffer, "AS2D_BOMBARDED", MESSAGE_TYPE_INFO, GC.getUnitInfo(getUnitType()).getButton(), (ColorTypes)GC.getInfoTypeForString("COLOR_RED"), getX_INLINE(), getY_INLINE(), true, true);
return true;
}
Da ich nun Parameter für diese Funktion verlange muss das in der Datei CvUnit.h natürlich ebenfalls bekannt gemacht werden.
Ich änder die Zeile:
PHP-Code:
bool bombard();
in:
PHP-Code:
bool bombard(int iX, int iY);
Und zu letzt müssen die Variablen beim Missionsstart mit übergeben werden. Dazu änder ich in der Datei CvSelectionGroup.cpp in der Funktion void CvSelectionGroup::startMission() ca. bei Zeile 891 den Code entsprechend ab.
Aus:
PHP-Code:
case MISSION_BOMBARD:
if (pLoopUnit->bombard())
{
bAction = true;
}
break;
wird
PHP-Code:
case MISSION_BOMBARD:
if (pLoopUnit->bombard(headMissionQueueNode()->m_data.iData1, headMissionQueueNode()->m_data.iData2))
{
bAction = true;
}
break;
Nun muss ich nur noch die Funktion canBombardAt in der Datei CvUnit.cpp so schreiben, dass sie sinnvoll erkennt, wann bombardiert werden kann und wann nicht.
Derzeit erkennt sie, ob ein Feld innerhalb der Reichweite liegt, dazu sieht so so aus:
PHP-Code:
bool CvUnit::canBombardAt(const CvPlot* pPlot, int iX, int iY) const
{
CvPlot* pTargetPlot; //! Das Zielfeld
//! Kann die Einheit überhaupt bombardieren?
if (!canBombard())
{
return false;
}
//! Hier holen wir uns das Zielfeld
pTargetPlot = GC.getMapINLINE().plotINLINE(iX, iY);
//! Ist die Entfernung zwischen dem Feld wo die Einheit steht und dem Zielfeld zu weit kann nicht bombardiert werden
if (plotDistance(pPlot->getX_INLINE(), pPlot->getY_INLINE(), pTargetPlot->getX_INLINE(), pTargetPlot->getY_INLINE()) > BombardRange())
{
return false;
}
return true;
}
Und es geht super