Seite 4 von 180 ErsteErste 123456781454104 ... LetzteLetzte
Ergebnis 46 bis 60 von 2699

Thema: Der SDK-Fragen-Thread

  1. #46
    Waddehaddedudeda Avatar von Cybah
    Registriert seit
    01.09.06
    Beiträge
    30.450
    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 [D]: HIER (klick mich!) (Stand: 08.07.2022)

  2. #47
    Registrierter Benutzer Avatar von alpha civ
    Registriert seit
    22.07.06
    Beiträge
    16.757
    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.

  3. #48
    Waddehaddedudeda Avatar von Cybah
    Registriert seit
    01.09.06
    Beiträge
    30.450
    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:

    PHP-Code:
    bool CvUnit::canEnterTerritory(TeamTypes eTeambool 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 */ 
    Damit bleiben die Einheiten aber auch bei Kriegserklärung im Feindesland, können also sofort die nächste Stadt einnehmen, was total imba ist.

    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 [D]: HIER (klick mich!) (Stand: 08.07.2022)

  4. #49
    Registrierter Benutzer Avatar von alpha civ
    Registriert seit
    22.07.06
    Beiträge
    16.757
    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

    PHP-Code:
    if (pLoopUnit != NULL)
            {
                if (
    pLoopUnit->atPlot(this))
                {
                    if (!(
    pLoopUnit->isCargo()))
                    {
                        if (!(
    pLoopUnit->isCombat()))
                        {
                            if (!
    isValidDomainForLocation(*pLoopUnit) || !(pLoopUnit->canEnterArea(getTeam(), area(), falsefalse)))   //das erste false ist für bIgnoreRightOfPassage !
                            
    {
                                if (!
    pLoopUnit->jumpToNearestValidPlot())
                                {
                                    
    bErased true;
                                }
                            }
                        }
                    }
                }
            } 
    Geänderte Deklarationen:
    PHP-Code:
    bool canEnterTerritory(TeamTypes eTeambool bIgnoreRightOfPassage falsebool irgendwas=true) const;                        
    bool canEnterArea(TeamTypes eTeam, const CvAreapAreabool bIgnoreRightOfPassage falsebool irgendwas=true) const; 
    Die Methode "canEnterArea":
    PHP-Code:
    bool CvUnit::canEnterArea(TeamTypes eTeam, const CvAreapAreabool bIgnoreRightOfPassagebool irgendwas) const
    {
        if (!
    canEnterTerritory(eTeambIgnoreRightOfPassageirgendwas))
        {
            return 
    false;
        }
    [...]


    Wäre ein erster (ungetesteter!) Ansatz.

  5. #50
    Registrierter Benutzer Avatar von alpha civ
    Registriert seit
    22.07.06
    Beiträge
    16.757
    Funktioniert nicht so ganz. Einheiten werden nicht weggebeamt. Werde weiter testen.

  6. #51
    Waddehaddedudeda Avatar von Cybah
    Registriert seit
    01.09.06
    Beiträge
    30.450
    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 [D]: HIER (klick mich!) (Stand: 08.07.2022)

  7. #52
    Registrierter Benutzer Avatar von alpha civ
    Registriert seit
    22.07.06
    Beiträge
    16.757
    Zitat Zitat von Cybah Beitrag anzeigen
    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.
    Das wird eigentlich bereits schon getan.

  8. #53
    Waddehaddedudeda Avatar von Cybah
    Registriert seit
    01.09.06
    Beiträge
    30.450
    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 [D]: HIER (klick mich!) (Stand: 08.07.2022)

  9. #54
    Beyond Mars Avatar von [VK]
    Registriert seit
    05.02.08
    Beiträge
    59.405
    Mal so eine Idee: In wie fern unterscheidet sich der Trait von OG+Kriegserklärung. Vielleicht kann man daran was abschauen.

  10. #55
    Waddehaddedudeda Avatar von Cybah
    Registriert seit
    01.09.06
    Beiträge
    30.450
    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 [D]: HIER (klick mich!) (Stand: 08.07.2022)

  11. #56
    Waddehaddedudeda Avatar von Cybah
    Registriert seit
    01.09.06
    Beiträge
    30.450
    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 [D]: HIER (klick mich!) (Stand: 08.07.2022)

  12. #57
    Registrierter Benutzer Avatar von alpha civ
    Registriert seit
    22.07.06
    Beiträge
    16.757
    Zitat Zitat von Cybah Beitrag anzeigen
    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.
    Das wird das Problem auch nicht lösen.

    Das Problem ist nämlich die eine Abfrage in "canEnterTerritory":

    PHP-Code:
    if (isEnemy(eTeam))
    {
        return 
    true;

    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.

    Abhilfe schafft folgendes:
    PHP-Code:
    bool CvUnit::canEnterTerritory(TeamTypes eTeambool bIgnoreRightOfPassagebool 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;

    Der Parameter bTeamDeclareWarCall bedeutet, dass die Methode canEnterTerritory implizit durch CvTeam::declareWar aufgerufen wird.

    Weitere Änderungen:
    In CvUnit.h:
    PHP-Code:
    bool canEnterTerritory(TeamTypes eTeambool bIgnoreRightOfPassage falsebool bTeamDeclareWarCall false) const;    // bTeamDeclareWarCall hinzufügen
    bool canEnterArea(TeamTypes eTeam, const CvAreapAreabool bIgnoreRightOfPassage falsebool bTeamDeclareWarCall false) const;    // bTeamDeclareWarCall hinzufügen 
    In CvUnit.cpp:
    PHP-Code:
    bool CvUnit::canEnterArea(TeamTypes eTeam, const CvAreapAreabool bIgnoreRightOfPassagebool bTeamDeclareWarCall) const
    {
            if (!
    canEnterTerritory(eTeambIgnoreRightOfPassagebTeamDeclareWarCall))  // bTeamDeclareWarCall hinzufügen
        
    {
            return 
    false;
        }
    [...] 
    In CvMap.h:
    PHP-Code:
    void verifyUnitValidPlot(bool bTeamDeclareWarCall false);  // bTeamDeclareWarCall hinzufügen 
    In CvMap.cpp:
    PHP-Code:
    void CvMap::verifyUnitValidPlot(bool bTeamDeclareWarCall)  // bTeamDeclareWarCall hinzufügen
    {
        for (
    int iI 0iI numPlotsINLINE(); iI++)
        {
            
    plotByIndexINLINE(iI)->verifyUnitValidPlot(bTeamDeclareWarCall);  // bTeamDeclareWarCall hinzufügen
        
    }

    In CvPlot.h:
    PHP-Code:
    void verifyUnitValidPlot(bool bTeamDeclareWarCall false);  // bTeamDeclareWarCall hinzufügen 
    In CvPlot.cpp:
    PHP-Code:
    void CvPlot::verifyUnitValidPlot(bool bTeamDeclareWarCall)  // bTeamDeclareWarCall hinzufügen
    {
        [...]

        
    std::vector<CvUnit*>::iterator it aUnits.begin();
        while (
    it != aUnits.end())
        {
            
    CvUnitpLoopUnit = *it;
            
    bool bErased false;

            if (
    pLoopUnit != NULL)
            {
                if (
    pLoopUnit->atPlot(this))
                {
                    if (!(
    pLoopUnit->isCargo()))
                    {
                        if (!(
    pLoopUnit->isCombat()))
                        {
                            if (!
    isValidDomainForLocation(*pLoopUnit) || !(pLoopUnit->canEnterArea(getTeam(), area(), falsebTeamDeclareWarCall)))  // bTeamDeclareWarCall hinzufügen
                            
    {
                                if (!
    pLoopUnit->jumpToNearestValidPlot())
                                {
                                    
    bErased true;
                                }
    [...]

    In CvTeam.cpp:
    PHP-Code:
    void CvTeam::declareWar(TeamTypes eTeambool bNewDiploWarPlanTypes eWarPlan)
    {
          [...]

            
    FAssert(!(AI_isSneakAttackPreparing(eTeam)));
            if ((
    AI_getWarPlan(eTeam) == NO_WARPLAN) || AI_isSneakAttackPreparing(eTeam))
            {
                if (
    isHuman())
                {
                    
    AI_setWarPlan(eTeamWARPLAN_TOTAL);
                }
                else if (
    isMinorCiv() || isBarbarian() || (GET_TEAM(eTeam).getAtWarCount(true) == 1))
                {
                    
    AI_setWarPlan(eTeamWARPLAN_LIMITED);
                }
                else
                {
                    
    AI_setWarPlan(eTeamWARPLAN_DOGPILE);
                }
            }

            
    GC.getMapINLINE().verifyUnitValidPlot(true);  // declare war call

            
    for (iI 0iI MAX_PLAYERSiI++)
            {
                if (
    GET_PLAYER((PlayerTypes)iI).getTeam() == getID())
                {
                    
    GET_PLAYER((PlayerTypes)iI).verifyUnitStacksValid();
                }
            } 
    Ich hoffe das hilft.

  13. #58
    verschollen Avatar von deepwater
    Registriert seit
    23.04.11
    Beiträge
    1.580
    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.?

  14. #59
    verschollen Avatar von deepwater
    Registriert seit
    23.04.11
    Beiträge
    1.580
    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. Mit
    PHP-Code:
    pAdjacentPlot plotDirection(getX_INLINE(), getY_INLINE(), ((DirectionTypes)iDirection)); 
    bekomme 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?

    Wie lässt sich das verwirklichen?
    Ich weiß ist knifflig...

  15. #60
    Registrierter Benutzer Avatar von alpha civ
    Registriert seit
    22.07.06
    Beiträge
    16.757
    Suchst du einen Vektor von Vektoren?

Seite 4 von 180 ErsteErste 123456781454104 ... LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •