Wo wird festgelegt, welche Einheiten bei Kriegserklärung aus den Grenzen geworfen werden?
Wo wird festgelegt, welche Einheiten bei Kriegserklärung aus den Grenzen geworfen werden?
Pucc's Lets Plays BASE 6.0: #1 #2 #3 #4 #5
Download von BASE 6.4 [E]: HIER (klick mich!) (Stand: 08.06.2024)
Ich bin nicht sicher ob ich die Frage 100% verstehe:
Schaue dir mal die CvUnit-Methoden "canEnterTerritory" und "canEnterArea" an.
Letztere wird durch die CvPlot-Methode "verifyUnitValidPlot" aufgerufen, diese wiederum durch die gleichnamige Methode von CvMap. An der Spitze steht dann "declareWar" von CvTeam.
Also:
CvTeam::declareWar -> CvMap::verifyUnitValidPlot -> CvPlot::verifyUnitValidPlot -> CvUnit::canEnterArea -> CvUnit::canEnterTerritory
In "canEnterTerritory" solltest du zusätzliche Bedingungen an die Einheit stellen können.
Die Sache ist folgende: Die Einheit kann ja nur vor Kriegsbeginn nicht das feindliche Territorium betreten. D.h. im Krieg müsste canEnterTerritory irgendwie ausgehebelt werden. Das habe ich aber nicht gefunden.
Oder umgekehrt, ich habe definiert, dass alle Einheiten mit Trait X canEnterTerritory true haben. Das müsste false werden bei Kriegsbeschluss und danach sofort wieder true werden. Wenn das geht.
Um genau zu sein siehts so aus:
Damit bleiben die Einheiten aber auch bei Kriegserklärung im Feindesland, können also sofort die nächste Stadt einnehmen, was total imba ist.PHP-Code:
bool CvUnit::canEnterTerritory(TeamTypes eTeam, bool bIgnoreRightOfPassage) const
{
if (GET_TEAM(getTeam()).isFriendlyTerritory(eTeam))
{
return true;
}
if (eTeam == NO_TEAM)
{
return true;
}
if (isEnemy(eTeam))
{
return true;
}
if (isRivalTerritory())
{
return true;
}
/* Enhanced Traits (Asaf) - Start */
if (GET_PLAYER(getOwnerINLINE()).isExploreRivalTerritory())
{
return true;
}
/* Enhanced Traits (Asaf) - End */
Am besten ich lass es den Fanatic machen, der die Mod erstellt hat. Nur der hat im Moment keine Zeit.
Pucc's Lets Plays BASE 6.0: #1 #2 #3 #4 #5
Download von BASE 6.4 [E]: HIER (klick mich!) (Stand: 08.06.2024)
Für Einheiten, die diese Traits haben, sollen die gleichen Gegebenheiten gelten, also bei Kriegserklärung rausgebeamt werden?
Du könntest vielleicht "canEnterTerritory" einen zusätzlichen optionalen Parameter (bool) mitgeben der angibt, ob die ob die Einheiten mit diesen Traits dennoch unerwünscht sind (die Methode also false zurückgibt).
Dazu müsstest du diese Methode um diesen optionalen Parameter (mit der Defaultwert true) erweitern.
Das gleiche musst du mit der Methode CvUnit::canEnterArea machen. Der Aufruf dieser Methode muss dann in der Methode CvPlot::verifyUnitValidPlot geändert werden, also
Geänderte Deklarationen:PHP-Code:
if (pLoopUnit != NULL)
{
if (pLoopUnit->atPlot(this))
{
if (!(pLoopUnit->isCargo()))
{
if (!(pLoopUnit->isCombat()))
{
if (!isValidDomainForLocation(*pLoopUnit) || !(pLoopUnit->canEnterArea(getTeam(), area(), false, false))) //das erste false ist für bIgnoreRightOfPassage !
{
if (!pLoopUnit->jumpToNearestValidPlot())
{
bErased = true;
}
}
}
}
}
}
Die Methode "canEnterArea":PHP-Code:
bool canEnterTerritory(TeamTypes eTeam, bool bIgnoreRightOfPassage = false, bool irgendwas=true) const;
bool canEnterArea(TeamTypes eTeam, const CvArea* pArea, bool bIgnoreRightOfPassage = false, bool irgendwas=true) const;
PHP-Code:
bool CvUnit::canEnterArea(TeamTypes eTeam, const CvArea* pArea, bool bIgnoreRightOfPassage, bool irgendwas) const
{
if (!canEnterTerritory(eTeam, bIgnoreRightOfPassage, irgendwas))
{
return false;
}
[...]
}
Wäre ein erster (ungetesteter!) Ansatz.
Funktioniert nicht so ganz. Einheiten werden nicht weggebeamt. Werde weiter testen.
wenn man eine militäreinheit im frieden per worldbuilder in feindesland parkt und ne runde beendet, müsste die danach rausgebeamt werden oder? grund: sie darf da nicht stehen, der plot ist also nicht valid. also wird der nächste valid plot gesucht.
wenn man eine militäreinheit im frieden per worldbuilder in feindesland parkt und den krieg erklärt und DANN die runde beendet, wird sie bestimmt nicht rausgebeamt, weil der plot dann valid ist. dass er vor kriegserklärung nicht valid war, ist in dem fall egal.
solange nicht gespeichert wird, wann etwas valid war und was nicht, dürfte es keine lösung für das problem geben oder?
man müsste zum zeitpunkt der kriegserklärung das territorium nach einheiten absuchen, die im falle eines friedens dort nicht stehen dürfen und diese dann versetzen. wenn es stacks sind, müssten quasi einzelne einheiten des stacks verschoben werden.
Pucc's Lets Plays BASE 6.0: #1 #2 #3 #4 #5
Download von BASE 6.4 [E]: HIER (klick mich!) (Stand: 08.06.2024)
stimmt, das problem sind jetzt einheiten, die im frieden da stehen dürfen. und zwar nur die, die nicht die herkömmliche erlaubnis besitzen.
Pucc's Lets Plays BASE 6.0: #1 #2 #3 #4 #5
Download von BASE 6.4 [E]: HIER (klick mich!) (Stand: 08.06.2024)
Mal so eine Idee: In wie fern unterscheidet sich der Trait von OG+Kriegserklärung. Vielleicht kann man daran was abschauen.
bei kriegserklärung erlischt die OG, aber der trait bleibt.
Pucc's Lets Plays BASE 6.0: #1 #2 #3 #4 #5
Download von BASE 6.4 [E]: HIER (klick mich!) (Stand: 08.06.2024)
das bringt mich auf die idee der lösung, die ich aber nicht selbst machen kann:
- isExploreRivalTerritory() muss sich auf andere teams beziehen, im krieg würde das dann false werden für das team, mit dem man im krieg ist.
Pucc's Lets Plays BASE 6.0: #1 #2 #3 #4 #5
Download von BASE 6.4 [E]: HIER (klick mich!) (Stand: 08.06.2024)
Das wird das Problem auch nicht lösen.
Das Problem ist nämlich die eine Abfrage in "canEnterTerritory":
Diese Abfrage sorgt dafür, dass eine Einheit, die vor Kriegserklärung sich bereits im Gebiet aufhält (und vorher keine offene Grenzen vereinbart wurden), im feindlichem Gebiet verbleibt.PHP-Code:
if (isEnemy(eTeam))
{
return true;
}
Abhilfe schafft folgendes:
Der Parameter bTeamDeclareWarCall bedeutet, dass die Methode canEnterTerritory implizit durch CvTeam::declareWar aufgerufen wird.PHP-Code:
bool CvUnit::canEnterTerritory(TeamTypes eTeam, bool bIgnoreRightOfPassage, bool bTeamDeclareWarCall) const
{
if (GET_TEAM(getTeam()).isFriendlyTerritory(eTeam))
{
return true;
}
if (eTeam == NO_TEAM)
{
return true;
}
if (isRivalTerritory())
{
return true;
}
if (alwaysInvisible())
{
return true;
}
if (m_pUnitInfo->isHiddenNationality())
{
return true;
}
if (!bIgnoreRightOfPassage)
{
if (GET_TEAM(getTeam()).isOpenBorders(eTeam))
{
return true;
}
}
if (!bTeamDeclareWarCall)
{
if (isEnemy(eTeam))
{
return true;
}
// Einfacher Test, dient zur Unterscheidung
if (baseCombatStr() >= 2)
{
return true;
}
}
return false;
}
Weitere Änderungen:
In CvUnit.h:
In CvUnit.cpp:PHP-Code:
bool canEnterTerritory(TeamTypes eTeam, bool bIgnoreRightOfPassage = false, bool bTeamDeclareWarCall = false) const; // bTeamDeclareWarCall hinzufügen
bool canEnterArea(TeamTypes eTeam, const CvArea* pArea, bool bIgnoreRightOfPassage = false, bool bTeamDeclareWarCall = false) const; // bTeamDeclareWarCall hinzufügen
In CvMap.h:PHP-Code:
bool CvUnit::canEnterArea(TeamTypes eTeam, const CvArea* pArea, bool bIgnoreRightOfPassage, bool bTeamDeclareWarCall) const
{
if (!canEnterTerritory(eTeam, bIgnoreRightOfPassage, bTeamDeclareWarCall)) // bTeamDeclareWarCall hinzufügen
{
return false;
}
[...]
In CvMap.cpp:PHP-Code:
void verifyUnitValidPlot(bool bTeamDeclareWarCall = false); // bTeamDeclareWarCall hinzufügen
In CvPlot.h:PHP-Code:
void CvMap::verifyUnitValidPlot(bool bTeamDeclareWarCall) // bTeamDeclareWarCall hinzufügen
{
for (int iI = 0; iI < numPlotsINLINE(); iI++)
{
plotByIndexINLINE(iI)->verifyUnitValidPlot(bTeamDeclareWarCall); // bTeamDeclareWarCall hinzufügen
}
}
In CvPlot.cpp:PHP-Code:
void verifyUnitValidPlot(bool bTeamDeclareWarCall = false); // bTeamDeclareWarCall hinzufügen
In CvTeam.cpp:PHP-Code:
void CvPlot::verifyUnitValidPlot(bool bTeamDeclareWarCall) // bTeamDeclareWarCall hinzufügen
{
[...]
std::vector<CvUnit*>::iterator it = aUnits.begin();
while (it != aUnits.end())
{
CvUnit* pLoopUnit = *it;
bool bErased = false;
if (pLoopUnit != NULL)
{
if (pLoopUnit->atPlot(this))
{
if (!(pLoopUnit->isCargo()))
{
if (!(pLoopUnit->isCombat()))
{
if (!isValidDomainForLocation(*pLoopUnit) || !(pLoopUnit->canEnterArea(getTeam(), area(), false, bTeamDeclareWarCall))) // bTeamDeclareWarCall hinzufügen
{
if (!pLoopUnit->jumpToNearestValidPlot())
{
bErased = true;
}
[...]
}
Ich hoffe das hilft.PHP-Code:
void CvTeam::declareWar(TeamTypes eTeam, bool bNewDiplo, WarPlanTypes eWarPlan)
{
[...]
FAssert(!(AI_isSneakAttackPreparing(eTeam)));
if ((AI_getWarPlan(eTeam) == NO_WARPLAN) || AI_isSneakAttackPreparing(eTeam))
{
if (isHuman())
{
AI_setWarPlan(eTeam, WARPLAN_TOTAL);
}
else if (isMinorCiv() || isBarbarian() || (GET_TEAM(eTeam).getAtWarCount(true) == 1))
{
AI_setWarPlan(eTeam, WARPLAN_LIMITED);
}
else
{
AI_setWarPlan(eTeam, WARPLAN_DOGPILE);
}
}
GC.getMapINLINE().verifyUnitValidPlot(true); // declare war call
for (iI = 0; iI < MAX_PLAYERS; iI++)
{
if (GET_PLAYER((PlayerTypes)iI).getTeam() == getID())
{
GET_PLAYER((PlayerTypes)iI).verifyUnitStacksValid();
}
}
hmm, ich habe ein Problem, wahrscheinlich liegt es daran, dass mein Kopf gerade zu voll ist... Kann ich eine unbestimmte Anzahl an Vektoren (STL) erstellen, also zum Beispiel die Anzahl der Vektoren von einer Variablen abhängig machen? Im Namen bräuchte man dann einen Counter, der mit jedem neuen Vektor um eins erhöht wird, also zum Beispiel. Vektor1; Vektor2;...etc.?
Wo kann ich nur meinen Hirnarbeitsspeicher löschen??? Ich fürchte ich habe mich schon zuviel da reingedacht. Vielleicht kann mir jemand helfen,
Mein Problem ist folgendes: Jede Runde werden ja die Plots durchgeloopt. Ich möchte jetzt verschiedene Gruppen nach Geländeart erstellen. Ich fange mit dem ersten Plot an. Sagen wir mal zu anschauungszwecken liegt der mitten auf der Karte. Er hat eine bestimmte Geländeart, z.B. Grasland. Mitbekomme ich den nächsten Plot. Von diesem ermittel ich auch die Geländeart. Ist sie dieselbe wie beim ersten Plot, geht das ganze Spiel von vorne los, ohne, dass beim ersten Plot abgebrochen werden soll, wir haben ja erst in einer Richtung nach dem angrenzenden Plot geschaut?PHP-Code:
pAdjacentPlot = plotDirection(getX_INLINE(), getY_INLINE(), ((DirectionTypes)iDirection));
Wie lässt sich das verwirklichen?
Ich weiß ist knifflig...
Suchst du einen Vektor von Vektoren?