30.01.2026, 13:59
Den Zwölfen zum Gruße!
Zeit, das zu erläutern. Ich bin inzwischen zwei Schritte weiter, wobei sich eine große Wende ergeben hat. Aber zunächst einmal dazu, wie sich das Prüfen deutlich beschleunigen läßt:
Anstatt den SQLite-Browser zu verwenden, lassen sich Skripte mit SQLite3 aufrufen. Im Browser musste ich immer hin- und herwechseln zwischen Spielständen, dann aus einer Textdatei SQLs aufrufen, Zahlen für die Truhenbefüllungen ändern usw. Mit einem Skript lassen sich alle relevanten Truheninhalte eines Gebietes innerhalb von Sekunden in den Testspielstand eintragen.
1. Beispiel: Die mittleren Rüstungsteile am Praiosplatz in den Testspielstand eintragen. Erst einmal ohne weitere Erläuterung, um zu zeigen, welche Befehle notwendig sind.
SQLite3 hat eine begrenzte Befehlsauswahl. Unter anderem ist es nicht so einfach möglich, Variablen anzulegen. Das umgehe ich durch eine temporäre Tabelle. Die 1. Abfrage wird in eine Textdatei geschrieben, welche wiederum in diese Tabelle geschrieben wird. Der Testspielstand bekommt wiederum seine Befüllung aus dieser Tabelle. Am Ende gebe ich noch die jeweilige Zahl aus. Damit läßt sich z.B. überprüfen, ob sich Zahlen wiederholen. Auch für das Dokumentieren von guten oder sehr guten Kombinationen ist das praktischer als jeweils die Textdatei zu öffnen.
Annahme: Es gibt noch einen lokalen Spielstand "savegame.dsa". Dieser wird am Ende nur geöffnet, um sicherzugehen, dass man aus den Testspielständen raus ist und sich nichts zerschießt.
In der Eingabeaufforderung sieht das dann ganz leicht aus (Annahme: Das Skript ist gespeichert unter dem Namen "abfrage_praiosplatz.txt" und man ist bereits im Verzeichnis von SQLite3):
Ein weiterer Trick: Man kann SQLite3 offen lassen und den letzten Befehl wiederholen. D.h. Pfeiltaste nach oben, ".read abfrage_praiosplatz.txt" erscheint erneut, und dann Eingabeaufforderung drücken.
Jetzt die vollständige Version, bei der sechs Truhen am Praiosplatz abgefragt werden. Ich habe die Variablen, Textdateien und temporären Tabellen entsprechend genannt.
Um auf mögliche Wiederholungen mittlerer Rüstungskombinationen einfacher zu achten, habe ich eine Variante gebaut, die nur das erste SELECT aus dem letzten Block enthält. Damit scheint es sogar noch etwas schneller zu gehen.
In jedem Fall ist das Testen deutlich schneller geworden. Erst so konnte ich vor mehreren Tagen die nächste Erkenntnis gewinnen, über die ich ein anderes Mal schreiben möchte. In jedem Fall habe ich eine deutlich bequemere und schnellere Möglichkeit, Truhen und Taschendiebstahlsinhalte zu prüfen, was sowohl in Drakensang insgesamt als auch im Nachfolger funktioniert!
Wer hätte das gedacht: Durch einen Misserfolg 2019 (gute Truhenkombi Entlang der Rakula verpasst) habe ich mir jetzt noch Skriptschreiben mit SQLite3 beigebracht.
(14.12.2025, 23:01)Kunar schrieb: Mit anderen Worten: Man spart massig Zeit, um neuen Truheninhalt am Praiosplatz zu generieren und diesen zu prüfen. Auch das Prüfen geht deutlich schneller, als ich es bisher getan habe - davon mehr ein anderes Mal.
Zeit, das zu erläutern. Ich bin inzwischen zwei Schritte weiter, wobei sich eine große Wende ergeben hat. Aber zunächst einmal dazu, wie sich das Prüfen deutlich beschleunigen läßt:
Anstatt den SQLite-Browser zu verwenden, lassen sich Skripte mit SQLite3 aufrufen. Im Browser musste ich immer hin- und herwechseln zwischen Spielständen, dann aus einer Textdatei SQLs aufrufen, Zahlen für die Truhenbefüllungen ändern usw. Mit einem Skript lassen sich alle relevanten Truheninhalte eines Gebietes innerhalb von Sekunden in den Testspielstand eintragen.
1. Beispiel: Die mittleren Rüstungsteile am Praiosplatz in den Testspielstand eintragen. Erst einmal ohne weitere Erläuterung, um zu zeigen, welche Befehle notwendig sind.
Code:
.open C:\Users\Kunar\Documents\Drakensang\profiles\default\save\continue_0\continue.dsa
.once praiosplatz_ruestung_mittel.txt
select LootTableSeed from _Instance_Chest where _Level = 'location02_praios' and LootTable like '%_%' and LootTable = 'loot_kiste_armor_mittel';
.open C:\Users\Kunar\Documents\Drakensang\profiles\default\save\savegame_1248\savegame.dsa
CREATE TEMP TABLE praiosplatz_ruestung_mittel (LootTableSeed INTEGER);
.import praiosplatz_ruestung_mittel.txt praiosplatz_ruestung_mittel
update _Instance_Chest set LootTable = 'loot_kiste_armor_mittel', LootTableSeed = ( SELECT LootTableSeed FROM praiosplatz_ruestung_mittel ) where Name = 'kiste_truhe_02_loc01_kahlkopf';
.output stdout
SELECT LootTableSeed FROM praiosplatz_ruestung_mittel;
-- open another database just to close the current connection
.open savegame.dsaSQLite3 hat eine begrenzte Befehlsauswahl. Unter anderem ist es nicht so einfach möglich, Variablen anzulegen. Das umgehe ich durch eine temporäre Tabelle. Die 1. Abfrage wird in eine Textdatei geschrieben, welche wiederum in diese Tabelle geschrieben wird. Der Testspielstand bekommt wiederum seine Befüllung aus dieser Tabelle. Am Ende gebe ich noch die jeweilige Zahl aus. Damit läßt sich z.B. überprüfen, ob sich Zahlen wiederholen. Auch für das Dokumentieren von guten oder sehr guten Kombinationen ist das praktischer als jeweils die Textdatei zu öffnen.
Annahme: Es gibt noch einen lokalen Spielstand "savegame.dsa". Dieser wird am Ende nur geöffnet, um sicherzugehen, dass man aus den Testspielständen raus ist und sich nichts zerschießt.
In der Eingabeaufforderung sieht das dann ganz leicht aus (Annahme: Das Skript ist gespeichert unter dem Namen "abfrage_praiosplatz.txt" und man ist bereits im Verzeichnis von SQLite3):
Code:
Test für Praiosplatz:
sqlite3
.read abfrage_praiosplatz.txt
.exitEin weiterer Trick: Man kann SQLite3 offen lassen und den letzten Befehl wiederholen. D.h. Pfeiltaste nach oben, ".read abfrage_praiosplatz.txt" erscheint erneut, und dann Eingabeaufforderung drücken.
Jetzt die vollständige Version, bei der sechs Truhen am Praiosplatz abgefragt werden. Ich habe die Variablen, Textdateien und temporären Tabellen entsprechend genannt.
Code:
-- Test für Praiosplatz
-- den letzten Spielstand laden
.open C:\Users\Kunar\Documents\Drakensang\profiles\default\save\continue_0\continue.dsa
-- die Truhen vom Praiosplatz aus dem Spielstand auslesen und in Textdateien schreiben
.once praiosplatz_ruestung_mittel.txt
select LootTableSeed from _Instance_Chest where _Level = 'location02_praios' and LootTable like '%_%' and LootTable = 'loot_kiste_armor_mittel';
.once praiosplatz_waffen_reich.txt
select LootTableSeed from _Instance_Chest where _Level = 'location02_praios' and LootTable like '%_%' and LootTable = 'loot_kiste_waffen_reich';
.once praiosplatz_ruestung_arm1.txt
select LootTableSeed from _Instance_Chest where _Level = 'location02_praios' and LootTable like '%_%' and LootTable = 'loot_kiste_armor_arm' and _ID = '|Level|Objects|Chest|loc02_truhe_armor_einfach_1';
.once praiosplatz_ruestung_arm2.txt
select LootTableSeed from _Instance_Chest where _Level = 'location02_praios' and LootTable like '%_%' and LootTable = 'loot_kiste_armor_arm' and _ID = '|Level|Objects|Chest|loc02_truhe_armor_einfach_2';
.once praiosplatz_waffen_arm.txt
select LootTableSeed from _Instance_Chest where _Level = 'location02_praios' and LootTable like '%_%' and LootTable = 'loot_kiste_waffen_arm';
.once praiosplatz_waffen_mittel.txt
select LootTableSeed from _Instance_Chest where _Level = 'location02_praios' and LootTable like '%_%' and LootTable = 'loot_kiste_waffen_mittel';
-- den Truhentest-Spielstand laden
.open C:\Users\Kunar\Documents\Drakensang\profiles\default\save\savegame_1248\savegame.dsa
-- temporäre Tabellen anlegen und mit den Textdateien füllen
CREATE TEMP TABLE praiosplatz_ruestung_mittel (LootTableSeed INTEGER);
.import praiosplatz_ruestung_mittel.txt praiosplatz_ruestung_mittel
CREATE TEMP TABLE praiosplatz_waffen_reich (LootTableSeed INTEGER);
.import praiosplatz_waffen_reich.txt praiosplatz_waffen_reich
CREATE TEMP TABLE praiosplatz_ruestung_arm1 (LootTableSeed INTEGER);
.import praiosplatz_ruestung_arm1.txt praiosplatz_ruestung_arm1
CREATE TEMP TABLE praiosplatz_ruestung_arm2 (LootTableSeed INTEGER);
.import praiosplatz_ruestung_arm2.txt praiosplatz_ruestung_arm2
CREATE TEMP TABLE praiosplatz_waffen_arm (LootTableSeed INTEGER);
.import praiosplatz_waffen_arm.txt praiosplatz_waffen_arm
CREATE TEMP TABLE praiosplatz_waffen_mittel (LootTableSeed INTEGER);
.import praiosplatz_waffen_mittel.txt praiosplatz_waffen_mittel
-- den Truhentest-Spielstand mit den Werten vom Praiosplatz befüllen
update _Instance_Chest set LootTable = 'loot_kiste_armor_mittel', LootTableSeed = ( SELECT LootTableSeed FROM praiosplatz_ruestung_mittel ) where Name = 'kiste_truhe_02_loc01_kahlkopf';
update _Instance_DestroyableEntity set LootTable = 'loot_kiste_waffen_reich', LootTableSeed = ( SELECT LootTableSeed FROM praiosplatz_waffen_reich ) where _ID = '|Level|Objects|DestroyableEntity|fass_holz03_loc01_10' and _Level = 'location01';
update _Instance_DestroyableEntity set LootTable = 'loot_kiste_armor_arm', LootTableSeed = ( SELECT LootTableSeed FROM praiosplatz_ruestung_arm1 ) where _ID = '|Level|Objects|DestroyableEntity|fass_holz03_loc01_12' and _Level = 'location01';
update _Instance_DestroyableEntity set LootTable = 'loot_kiste_armor_arm', LootTableSeed = ( SELECT LootTableSeed FROM praiosplatz_ruestung_arm2 ) where _ID = '|Level|Objects|DestroyableEntity|fass_holz03_loc01_13' and _Level = 'location01';
update _Instance_DestroyableEntity set LootTable = 'loot_kiste_waffen_arm', LootTableSeed = ( SELECT LootTableSeed FROM praiosplatz_waffen_arm ) where _ID = '|Level|Objects|DestroyableEntity|fass_holz03_loc01_11' and _Level = 'location01';
update _Instance_DestroyableEntity set LootTable = 'loot_kiste_waffen_mittel', LootTableSeed = ( SELECT LootTableSeed FROM praiosplatz_waffen_mittel ) where _ID = '|Level|Objects|DestroyableEntity|fass_holz02_loc01_7' and _Level = 'location01';
-- die Werte vom Praiosplatz einmalig ausgeben
.output stdout
SELECT LootTableSeed FROM praiosplatz_ruestung_mittel;
SELECT LootTableSeed FROM praiosplatz_waffen_reich;
SELECT LootTableSeed FROM praiosplatz_ruestung_arm1;
SELECT LootTableSeed FROM praiosplatz_ruestung_arm2;
SELECT LootTableSeed FROM praiosplatz_waffen_arm;
SELECT LootTableSeed FROM praiosplatz_waffen_mittel;
-- anderen Spielstand öffnen, nur um die andere Verbindung zu beenden
.open savegame.dsaUm auf mögliche Wiederholungen mittlerer Rüstungskombinationen einfacher zu achten, habe ich eine Variante gebaut, die nur das erste SELECT aus dem letzten Block enthält. Damit scheint es sogar noch etwas schneller zu gehen.
In jedem Fall ist das Testen deutlich schneller geworden. Erst so konnte ich vor mehreren Tagen die nächste Erkenntnis gewinnen, über die ich ein anderes Mal schreiben möchte. In jedem Fall habe ich eine deutlich bequemere und schnellere Möglichkeit, Truhen und Taschendiebstahlsinhalte zu prüfen, was sowohl in Drakensang insgesamt als auch im Nachfolger funktioniert!
Wer hätte das gedacht: Durch einen Misserfolg 2019 (gute Truhenkombi Entlang der Rakula verpasst) habe ich mir jetzt noch Skriptschreiben mit SQLite3 beigebracht.
Ärger im Svellttal? Auf der Suche nach dem Salamanderstein? Dann hilft der Sternenschweif-Reiseführer von Kunar!

