Themabewertung:
  • 0 Bewertung(en) - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Drakensang Savegame Format (*.dsa)
#1
Ja mir ist ein bisschen langweilig, da hab ich mir mal die Savegames angeschaut :evil:

Und die sind toll! Es sind SQLite Datenbanken. D. h. sie lassen sich mit einem Programm wie z. B. SQLite Database Browser öffnen und editieren/anschauen.

Viele Sachen sind einfach selbsterklärend und sollten einfach so geändert werden können :).

Was ich mir ganz lustig vorstelle zu ändern wären z. B. das Verhalten verschiedener Fraktionen zueinander in der Tabelle _Factions. Man könnte damit wohl z. B. einigen Monstern erklären, dass sie einen nicht angreifen sollen - dafür aber andere Monster oder so ;)


Achtung SPOILERALARM: es findet sich z. B. eine Liste aller 626 Quests (interner Questname und Queststatus) in der Tabelle _Story_Tasks
There are only 10 types of people in the world. Those who understand binary and those who don't.
Zitieren
#2
Ach und für die, die cheaten wollen:
_Instance_PC die Zeile ohne ID und Klasse = Hero raussuchen.
Der Rest sollte selbsterklärend sein ;)
There are only 10 types of people in the world. Those who understand binary and those who don't.
Zitieren
#3
Da kann man ja wirklich alles machen. Cheaten leicht gemacht. ;)
--------
Warnung! Geschichte kann zu Einsichten führen und verursacht Bewusstsein!
Avatar by: Keven Law (CC BY-SA 2.0)
Zitieren
#4
Obi-Wahn schrieb:Da kann man ja wirklich alles machen.
Schade das es in Drakensang nicht mehr alle Charakterklassen aus der Nordlandtrilogie gibt, sonnst könnte man anhand der Konvertierungsregeln von DSA3 zu DSA4 einen Heldenimporter schreiben.
Zitieren
#5
Ich gebe zu ich will auch etwas cheaten. Wenn ich ein Savegame unter Vista öffne, dann tauchen zwar die ganzen Oberordner (_Instance_x) auf, aber wenn ich dann auf etwas klicke erscheinen keine Werte. Liegt das an Vista, oder muss ich zusätzlich noch was installieren?
Ach ja, ich habe SQliteTool 1.0 installiert.
Bitte helft mir schnell
Grüße
NoTime
Zitieren
#6
Hallo alle zusammen!

Ich habe selber mal ein wenig rumprobiert, und habe auch recht einfach herausgefunden, wie man den Characterbogen seines Heldens editiert (mit SFs, Talenten, Zaubern, usw).
Nur kann ich beim besten Willen nicht den Inventarbogen finden. Irgendwie interessiert es mich, wie eine Datenbank sowas realisieren will. Alles in einen Eintrag? Aber in der PC-Tabelle finde ich nur einen Eintrag auf irgendeinen StorageIndex, den ich dann aber nirgendwo wiederfinden kann.
Daher die Frage: hat irgendjemand gefunden, wo das Inventar der Helden gespeichert wird?

Hesinde zum Gruße
Alarion
Zitieren
#7
Alarion, kannst du mir sagen, wie du vorgegangen bist und welche Programme du verwendest? Ich sehe irgendwie nur _Instance_Pc kann da aber keinen Wert Hero finden, aber auch sonst kann ich keine Werte sehen.
Grüße

Alarion schrieb:Hallo alle zusammen!

Ich habe selber mal ein wenig rumprobiert, und habe auch recht einfach herausgefunden, wie man den Characterbogen seines Heldens editiert (mit SFs, Talenten, Zaubern, usw).
Nur kann ich beim besten Willen nicht den Inventarbogen finden. Irgendwie interessiert es mich, wie eine Datenbank sowas realisieren will. Alles in einen Eintrag? Aber in der PC-Tabelle finde ich nur einen Eintrag auf irgendeinen StorageIndex, den ich dann aber nirgendwo wiederfinden kann.
Daher die Frage: hat irgendjemand gefunden, wo das Inventar der Helden gespeichert wird?

Hesinde zum Gruße
Alarion
Zitieren
#8
Also ich habe ein SQLite-Tool benutzt (SQLite Database Browser, http://sqlitebrowser.sourceforge.net/, für Windows) benutzt und mit diesem einfach den Spielstand geöffnet.
Bei diesem Programm gibt es drei Tabs, der interessante ist Browse Data, hier kann man die einzelnen Datenbanken anzeigen und die Werte betrachten (und ggf. auch verändern). Wenn man sich dort _Instance_PC ansieht, hat man für jeden Helden (und auch für manche mehrmals, wahrscheinlich aus storygründen) eine Zeile, bei mir ist mein Character ganz unten (hat als Id CharWizardPC, als Name Hero). Die Spalten sind verschiedene Einträge (AP, Talente, Sonderfertigkeiten, alles mögliche), aber eben kein ersichtliches Inventar...
Zitieren
#9
Danke Dir, ich werde das mal gleich ausprobieren. :)
Zitieren
#10
Bringt TaATAdjustSchwert ändern was ? Ich habe bei mir mal Schwerter auf 15 gestellt :), was sollte man noch ändern.
Zitieren
#11
Ich denke, das ist ein Bonus auf den Talentwert. Z.B. der Archetyp Krieger bekommt ja +2 auf Schwerter, die nicht direkt aus dem Talent kommen. Ist also im Endeffekt ein direkter Bonus auf das Talent, denke ich. (Ich weiß aber nicht, ob und wie das auf AT/PA angerechnet wird...)
Zitieren
#12
Ich glaube, wenn ihr an den Talentwerten was ändert, müsst ihr auch die AT/PA-Werte entsprechend der hinzugekommenen Punkte ändern. Sonst bringt euch das nichts. ;)
Zum NLT-Wiki: http://nlt-wiki.crystals-dsa-foren.de/doku.php , Zum Drakensang-Wiki: http://drakensang-wiki.crystals-dsa-foren.de/doku.php
KEIN SUPPORT per E-Mail, PN, IRC, ICQ! Lest die Regeln und benutzt das Forum für sämtliche Anfragen! KEINE persönliche Betreuung!
Zitieren
#13
Ist ja eine richtige Wissenschaft das Cheaten - ich habe jetzt etwas manipuliert und bin froh, dass das Spiel noch absturzfrei läuft, echt genial :) - Danke nochmal :)
Zitieren
#14
Also was das Inventar anbelangt,
es gibt Tabellen wie zum Beispiel
_Instance_Armor ...in ihr sind alle Rüstungs und Kleidungsgegenstände aufgezählt die im Spiel bisher aufgetaucht sind und auch ein paar mehr... Jeder Datansatz enthält Informationen zum Gegenstand und dazu, wo er sich befindet.
Das Inventar scheint sich über den Wert StorageSlotId aufzubauen :)
Solche Tabellen gibt es für die meisten Gegenstandskategorien und so baut sich das ganze Inventar auf... eine interessante Lösung muss ich ja mal sagen.
Ich werd damit gleich mal etwas rumspielen udn euch meine Erkenntnisse mitteilen ;)
Zitieren
#15
Das Inventar ist über eine Relation aufgebaut, z.B. von _Instance_Ammo (StorageGUID) und _Instance_PC (Guid), das Problem ist das diese Schlüssel der Gegenstände, Inventare der Helden ("Guid" der Helden aus in _Instance_PC) scheinbar über die anderen Attribute des Tupels anhand einer Prüfsumme errechnet wird, da sie nur einmal vorkommen dürfen. Genaugenommen könnte man das Inventar nur dann editieren wenn man den Primärschlüssel der jeweiligen Gegestandstabelle ausrechnen kann.

edit: wenn die Prüfsumme der Schlüssel wird nicht überprüft, leider kann man die Schlüssel in SQLite Database Browser nicht kopieren (auch nicht durch Import/Export) sodass man mit diesem Programm nur vorhandene Gegenstände editieren kann und nicht neue hinzufügen...
Zitieren
#16
Okay, okay ich will nichts gesagt haben der SQLite Database Browser kann das, wenn man über die SQL Query Funktion ein ensprechendes SQL Statement eingibt, z.B.:
Code:
UPDATE _Instance_Money SET StackCount = StackCount + 100000 WHERE StorageGUID IN (SELECT Guid FROM _Instance_PC WHERE Name="Hero")
Addiert 1000 Dukaten zum Geld des Hauptcharakters
Zitieren
#17
Stimmt ja, man kann bei dem Browser auch SQL-Queries ausführen. Genial, da helfen mir meine Gymnasial-SQL-Kenntnisse sogar mal. Vielen dank, Borbaradwurm, auf die Idee wäre ich selber gar nicht gekommen. :-)
Zitieren
#18
Okay, um mit dem SQL Browser neue Gegenstände hinzuzufügen muss man in den neuen Zeilen die StorageGUID auf die Guid des Helden (aus _Instance_PC) setzten, die Guid des neuen Gegenstandes auf die Guid eines anderen Gegenstands aus derselben Tabelle setzten (weil die Schlüssel einmalig sein sollen teilt die Datenbank dann neue Schlüssel zu).

StorageSlotId: ist das Inventory Slot zahlen von 0-47 sind die nicht-Quest-Item-Slots wobei jedes Slot pro StorageGUID nur einmal verwendet werden darf, ähnlich muss man auch bei Gegenständen aufpassen die gerade vom Helden "gegezogen" sind, jedes EquipmentSlot nur einmal benutzen.
Zitieren
#19
Ich hab mir das ganze etwas einfacher gemacht und den Gegenstand einfach in eine Truhe geschmissen.
Zum einfügen des Gegenstandes habe ich in die Savegamedatei die Template Tabellen aus %root\Drakensang\export\db\game.db4 importiert.
Hier mal eine Beispielhafte SQL~Query welche ein Paar Amazonenbeinschienen einfügt.
Code:
INSERT INTO _Instance_Armor
(Guid,_ID,_Level,_Layers,Transform,Id,Graphics,Physics,GfxSkin,Name,LookAtText,
EquipmentType,RSKo,RSBr,RSRu,RSBa,RSLA,RSRA,RSLB,RSRB,ArMaterial,
ArTyp,ArGes,ArBE,QuestId,Gew,PickingRange,Value,ScriptPreset,ScriptOverride
,LimitedScript,PermanentEffect,IconBrush,Arme,Haende,Torso,Beine,Fuesse,Haare,
LookAtUnidentified,IdentificationTalent,InfoUnIdentified,InfoIdentified,
IdentificationDifficulty,IsIdentified,Robable,PickingHeight,UseAnim,CanUse,Race,
Sex,StorageGUID,Lootable,VelocityVector,PhysicCategory,StorageSlotId,SoundUI,
IsTradeItem,InventoryType,IsEquiped,EquipmentSlotId,LocalizeLookAtText,
IsMagical,CanDestroy,UseTalent,EntityDiscovered)
values (null,null,"dungeon02_hauptquartier",null,null,
(SELECT field1 FROM _Template_Armor WHERE field1 = 'beine_amazonenruestung'),(SELECT field2 FROM _Template_Armor WHERE field1 = 'beine_amazonenruestung'),(SELECT field3 FROM _Template_Armor WHERE field1 = 'beine_amazonenruestung'),
(SELECT field4 FROM _Template_Armor WHERE field1 = 'beine_amazonenruestung'),(SELECT field5 FROM _Template_Armor WHERE field1 = 'beine_amazonenruestung'),(SELECT field6 FROM _Template_Armor WHERE field1 = 'beine_amazonenruestung'),
(SELECT field7 FROM _Template_Armor WHERE field1 = 'beine_amazonenruestung'),(SELECT field8 FROM _Template_Armor WHERE field1 = 'beine_amazonenruestung'),(SELECT field9 FROM _Template_Armor WHERE field1 = 'beine_amazonenruestung'),
(SELECT field10 FROM _Template_Armor WHERE field1 = 'beine_amazonenruestung'),(SELECT field11 FROM _Template_Armor WHERE field1 = 'beine_amazonenruestung'),(SELECT field12 FROM _Template_Armor WHERE field1 = 'beine_amazonenruestung'),
(SELECT field13 FROM _Template_Armor WHERE field1 = 'beine_amazonenruestung'),(SELECT field14 FROM _Template_Armor WHERE field1 = 'beine_amazonenruestung'),(SELECT field15 FROM _Template_Armor WHERE field1 = 'beine_amazonenruestung'),
(SELECT field16 FROM _Template_Armor WHERE field1 = 'beine_amazonenruestung'),(SELECT field17 FROM _Template_Armor WHERE field1 = 'beine_amazonenruestung'),(SELECT field18 FROM _Template_Armor WHERE field1 = 'beine_amazonenruestung'),
(SELECT field19 FROM _Template_Armor WHERE field1 = 'beine_amazonenruestung'),(SELECT field20 FROM _Template_Armor WHERE field1 = 'beine_amazonenruestung'),(SELECT field21 FROM _Template_Armor WHERE field1 = 'beine_amazonenruestung'),
(SELECT field22 FROM _Template_Armor WHERE field1 = 'beine_amazonenruestung'),(SELECT field23 FROM _Template_Armor WHERE field1 = 'beine_amazonenruestung'),(SELECT field24 FROM _Template_Armor WHERE field1 = 'beine_amazonenruestung'),
(SELECT field25 FROM _Template_Armor WHERE field1 = 'beine_amazonenruestung'),(SELECT field26 FROM _Template_Armor WHERE field1 = 'beine_amazonenruestung'),(SELECT field27 FROM _Template_Armor WHERE field1 = 'beine_amazonenruestung'),
(SELECT field28 FROM _Template_Armor WHERE field1 = 'beine_amazonenruestung'),(SELECT field29 FROM _Template_Armor WHERE field1 = 'beine_amazonenruestung'),(SELECT field30 FROM _Template_Armor WHERE field1 = 'beine_amazonenruestung'),
(SELECT field31 FROM _Template_Armor WHERE field1 = 'beine_amazonenruestung'),(SELECT field32 FROM _Template_Armor WHERE field1 = 'beine_amazonenruestung'),(SELECT field33 FROM _Template_Armor WHERE field1 = 'beine_amazonenruestung'),
(SELECT field34 FROM _Template_Armor WHERE field1 = 'beine_amazonenruestung'),(SELECT field35 FROM _Template_Armor WHERE field1 = 'beine_amazonenruestung'),(SELECT field36 FROM _Template_Armor WHERE field1 = 'beine_amazonenruestung'),
(SELECT field37 FROM _Template_Armor WHERE field1 = 'beine_amazonenruestung'),(SELECT field38 FROM _Template_Armor WHERE field1 = 'beine_amazonenruestung'),(SELECT field39 FROM _Template_Armor WHERE field1 = 'beine_amazonenruestung'),
(SELECT field40 FROM _Template_Armor WHERE field1 = 'beine_amazonenruestung'),(SELECT field41 FROM _Template_Armor WHERE field1 = 'beine_amazonenruestung'),(SELECT field42 FROM _Template_Armor WHERE field1 = 'beine_amazonenruestung'),
(SELECT field43 FROM _Template_Armor WHERE field1 = 'beine_amazonenruestung'),(SELECT field44 FROM _Template_Armor WHERE field1 = 'beine_amazonenruestung'),(SELECT field45 FROM _Template_Armor WHERE field1 = 'beine_amazonenruestung'),
(SELECT field46 FROM _Template_Armor WHERE field1 = 'beine_amazonenruestung'),
(SELECT Guid FROM _Instance_Chest WHERE Id = "loc02_chest_spielerhaus_05"),0,null,"Pickable",-1,"ui_equipment",0,null,-1,null,1,0,0,null,0)
Vorsicht mit der Formatierung des Forums, gegebenenfalles müsst ihr Leerzeichen entfernen ;)

Die Guid (der Primärschlüssel) wird auf Null gesetzt, da er automatisch vergeben wird, verwendet man den Guid eines anderen Gegenstandes verschwindet dieser aus der Table.
Diese Query fügt ein Paar Beinschienen in einer Kiste ein und ist erst einsetzbar wenn man ein paar Quests in Ferdok gelöst hat.

Wenn ihr die Template Tabelle richtig importiert habt könnt ihr den Ausdruck 'beine_amazonenruestung' durch irgendetwas ersetzen, was euch interessanter vorkommt ;)
Viel Spaß beim experimentieren... Wer schlau ist benutzt replace ;)

Ps. mir ist bewusst, dass es sicher auch eine elegantere Methode gibt.. nur leider bin ich in SQLite nicht sonderlich bewandert. Bei Zeiten werde ich das ganze wohl mal programmatisch lösen.

EDIT: Nochmal etwas übersichtlicher, allerdings in zwei Statements gesplittet.
Nochimmer in die Kiste und 'beine_amazonenruestung' durch einen beliebigen Ausrüstungsgegenstand aus der _Template_Armor ersetzbar.
Code:
INSERT INTO "_Instance_Armor"
("_ID","Id","Graphics","Physics","GfxSkin","Name","LookAtText",
"EquipmentType","RSKo","RSBr","RSRu","RSBa","RSLA","RSRA","RSLB",
"RSRB","ArMaterial","ArTyp","ArGes","ArBE","QuestId","Gew",
"PickingRange","Value","ScriptPreset","ScriptOverride",
"LimitedScript","PermanentEffect","IconBrush","Arme","Haende",
"Torso","Beine","Fuesse","Haare","LookAtUnidentified",
"IdentificationTalent","InfoUnIdentified","InfoIdentified",
"IdentificationDifficulty","IsIdentified","Robable",
"PickingHeight","UseAnim","CanUse","Race","Sex")
SELECT
"field1","field1","field2","field3","field4","field5","field6","field7","field8","field9", "field10",
"field11","field12","field13","field14","field15","field16","field17","field18","field19", "field20",
"field21","field22","field23","field24","field25","field26","field27","field28","field29", "field30",
"field31","field22","field33","field34","field35","field36","field37","field38","field39", "field40",
"field41","field22","field43","field44","field45","field46"
FROM _Template_Armor
WHERE field1 = 'beine_amazonenruestung'
Code:
UPDATE "_Instance_Armor"
SET "Guid" = null,"_ID" = null,"_Level" = "dungeon02_hauptquartier",
"_Layers" = null,"Transform" = null,
"StorageGUID" = (SELECT Guid FROM _Instance_Chest WHERE Id = "loc02_chest_spielerhaus_05"),
"Lootable" = 0,"VelocityVector" = null,"PhysicCategory" = "Pickable",
"StorageSlotId" = -1,"SoundUI" = "ui_equipment","IsTradeItem" = 0,
"InventoryType" = null,"IsEquiped" = -1,"EquipmentSlotId" = null,
"LocalizeLookAtText" = 1,"IsMagical" = 0,"CanDestroy" = 0,
"UseTalent" = null,"EntityDiscovered" = 0
WHERE _ID = "beine_amazonenruestung"
Zitieren
#20
Jinnay schrieb:Die Guid (der Primärschlüssel) wird auf Null gesetzt, da er automatisch vergeben wird, verwendet man den Guid eines anderen Gegenstandes verschwindet dieser aus der Table.
Oh ja, Null, da war doch was, mein SQL ist wohl doch etwas eingrostet. Mein Kommentar bezieht sich übrigens aufs händische hinzufügen einer neuen Zeile im SQLite Browser, wo kein Schlüssel vergeben wird.
Jinnay schrieb:Wenn ihr die Template Tabelle richtig importiert habt könnt ihr den Ausdruck 'beine_amazonenruestung' durch irgendetwas ersetzen, was euch interessanter vorkommt ;)
Wegen dem Importieren habe ich bewusst kein SQL Statement gepostet.
Jinnay schrieb:Bei Zeiten werde ich das ganze wohl mal programmatisch lösen.
Ich warscheinlich auch...
Zitieren




Benutzer, die gerade dieses Thema anschauen: 4 Gast/Gäste