Drakensang (1), mal wieder – Phex zum Gruße!

Nach vielen Jahren habe ich mal wieder Drakensang (Teil 1) gefunden. Es handelt sich um jenes Spiel das als “Bestes deutsches Spiel 2008” ausgezeichnet wurde — wenn man mich fragt: zurecht.

Einerlei, ich spiele derlei Computerspiele eher weniger wegen der vielen Gegner oder irgendwelchen taktischen Spielchen, sondern um die erzählte Geschichte zu genießen.

Daher bin ich passionierter Cheater. Damals, als ich den ersten Teil von Drakensang erstmals durchspielte, hatte ich noch keine Ahnung wie einfach das ist. Daher spielte ich ohne Cheats durch. Mit Drakensang: Am Fluß der Zeit änderte sich das jedoch, da ich herausfand, daß die grundlegenden Spieldaten in SQLite3-Datenbanken abgelegt sind. Da ich dies noch im Hinterkopf hatte, habe ich beim erneuten Spielen vom ersten Teil von Drakensang daher direkt nachgeschaut was alles SQLite3-Datenbanken sind. Das trifft auf einige Dateien im Spielverzeichnis, sowie auf gespeicherte Spielstände zu.

Cheaten ist so relativ einfach möglich, wenn man nur ein paar Kleinigkeiten beachtet, ein paar gewisse Abkürzungen und Regeln von DSA im Hinterkopf behält (Die Gold-Edition von Drakensang enthält hilfreicherweise das Basisregelwerk) und sich einen Reim auf die seltsame Mischung aus Englisch und Deutsch in den Spaltennamen der Tabellen und an anderen Stellen machen kann1.

Als ehemaliger DSA-Spieler2 ist mir natürlich bewußt, daß es sich nicht um Cheaten handelt, sondern um eine würdige Form der Verehrung Phexens. Solch phexgefälliges Werk kann mir sicher niemand verübeln. Außerdem kann man mit diesen phexgefälligen Justierungen den Praioten im Dunkelwald schön einheizen. Wer — außer vielleicht einige Praidioten 😉 — könnte das denn als schlechten Zweck ansehen?

Hier meine phexischen Rezepte bisher. Man kann wahlweise die Konsole von SQLite3 selbst benutzen, oder das grafische Tool DB Browser for SQLite. Letzteres kann aber scheinbar nur jeweils eine Query an die Datenbank absetzen. Man muß sie also einzeln abschicken. Wahrscheinlich setze ich mich aber nochmal hin und gieße das in ein paar Pythonskripte die dann natürlich auch die Pfade der Datenbanken selbst ermitteln. Ne grafische Oberfläche will ich aber nicht versprechen, da ich damit unter Python erst sehr beschränkte (PyQt) Erfahrung habe.

So, zum eigentlichen Gegenstand. Die Tabelle welche für unsere Spielercharaktere3 zuständig ist, findet sich in den Spielständen als Tabelle _Instance_PC4. Es gilt also zuerst ein Spiel zu beginnen und dann einen der Spielstände aus dem Drakensang-Verzeichnis unterhalb eures Dokumentenordners — es handelt sich um .dsa-Dateien — zu laden.

Nicht vergessen: Backups helfen. Habe diese Queries zwar selbst ausprobiert, aber was hilft das wenn ihr trotzdem aus welchem Grund auch immer etwas vergurkt. Also schön ein Backup des Spielstands (nicht mit der Endung .dsa!!!) anlegen und ggf. auf Ursprungszustand zurücksetzen.

Hier setzen wir einige Attribute und Fertigkeiten erst einmal selektiv hoch:

