Seite 2 von 10 ErsteErste 123456 ... LetzteLetzte
Ergebnis 16 bis 30 von 136

Thema: fliegende Artillerie :)

  1. #16
    Europäer Avatar von Radyserb
    Registriert seit
    01.01.01
    Ort
    serbska stolica Budyšin a němska stolica Berlin
    Beiträge
    9.023

    Fliegende Rehe???

  2. #17
    Registrierter Benutzer
    Registriert seit
    29.01.03
    Beiträge
    4.909
    Also der Combat Mod der hatte keine solche Funktion.. irgendwie haben dort die Artillerien die Gegnerischen Einheiten einfach komplett kaputt gemacht ohne selbst Schaden zu nehmen und sind dann auf das entsprechende Feld vorgerückt. Städte wurden komplett zerstört... komisch auf den Screenshoots sah das alles noch anders aus.

    Der andere Mod (MuminMod) ging gar nicht. Beim laden kam ein fehler, dass in einer XML Datei ein tag falsch ist. Das war der Tag für einen Leader einer Civilisation den hab ich komplett gelöscht um den Mod trotzdem zu testen. Danach lud er den Mod, zeigte aber keine Schrift mehr an. Auch das Umstellen auf die englische Version brachte nichts.

    So nun hab ich mir das SDK geladen und bin gerade dabei das zum laufen zu bringen. Vielleicht finde ich ja mit meinen doch beschränkten C++ Kenntnissen doch irgendetwas und kann mich dann da reinarbeiten. C++ Bücher habe ich einige zu Hause, wollte das immer mal lernen aber habe nie so richtig die Zeit dazu gefunden.

  3. #18
    Registrierter Benutzer
    Registriert seit
    29.01.03
    Beiträge
    4.909
    So nun habe ich alles installiert und gucke gerade etwas in den Codes... leider konnte ich bis jetzt noch nicht die Datei entdecken in der geklärt wird, welche Aktionen ein Spieler mit einer Einheit machen kann... mal sehen vielleicht finde ich da noch etwas

  4. #19
    Registrierter Benutzer
    Registriert seit
    29.01.03
    Beiträge
    4.909
    Ahh ja... der erste Erfolg

    Ich habe die Stelle gefunden wo entschieden wird, ob eine Einheit bombardieren kann oder nicht... das Bild unten ist der Beweis. Es ist ekien Stadt in der Nähe und trotzdem kann man bombardieren.
    Aber das ist nur der Anfang! Denn betätigt man den Bottum stürzt Civ4 einfach ab.. klar ist jakeine Stadt in der Nähe um sie zu bombardieren. Nun wird geguckt wie es weiter geht
    Angehängte Grafiken Angehängte Grafiken

  5. #20
    the cosmos rocks Avatar von Caesium
    Registriert seit
    08.12.03
    Ort
    Faerûn
    Beiträge
    9.104
    Keine Stadt und dennoch Kulturradius
    Caesium Mod v2.4 (für Civ4 WL v2.13)

  6. #21
    Registrierter Benutzer
    Registriert seit
    29.01.03
    Beiträge
    4.909
    Doch da ist doch meine eigene Stadt daneben Aber die kann man ja nicht bombadrieren...

  7. #22
    the cosmos rocks Avatar von Caesium
    Registriert seit
    08.12.03
    Ort
    Faerûn
    Beiträge
    9.104
    So ist das also... dann mal weiterhin viel Erfolg...
    Caesium Mod v2.4 (für Civ4 WL v2.13)

  8. #23
    Registrierter Benutzer
    Registriert seit
    29.01.03
    Beiträge
    4.909
    Ich habe jetzt die Funktion gefunden in der "bombardiert" wird das ist übrings:
    bool CvUnit::bombard()

    doch nun suche ich eine Möglichkeit vor dem Bombardieren so eine Feldauswahl einzublenden wie beim Luftangriff. Doch leider habe ich noch nicht herausgefunden wie das beim Luftangriff passiert bzw. was passiert nachdem der Buttom angeklickt wurde? Wie kommt es dann zu diesem Luftangriffauswahlfeldern? Fragen über Fragen, ich suche weiter und wenn jemand eine Antwort hat, dann kann er sie mir ja schnell sagen

    Übrings habe ich per Mail folgenden Hinweis zum Thema "fliegende Artillerie" bekommen:
    Im Zweiten Weltkrieg wurden StuKas als fliegende Artillerie zur
    Unterstützung für weit vorgerückte Panzerdivisionen eingesetzt. Zuerst von
    den Deutschen zu Beginn des Krieges. Polen und Franzosen waren dieser Taktik
    damals nicht gewachsen, v.a. die französische Generalität war damals noch
    der WK 1 Doktrin/Kampfführung zugewandt. Die rechneten gar nicht mit dem
    massierten Einsatz von schnellen Verbänden mit taktischer Luftunterstützung
    und der deutschen Taktik des Ausmanövrierens. Warum erzähl ich dir das? Ist
    mir zum Thema fliegende Artillerie eingefallen...mein gott, und ich hab mal
    Zivi gemacht...

  9. #24
    sehr stylisch Avatar von Polly
    Registriert seit
    11.08.02
    Ort
    Kall
    Beiträge
    14.715
    Zitat Zitat von Netbandit
    Ich habe jetzt die Funktion gefunden in der "bombardiert" wird das ist übrings:
    bool CvUnit::bombard()
    Nach Syntax klingt das eher nach einer Funktion, in der abgefragt wird, ob die Einheit bombardieren kann, da als Rückgabewert ein bool angegeben ist (bool bedeutet, dass die Rückgabe entweder "wahr" oder "falsch" ist).

    Aber ohne die Definition der Funktion gesehen zu haben, weiß ich das natürlich nicht wirklich.

  10. #25
    Registrierter Benutzer
    Registriert seit
    29.01.03
    Beiträge
    4.909
    Zitat Zitat von Polly
    Nach Syntax klingt das eher nach einer Funktion, in der abgefragt wird, ob die Einheit bombardieren kann, da als Rückgabewert ein bool angegeben ist (bool bedeutet, dass die Rückgabe entweder "wahr" oder "falsch" ist).

    Aber ohne die Definition der Funktion gesehen zu haben, weiß ich das natürlich nicht wirklich.
    Polly, Polly selbst ich als C++Nicht-Könner-Aber-Sich-Durchaus-Mit-Vielen-Anderen-Programmiersprachen-Auskenner weiß, dass jede Funktion etwas zurück gibt. Ansonnsten wäre es ja eine Procedure. Und da C++ keine Proceduren hat, sondern nur Funktionen ist anzunehmen, dass jede Funktion die etwas ausführt aber nicht direkt zurück gibt im Falle, das sie etwas auch wirklich ausgeführt hat ein true meldet

    Übrigens heißt die Funktion die testet ob eine Einheit bombardieren kann sinnvoller Weise: canBombard

  11. #26
    sehr stylisch Avatar von Polly
    Registriert seit
    11.08.02
    Ort
    Kall
    Beiträge
    14.715
    In C++ wird zwar nicht zwischen Prozeduren und Funktionen unterschieden, aber trotzdem gibt es Funktionen, die nichts zurückgeben. Diese Funktionen liefern als Rückgabe den Wert "void".

    Normalerweise nutzt man in C++ allerdings den Rückgabewert einer Funktion nicht mehr zur Überprüfung, womit ich allerdings nicht sagen möchte, dass dies von Programmierern nicht mehr gemacht wird, immerhin ist C++ ja C kompatibel. Schöner ist es aber mit der strukturierten Fehlerbehandlung über Throws und Catches zu arbeiten.

    Wie gesagt habe ich von dem SDK keinerlei Ahnung, mein Einwurf war nur als netter Hinweis gedacht. Wenn du es besser weißt, dann ok.

  12. #27
    Registrierter Benutzer
    Registriert seit
    29.01.03
    Beiträge
    4.909
    Stimmt damit Funktionen nichts zurück liefern, liefern sie einfach void zurück, da geb ich dir Recht.
    Trotzdem macht es Sinn, auch nicht zur Fehlerkontrolle, jeder Funktion die eine Aktion ausführt einen Rückgabewert von true oder false mitzugeben. Denn eine Funktion die eine bestimmte Aktion ausführt, führt diese Aktion vielleicht nur unter bestimmten Bedingungen aus und bricht vielleicht ab bevor diese Aktion ausgeführt wurde, weil die Bedingungen dafür nicht erfüllt waren. In diesem Falle macht es Sinn einen Rückgabewert von True oder false mitzugeben, damit man später prüfen kann ob die entsprechende Aktion ausgeführt wurde. Das ist sicher einfacher als mit Throws und Catches

    In diesem Falle ist es sogar so Denn es wird vor einer Bombardierung nocheinmal geprüft ob die Einheit überhaupt bombardieren kann und bei einem negativen ergebnis wird die Funktion mit return false abgebrochen

    Ich wollte dich ja nicht zurecht weisen, du bist gerne eingeladen bei der Lösung der Probleme mitzuhelfen. Lad dir das SDK herunter und dann suchen wir gemeinsam nach den Funktionen die zu einer tollen Bombardieraktion notwendig sind

  13. #28
    Registrierter Benutzer
    Registriert seit
    29.01.03
    Beiträge
    4.909
    und es geht weiter:

    In der datei CVGame.cpp gibt es die Funktion void CvGame::updateColoredPlots()
    dort habe ich die Codezeilen gefunden die dafür verantwortlich sind, dass bei Flugzeugen der Einsatzradius angezeigt wird:

    PHP-Code:
            if (pHeadSelectedUnit->getDomainType() == DOMAIN_AIR)
            {
                
    iMaxAirRange 0;

                
    pSelectedUnitNode gDLL->getInterfaceIFace()->headSelectionListNode();

                while (
    pSelectedUnitNode != NULL)
                {
                    
    pSelectedUnit = ::getUnit(pSelectedUnitNode->m_data);
                    
    pSelectedUnitNode gDLL->getInterfaceIFace()->nextSelectionListNode(pSelectedUnitNode);

                    if (
    pSelectedUnit != NULL)
                    {
                        
    iMaxAirRange max(iMaxAirRangepSelectedUnit->airRange());
                    }
                }

                if (
    iMaxAirRange 0)
                {
                    for (
    iDX = -(iMaxAirRange); iDX <= iMaxAirRangeiDX++)
                    {
                        for (
    iDY = -(iMaxAirRange); iDY <= iMaxAirRangeiDY++)
                        {
                            
    pLoopPlot plotXY(pHeadSelectedUnit->getX_INLINE(), pHeadSelectedUnit->getY_INLINE(), iDXiDY);

                            if (
    pLoopPlot != NULL)
                            {
                                if (
    plotDistance(pHeadSelectedUnit->getX_INLINE(), pHeadSelectedUnit->getY_INLINE(), pLoopPlot->getX_INLINE(), pLoopPlot->getY_INLINE()) <= iMaxAirRange)
                                {
                                    
    NiColorA color(GC.getColorInfo((ColorTypes)GC.getInfoTypeForString("COLOR_WHITE")).getColor());
                                    
    color.0.4f;
                                    
    gDLL->getEngineIFace()->addColoredPlot(pLoopPlot->getX_INLINE(), pLoopPlot->getY_INLINE(), colorPLOT_STYLE_TARGETPLOT_LANDSCAPE_LAYER_BASE);
                                }
                            }
                        }
                    }
                }
            } 
    Das habe ich nun kopiert und darunter etwas verändert wieder eingefügt:

    PHP-Code:
    //! Hier wird das "Gitter" für Bombardierungseinheiten dargestellt
            
    if (pHeadSelectedUnit->canBombard())
            {

                
    iMaxBombardRange 0;   //! Bombardierungsreichweite auf 0 setzen

    //! Holt die Liste der selektierten Einheiten
                
    pSelectedUnitNode gDLL->getInterfaceIFace()->headSelectionListNode();

    //! Hier geht er die komplette Liste durch und sucht die selektierte Einheit mit der weitesten Bombardierungsreichweite

                
    while (pSelectedUnitNode != NULL)
                {
                    
    pSelectedUnit = ::getUnit(pSelectedUnitNode->m_data);
                    
    pSelectedUnitNode gDLL->getInterfaceIFace()->nextSelectionListNode(pSelectedUnitNode);

                    if (
    pSelectedUnit != NULL)
                    {
                        
    //! Ich benutze der erstmal den XML Tag "airRange" zur Feststellung der Bombardierreichweite
                        
    iMaxBombardRange max(iMaxBombardRangepSelectedUnit->airRange());
                    }
                }

                if (
    iMaxBombardRange 0//! wenn bei einer Einheit im selaktierten Stack die Bombardierreichweite > 0 ist dann zeigt er sie an
                
    {
                    for (
    iDX = -(iMaxBombardRange); iDX <= iMaxBombardRangeiDX++)
                    {
                        for (
    iDY = -(iMaxBombardRange); iDY <= iMaxBombardRangeiDY++)
                        {
                            
    pLoopPlot plotXY(pHeadSelectedUnit->getX_INLINE(), pHeadSelectedUnit->getY_INLINE(), iDXiDY);

                            if (
    pLoopPlot != NULL)
                            {
                                if (
    plotDistance(pHeadSelectedUnit->getX_INLINE(), pHeadSelectedUnit->getY_INLINE(), pLoopPlot->getX_INLINE(), pLoopPlot->getY_INLINE()) <= iMaxBombardRange)
                                {
                                    
    NiColorA color(GC.getColorInfo((ColorTypes)GC.getInfoTypeForString("COLOR_RED")).getColor());
                                    
    color.0.4f;
                                    
    gDLL->getEngineIFace()->addColoredPlot(pLoopPlot->getX_INLINE(), pLoopPlot->getY_INLINE(), colorPLOT_STYLE_TARGETPLOT_LANDSCAPE_LAYER_BASE);
                                }
                            }
                        }
                    }
                }
            } 
    Und nun werden beu Einheiten die eine Bombardierungsstärke besitzen ebenfalls ein reichweitengitter angezeigt. Ich benutze hier als Reichweite den XML Tag iairRange.
    Die Variable iMaxBombardRange muss natürlich beim Funktionsbeginn angemeldet werden.

    Anbei noch ein Bild wo man den Feuerradius gut erkennen kann...
    ich komme dem Problem also näher!
    Angehängte Grafiken Angehängte Grafiken

  14. #29
    Registrierter Benutzer
    Registriert seit
    29.01.03
    Beiträge
    4.909
    Ok es geht weiter:

    Edit:
    Achtung, leider kann man die spitzen "Pfeilklammern" für die XML Tags hier nicht verwenden, da das Forum diese als HTML Tag auffasst und nicht korrekt anzeigt. Daher habe ich stattdessen runde Klammer gesetzt "()". Also alle runden Klammern einfach als spitze Klammern vorstellen


    Nun habe ich die Lösung gefunden wie man in das Zielauswahlinterface kommt! Das ist an sich einfacher als ich es mir vorgestellt habe.

    Es gibt die XML Datei CIV4MissionInfos.xml. In ihr stehen alle zur verfügung stehenden Missionen drinne. Dort habe ich die Mission "MISSION_BOMBARD" etwas abgeändert. Und zwar habe ich alle Tags nach (bSound)1(/bSound) wegkopiert, denn so sieht es bei allen Missionen aus, welche ein Zielauswahlinterface einblenden. Ich denke hier ist der Tag (bVisible)1(/bVisible) ausschlaggebend. Wenn dieser Tag auf 0 steht oder eben nciht gesetzt ist, dann wird die Mission auch nicht unter der Befehlsauswahl eingeblendet.

    Aber das führt ja nur dazu, dass die Mission nicht mehr auswählbar ist, wie kommt es nun zum Interface? Ganz einfach! In der XML Datai CIV4InterfaceModeInfos.xml stehen alle Missionen drinne die ein spezielles Interface erzeugen. Hier habe ich folgendes hinzugefügt (inspiriert von INTERFACEMODE_AIRBOMB) :

    PHP-Code:
            <InterfaceModeInfo>
                <
    Type>INTERFACEMODE_BOMBARD</Type>
                <
    Description>TXT_KEY_INTERFACEMODE_AIRBOMB</Description>
                <
    Help>TXT_KEY_INTERFACEMODE_AIRBOMB_HELP</Help>
                <
    CursorType>CURSOR_AIRBOMB</CursorType>
                <
    Mission>MISSION_BOMBARD</Mission>
                <
    HotKey>KB_B</HotKey>
                <
    bAltDown>0</bAltDown>
                <
    bShiftDown>0</bShiftDown>
                <
    bCtrlDown>0</bCtrlDown>
                <
    iHotKeyPriority>0</iHotKeyPriority>
                <
    HotKeyAlt/>
                <
    bAltDownAlt>0</bAltDownAlt>
                <
    bShiftDownAlt>0</bShiftDownAlt>
                <
    bCtrlDownAlt>0</bCtrlDownAlt>
                <
    iHotKeyPriorityAlt>0</iHotKeyPriorityAlt>
                <
    bVisible>1</bVisible>
                <
    bGotoPlot>0</bGotoPlot>
                <
    bHighlightPlot>1</bHighlightPlot>
                <
    bSelectType>0</bSelectType>
                <
    bSelectAll>0</bSelectAll>
                <
    Button>,Art/Interface/Buttons/Actions/Airbomb.dds,Art/Interface/Buttons/Actions_Builds_LeaderHeads_Specialists_Atlas.dds,2,1</Button>
            </
    InterfaceModeInfo
    Natürlich stimmen (Description)TXT_KEY_INTERFACEMODE_AIRBOMB(/Description) und (Help)TXT_KEY_INTERFACEMODE_AIRBOMB_HELP(/Help) noch nicht mit der neues Mission überein, aber das kann man ja später problemlos anpassen! (CursorType)CURSOR_AIRBOMB(/CursorType) habe ich ebenfalls so stehen lassen, weil dieser an sich ganz gut zur Mission passt, aber wenn man möchte lässt sich das auch gut anpassen.

    Das wars von der XML Seite aus, nun gibt es noch ein paar SDK Anpassungen:

    1.) Der neue Interfacemode muss natürlich bekannt gemacht werden, das geschieht in der Datei CvEnums.h, dort änder ich ab Zeile 192 die enum folgender maßen ab:

    PHP-Code:
    enum DllExport InterfaceModeTypes            // Exposed to Python
    {
        
    NO_INTERFACEMODE = -1,

        
    INTERFACEMODE_SELECTION,
        
    INTERFACEMODE_PING,
        
    INTERFACEMODE_SIGN,
        
    INTERFACEMODE_GRIP,
        
    INTERFACEMODE_GLOBELAYER_INPUT,
        
    INTERFACEMODE_GO_TO,
        
    INTERFACEMODE_GO_TO_TYPE,
        
    INTERFACEMODE_GO_TO_ALL,
        
    INTERFACEMODE_ROUTE_TO,
        
    INTERFACEMODE_AIRLIFT,
        
    INTERFACEMODE_NUKE,
        
    INTERFACEMODE_RECON,
        
    INTERFACEMODE_AIRBOMB,
        
    INTERFACEMODE_BOMBARD,  //! Meine neue Bombardiermission braucht ein Interface!
        
    INTERFACEMODE_AIRSTRIKE,
        
    INTERFACEMODE_REBASE,

        
    NUM_INTERFACEMODE_TYPES
    }; 
    Damit kennt Civ4 nun den Interfacemode als offizielles Interface. Allerdings gibt es dann noch zwei Funktionen welche abfragen ob ein Interface gezeichnet werden kann/soll und ob an der Stello wo der Cursor gerade ist die Mission durchgeführt werden kann (dann erscheint ein grünes Kästchen, auf unerkundeten Gebiet ist das Kästchen grau und wenn die Mission an einer Stelle nicht durchgeführt werden kann ist gar kein Kästchen zu sehen.)

    Also 2.) In der Datei CvSelectionGroup.cpp in der Funktion bool CvSelectionGroup::canDoInterfaceMode(InterfaceModeTypes eInterfaceMode) ab Zeile 1442 in der Switchanweisung switch (eInterfaceMode) einfach folgenden Code hizufügen:

    PHP-Code:
    //! Das Interface für die Bombardierungsfunktion ist davon abhänig, ob die Einheit überhaupt bombardieren kann!
            
    case INTERFACEMODE_BOMBARD:
                if (
    pLoopUnit->canBombard())
                {
                    return 
    true;
                }
                break; 
    Damit wird das Interface aktiviert sobald man den Buttom dafür drückt.

    3.) Wieder in der Datei CvSelectionGroup.cpp in der Funktion bool CvSelectionGroup::canDoInterfaceModeAt(InterfaceModeTypes eInterfaceMode, CvPlot* pPlot) ab Zeile 1530 in der Switchanweisung switch (eInterfaceMode) einfach folgenden Code hizufügen:

    PHP-Code:
            case INTERFACEMODE_BOMBARD:
                if (
    pLoopUnit != NULL)
                {
                    if (
    pLoopUnit->canBombardAt(pLoopUnit->plot(), pPlot->getX_INLINE(), pPlot->getY_INLINE()))
                    {
                        return 
    true;
                    }
                }
                break; 
    Damit wird die Funktion canBombardAt aus der Datei CvUnit.cpp aufegrufen um abzufragen ob das jeweilige Feld bombardiert werden kann. Ist dies der Fall (true) wird der Feldcursor grün.

    Natürlich existiert diese Funktion nicht, da im orignal Civ4 kein bestimmtes Feld bombardiert werden kann. Daher müss die Funktion noch geschrieben werden.

    4.) In der Datei CvUnit.cpp einfach folgende Funktion hinzufügen. (Ich habe das bei Zeile 3293) gemacht um gleich den Bezug zu den anderen Bombardierungsfunktion herzustellen.

    PHP-Code:
    //! Kann das ausgewählte Feld überhaupt bombardiert werden? Das beantwortet diese Funktion!
    bool CvUnit::canBombardAt(const CvPlotpPlotint iXint iY) const
    {
    return 
    true;

    Diese Funktion tut natürlich nichts weiter als immer true zurück zu geben, was zum testen erstmal reicht. Später wird die Funktion ähnlich der canAirBombAt Funktion abfragen ob das Feld bombardiert werden darf!

    5.) Die Funktion muss jedoch noch bekannt gemacht werden, das passiert in der Datei CvUnit.h in der Klasse CvUnit mit folgenden Code: (Ich habe ihn bei Zeile 154 eingefügt im wieder den Bezug zu den anderen Bombardierungsfunktionen zu haben)

    PHP-Code:
        bool canBombardAt(const CvPlotpPlotint iXint iY) const;   //! Fragt ab ob das Feld bombardiert werden kann                                                                    // Exposed to Python 
    Und wenn wir das jetzt testen müsste es genauso aussehen wie auf dem Bild was ich angehangen habe.

    Wenn man nun das ausgewählte Feld anklickt stürzt Civ4 ab, was daran liegt, dass nun die Funktion bombard() aufgerufen wird, welche versucht die feindliche Stadt zu bombardieren die neben der Einheit liegt. Das führt jedoch zu nichts, denn dort steht ja keine feindliche Stadt also stürzt Civ4 ab. Daher habe ich in der Funktion bool CvUnit::bombard() in der Datei CvUnit.cpp gleich hinter der ersten Klammer folgenden Code ingefügt:

    PHP-Code:
    return false
    Damit wird die Funktion abgebrochen bevor er versucht die nicht verhandene Stadt zu bombardieren.

    Als nächstes muss ich nun die Funktion canBombardAt anpassen, damit diese korrekt ermittelt welches Feld bombardiert werden kann und welches nicht. Außerdem möchte ich die Funktion bombard ersteinmal so abändern, dass eine Testmitteilung erscheint wo steht, das bombardiert wurde. Damit kann ich prüfen ob das mit der Feldauswahl und dem Interface überhaupt so hinhaut wie ich es mir denke.

    Also es geht weiter und so langsam komme ich in die heiße Phase meiner Pläne
    Angehängte Grafiken Angehängte Grafiken
    Geändert von Netbandit (05. Juni 2006 um 16:16 Uhr)

  15. #30
    Ein Platz an der Sonne Avatar von Commander Bello
    Registriert seit
    05.06.05
    Ort
    Nähe Koblenz
    Beiträge
    6.209
    Bin kein Programmierer und kann daher nur teilweise folgen. Klingt aber gut und sinnvoll, was du beschreibst.
    Vor allem gefällt mir, daß du detailliert beschreibst, was du tust und warum.

    Würde mich sehr freuen, wenn dein Engagement dazu führen könnte, daß man Artillerie-Einheiten endlich mal vernünftig einsetzen kann. In diesem Sinne im Namen aller "wahren Bombardierungsfans": Gluck auf und gutes Gelingen!


Seite 2 von 10 ErsteErste 123456 ... LetzteLetzte

Berechtigungen

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