Ergebnis 1 bis 10 von 10

Thema: [SDK] Variablen auslesen und zurückschreiben

  1. #1
    Ein Platz an der Sonne Avatar von Commander Bello
    Registriert seit
    05.06.05
    Ort
    Nähe Koblenz
    Beiträge
    6.209

    [SDK] Variablen auslesen und zurückschreiben

    Ich möchte verschiedene Variablen nationenspezifisch anlegen, für Zählschleifen oder zum Zwischenspeichern von Werten nutzen und natürlich wieder zurückschreiben, damit die jeweiligen Werte erhalten bleiben.

    Beispiel 1:
    Ich möchte den Wert der nach Europa gelieferten Güter (brutto wie netto) ermitteln und aufsummieren, um ihn später mal auswerten zu können.

    Mir ist klar, dass ich innerhalb einer Funktion eine Variable über
    Code:
    int iVariable = 0;
    anlegen und mit ihr arbeiten kann. Mir ist weiterhin klar, dass ich die Variable ggf. über
    Code:
    return iVariable;
    aus der Funktion zurückgeben könnte, wenn das entsprechend definiert wäre.

    Was mir nicht klar ist, ist, wie die Variable außerhalb der Funktion so anzulegen ist, dass ich sie auslesen und nach der Berechnung zurückschreiben kann, so dass sie auch in einem Savegame gespeichert wird. Das Ganze soll dann ja auch noch nationenabhängig geschehen.

    Muss ich dafür also zwingend eine Variable in der Civ4CivilizationInfos.xml (plus Schema) anlegen und dann komplett in der CvInfos.cpp durchdeklinieren (dafür könnte ich ja eine andere Variable als Vorlage nehmen) oder gibt es für den beschriebenen Einsatzzweck eine kürzere Möglichkeit?

    (Ich behalte mir das Recht auf weitere Fragen vor )


  2. #2
    ε•ω=1 Avatar von Ramkhamhaeng
    Registriert seit
    19.07.10
    Ort
    Aralkum
    Beiträge
    9.896
    Diese Variablen brauchen nicht im XML-Teil eingetragen werden. (Wahrscheinlich willst du später noch für deine Berechnungen Konstanten festlegen, die deine neuen Berechnungen beeinflussen. Diese könnten dann nat. per XML festlegbar sein. )

    Willst du diese Werte wirklich an die Nation hängen oder eher an den Spieler: Da ich ungefähr weiß worum es dir geht würde ich im ersten Fall befürchten, dass es zu Problemen kommt, wenn zwei Spieler zur gleichen Nation gehören/den gleichen Hafen nutzen.
    Da es dir um ein ganzes Array von Werten geht beschreibe ich gleich die Vorgehensweise für diesen Fall.

    In deinem Fall würde ich so vorgehen:
    1. CvPlayer.h und CvPlayer.cpp öffnen und alle Zeilen mit der Variable m_abYieldEuropeTradable betrachten.
    2. Fast Zeilen mit der obigen Variable kopieren und direkt darunter für die neue Variable wiederverwenden. Es ist an vielen Stellen wichtig, dass du
    die Reihenfolge einhältst. (Z.B. bei den ->Read(...) und ->Write(...)-Zeilen ) Den Typ deiner Variablen musst du wahrscheinlich von bool zu int ändern. (Von float/double würde ich abraten.)
    3. Neue Methoden für das Auslesen und setzen der Variablen kreieren. Da kannst du auch mit copy & paste arbeiten

  3. #3
    Ein Platz an der Sonne Avatar von Commander Bello
    Registriert seit
    05.06.05
    Ort
    Nähe Koblenz
    Beiträge
    6.209
    Gucke ich mir gleich mal an, aber schon mal herzlichen Dank für die schnelle und detaillierte Antwort!


  4. #4
    Ein Platz an der Sonne Avatar von Commander Bello
    Registriert seit
    05.06.05
    Ort
    Nähe Koblenz
    Beiträge
    6.209
    Zitat Zitat von Ramkhamhaeng Beitrag anzeigen
    1. CvPlayer.h und CvPlayer.cpp öffnen und alle Zeilen mit der Variable m_abYieldEuropeTradable betrachten.
    Eine Nebenfrage stellt sich gleich:
    m_abYieldEuropeTradable

    Diese Nomenklatur habe ich noch nicht richtig verstanden. Ich habe es mir bei meinen bisherigen Ausflügen in die DLL-Dateien immer so zurechtgelegt, dass "m_" für eine dauerhaft zu speichernde Variable irgendeines Typs steht. "a" habe ich bislang als Array interpretiert und "b" wäre ein Boolean-Wert.
    Ist diese Interpretation korrekt, und wenn ja, ist das C++ - Standard oder von Firaxis mal so vorgegeben worden?


  5. #5
    ε•ω=1 Avatar von Ramkhamhaeng
    Registriert seit
    19.07.10
    Ort
    Aralkum
    Beiträge
    9.896
    Ein C++-Standard ist es nicht, aber durchaus üblich die Variablen-Namen so zu wählen.
    Das m_ steht für „Member“ und wird für Variablen gewählt, die zu einem Objekt gehören (Im Unterschied zu static-Variablen, die in allen Instanzen einer Objektklasse gleich sind. )
    Die Interpretation von a und b stimmt. Allerdings ist das auch nicht 100%-ig einheitlich im Code. m_paiExtraFeatureDefensePercent aus CvUnit.h haben sie auch noch mit p gekennzeichnet, dass es ein Pointer ist.

  6. #6
    Ein Platz an der Sonne Avatar von Commander Bello
    Registriert seit
    05.06.05
    Ort
    Nähe Koblenz
    Beiträge
    6.209
    Danke für die Erläuterung.
    Also lag ich mit meinen Interpretationen gar nicht so sehr falsch, das rettet mir den Tag.


  7. #7
    Ein Platz an der Sonne Avatar von Commander Bello
    Registriert seit
    05.06.05
    Ort
    Nähe Koblenz
    Beiträge
    6.209
    Zitat Zitat von Ramkhamhaeng Beitrag anzeigen
    Diese Variablen brauchen nicht im XML-Teil eingetragen werden. (Wahrscheinlich willst du später noch für deine Berechnungen Konstanten festlegen, die deine neuen Berechnungen beeinflussen. Diese könnten dann nat. per XML festlegbar sein. )
    Hier noch einmal eine Spezifizierung meinerseits:
    Ich benötige für eine Zählschleife eine Variable, die ich gern per XML setzen würde (um sie später ggf. testweise ändern zu können).
    Diese Variable soll pro Nation (s.a. die Frage unten) verfügbar und natürlich unabhängig sein.

    Aus meinem Eröffnungsposting:
    Was mir nicht klar ist, ist, wie die Variable außerhalb der Funktion so anzulegen ist, dass ich sie auslesen und nach der Berechnung zurückschreiben kann, so dass sie auch in einem Savegame gespeichert wird. Das Ganze soll dann ja auch noch nationenabhängig geschehen.

    Muss ich dafür also zwingend eine Variable in der Civ4CivilizationInfos.xml (plus Schema) anlegen und dann komplett in der CvInfos.cpp durchdeklinieren (dafür könnte ich ja eine andere Variable als Vorlage nehmen) oder gibt es für den beschriebenen Einsatzzweck eine kürzere Möglichkeit?
    Und, wo ich das gerade tippe, dann wäre diese Variable wohl irgendwie als Member von CvPlayer zu definieren?


    Zitat Zitat von Ramkhamhaeng Beitrag anzeigen
    Willst du diese Werte wirklich an die Nation hängen oder eher an den Spieler: Da ich ungefähr weiß worum es dir geht würde ich im ersten Fall befürchten, dass es zu Problemen kommt, wenn zwei Spieler zur gleichen Nation gehören/den gleichen Hafen nutzen.
    Hier verstehe ich die Frage nicht? Wann gehören denn zwei Spieler zur gleichen Nation, resp. nutzen den gleichen Hafen?
    Pro Spiel ist doch immer nur ein Spieler pro Nation vorhanden, damit wäre auch die Zuordnung der Variablen klar.

    Oder übersehe ich irgendetwas?

    Falls es noch nicht aufgefallen sein sollte, ich habe Fragen über Fragen.


  8. #8
    Col-Modder Avatar von raystuttgart
    Registriert seit
    19.03.10
    Ort
    Stuttgart
    Beiträge
    4.585
    Zitat Zitat von Commander Bello Beitrag anzeigen
    Pro Spiel ist doch immer nur ein Spieler pro Nation vorhanden, damit wäre auch die Zuordnung der Variablen klar.
    Das muss nicht sein.
    Du kannst in einem Spiel auch 2 Spieler der selben Nation starten lassen.

    Das Player-Objekt ist normalerweise das, welches man nutzt um Daten des Spielers zu speichern.
    Ergibt sich eigentlich schon von selbst.
    Teammitgleid dieses Projekt für Colonization:
    [Mod] We The People
    (Nachfolgerprojekt von Religion and Revolution)

    Davor Teammitgleid dieses Projekt für Colonization:
    [Mod] Religion and Revolution

    Vor-Vorheriges Projekt für Colonization:
    [ModMod] ray's Wunschliste

    Und wiederum davor Teammitglied von:
    [Mod] The Authentic Colonization (TAC)

  9. #9
    ε•ω=1 Avatar von Ramkhamhaeng
    Registriert seit
    19.07.10
    Ort
    Aralkum
    Beiträge
    9.896
    Zitat Zitat von Commander Bello Beitrag anzeigen
    Und, wo ich das gerade tippe, dann wäre diese Variable wohl irgendwie als Member von CvPlayer zu definieren?
    Ja und Nein. Bei Werten aus XML-Daten ist immer eine "Info"-Klasse zwischengeschaltet, die für das Auslesen der XML-Daten zuständig ist. Bei Einheiten, CvUnit, wäre das beispielsweise namentlich passend CvUnitInfo. Bei CvPlayer gibt es eine Besonderheit, da hier gleich zwei Info-Klassen zugeordnet sind: CvLeaderHeadInfo und CvCivilisationInfo. Da musst du dir die passende für deine Erweiterung aussuchen.
    Die Daten in den Info-Klassen solltest du dir während des Spielens als konstant vorstellen. Willst du die Werte während der Partie variieren sollst du daher dann in CvPlayer eine Membervariable für den Wert definierten. Dieser Wert wird dann auch im Spielstand gespeichert.

    Hier gibt es ein Beispiel für die Erweiterung der XML-Daten: http://forums.civfanatics.com/showthread.php?t=166935

    Hier verstehe ich die Frage nicht? Wann gehören denn zwei Spieler zur gleichen Nation, resp. nutzen den gleichen Hafen?
    Pro Spiel ist doch immer nur ein Spieler pro Nation vorhanden, damit wäre auch die Zuordnung der Variablen klar.

    Oder übersehe ich irgendetwas?
    Wie bei Civ4 ist es durchaus möglich, dass zwei Spieler der gleichen Nation am Spiel teilnehmen. Um von vornherein Schwierigkeiten auszuschließen sollen die Daten daher lieber nicht an die Nation sondern an den Spieler (oder das Team des Spielers) gebunden werden.

  10. #10
    Ein Platz an der Sonne Avatar von Commander Bello
    Registriert seit
    05.06.05
    Ort
    Nähe Koblenz
    Beiträge
    6.209
    Ok, sehe ich ein.

    Da ich über "Königsaktionen" nachdenke, wäre für den aktuellen Fall tatsächlich die CvCivilzationInfo von Interesse.

    Ich werde mal ein bisschen herumpusseln. Der nächste Hilfeschrei dürfte also nicht lange auf sich warten lassen.


Berechtigungen

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