PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [Release] Trade inventory/Händlerinventare



Shak-otay
28.07.2010, 16:00
Nach all' meinem Gejammere über die Automatisierungstendenzen
bei G3/Risen speziell auf Script-Ebene will ich hier mal eine Lanze brechen
für den/die Script-Verantwortlichen bei den PBs, die sich tapfer dagegen wehren.

In Risen-Infos kann man nämlich per Command "gCInfoCommandRunScript"
das Script "OnTradeInfo_RefillTradeItems" ausführen.


<Command
ClassName="gCInfoCommandRunScript"
Other="It_Po_Health_01"
OtherType="gEOtherType_TemplateEntity"
Script="OnTradeInfo_RefillTradeItems"
Self="Cormac"
Param="20"
>
</Command>

Das Folgende hat jetzt nur noch akademischen Wert (wenn überhaupt), weil
es eine neue revolutionär einfache Methode zum Erstellen von Risen-Infos (http://forum.worldofplayers.de/forum/showpost.php?p=13518646&postcount=1) gibt.


Ich habe die Info "FILLERX2_00978.xinf" (Cormac) aufgebohrt, d.h. um 18
RunScript-Commands erweitert, so dass ein Händler jetzt 25 verschiedene
Item-Sorten anbieten kann (sollte reichen; bisher waren es max. 7).

Name des zu bearbeitenden binären Files: "FILLERX2_00978 TradeInv.bini".
Zu beachten ist die unterschiedliche Reihenfolge von Other/Self in Script und bini.

Wer sich überwinden kann, mal einen Hexeditor zu benutzen, sollte nach Lesen
dieser Anleitung in der Lage sein, Händlern beliebige Items in das Tradeinventory zu legen.

Wenn die Theorie nicht interessiert, kann man auch gleich mit dem praktischen Beispiel
(s.u.) loslegen. Ohne Hexeditor geht's allerdings nicht.

Wer Probleme mit der Dezimal-Hex-Wandlung hat, kann den Windows-Rechner
(calc.exe, wissensch. Modus) benutzen.



------------------- Theo rie ---------------------------------------

Das RunScript-Command von oben sieht in Hex (Adresse 15A-1B9) so aus:

Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F

00150 00 00 C9 00 00 00 00 00 01 00<01 00 01 01 00 01 ..É.............
00160 EE 11 01 00 00 01 00 C9 00 4D 00 00 00 C9 00 05 î......É.M...É..
00170 00 00 00 EF 11 F0 11 1E 00 05 00 00 00 01 00 01 ...ï.ð..........
00180 68 20 F2 11 BD 11 1E 00 02 00 00 00 30 16 F3 11 h ò.½.......0.ó.
00190 BD 11 1E 00 02 00 00 00 BD 25 F5 11 F6 11 1E 00 ½.......½%õ.ö...
001A0 06 00 00 00 C9 00 01 00 00 00 F7 11 D5 11 1E 00 ....É.....÷.Õ...
001B0 04 00 00 00 14 00 00 00 01 00>01 00 01 01 00 01 ................

FILLERX2_00978_TradeInv.bini.JPG (http://upload.worldofplayers.de/files5/FILLERX2_00978_TradeInv.bini.JPG)

Geändert werden müssen 2 Words an den Adressen 0x18C (self: Händlername),
0x198 (other: Itemname) und das DWORD an 0x1B4 (Param: Itemanzahl).

Anstelle der Namen sind hier natürlich die TableEntry-Nummern (TE-No) 0x1630
und 0x25BD eingetragen. Nach Intel-Hex-Datenkonvention sind die Werte gedreht,
also erst das Low- und dann das Highbyte. Etwas gewöhnungsbedürftig, aber nicht
wirklich schwierig.)

Die zu einem bestimmten Händler- bzw. Itemnamen gehörige TE-No findet man
in der infos-header.txt, die im Lrenter-zip enthalten ist.

Ein RunScript-Block ist 96 Bytes (0x60) groß. Wenn man mehr als 1 Item ändern will,
findet man die 3 Änderungsstellen im Block durch Additon von 0x60 x (Itemnr.-1)
zu den oben angegebenen Adressen des 1. Blocks (0x18C, 0x198, 0x1B4).

Also Block 2 (Item 2): 1EC, 1F8 und 0x214
Block 25 (Item 25): A8C, A98 und AB4

Von den Blöcken 3..24 gebe ich nur die erste Adresse an:
(Anmerkung: Adr. des Händlernamens; nicht Blockstart!)
Block 3: 24C, 2Ac,
Block 5: 30C, 36C, 3CC, 42C, 48C, 4EC, 54C, 5Ac,
Block 13: 60C, 66C, 6CC, 72C, 78C, 7EC, 84C, 8AC,
Block 21: 90C, 96C, 9CC, A2C

(Wenn man nur 1 Item braucht, kann man den Param-Wert an der 3. Adresse
unverändert lassen.)

Die 25-Hex-Blocks stehen alle im binären File FILLERX2_00978 TradeInv.bini.
Hier steht an Adresse 0x23 die TE-No des Infonamens und an 0x4B die des Ownernamens.

Den Infonamen müssen wir uns selbst ausdenken, d.h. er existiert noch nicht in der
compiled_infos.bin. Er muss daher in die Info_TEntries.ini eingetragen werden.

Das gilt auch für Items, die nicht in der infos-header.txt stehen (also die meisten).


Praktisches Beispiel: Tristan die It_Armor_Don_Hunter und 10x It_Lockpick
-------------------- ins Händlerinventar legen.

Vorbereitungen: (XP; andere OS: NicoDEs cmd-File benutzen.)

in den Ordner C:\Dokumente und Einstellungen\[user account]\
Lokale Einstellungen\Anwendungsdaten\Risen\data\compiled\library

eine compiled_infos.bin entpacken (es kann auch eine bin meiner mods benutzt werden)
und in compiled_infos.lrent umbenennen.

Eine LEERE Info_TEntries.ini im gleichen Verzeichnis erzeugen (umbenanntes Textdokument).

1. "FILLERX2_00978 TradeInv.bini" im Hexeditor öffnen. ÜBERSCHREIB-Modus
einstellen, nicht den Einfügemodus!
Das erste Item (It_Po_Health_01) lassen wir unverändert.


2. Händlername= Tristan in der infos-header.txt suchen (Notepad-Suche)
TE-No (steht vor dem Namen) ist 16E0. An Adresse 0x4B in der *.bini
E0 16 eintragen. (Ja, des ist gedreht!)

3. Da wir 2 Items ändern wollen, muss in die Itemblocks 2 und 3 an die 2.
Änderungsadresse (s. Theorie) auch diese TE-No eingetragen werden.
Die Adressen der Händlernamen-TEs in den Blocks sind 1EC bzw. 24C;
dort muss jeweils E0 16 eingetragen werden.

4. Die TE-No (TE) von It_Lockpick ist 0x26b5 (s. infos-header.txt).
Die Adresse des Itemnamen-TEs ist 12 Bytes (0x0C) hinter 0x1EC;
d.h. B5 26 eintragen an 1EC+0C= 0x1F8.
Die Itemanzahl (Param) steht 40 Bytes (0x28) hinter 0x1EC.
Also 0x0A (=10) eintragen an 0x214.

5. Wir wählen einen Namen für die neue Info: SHAKX2_Trist_Inv.
Dieser Name muss in die Info_TEntries.ini eingetragen werden.

Die Rüstung steht nicht in der infos-header.txt. Namen auch in die
*.ini eintragen. (Zeilen immer mit Return (ENTER-Taste) abschließen!)

6. Die beiden Einträge haben noch keine TE-No.
Mit dem Lrenter die compiled_infos-lrent öffnen.
In der Combobox unten eine Info anklicken; im "Risen-Info Properties"-
Fenster den "next new TabeleEntry"-Wert merken. Bei der compiled_info
der Risen-Demo ist das 0x6835.

Den Wert ordnen wir SHAKX2_Trist_Inv zu; entsprechend 0x6836 der
Rüstung.

( Achtung: jetzt wieder im Hexeditor arbeiten; Lrenter offen lassen)

An Adresse 0x23 der bini tragen wir 35 68 (für den Infonamen) ein.
An Adresse 24C + 0C= 0x258 tragen wir 36 68 für den Itemnamen ein (vergl. Theorie).


7. Geänderte bini speichern.

8. Im Lrenter (binary copy)- append-Button drücken und bini laden (anhängen).
Dann Ok-Button drücken und mit "File save" die lrent speichern.

9. _compiled_infos.lrent umbenennen in compiled_infos.bin (d.h. ohne Underscore!).

10. Risen starten, Tristan anquatschen. Er sollte jetzt (die Startklamotten des Heros;
Mist, unsichtbar) die Jägerrüstung und 10 Dietriche im Handelsinventar haben.


(Leider macht die It_Armor_Intro_Old den Body des Heros unsichtbar, daher musste
ich auf die Jägerrüstung ausweichen, obwohl die natürlich nicht zu Tristans
Händler-Inventar "passt".)

edit: ich habe von Item-Blocks geredet, obwohl es eigentlich RunScript-Command-Blocks sind; sollte aber klar sein, was gemeint ist.

Zu beachten: Item1 und Item4 bis Item25 haben noch den Cormac-TableEntry
(0x1630) eingetragen. Da beim Handeln mit Cormac sein Fill-Script aufgerufen wird,
sollte das egal sein; besser wär's, die TEs durch Tristans zu ersetzen (bzw.
des Händlers, den ihr ändern wollt).

Außerdem hätte ich erwartet, dass Tristan 2 "Lass uns handeln"-Dialogoptionen hätte,
da ich die ursprüngliche nicht ausgeschaltet habe.

Wenn's bei Eurem Händler nicht funktioniert, die SortID an Adresse 0x3D erhöhen,
z.B. 70 17 eintragen (sollte immer Priorität haben, weil groß genug).

shak-otay, Juli 2010

Tristan_TradeInv.JPG (http://upload.worldofplayers.de/files5/Tristan_TradeInv.JPG)

Tristan_TradeInv.zip (http://upload.worldofplayers.de/files5/Tristan_TradeInv.zip)

Den nötigen Lrenter gibt's hier (http://forum.worldofplayers.de/forum/showpost.php?p=13343078&postcount=1).

Baltram
29.07.2010, 17:05
Dieses Script ist echt 'ne tolle Entdeckung. Danke auch für die gut verständliche Anleitung! :)

Ich wollts gerade auch mal ausprobieren und habe die compiled_infos.bin direkt editiert (hab bei der Cormac-Stelle aus deinem Screenshot die Amounts verändert). Aber leider hab ich irgendwas falsch gemacht, denn im Spiel hat es keine Auswirkungen, auch wenn ich eine library.p01 erstelle... Ich bin wohl grad iwie zu dämlich dazu. :(

Da es natürlich am besten wäre, wenn man komplett neue, eigene Händler erstellen könnte, ploppen bei mir ein paar Fragen auf... vllt kannst du ja zu der einen oder anderen was sagen:

1.) Kann man mit deinem NPC-Composer auch Händler erstellen/klonen bzw. funktioniert das dann alles mit Handel-Dialog etc. ?
2.) Kann man die "Default"-Items aus dem Händlerinventar entfernen (z.B. mit Parameter -1), sodass der Händler nur die Sachen hat, die man selbst reinscriptet?
3.) Kann man dafür sorgen, dass dieses refill script nur einmal aufgerufen wird (vllt mithilfe von irgendwelchen conditions oder so)?

Ich frage mich übrigens immer noch, wo die Händlerinventare gespeichert sind. Dass die in irgenwelchen EXEs oder DLLs liegen, finde ich irgendwie abwegig auch wenn mir kein anderer Ort mehr einfällt. In den tples/lrents ists ja leider nicht. Vllt. kann man ja was rausfinden, wenn man die Savegames analysiert...?

Und was auch schade ist ist, dass das refill script das einzige derart nützliche zu sein scheint außer vllt u.a. SetSkillsToLevel. Ich habe in den Rohinfos nur 58 verschiedene "Script=XYZ" gefunden und die allermeisten scheinen nicht arg brauchbar... :dnuhr:

Arbeitest du eig. an einem Quest/Info composer?

Shak-otay
29.07.2010, 18:31
[...]Danke auch für die gut verständliche Anleitung! :)Bitte. Und "danke" für dein Lob; sonst scheint mich ja keiner zu verstehn...§wink


Ich wollts gerade auch mal ausprobieren und habe die compiled_infos.bin direkt editiert (hab bei der Cormac-Stelle aus deinem Screenshot die Amounts verändert). Aber leider hab ich irgendwas falsch gemacht, denn im Spiel hat es keine Auswirkungen, auch wenn ich eine library.p01 erstelle... [...]Kann gut sein, dass der Param-Wert nur die max. Itemanzahl angibt und zufällig die Anzahl generiert wurde, die vorher auch vorhanden war. Ich bin mir auch nicht sicher, ob das Script bei jedem Aufruf wirksam wird. Lrents bzw. bins braucht man nicht packen, damit sie wirksam werden (.tab und .tple schon).


1.) Kann man mit deinem NPC-Composer auch Händler erstellen/klonen bzw. funktioniert das dann alles mit Handel-Dialog etc. ?
Ich denke, das läuft über

<Command
ClassName="gCInfoCommandSetTradeEnabled"
Entity1="Oscar"
TradeEnabled="True"
>
</Command>
Hattich gestern keine Zeit mehr, es auszuprobieren.



2.) Kann man die "Default"-Items aus dem Händlerinventar entfernen (z.B. mit Parameter -1), sodass der Händler nur die Sachen hat, die man selbst reinscriptet?Mein Vorschlag war "0"; werde beides mal probieren.

3.) Kann man dafür sorgen, dass dieses refill script nur einmal aufgerufen wird (vllt mithilfe von irgendwelchen conditions oder so)?Indem man "Permanent" auf 0 setzt. Conditions wäre zu umständlich.


Ich frage mich übrigens immer noch, wo die Händlerinventare gespeichert sind. Dass die in irgenwelchen EXEs oder DLLs liegen, finde ich irgendwie abwegig Werden sie überhaupt gespeichert? Wenn, dann in den savegames. Aber ich vermute, die werden neu generiert; die "Schemata" oder Vorlagen für die einzelnen Händler müssten in dlls stehen.

edit: was passiert denn mit Gegenständen, die man einem Händler verkauft. Bleiben die in seinem Trade inventory, bis man sie wieder zurückkauft? Dann müssten zumindest diese Teile im savegame stehen.


Und was auch schade ist ist, dass das refill script das einzige derart nützliche zu sein scheint außer vllt u.a. SetSkillsToLevel. Ich habe in den Rohinfos nur 58 verschiedene "Script=XYZ" gefunden und die allermeisten scheinen nicht arg brauchbar... :dnuhr:Soll ich die Lanze, die ich für den PB-Scripter gebrochen habe, wieder flicken?:D


Arbeitest du eig. an einem Quest/Info composer?Öhm, erstmal nicht. Der Grund besteht darin, dass das doch etwas viel Aufwand wäre, zudem spätestens dann unnötige Arbeit, wenn NicoDE noch eine Möglichkeit eröffnen sollte, dass man (mit engine-Funktionen z.B.) xinf in bin wandeln kann.

NicoDE
29.07.2010, 19:15
Lrents bzw. bins braucht man nicht packen, damit sie wirksam werden (.tab und .tple schon).Gilt das auch für den Fall, dass man die physikalischen Dateien per mountlist_packed.ini aktiviert?

Baltram
29.07.2010, 19:34
Kann gut sein, dass der Param-Wert nur die max. Itemanzahl angibt und zufällig die Anzahl generiert wurde, die vorher auch vorhanden war.Wenn ich Cormac alle Tränke abkaufe, sind beim erneuten Ansprechen wieder 10 von den kleineren da, also wie in der originalen BIN, denke ich. Wie gesagt k.A. was ich falsch mache.
[...]Wenn, dann in den savegames. Aber ich vermute, die werden neu generiert; die "Schemata" oder Vorlagen für die einzelnen Händler müssten in dlls stehen.Ja, die meinte ich.
Soll ich die Lanze, die ich für den PB-Scripter gebrochen habe, wieder flicken?K.A. was würde man denn mit so einem Ding machen können, wenns wieder heile ist? :p
Öhm, erstmal nicht. Der Grund besteht darin, dass das doch etwas viel Aufwand wäre, zudem spätestens dann unnötige Arbeit, wenn NicoDE noch eine Möglichkeit eröffnen sollte, dass man (mit engine-Funktionen z.B.) xinf in bin wandeln kann.@Nico
Und, wie siehts diesbezüglich aus?
Gilt das auch für den Fall, dass man die physikalischen Dateien per mountlist_packed.ini aktiviert?Ich denke nicht. Zumindest geänderte tples werden bei mir (hab die Vollversion) sogar ohne eigene mountlist_packed.ini ungepackt angenommen. Neue aber meine ich nicht (würden sie vllt mit der INI, muss ich mal testen).

Shak-otay
29.07.2010, 21:00
Wenn ich Cormac alle Tränke abkaufe, sind beim erneuten Ansprechen wieder 10 von den kleineren da, also wie in der originalen BIN, denke ich. Wie gesagt k.A. was ich falsch mache.Hmm, ja, das liegt wohl daran, dass die Info Filler 0978.xinf erst in den Kapiteln 3 und 4 wirksam ist. Für Kap. 1 gilt Filler 0976 und Kap. 2 Filler 0977.

(Du hast es in Kap. 1 oder 2 getestet, richtig?)


was würde man denn mit so einem Ding machen können, wenns wieder heile ist? :pDa es nur eine virtuelle Lanze ist, leider nicht das, was ich gerne machen würde.;)

Baltram
29.07.2010, 21:11
Hmm, ja, das liegt wohl daran, dass die Info Filler 0978.xinf erst in den Kapiteln 3 und 4 wirksam ist. Für Kap. 1 gilt Filler 0976 und Kap. 2 Filler 0977.Achsoo. Danke, ich dachte schon ich spinn.
(Du hast es in Kap. 1 oder 2 getestet, richtig?)Das allererste mal war sogar in Kapitel 4 glaube ich. Das hatte aber auch keine Auswirkung, vllt weil die BIN falsch platziert war oder weil ich an einer Stelle -1 als Param übegeben hatte.
Da es nur eine virtuelle Lanze ist, leider nicht das, was ich gerne machen würde.;)Da hake ich jetzt mal nicht weiter nach :scared:

NicoDE
29.07.2010, 21:57
Soll ich die Lanze, die ich für den PB-Scripter gebrochen habe, wieder flicken?:DVielleicht findest du noch mehr Funktionen (die nicht verwendet wurden).
Ich habe mal die entsprechenden Listen für die scripts\Script_Game.dll angehängt (die Bezeichner im Quelltext sind nur geraten).
Übrigens: "CON_" ist die Nameskonvention für Konsolenanweisungen.


Und, wie siehts diesbezüglich aus?Ich habe viel Arbeit, kaum Zeit und keine Hilfe :)
Bis davon irgendwas produktiv einsetzbar ist, wird es noch eine ganze Weile dauern...

Baltram
29.07.2010, 22:36
Ich habe viel Arbeit, kaum Zeit und keine Hilfe :). Bis davon irgendwas produktiv einsetzbar ist, wird es noch eine ganze Weile dauern...Es ist also eher nicht zu erwarten, dass du sowieso in wenigen Wochen eine Engine-Funktion hervorzauberst, die alle "selbstgemacheten" Info/Quest-Compiler nutzlos machen würde? (Ich würde nämlich vllt Anfang Sept. ganz gern einen in Angriff nehmen, falls es bis dahin noch nix in der Richtung gibt ...shak?...).

Was Hilfe angeht... ich würde dir schon gern helfen und andere sicher auch. Ich fürchte aber, dass kaum einer auch nur annähernd die nötigen "Skills" und die Erfahrung hat, um auch effektiv was bei der Art von Arbeit zu bewirken. Vermute ich. :(

(...was kann man eigentlich aus dem Smilie schließen? Dass du es magst, dich leicht isoliert unter Zeitmangel zu überarbeiten? :gratz)

Shak-otay
29.07.2010, 22:50
(Das mit der mountlist habe ich noch nicht probiert.)

Vielleicht findest du noch mehr Funktionen (die nicht verwendet wurden)."finden" = "erfolgreich anwenden"?

edit: ok, ich habe 'ne Idee. Der Command-Aufbau für "..RunScript" ist so:


<Command
ClassName="gCInfoCommandRunScript"
Other="It_Po_Health_01"
OtherType="gEOtherType_TemplateEntity"
Script="OnTradeInfo_RefillTradeItems"
Self="Cormac"
Param="20"
>
</Command>

Ich muss also nur eine Info mit -sagen wir- 100 RunScript-Command-Blocks erstellen, wo ich die in Frage kommenden Scripte eintrage. Und dann hoffen, dass das Spiel nicht abschmiert, sobald der erste Block mit einer nur in dlls lauffähigen Scriptfunktion erreicht wird.

(Beim Script "SetSkillsToLevel" ist Other="". Hoffe, es gibt kein Problem, wenn man nicht benötigte Parameter doch belegt?)


Ich habe mal die entsprechenden Listen für die scripts\Script_Game.dll angehängt Jupp, danke.§wink
edit: Ich hab' mir die __source.txt angesehen; wenn ich DumpScriptFunctions("Script.dll") ins Risen-SDK einbaue, passiert nichts. Braucht man eine Script_Game.lib?


Ich habe viel Arbeit, kaum Zeit und keine Hilfe :)
Öhm, naja, ich denk' wir drei haben 'ne ganz gute Arbeitsteilung, oder? Jeder macht das, was er am besten kann.

Dass Du dir mal wieder das Schwerste rausgesucht hast, da können wir ja nichts zu, oder?:D (duck und weg...)

Nee, mal ehrlich, immer, wenn ich mal wieder versuche zu verstehen, wie Du den Code analysierst, muss ich nach 15 Minuten heulend aufgeben...:scared:


Bis davon irgendwas produktiv einsetzbar ist, wird es noch eine ganze Weile dauern...Uns hetzt/zwingt doch keiner, sondern wir machen es 'just for fun'. (So hatte ich es jedenfalls verstanden.;))

Gute, Nacht, ihr zwei...(schön, euch dabei zu haben)§wink

NicoDE
30.07.2010, 09:54
Tun wir mal so, als wäre "OnTradeInfo_RefillTradeItems" so eine Funktion.Das ist eine Frage, mit welchen Tools man arbeitet (um Arbeit/Zeit zu sparen)...
Ich habe mal eben Dummy-Strukturen für die Klassen angelegt, gEStackType definiert und die verwendeten Importe typsiert und F5 gedrückt (siehe Anhang)
...IDA Pro mit Hex-Rays hat aber auch seinen Preis.

Der erste Block:
Entity Self;
Entity Other;

if( a_pSelf )
Self = a_pSelf;
else
Self.AttachTo( a_SPU.GetSelfEntity() );
if( a_pOther )
Other = a_pOther;
else
Other.AttachTo( a_SPU.GetOtherEntity() );taucht in jeder Funktion auf (gehört also offensichtlich zum Makro mit dem die Skriptfunktionen deklariert werden.
Der Funktionsprototyp ist immer gleich. Es gibt nur Unterschiede in der Interpretation des letzten Parameters.

In der OnTradeInfo_RefillTradeItems werden (durch die Optimierung des Compilers) am Ende die anschließend nicht mehr benötigten Parameter auf dem Stack als Variablen benutzt. Dadurch ist der Pseudocode nicht mehr so schön lesbar - aber man versteht worum es geht. Wie man sehen kann, wird die Anzahl nur sichergestellt, wenn die Hälfte oder weniger im Händlerinventar vorhanden ist.

Shak-otay
30.07.2010, 10:15
[..]
Und was auch schade ist ist, dass das refill script das einzige derart nützliche zu sein scheint außer vllt u.a. SetSkillsToLevel. Ich habe in den Rohinfos nur 58 verschiedene "Script=XYZ" gefunden und die allermeisten scheinen nicht arg brauchbar... :dnuhr:Sind sogar noch 8 mehr, oder so. Aber die meisten sind tatsächlich sehr spezifisch, so dass man sich wundern muss, dass sie nicht in der dll "versteckt" wurden.


23.4.2010


gCInfoCommandRunAIScript <AIScript>
-----------------------------------

FadeOutMusic

OnQuestRunning_EldricRitual
OnQuestRunning_FreeUrsegor
OnQuestRunning_GoldenGateCutscen
OnQuestRunning_InquisitorLeavesPlayer
OnQuestRunning_Inquisitor_OpenPortal
OnQuestRunning_SealMagic
OnQuestRunning_WolfNo
OnQuestRunning_WolfYes

DrawWeapon
DrinkBeer
DrinkBottle
EatMeat
EatStew
ReadLetter
SayYouLearnedWell
UndrawWeapon



gCInfoCommandRunScript <Script>
-------------------------------

DismissPlayerParty
EndOfStory_Demo (RATZ01365, 1777, 1778)

OnQuest_ClearInitiationMemory
OnQuest_ClearNPCmemory
OnQuest_LockAIResult
OnQuestPlayer_IsHurt

OnQuest_SetDamageCalculationType_Immortal
OnQuest_SetDamageCalculationType_Monster (Owner=Marvin)
OnQuest_SetDamageCalculationType_Normal
OnQuest_SetAttidudeLock_Friend
OnQuest_SetAttidudeLock_None

OnQuestActivate_Fincher_KillRudolfsCamp

OnQuestRunning_InqsEnterTemple
OnQuestRunning_InquisitorLeavesPlayer
OnQuestRunning_Inquisitor_OpenPortal
OnQuestRunning_PlunderTemple

OnQuestRunning_VulcanTempleAltarDoor
OnQuestRunning_VulcanTempleBreakthrough

OnQuestSuccess_CarlosWantsToSeePlayer
OnQuestSuccess_CarlosWantsToSeePlayerAfterScordoDrivenAway
OnQuestSuccess_CarlosSolvedQuest4_KillDONsWhoCantBeDrivenAway
OnQuestSuccess_CauseMONCloseDONQuestsCH1
OnQuestSuccess_ChangeRoutineAlvaro

OnQuestSuccess_DismissPartyMemberCyrus
OnQuestSuccess_DismissPartyMob_Fincher
OnQuestSuccess_DismissPartyMob_Fincher_Remote
OnQuestSuccess_DismissPartyMemberRupert
OnQuestSuccess_DismissPatty
OnQuestSuccess_DismissVasili
OnQuestSuccess_FindAllArtifactDiscs
OnQuestSuccess_FindAllSouldrinker
OnQuestSuccess_FindAllStormwind

OnQuestSuccess_FoundArmorPieceTitanlord_All
OnQuestSuccess_JoinPartyMob_Fincher
OnQuestSuccess_MakeRomanovsMenHostile
OnQuestSuccess_NoviceHensonsWolvesDead
OnQuestSuccess_OpenMonasteryDoor
OnQuestSuccess_OpenHarborTunnelDoor

OnQuestSuccess_PlayerFoundTeleportstone
OnQuestSuccess_PlayerSearchForCivilisation
OnQuestSuccess_Player_EntersFirstWinch
OnQuestSuccess_Player_KillsAllUndead
OnQuestSuccess_Player_AgainstMendoza

OnQuestSuccess_SolvedQuestForCarlos
OnQuestSuccess_SolvedQuestForScordo
OnQuestSuccess_SpawnLizardScoutsWithTeleportStones

OnQuestSuccess_ChangeToChapter2
OnQuestSuccess_ChangeToChapter3
OnQuestSuccess_ChangeToChapter4

OnTradeInfo_RefillTradeItems

SetCombatAI
SetCombatSkills
SetGuild_Pir
SetRawMeatCount
SetPERMITTED
SetRoutineContinueRoutine
SetSkillsToLevel

StartBlackScreen
StartBlackScreen_AbruptBlendOut
StartInfoTutorial
StartTestFight

TitanMainDoorClose (FEEL 0002, Owner="Obj_EVT_Button_Trigger_Invisible")
TitanMainDoorOpen (FEEL 0001)
TuneUpNPCs_Chapter1
TuneUpNPCs_Harbour
TuneUpNPCs_Monastery



gCInfoConditionScript ScriptName
--------------------------------

Has_EquippedMeleeWeapon
Has_MeleeWeapon

HasNot_EquippedMeleeWeapon
HasNot_MeleeWeapo

Has_MoreRawMeat

IsDuel_Cancel
IsDuel_Lost
IsDuel_Won

IsNot_NearEntity

OnQuestCondition_BelschwurTalksAboutMages
OnQuestCondition_PlayerGotOlfsGoldGoblet
OnQuestCondition_SomeOneLeftTheCityThroughTheTunnel (RATZ 1722)

OnQuestPlayer_IsHurt

OnQuestRunning_Abrax_FreeLibrary
OnQuestRunning_Cyrus_DruidBarriere
OnQuestRunning_FindTitanArmorAll (KALV 0621)
OnQuestRunning_FursForBaxter (KALV 0065)
OnQuestRunning_Inquisitor_LeftWinch_Open (KALV 0102)
OnQuestRunning_Inquisitor_RightWinch_Open (KALV 0100)
OnQuestRunning_JervisCanTeach (FILL 0789, 1298)

OnRunningQuest_RodriguezFindSpy (FILL 0763)

OnQuestSuccess_ErlanSearchNautilus (KALV 0298)
OnQuestSuccess_PlayerHasLizardSword (KALV 0487, 0488, 0489)

OnTitanMainDoorClosed (FEEL 0001)
OnTitanMainDoorOpened (FEEL 0002)



Nicht per Info-Scriptaufruf zugänglich:
--------------------------------------

StartAutosave
OnQuestChange
OnInfo

OnPlayer_Change_SkillBase
OnPlayer_Change_ItemAmount

OnBenchmarkResult_LowestPixelPerSec
OnBenchmarkResult_LowPixelPerSec
OnBenchmarkResult_MediumPixelPerSec
OnBenchmarkResult_LowTrianglesPerSec
OnBenchmarkResult_MediumTrianglesPerSec


Ich hatte mich ja mal über die fehlende Möglichkeit beschwert, NPCs gezielt etwas essen zu lassen. Ist aber offenbar per AIScript doch möglich:

DrinkBeer, DrinkBottle, EatMeat, EatStew,

wenn auch nicht mit beliebigen essbaren Items.

Dann gibt's noch

DrawWeapon, ReadLetter, (SayYouLearnedWell)
UndrawWeapon

Habe ich aber alle nicht ausprobiert.

NicoDE
30.07.2010, 10:36
Ich hab' mir die __source.txt angesehen; wenn ich DumpScriptFunctions("Script.dll") ins Risen-SDK einbaue, passiert nichts. Braucht man eine Script_Game.lib?Die TestApp läuft (wie das Spiel) in <Risen>\bin\. Du musst also "scripts\\Script_Game.dll" verwenden. Nicht vergessen das Manifest für OpenMP zu verwenden (Script_Game.dll lädt die Engine.dll, welche die vcomp.dll benötigt, die nur mit Manifest gefunden wird).

Ich habe den Quelltext und die Listen aktualisiert, weil ich vergaß die Adressen zu korrigieren (die Script_Game.dll ist reloziert und meine lokalen Adressen helfen niemandem :)).

NicoDE
30.07.2010, 11:07
Ich hatte mich ja mal über die fehlende Möglichkeit beschwert, NPCs gezielt etwas essen zu lassen. Ist aber offenbar per AIScript doch möglich:

DrinkBeer, DrinkBottle, EatMeat, EatStew,

wenn auch nicht mit beliebigen essbaren Items.EatMeat ruft "_AI_Consume" mit "It_Meat_Fried" auf... könnte man auch mit anderen Items ausprobieren. Allerdings gibt es in EatMeat noch etwas mehr Code (Test mit PSRoutine::GetAniState() == gEAniState_Stand, Sicherstellen eines (hidden) Items, ...).

NicoDE
30.07.2010, 12:23
Es ist also eher nicht zu erwarten, dass du sowieso in wenigen Wochen eine Engine-Funktion hervorzauberst, die alle "selbstgemacheten" Info/Quest-Compiler nutzlos machen würde? (Ich würde nämlich vllt Anfang Sept. ganz gern einen in Angriff nehmen, falls es bis dahin noch nix in der Richtung gibt ...shak?...).Dürfte gar nicht nötig sein.
Risen repariert sich selbst (macht eCDocArchive beim Load): Alle *.xqst in data/raw/quests/ gelegt
(optional) neue AAA.xqst angelegt
in bin/mountlist_packed.ini die physikalischen Dateien aktiviert
data/compiled/library/compiled_quests.bin aus data/compiled/library.pak entpackt
physikalische compiled_quests.bin ungültig gemacht (zum Beispiel "V001" -> "X001" im Header)
Spiel gestartetErgebnis ist eine neue compiled_quests.bin (optional mit AAA-Quest).

Da die Zeitstempel der XQST in der BIN stehen, sollte ich das Archiv mit den Rohdaten der Quest mal aktualisieren (ist aber eher eine Frage der Wartbarkeit bzw. Vereinfachung der Suche nach Änderungen).

Baltram
30.07.2010, 12:54
Oh... ja, das ist sehr gut zu wissen :D. Geht das auch mit den Infos?

EDIT:
@unter mir
Danke. Werd das Erscheinen von deinem Tool leider verpassen (§hhmpf), weil ich ab morgen für zwei Wochen weg bin...

NicoDE
30.07.2010, 13:03
Oh... ja, das ist sehr gut zu wissen :D. Geht das auch mit den Infos?Dürfte mit allen DocArchive gehen (alle BIN in data/compiled/library/ außer compiled_achievements.bin).

Ich werde mich am Wochenende mal an einem Tool versuchen, welches per Engine aus den BINs Rohdaten generiert.

Shak-otay
30.07.2010, 13:31
Waooooooooh, Nico, was für eine Eruption.:D:gratz

Da bleibt mir nur, HerrFenrisWolf aus dem G3-Forum zu zitieren:

Großer Meister! Blutend Lamm dir zu Füßen leg'...

Wo fang' ich jetz nur an? Bin so aufgeregt!...:D

PS: das ging hier so Schlag auf Schlag, dass ich garnicht nicht gemerkt habe, dass Du schon geantwortest hattest, während ich einen post editierte.


Die TestApp läuft (wie das Spiel) in <Risen>\bin\. Du musst also "scripts\\Script_Game.dll" verwenden. Danke! (Mannomann, manchmal steh' ich wirklich auf der Leitung...:scared:)

Öhm, die Ausgabe der MessageBoxes (AIState etc.) sprengt bei mir den Bildschirm. Man könnte ja den 2. Param GELPCChar aus g_MessageBox( GELPVoid, GELPCChar, GELPCChar, GEU32 ) für eine Ausgabe der Texte in ein File verwenden oder geht das eleganter? (Was bedeutet überhaupt GE_?)

NicoDE
30.07.2010, 14:30
Öhm, die Ausgabe der MessageBoxes (AIState etc.) sprengt bei mir den Bildschirm.Die Windows-MessageBox unterstützt [Strg+C]. Kannst dir den angezeigten Text also aus der Zwischenablage holen. War für mich am einfachsten :)

ps: GE steht wahrscheinlich für Genome Engine.

Shak-otay
30.07.2010, 14:49
Die Windows-MessageBox unterstützt [Strg+C]. Kannst dir den angezeigten Text also aus der Zwischenablage holen. War für mich am einfachsten :)Nope, alles false. Das geht bei mir eben nicht. Kein Markieren per ctrl-A möglich; nichts. Ich kann auch den Ok-Button nicht sehen. Mit "Enter" poppt jeweils die nächste Box auf, das ist alles.

Aber egal, mach' ich's erstmal über den Pointer. (Muss das bei Gelegenheit mal debuggen; evtl. hat mein System 'ne Macke; kam ja auch mit Baltrams xmac2obj-tool schon nicht klar.:dnuhr:)


ps: GE steht wahrscheinlich für Genome Engine.
Sprach ich nicht gerade von einer "Leitung"? Ist offenbar eine ziemlich dicke...§cry

NicoDE
30.07.2010, 15:09
Nope, alles false.Mach’s nicht so kompliziert :)
Solange das Fenster den Fokus hat (aktiv ist), solange geht [Strg+C].
Da gibt’s nichts zu markieren.

Shak-otay
30.07.2010, 18:13
Mach’s nicht so kompliziert :)
Solange das Fenster den Fokus hat (aktiv ist), solange geht [Strg+C].
Da gibt’s nichts zu markieren.Du hast mal wieder recht. (schäm...)
naja, es gab jedesmal bei ctrl-c diesen error-Piep und dann habe ich nicht weitergemacht.:scared:

So, nachdem ich mir noch einen mit der mountlist abgebrochen habe (Demo-Pfade sind etwas anders), jetzt die frohe Kunde:

ich kann dies hier für die infos bestätigen

Dürfte mit allen DocArchive gehen (alle BIN in data/compiled/library/

Allerdings musste ich die compiled_infos.bin in C:\Dokumente...\Anwendungsdaten\Risen Demo\data\compiled\library ablegen (liegt vllt. an der Demo version?).

Pfade für die Demo in der mountlist:


[Physical]
ini=data/ini
statistics=data/statistics
appdata=$(localappdata)/Risen Demo
snapshots=$(localappdata)/Risen/ScreenShots
save=$(savedgames)/RisenDemo/SaveGames
data/extern/videos


(Habe noch ein kleines Problem mit den savegames; kann zwar eins anlegen, aber keine laden.
Das angelegte überschreibt mir ohne Nachfrage ein vorhandenes. Also an alle Demo-Besitzer:
backuppt/zippt eure savegames, falls ihr auch basteln wollt.)

(Bei einer "deiner" xinfs (PANKRATZX2_01772.xinf aus Zip vom 8.12.2009) fehlt übrigens eine Kleinigkeit:


219333 gCInfoCommandRunAIScript

219346 AIScriptName
219348 bCString
EatMeat

219352 Self
219354 bCString
Sara

21935e Other
219360 bCString
""

21936a Param
21936c int
FF FF FF FF
)
Die restlichen 4539 infos in der neu erstellten compiled_infos.bin scheinen identisch mit denen in der original (Demo) compiled_infos.bin zu sein.

Das ist so dermaßen genial. Ich werd' mal diese Trade inventory-Geschichte auf das neue Verfahren ummodeln äh -moddeln.

Das ist ein großer Tag fürs Risen modding. Besten Dank, Sire!;)§wink

NicoDE
30.07.2010, 19:00
So, nachdem ich mir noch einen mit der mountlist abgebrochen habe (Demo-Pfade sind etwas anders), [...]Such zur Laufzeit im .rdata-Segment der Engine.dll nach "[Root]". Der Standardinhalt der INI ist als String vorhanden.

Shak-otay
30.07.2010, 22:45
Danke. Gutes Schlußwort für heute; ich melde mich ab- gute Nacht.§wink

PS: diesen Tag muß ich mir im Kalender markieren.:D