Wichtige Frage?

  • Hallo,

    ich habe versucht Variablen aus der user.cfg zu lesen welche ich dort vorher definiert habe. mit der Funktion:
    xxxxxx(readConfig("Game", "Test"))
    Das funktioniert auch.

    Jetzt meine Frage. Kann man auch Variablen in eine Datei schreiben?

    Ich möchte z.B. die Variable Test mit dem Inhalt Steffi am Ende in der user.cfg so haben: Test = Steffi

    Kann mir jemand helfen?

    Tschüß
    Steffi



  • Über die Schnittstelle von Lua zu C++ wären solche Schreibvorgänge denkbar (wenn die Entwickler diese Funktion unterstützt haben, was ich noch nicht getestet habe). Allerdings besteht in meinen Augen dazu noch nicht einmal die Notwendigkeit, da man über die Lua´s jederzeit einen z.B. aus der "game.cfg" ausgelesenen Wert überschreiben kann und (bei Bedarf) auch ganz neue, fürs ganze Spiel geltende, (globale) Variablen bilden kann. Du könntest so z.B. in einer Lua Datei (die sich im Unterordner "Script" deiner Extension befinden sollte) eine globale Variable "Test" deklarieren und ihr dort auch gleich den Wert "Steffi" zuweisen. Diese Variable kann dann direkt in allen anderen Lua´s (ohne Benutzung des "Read" Befehles) verwendet / ausgelesen werden.

  • Hallo SteveXY,

    das mit den globalen Variablen ist schon richtig, aber nach dem laden eines Spiels sind diese Variablen, welche in einer lua-Datei einmal gesetzt wurden nicht mehr vorhanden, sondern erst wieder wenn diese neu gesetzt werden.

    Was ich brauche ist eine Möglichkeit Variablen in einer z.B. lua-Datei zu setzen und nach erneutem Spielstart sollen diese Variablen (Inhalte) schon vorhanden sein, ohne diese lua-Datei erneut aufzurufen.

    Besser wäre noch wenn die Variablen + Inhalt im Spielstand (Savegame) mit abgespeichert werden und nach erneutem Spielstart gleich zur Verfügung stehen.

    Nachtrag: Der Inhalt in den Variablen welche gespeichert werden sollen ändert sich im Spielverlauf und soll deshalb bei Spielbeginn gleich vorhanden sein.

    Tschüß
    Steffi


  • --------------------------------


    Hallo Steffi,


    dazu müsstest Du vermutlich in Deine Extension-Datei den Ordner "game.cfg" kopieren und in diesem die Anfangs-Globalen Variablen definieren. Nach Spielende und sichern werden ja diese Variablen auch mit geändertem Inhalt in den Saveständen mitgespeichert und stehen beim Spielestart wieder zur Verfügung.
    Habe das noch nicht probiert, aber definitiv müsste es so funktionieren.


    schlumpfi



  • Hallo Schlumpfi,
    also zunächst einmal Dank für den Versuch uns zu helfen. Allerdings geht das, was du da vorschlägst definitiv NICHT! Da du kein Programmierer bist und dich wohl auch nocht nicht so mit den Dateien beschäfftigt hast, versuche ich es dir hier zu erklären. Weder die "game.cfg" noch die "user.cfg" enthält Programmcode. Globale Variablen definieren geht dort dem entsprechend auch nicht. Die Endung ".cfg" zeigt, dass es sich um Config-Dateien handelt. In diesen Dateien werden nur bestimmte Konfigurationswerte hinterlegt... ähnlich den ".ini" - Dateien von Programmen. Auch darin enthaltene Werte werden nicht in den Spielständen gespeichert. Vermutlich bist du darauf gekommen, weil sich einige Änderungen in diesen Dateien erst beim Start eines neuen Spieles bemerkbar machen. Die Ursache dafür ist aber, dass die Konfigurations-Werte nur beim Start eines neuen Spieles benötigt werden und deshalb auch nur dann ausgelesen werden! Diese Tatsachen kannst du ganz leicht selber kontrollieren. Wenn du z.B. das Startgeld erhöhst und ein neues Spiel startest, wird der Wert einmalig ausgelesen und du hast das höhere Startgeld. Gibst du nun Geld aus oder verdienst neues, ändert sich nichts in der Game.cfg! Selbst wenn du im Story-Verlauf das Penthouse und den Hinterhof regulär freischaltest steht in der "game.cfg" immer noch Penthouse enabled = false! Auch die Spielstände sind reine Textdateien! Öffne sie mal mit einem Editor / Textverarbeitung. Auch dort wirst du keine Variablenwerte aus der "game.cfg" finden.

  • steffi
    Nach dem zu urteilen, was ich bis jetzt getestet habe, vermute ich, dass das Einführen einer neuen globalen Variablen mit zusätzlichen Abspeichern in den Spielständen NICHT möglich ist.

    Allerdings könnte dir folgender Trick helfen:
    Die meisten vorhandenen Werte sind von einem Datentyp der dem Typ "Single" ähnlich ist (für Mitleser: hat nichts mit dem Spiel Singles zu tun, gemeint ist der Floatingpoint Variablentyp einfacher Genauigkeit aus C++ etc.) Abgespeichert und ausgelesen werden diese Werte mit 8 Nachkommenstellen. Eine Genauigkeit, die fürs "Gameplay" nicht nötig ist. Wenn du dir nun Werte raussuchst, die sich im Spiel nicht oder nur selten und dann um Ganzzahlen ändern (wie z.B. die Charaktereigenschaften der Personen [z.B. CHAR_MESSY etc.] könntest du die hinteren Nachkommastellen nutzen, um deine Werte, ohne merkbare Veränderungen im Gameplay, abzuspeichern. (Für Mitleser: Bedürfnisse etc. sind ungeignet, da sie sich laufend im Spiel ändern). Wenn du z.B. nur die letzten 6 Nachkommastellen nimmst, hättest du pro Variable fast. 20 Bit um deine eigene Variable "parasitär" mit abzuspeichern. Die nötigen mathematischen Funktionen um deine "Variable" zu isolieren sollten kein Problem sein und werden von Lua unterstützt.

    Anmerkung: Lua selbst hat immer den Datentyp "Variant", gemeint ist oben die Form der Abspeicherung in den Spielständen.

  • -- Beispiel Code... Deklaration der globalen Variablen "myNewVar" in einer Lua-Datei des Ordners Script der Extension.
    -- hier z: Beispiel Pacificas Charaktereigenschaft genutzt
    local gos = character.getGameObjectServer()
    local character = gos.getCharacter(WARRIOR)
    --Setzen des Wertes
    local temp;
    local messy;
    -- Aktuellen Wert auslesen
    messy = character.getCharacterCondition(CHAR_MESSY);
    -- Nachkommastellen eliminieren um evt. vorhandenen Wert myNewVar zu löschen
    -- Hier per modulo Funktion, da Lua "Fix" und "Int" Funktion nicht kennt...
    messy = messy - (math.mod(messy,1));
    temp = myNewVar * 1E-8;
    messy = messy + temp;
    character.setCharacterCondition(CHAR_MESSY, messy);


    --Auslesen
    messy = character.getCharacterCondition(CHAR_MESSY);
    temp = math.mod(messy,1);
    myNewVar = temp * 1E8;

  • Hallo SteveXY,

    das ist eine super Idee. Vorhanden Variable zu nutzen hatte ich mir auch schon gedacht, allerdings nicht so und vor allem wird die Variable im Spielstand gesichert - genial.

    Danke

    Tschüß
    Steffi