UPDATE _Instance_PC SET RunSpeed=10.0, CurrentSpeed=10.0, MaxVelocity=10.0, Reg_LE=1, Reg_LE_freq=100, Reg_AU=1, Reg_AU_freq=100, MU=21, KL=21, `IN`=21, CH=21, FF=21, GE=21, KO=21, KK=21, TaArmbrust=18, TaDolche=18, TaATAdjustDolche=18, TaFechtwaffen=18, TaATAdjustFechtwaffen=18, TaHiebwaffen=18, TaATAdjustHiebwaffen=18, TaSaebel=18, TaATAdjustSaebel=18, TaSchwerter=18, TaATAdjustSchwerter=18, TaSpeere=18, TaATAdjustSpeere=18, TaStaebe=18, TaATAdjustStaebe=18, TaZwHiebwaffen=18, TaATAdjustZwHiebwaffen=18, TaZwSchwerter=18, TaATAdjustZwSchwerter=18, TaRaufen=18, TaATAdjustRaufen=18, TaBogen=18, TaWurfwaffen=18, TaSchleichen=18, TaSelbstbeherrschung=18, TaSinnenschaerfe=18, TaTaschendiebstahl=18, TaZwergennase=18, TaFallenstellen=18, TaPflanzenkunde=18, TaTierkunde=18, TaWildnisleben=18, TaMagiekunde=18, TaHeilkundeWunden=18, TaHeilkundeGift=18, TaGassenwissen=18, TaAlchimie=18, TaBogenbau=18, TaSchmieden=18, TaFallenEntschaerfen=18, TaSchloesser=18, TaFeilschen=18, TaEtikette=18, TaEinschuechtern=18, TaBetoeren=18, TaUeberreden=18, TaMenschenkenntnis=18, SF_Ausweichen1=18, SF_Ausweichen2=18, SF_Ausweichen3=18, SF_Ausdauernd1=18, SF_Ausdauernd2=18, SF_Ausdauernd3=18, SF_Ruestungsgewoehnung1=18, SF_Ruestungsgewoehnung2=18, SF_Ruestungsgewoehnung3=18, SF_Schildkampf1=18, SF_Schildkampf2=18, SF_Schildkampf3=18, SF_DefensiverKampfstil1=18, SF_DefensiverKampfstil2=18, SF_DefensiverKampfstil3=18, SF_OffensiverKampfstil1=18, SF_OffensiverKampfstil2=18, SF_OffensiverKampfstil3=18, SF_Meisterparade=18, SF_Klingenwand=18, SF_Windmuehle=18, SF_Finte=18, SF_GezielterStich=18, SF_Todesstoss=18, SF_Klingensturm=18, SF_Umreissen=18, SF_Wuchtschlag=18, SF_Niederwerfen=18, SF_Befreiungsschlag=18, SF_Hammerschlag=18, SF_GezielterSchuss=18, SF_Scharfschuetze=18, SF_Meisterschuetze=18, SF_SchnellLaden=18, SF_Eisenhagel=18, SF_Pfeilhagel=18, SF_Lademeister=18, SF_GezielterWurf=18, SF_Kraftwurf=18, SF_Meisterwurf=18, LEBonus=250, LEmax=300, AUmax=300, ATbasis=18, PAbasis=18, FKbasis=18, MR=18, LE=300, AU=300, AT=18, PA=18, AW=18, FK=18, ATW6=6, ATW6plus=6, RSKo=20, RSBr=20, RSRu=20, RSBa=20, RSLA=20, RSRA=20, RSLB=20, RSRB=20, BE=0, FEW6=6, FEW6plus=6, ATRange=5;

Wichtig ist hier die Spalte IN in rückwärtigen Anführungsstrichen zu schreiben, da IN auch ein SQL-Schlüsselwort ist. Sieht man noch in weiteren SQL-Queries weiter unten.

Hiermit setzen wir für ausnahmslos alle Spielercharaktere die besagten Attribute und Fertigkeiten.

Als nächstes kümmern wir uns noch selektiv um die magiebegabten Spielercharaktere und setzen alle Zauberfertigkeiten auf hohe Werte. Normalerweise wären einige Zauber je nach Volk und Magiertyp nicht verfügbar, aber bei uns herrscht Gleichberechtigung.

UPDATE _Instance_PC SET Reg_AE=300, Reg_AE_freq=1, ZaAdlerauge=18, ZaAeroFugumVakuum=18, ZaAnalys=18, ZaArmatrutz=18, ZaAttributoMU=18, ZaAttributoKL=18, ZaAttributoIN=18, ZaAttributoCH=18, ZaAttributoFF=18, ZaAttributoGE=18, ZaAttributoKO=18, ZaAttributoKK=18, ZaAxxeleratus=18, ZaBalsam=18, ZaBlitz=18, ZaCorpofrigo=18, ZaDschinenruf=18, ZaDuplicatus=18, ZaEscliptifactusSchattenkraft=18, ZaEigenschaftWiederherstellen=18, ZaEisenrost=18, ZaEiseskaelteKaempferherz=18, ZaElementarerDiener=18, ZaFalkenaugeMeisterschuss=18, ZaFavilludoFunkentanz=18, ZaFlimFlam=18, ZaForamen=18, ZaFulminictus=18, ZaGardianum=18, ZaHerrUeberDasTierreich=18, ZaTatzeSchwinge=18, ZaHorriphobus=18, ZaIgnifaxius=18, ZaIgnisphaero=18, ZaKlarumPurum=18, ZaKulminatio=18, ZaParalysis=18, ZaPlumbumbarum=18, ZaPsychostabilis=18, ZaRuheKoerper=18, ZaSanftmut=18, ZaSeidenzungeElfenwort=18, ZaSensibar=18, ZaSkelettarius=18, ZaSomnigravis=18, ZaOdem=18, AEBonus=500, AEmax=300, AE=300 WHERE IsMagicUser=1;

Am Ende das WHERE IsMagicUser=1 stellt sicher, daß dieses Update nur bei magiebegabten Spielercharakteren Anwendung findet.

So, nachdem ihr nun eine Basis gelegt haben, kann man sich mit Ausrüstung (Waffen, Rüstung, Munition, Schmuckgegenstände) eindecken und danach folgende Rezepte anwenden. Als erstes nehmen wir mal an, ihr habt einen in Fernkampf geübten Charakter5 und habt keinen Bock immer die Pfeile und Bolzen nachladen zu müssen. Besorgt euch nun einen Pfeil oder Bolzen je nach Waffenart und legt ihn in den Köcher. Dann beendet das Spiel und bearbeitet den “Weiter”-Spielstand6 mit folgendem Update:

UPDATE _Instance_Ammo SET MaxStackCount=999999, StackCount=999999, Gew=0, Value=1 WHERE StorageGUID IN (SELECT Guid FROM _Instance_PC) AND Id in ("Pfeil", "Bolzen")

Jetzt haben alle deine Charaktere anstatt eines oder bis zu hundert Pfeilen oder Bolzen in jedem Slot in dem Pfeile oder Bolzen waren 999999 Pfeile oder Bolzen. Das Gewicht ist absichtlich auf Null gesetzt, weil die Last so vieler Pfeile/Bolzen sonst ein Problem für den Charakter sein könnte.

Wie man hier sieht, befindet sich die Munition in der Tabelle _Instance_Ammo. Indem wir mit WHERE StorageGUID IN (SELECT Guid FROM _Instance_PC) das Update auf Zeilen mit der GUID all unserer Spielercharaktere eingrenzen, findet das Update auch nur Anwendung auf diese. Man will den Gegnern ja nicht unnötige Vorteile verschaffen 😉

Hierbei wird schon eine Beziehung von Spalten verschiedener Tabellen sichtbar. Die Spalten StorageGUID in den verschiedenen _Instance_*-Tabellen (bzpw. Ammo, Armor, Item, Jewelry, Weapon) entspricht der Guid-Spalte jenes Charakters der den Gegenstand besitzt. Diese Eingrenzung ist also auch in anderen Queries sinnvoll. Mit AND Id in ("Pfeil", "Bolzen") in der WHERE-Klausel schränken wir unser Update weiter auf diese Munitionsarten ein. Falls ihr andere Munitionsarten benötigt, sollten die Queries angepaßt werden.

Auch günstig ist, wenn man die Rüstungsgegenstände einfach leichter macht. Das geht wie folgt:

UPDATE _Instance_Armor SET Gew=500 WHERE StorageGUID IN (SELECT Guid FROM _Instance_PC) AND Gew>500

Somit werden alle Gegenstände die schwerer als ein halber Stein (== 1 kg auf aventurisch) sind, auf ein Gewicht von einem halben Stein gesetzt. Supi.

Folgendes Update setzt für alle Rüstungsteile einen hohen Rüstungsschutz und gibt ihnen permanente Effekte. Außerdem scheint es sie unverkäuflich zu machen7. Dies ist unabhängig davon ob die Gegenstände magisch sind oder nicht.

UPDATE _Instance_Armor SET RSKo=66, RSBr=66, RSRu=66, RSBa=66, RSLA=66, RSRA=66, RSLB=66, RSRB=66, IsTradeItem=NULL, PermanentEffect="PeAttackMalus4;PeMU3;PeKL3;PeIN3;PeCH3;PeFF3;PeGE3;PeKO3;PeKK3;PeImmuneToKnockdown;PeNotBurnable;" WHERE StorageGUID IN (SELECT Guid FROM _Instance_PC)

Die permanenten Effekte kann man der Tabelle _Template_Statuseffects in static.db4 im Unterverzeichnis export des Installationsverzeichnisses entnehmen. Achtung: man kann einen Effekt mehrfach in der durch Semikolon getrennten Liste aufführen. Allerdings führt dies offenbar zu einer Verschwendung von Rechenzeit welche ungleich höher ist als normal. Daher einfach die Liste so kurz wie möglich halten.

Auch bei den Waffen modifizieren wir leicht und machen sie ebenfalls unverkäuflich:

UPDATE _Instance_Weapon SET IsTradeItem=NULL, Gew=500, WpW6=5, WpW6plus=66, WpTPKK1=20, WpTPKK2=1, PermanentEffect="PeMU3;PeKL3;PeIN3;PeCH3;PeFF3;PeGE3;PeKO3;PeKK3;PeImmuneToKnockdown;PeNotBurnable;" WHERE StorageGUID IN (SELECT Guid FROM _Instance_PC) AND Gew>=500

Jede der getragenen Waffen hat so zusätzliche permanente Effekte und setzt das Gewicht der meisten Waffen8 auf einen halben Stein. Des weiteren werden die Trefferpunkte mit fünf W6 ausgwürfelt (5-30 TP) und zehn TP dazugefügt (insgesamt also: 15-40 TP). Des weiteren gibt es einen Körperkraftbonus für Körperkraft ab 20 (WpTPKK1) und zwar einen Trefferpunkt pro Körperkraftpunkt (WpTPKK2) ab 20.

Dann erweitern wir noch den Angriffsradius unserer Bögen und Armbrüste und beschleunigen das Nachladen:

UPDATE _Instance_Weapon SET WpATRange=66, WpReload=0, WpD1=0 WHERE StorageGUID IN (SELECT Guid FROM _Instance_PC) AND WpAmmoCategory IN ("Arrow", "Bolt")

Zuguterletzt machen wir unseren Schmuck unverkäuflich und geben ihm jeweils ein paar permanente Effekte:

UPDATE _Instance_Jewelry SET IsTradeItem=NULL, PermanentEffect="PeEtikette1;PeGE1FF1;PeMU3;PeKL3;PeIN3;PeCH3;PeFF3;PeGE3;PeKO3;PeKK3;PeImmuneToKnockdown;PeNotBurnable;" WHERE StorageGUID IN (SELECT Guid FROM _Instance_PC);

Spielstand abspeichern. Nachdem ihr das Spiel fortsetzt, sollten sich die Werte der Spielercharaktere deutlich verbessert haben.

Noch ein Hinweis: die Rezepte für Gegenstände beziehen sich nur auf Gegenstände von denen es ein Exemplar gibt welches sich im Besitz eines Spielercharakters befindet. Sie müssen entsprechend neu angewendet werden, falls ihr neue Gegenstände erhaltet/kauft.

Hoffe das hilft den ein oder Abenteurern bei den Questen in Drakensang.

// Oliver

PS: ach ja, einen ähnlichen Effekt hat das Perlskript welches ich mir damals für Drakensang: Am Fluß der Zeit schrieb. Die Datenbankschemata scheinen sich zumindest stark zu ähneln. Möglicherweise sind sie sogar identisch, aber das habe ich noch nicht verifiziert.

  1. kurzum: man sollte Englisch beherrschen []
  2. vor den ganzen Regelneuerungen die den Spielspaß aus meiner Sicht damals vor knapp 20 Jahren schmälerten und einen Neukauf aller bis dahin gekauften Regelwerke nötig gemacht hätten []
  3. inklusive Haupthelden/-heldin []
  4. PC == player character, NPC == non-player character []
  5. eigentlich gibt es kaum noch Unterschiede zwischen den Charakteren, aufgrund der obigen Updates, aber sei’s drum; diverse Werte haben wir nicht angepaßt und die machen manchmal minimale Unterschiede aus []
  6. bei mit unter %USERPROFILE%\Documents\Drakensang\profiles\default\save\continue_0 als continue.dsa []
  7. zumindest war dies meine Absicht []
  8. außer Wurfmessern usw., daher die Einschränkung nach Gewicht der Waffe []
This entry was posted in /dev/null, DE and tagged , , , . Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *