Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Stellaris SaveGame Datei einlesen (https://www.delphipraxis.net/204014-stellaris-savegame-datei-einlesen.html)

Andreas L. 15. Apr 2020 10:57

Stellaris SaveGame Datei einlesen
 
Hallo,
das Spiel Stellaris speichert seine Spielstände in einen JSON-ähnlichen Format. Ich möchte diese Dateien einlesen.

Ausschnit einer SaveGame-Datei:
Code:
version="Verne v2.6.2"
version_control_revision=56809
name="United Hives"
date="2248.04.06"
player={
   {
      name="unknown"
      country=0
   }
 
}
tick=0
random_log_day=0
species={
   {
      name_list="ART2"
      name="Wraith"
      plural="Wraith"
      adjective="Wraith"
      class="ART"
      portrait="art5"
      traits={
         trait="trait_intelligent"
         trait="trait_quick_learners"
         trait="trait_unruly"
         trait="trait_enduring"
         trait="trait_pc_savannah_preference"
      }
      home_planet=11
   }
}
Informationen zu den Dateien gibt es hier: https://stellaris.paradoxwikis.com/Save-game_editing

Wegen der Ähnlichkeit zu JSON habe ich versucht es zu konvertieren um die Datei anschließend mit den Delphi-eigenen JSON-Klasse & Routinen einzulesen. Das scheint aber nicht so einfach zu gehen.

Hat jemand eine Idee wie man dieses Format am Besten einliest? Gibt es vielleicht eine Unit/Klasse/Komponente? Ist der Ansatz mit der JSON-Konvertierung doch nicht so falsch? Oder komme ich nicht drum herum einen Parser zu schreiben?

TiGü 15. Apr 2020 11:04

AW: Stellaris SaveGame Datei einlesen
 
Sieht nach YAML aus.*
Probiere es mal hiermit:
https://blog.grijjy.com/2019/06/03/a...ry-for-delphi/

* DISCLAIMER: zwei von drei YAML Online Validatoren sagen das ist valides YAML

Andreas L. 15. Apr 2020 13:02

AW: Stellaris SaveGame Datei einlesen
 
Zitat:

Zitat von TiGü (Beitrag 1462108)
Sieht nach YAML aus.*
Probiere es mal hiermit:
https://blog.grijjy.com/2019/06/03/a...ry-for-delphi/

* DISCLAIMER: zwei von drei YAML Online Validatoren sagen das ist valides YAML

Die YAML-Validatoren sagen in der Tat das es valide ist. Aber die von dir verlinkte Bibliothek kann mein Dokument nicht einlesen. Es kommt aber auch nicht zu einer Fehlermeldung. Es passiert einfach gar nichts.

Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var
  Doc: IYamlDocument;
  DocFileName: String;
  Text: String;
begin
  DocFileName := 'I:\xxx\Stellaris SaveGame\SaveGame-Beispiel.yaml';

  Doc := TYamlDocument.Load(DocFileName);

  Text := Doc.Root.Values['species'].Nodes[0].Values['name'].tostring;

  ListBox1.Items.Add(Text);
end;

hoika 15. Apr 2020 14:06

AW: Stellaris SaveGame Datei einlesen
 
Hallo,
Leerzeichen im Dateipfad?

probier das mal
DocFileName := '"I:\xxx\Stellaris SaveGame\SaveGame-Beispiel.yaml"';

Und was bringt ein Doc.Root.Count (oder ItemCount)

Benedikt Magnus 15. Apr 2020 18:08

AW: Stellaris SaveGame Datei einlesen
 
Die Speicherstände von Stellaris (genauer: gamestate) sind weder JSON noch YAML sondern ein eigenes Format, das die Clausewitzengine zur Verfügung stellt. Das Format ist damit das gleiche, das auch in anderen Paradoxspielen (bspw. Europa Universalis, Crusader Kings, Hearts of Iron, Victoria...) genutzt wird.
Es gibt mit Sicherheit fertige Editoren dafür, aber vermutlich keine Bibliotheken, sodass man es selbst machen müsste.

Die wichtigsten Unterschiede zu JSON sind folgende:
  • Es gibt kein globales Objekt.
  • Statt durch Kommata sind Einträge durch Zeilenumbrüche getrennt.
  • Schlüssel sind nicht in Anführungszeichen umfasst.
  • Schlüssel und Wert sind durch ein Gleichheitszeichen anstatt durch einen Doppelpunkt getrennt.
  • Listen nutzen wie Objekte geschweifte anstatt eckige Klammern.
  • Es gibt keine Booleans und kein "null".
  • Bestimmte Eigenschaftswerte (Strings ohne umschließende Anführungszeichen) sind erlaubt, bspw. "yes", "no", "none", "planet", "male", etc.
  • Es gibt einen zusätzlichen Listentyp: Einträge getrennt durch Leerzeichen (bspw. "{ no no no no }).
(Es kann durchaus sein, dass ich etwas vergessen habe.)

Eine alle oben umfassenden Besonderheiten wären im folgenden Beispiel zu finden:

Code:
version="Verne v2.6.2"
version_control_revision=56809
date="2248.04.06"
required_dlcs={
   "Apocalypse"
   "Horizon Signal"
   "Megacorp"
}
planets={
   1534={
      name="WX12-677"
      planet_class="pc_asteroid"
      coordinate={
         x=163.440
         y=75.420
         origin=149
      }
      automated_development=no
      favorite_jobs={
      }
      auto_slots_taken={
         no no no no no no no no no no no no no no no no
      }
   }
}
In den meisten Fällen entspricht dieses Format gültigem YAML. Andersherum gilt das aber nicht: Nicht jedes gültige YAML ist auch eine gültige Gamestatedatei!

Andreas L. 16. Apr 2020 10:23

AW: Stellaris SaveGame Datei einlesen
 
Zitat:

Zitat von Benedikt Magnus (Beitrag 1462168)
Die Speicherstände von Stellaris (genauer: gamestate) sind weder JSON noch YAML sondern ein eigenes Format, das die Clausewitzengine zur Verfügung stellt. Das Format ist damit das gleiche, das auch in anderen Paradoxspielen (bspw. Europa Universalis, Crusader Kings, Hearts of Iron, Victoria...) genutzt wird.
Es gibt mit Sicherheit fertige Editoren dafür, aber vermutlich keine Bibliotheken, sodass man es selbst machen müsste.

Die wichtigsten Unterschiede zu JSON sind folgende:
  • Es gibt kein globales Objekt.
  • Statt durch Kommata sind Einträge durch Zeilenumbrüche getrennt.
  • Schlüssel sind nicht in Anführungszeichen umfasst.
  • Schlüssel und Wert sind durch ein Gleichheitszeichen anstatt durch einen Doppelpunkt getrennt.
  • Listen nutzen wie Objekte geschweifte anstatt eckige Klammern.
  • Es gibt keine Booleans und kein "null".
  • Bestimmte Eigenschaftswerte (Strings ohne umschließende Anführungszeichen) sind erlaubt, bspw. "yes", "no", "none", "planet", "male", etc.
  • Es gibt einen zusätzlichen Listentyp: Einträge getrennt durch Leerzeichen (bspw. "{ no no no no }).
(Es kann durchaus sein, dass ich etwas vergessen habe.)

Eine alle oben umfassenden Besonderheiten wären im folgenden Beispiel zu finden:

Code:
version="Verne v2.6.2"
version_control_revision=56809
date="2248.04.06"
required_dlcs={
   "Apocalypse"
   "Horizon Signal"
   "Megacorp"
}
planets={
   1534={
      name="WX12-677"
      planet_class="pc_asteroid"
      coordinate={
         x=163.440
         y=75.420
         origin=149
      }
      automated_development=no
      favorite_jobs={
      }
      auto_slots_taken={
         no no no no no no no no no no no no no no no no
      }
   }
}
In den meisten Fällen entspricht dieses Format gültigem YAML. Andersherum gilt das aber nicht: Nicht jedes gültige YAML ist auch eine gültige Gamestatedatei!

Danke für deine detaillierte Antwort :thumb: Dann wird mir nichts anderes übrig bleiben als einen Parser zu schreiben. Wie würdet ihr/du das angehen? Hast du Interesse den Parser zusammen mit mir zu entwickeln?

himitsu 16. Apr 2020 10:55

AW: Stellaris SaveGame Datei einlesen
 
Es gibt bereits Parser, die man z.B. als Python ausführen kann und wo man sich das Ding auch in JSON umwandeln lassen kann.

https://pypi.org/project/ClauseWizard/#files
Sieht so auch, als wenn es nur das Clause-Ding nach JSON gibt, aber wenn man den Text nur lesen, aber nicht ändern will, dann reicht es.

https://github.com/ClauText/ClauText
https://github.com/Shadark/ClauseWizard

Andreas L. 17. Apr 2020 11:18

AW: Stellaris SaveGame Datei einlesen
 
Zitat:

Zitat von himitsu (Beitrag 1462214)
Es gibt bereits Parser, die man z.B. als Python ausführen kann und wo man sich das Ding auch in JSON umwandeln lassen kann.

https://pypi.org/project/ClauseWizard/#files
Sieht so auch, als wenn es nur das Clause-Ding nach JSON gibt, aber wenn man den Text nur lesen, aber nicht ändern will, dann reicht es.

https://github.com/ClauText/ClauText
https://github.com/Shadark/ClauseWizard

Das ist ganz schön umfangreich :shock: Kannst du mir zeigen wie ich das nutzen muss um das SaveGame in z. B. JSON zu konvertieren?


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:44 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz