Wow, wundervoll. °-°
Die Verwendung ist recht ungewöhnlich (aber clever) und hab ein bisschen gebraucht, um das zu verstehen,
aber das Fenster umzuschalten läuft jetzt wie ne Eins. =D
Druckbare Version
Wow, wundervoll. °-°
Die Verwendung ist recht ungewöhnlich (aber clever) und hab ein bisschen gebraucht, um das zu verstehen,
aber das Fenster umzuschalten läuft jetzt wie ne Eins. =D
Ein Programm, das Bilder automatisch in 16x32 große Charsets schneidet?
oder
Ein Programm/Plugin/RM2009 Erweiterung, das/die den Upper Layer vom RM2K(3) erweitert?
So ein Programm hab ich mal vor ewigen Zeiten geschrieben. Mittlerweile ist davon alles verlorengegangen (Quellcode, das Programm selbst...), glücklicherweise habe ich noch einen Link auf das Programm gefunden (Vielen Dank an Cherry an dieser Stelle, der ein ReUp vorgenommen hat): CHA.EXE (es ist ein Wunder, dass das Programm noch unter Win8.1 64bit einwandfrei läuft, wie ich grade festgestellt habe^^).
Das Programm hat allerdings ein paar Eigenheiten, die... ähm, auf mangelnde Programmierkenntnisse meinerseits basieren^^:Von diesen Macken abgesehen, sollte das Programm - und ich bin selbst überrascht davon^^ - auch heute noch einwandfrei funktionieren.
- Kann nur BMP und PNG umwandeln. Umgewandelte Dateien sind immer ".BMP"-Dateien und haben ein "(new)" im Dateinamen stehen.
- Die Maße stimmen hinterher - allerdings wird alles, was hinter den Maßen aufgenommen wird, abgeschnitten.
- Bilder sind hinterher IMMER in 32bit-Farbtiefe abgespeichert. Mit einem anderen Programm (z.B. IrfanView) müssen die Farben wieder auf 256 herabgesetzt werden.
- Will man mehrere Dateien auf einmal umwandeln, geht das nur, wenn man mittels Drag&Drop die markierten Bilder zur CHA.EXE zieht.
Immerhin! Das ist doch schon mal eine tolle Sache! Danke!
@bugmenot: Ich hatte auf Seite 108 nach RowVar[2+] und A Switch gefragt. Diese Fixes tun, was sie sollen, zumindest wird das Menü verlassen. Was nicht funktioniert sind die QuickPatches dafür. Ich weiss nicht, welche Variablen und Switches dabei gesetzt werden.
Die Defaultwerte werden gesetzt.
Wenn ich den Quickpatch benutze, werden diese verstellt, die 1007 und 1008 zB werden nicht mehr gesetzt. Der neu eingestellte Wert wird aber nicht angewandt.
Die Art und Weise, wie der dynloader mittels Größenangabe % und # im RAM patcht is scheinbar anfällig gegen Updates / Sicherheitsupdates seitens Windows / OS.
Entweder die #Dezimalzahl im QuickPatch in eine little-endian hexZahl umwandeln:
HexConverter
Setz die Zahl in das rechte Feld neben dem "big-endian" und nimm die Zahlenfolge des linken Feldes neben dem "little-endian", füge die Zahl hinter das Komma eines QuickPatches ein:
Bsp. RowVar_ID=4A2834,D0070000 (statt #2000)
Bzw. im Windows Calculator Alt+3 drücken, etc.
Oder in irgendeinem Plugin onStartup(char *pluginName) mittels *reinterpret_cast<long *>(0xoffset) = Dezimalzahl; all die Werte setzen und die entsprechenden QuickPatches löschen (nur die Adresse und #Zahl/%Zahl vor einem #/%).
Oder ein Plugin schreiben, welches zuverlässiger patcht. Das reinterpret schien doch bisher noch keine Probleme mit Größenangaben verursacht zu haben (okay, 1 mal, wo ich den falschen Typ angegeben habe... aber meh.)
Hey, danke dir! Klappt nun super!
Hey bugmenot! Noch ne Anfrage:
Du hast in dem Visu Menu Patch für die Browser-Menüs zB Fähigkeiten, Items, Ausrüstung die Anzahl der Spalten veränderbar gemacht. Dies wäre auch im Kampf und im Shop eine tolle Sache, da die max. angezeigte Länge der Item/Skillnamen ab und an gerne länger sein dürfte.
Es gibt schon einige nicht so umfangreiche Fixes dafür, evtl. hilft das ja dabei die Stellen im Code schneller zu finden.
Nachtrag zu Visu Menu:
Bei den Quickpatches zu, Equip Info Fenster gibt es bisher keine Möglichkeit die Position des Textes in der Box zu verändern.
Bei den Einträgen zum Faceset im Hauptmenü fehlt in der 2k3 Readme die Zeile zum delta Y, diese kann man sich aus der 2k Readme und den Adressabständen schätzen.
M:P:Face(deltaY)=49E409,%50
Bei den Einträgen zum Cursor im Hauptmenü gibt es keinen Wert für die Y-Konstante, lediglich delta y.
(2k)
0x9510E = [Item](Entries per row, battle)
0x6FDCB = [Item](Entries per row, shop)
0x94F8F = [Info:Text](y)
0x94F94 = [Info:Text](x)
(2k3)
Item(Entries per row, battle)=4A0DD6,%2
Item(Entries per row, shop)=493063,%2
Skill(Entries per row, battle)=4A0E92,%2
M:P:Face(dy)=49E409,%50
Info:Text(y)=4C8713,#8
Info:Text(x)=4C8718,#8
Das Info:Text(y/x) wirkt sich dann aber auf Item/Skillbeschreibungen (und im Speicher/Lademenü) in allen Untermenüs aus.Zitat:
Bei den Quickpatches zu, Equip Info Fenster gibt es bisher keine Möglichkeit die Position des Textes in der Box zu verändern.
Man kann das per Plugin aber jederzeit während der Laufzeit (je nach aktivem Untermenü) patchen:
z.B.
int xStringOffset = 64;
*reinterpret_cast<long *>(0x4C8718 ) = xStringOffset;
Das aktuelle Untermenü erhält man über:
unsigned char MenuSubScene = ( *reinterpret_cast<char ***> (0x4CDB14) )[0][12];
Ich wähle mal die einfache(re) Methode:Zitat:
Bei den Einträgen zum Cursor im Hauptmenü gibt es keinen Wert für die Y-Konstante, lediglich delta y.
MainPartyCursor(y)=49E2E3,E8CC93FAFF,4476B4,c7473400000000A174DB4C00C3,4476B7,#8
Länge von Item/Skillnamen?
Vielen lieben dank! ( Mal wieder! ) Du bist awesome.
Item und Skillnamen sind auf X Zeichen begrenzt. Wenn man den Maker hexxt und das Limit entfernt, werden trotzdem nur X Zeichen angezeigt, weil nicht mehr Platz da ist.Zitat:
Länge von Item/Skillnamen?
Es könnte nützlich sein, mehr davon anzuzeigen. Mir würde das gefallen. Mal schauen!
Hey! Die Info:Text Sachen funktionieren super. Könntest du noch rausfinden, welche Adresse die Höhe der Infozeile im Speichern/Laden Menü beeinflusst?
Das kleine Fenster am oberen Rand?
Da gibt es leider ein paar Probleme. Die Zeichenreihenfolge ist: FileWindows -> InfoWindow -> Borders -> Cursor.
Für die x-Koordinaten gibt es nicht wirklich Platz.Zitat:
Zitat von DynRPG.ini
Es wäre wohl geeignet onDrawScreen() nochmal mit der system Hintergrundfarbe drüberzupinseln
Und noch irgendwelches Zeug:
download ExpDetectBug-in
Bombe, wird schon klappen. ^^
Und wieder was:
Die Info-Text-Zeilen wirken sich neben dem File-Menü noch auf die Infozeilen im Kampfsystem aus.Dort werden die Beschreibungstexte von Skills und Items in diesen Boxen angezeigt. Hättest du noch eine Adresse um diese beiden auch in der Höhe zu verändern?
Itemmenü / Skillmenü innerhalb und außerhalb vom Kampf sind (bis auf ein paar Abmessungen / zusätzliche Anzeigen) das Gleiche. Das heißt die oben genannten Adressen gelten auch immer für Kampf und Esc-Menü. Du wirst also (falls sich die Platzierung des Textes im Kampf von der Platzierung im eigentlichen Menü unterscheiden soll) während der Laufzeit im RAM patchen müssen:
Je nachdem ob scene == RPG::SCENE_BATTLE oder nicht. Bzw. zu Beginn und Ende des Kampf-dings neu setzen.Code:int infoTextY = [...]; //Item / Skill description text, position relative to window
int infoTextX = [...];
( *reinterpret_cast<long *> (0x4C8713)) = infoTextY;
( *reinterpret_cast<long *> (0x4C8718)) = infoTextX;
*Shop nicht vergessen.
reinterpret_cast patcht nur im RAM. Das heißt wenn die Applikation geschlossen und neu gestartet wird, dann wird Alles wieder auf default zurückgesetzt.
Patch-Hierarchie:
0. direkt auf RPG_RT angewendete Patches
1. aus DynPatches geladene .ips patches
2. aus DynRPG.ini geladene QuickPatches
3. reinterpret_cast in .dll patches / plugins (session-spezifisch: man muss darauf achten, ob die Änderung noch da sein muss)
Damit komme ich klar. Danke dir :-D
ich habe grad versucht mit cherrys debug addon die events meines spiels zu tracen. leider hat sich dann herausgestellt, dass das mit dyn rpg nicht klar kommt und cherry sagt auch, dass das nicht dafür gedacht ist.
wer nicht weiß, was das ist: damit kann man in einem textfile alle eventbefehle auslesen lassen, die der maker angewendet hat. das ist unersetzlich bei der suche von fehlern, weil man direkt die stelle sieht(wer kein dyn rpg benutzt, dem kann ichs auf anfrage auch zuschicken).
naja, das hier ist der "Programmwunsch und -erstellungsthread"... und ich.... wünsche mir ein tracing tool :) möglicherweise ja als dyn plugin? davon würden sicher viele was haben.
Es gibt in DynRPG die Möglichkeit mitzukriegen, welche Events ausgeführt werden. Theoretisch ginge sowas also. Kannst du mir mal eben den Inhalt einer solchen Textdatei posten, ich würd gern wissen, was du da erwartest.
Btw. was für Fehler suchst du damit? Ich habe schon mehrmals darüber nachgedacht, ein Log&Trace Plugin zu schreiben, daran alle Eventbefehle zu loggen habe ich aber nie gedacht, weil ich nicht sehe, bei welchen Problemen das helfen würde.
es gibt diese möglichkeit ...? wie? muss an mir vorbei gezogen sein. ich brauche das, was zuletzt ausgeführt wurde, also den befehl. im debugger wird das ja mit event und zeile angegeben, manchmal ist die zeile nicht immer gut bestimmbar, aber das wäre auch schon sehr hilfreich. du hast aber recht, dass eigentlich nicht alle befehle nötig sind.
konkret mein problem:
ich befüchte fast, dass mir so ein report da auch nicht helfen kann. es ist der eigentlich bekannte fehler "unsopported png image". ich weiß natürlich was das bedeutet. es gibt nur 2 seltsame dinge, 1. ist es meiner auffassung nach plötzlich aufgetreten und 2. kommt der fehler nur 1 mal, solange ich das testfenster offen hab. wenn ich dann also nochmal starte, ohne es zu schließen, kommt er nicht mehr. das macht keinen sinn.
vielleicht kommt das ja jemandem bekannt vor. es kann natürlich trotzdem sein, dass irgendwas an meinem picture-management vermurkst ist. hatte schon befürchtet, dass bei zusammenspiel von dynrpg, dynpec und rpgss irgendwas schieflaufen würde ...
Ist der Fehler reproduzierbar?
absolut.
nur black screen. kommt beim betreten von 2 unterschiedlichen maps im menü, egal ob ich mich auf die map teleportiere oder direkt dort starte. wenn ich den fehler auf der einen map hatte, kommt er dann auch nicht auf der anderen, wenn ich nochmal starte. scheint also zusammen zu hängen.
d.h. du startest das Spiel, beginnst auf deiner Menümap und dann kommt der Fehler ein mal, du klickst ihn weg und er kommt nie wieder. Und das passiert jedes einzelne Mal, wenn du das Spiel startest.
Auf der Map hast du also sicherlich den einen oder anderen ParallelProzess/Autostart oder? Da das Bild schwarz bleibt nehme ich an, es ist ein PP.
Verpass den PPs mal eine MessageBox als ersten Befehl, dann siehst du ja, wann es knallt.
ich hab das jetzt doch noch mit dem debugger auslesen können: der sagt "battle or unknown event, line 0" oder sowas. :D battle kann natürlich nicht sein, weil ich nix mit dem normalen ks mache. und unknown ... naja, vielleicht kann galileo mytery darüber aufklären. aber es wäre auch nicht logisch gewesen, wenn es ein mir bekanntes event gewesen wäre. klar, man vergisst immer mal was, aber das sind 2 ganz unterschiedliche maps, zum einen das gegenständemnü und zum anderen das entwicklungsmenü eines(nur eines) charakters. da sind nicht viele events und ich hab auchj schon alle common events gecheckt, die vielleicht prinzipiell noch mitlaufen. ...ich hab eher die befürchtung, ich hab es tot gepatched, geplugged oder so ...der fehler kommt ja im normalfall auch beim importieren und nicht beim testen. ....insofern... ratlosigkeit.
(über die info wie man mit dynrpg events ausliest wäre ich übrigens immernoch dankbar ^^)
Verschwindet das, wenn du Plugins ( RGSS und andere Bildersachen ) entfernst?
Ich wollte sagen, dass es die Möglichkeit gibt, ein Plugin zu schreiben, dass genau das tut. Vielleicht tue ich das ja noch mal.Zitat:
(über die info wie man man dynrpg events ausliest wäre ich übrigens immernoch dankbar ^^)
ich hab grad alles gelöscht, was mit dynrpg oder rpgss zu tun hat. ich hab außerdem noch die pictureordner gelöscht und es kommt immernoch. aber danke, dass du versuchst es mit zu ergründen :)Zitat:
Verschwindet das, wenn du Plugins ( RGSS und andere Bildersachen ) entfernst?
edit: ich habs gefunden .... arg .... manchmal ist man doch echt ............ glaub ich zumindest, moment.
edit: Okay, erklärung: meiner erinnerung zufolge, hatte ich mal eine schwarze event-grafik angelegt. ich gebe den events auf den maps verschiedene transparente grafiken, um sie unterscheiden zu können. schwarz bedeutet, dass es nur testwerte beinhaltet. gestern hab ich dann wohl einigen map events auf erwähnten maps diese grafiken gegeben. jetzt hab ich festgestellt, dass ich offenbar diese schwarze grafik nicht importiert habe, sondern einfach in den order geschoben, mit RGB farbraum. das löste den fehler aus. dass er nicht noch ein 2. mal kommt, liegt vermutlich an dyn rpg, weil es den dann unterdrückt? keine ahnung.
jaja, peinlich, peinlich, und ich dachte schon das ganze spiel ist jetzt futsch. aber galileo kann trotzdem abkacken. rpg makerer die eigene fehler produzieren, sind viel mysteriöser.
das wär natürlich super. let me know.Zitat:
Vielleicht tue ich das ja noch mal.
Ich hatte heute so gegen 23:45 spontan Bock auf Programmieren. Das Traceding ist fast fertig.
bin gespannt :)
Hey IndependentArt!
das hier ist Version 0.1 des CortiTrace-Plugins. LINK:CortiTrace.dll
Was es tut: Stumpf alles in eine Textdatein schreiben, was passiert.
Was es nicht bietet: Konfiguration, aktivieren und deaktivieren.
Beispiel:
Sowas hier: IntPar[7] 1, 121, 123, 1, 0, 3, 0, bedeutet, dass der Befehl 7 Zahlenparameter besitzt mit den Werten 1, 121, etc.Code:2015.02.18-16:11:46 [Event] Evcmd[SHOW_MESSAGE] EventId[1] PageId[1] lineId[3] Str.Par IN \v[61](9) SQRT -> OUT \v[63](3)
2015.02.18-16:11:47 [Event] Evcmd[END_OF_EVENT] EventId[1] PageId[1] lineId[4]
2015.02.18-16:11:47 [Event] Evcmd[CHANGE_VARIABLE] EventId[0] PageId[0] lineId[1] IntPar[7] 1, 121, 123, 1, 0, 3, 0,
2015.02.18-16:11:47 [Event] Evcmd[END_OF_EVENT] EventId[0] PageId[0] lineId[4]
In diesen Werten ist kodiert, mit welchen Einstellungen der Befehl versehen ist, z.B. hier Variablen 121 bis 123 die beschrieben werden.
Das hier schön auszuformulieren oder zu einer Zeile wie im Maker zu machen würde wohl noch etwas Zeit in Anspruch nehmen.
Schau was wie du damit klar kommst.
Nur loggen in einem Plugin war gestern~ jetzt verschicke ich Funktionszeiger über die Makervariablen und kann das Tracing-Plugin aus anderen Plugins heraus benutzen.
Plugins, die sich gegenseitig pluggen. Mwahahaha! *beiläufig ein Kind opfert*
ich verstehe GAR NICHTS! ^^ nur das mit dem kind.Zitat:
Nur loggen in einem Plugin war gestern~ jetzt verschicke ich Funktionszeiger über die Makervariablen und kann das Tracing-Plugin aus anderen Plugins heraus benutzen.
Plugins, die sich gegenseitig pluggen
ich komme erst morgen dazu, mir das anzuschauen. aber danke schonmal.
ich komm auf die badewiese und sag ihr seid alles spasten!
wo wird die datei gespeichert...? sie liegt nicht im plugin und nicht im projektordner.
Da müsste ein neuer Ordner erstellt werden. Beginnt mit Dyn*
ja, läuft.
wird sich aber erst zeigen, ob es tatsächlich hilfreich oder doch ein wenig zu kryptisch ist :)
Ich werde erstmal keine weitere Arbeit in das Tracing stecken, da ich herkömmliches Debugging über MessageBox und F9 für effektiver halte.
das kann auch hilfreich sein. wenn man aber zumindest weiß, welches event und welche zeile, dann ist das schon ein riesen vorteil :)
Steht da. EventId und LineID.
ich weiß, ich wollte auch gar nichts anderes behaupten :D
Dann frag ich hier doch nochmal an.
Und zwar wollte ich wissen, ob es theoretisch möglich wäre die Statuswerte der Gegner (in erster Linie den ATK Wert) über 999 zu bringen (ohne so später wie jedem Gegner vor Kampf Beginn einen zustand geben der die Angriffskraft verdoppelt). Corti meinte dann, bugmenot hat mal einen Quickpatch veröffentlicht der die Schadensformel von 4x ATK - 2x DEF in 2x ATK - DEF umwandelt. Hab dazu jetzt das hier im Thread gefunden:
http://www.multimediaxis.de/threads/...=1#post3177299
Allerdings funktioniert das nicht (und ja, ich hab auf der Seite davor geschaut). So wie ich das verstehe bezieht sich der Quickpatch dort nur auf den Schaden von Skills, nicht jedoch von normalen Angriffen. Wie genau sähe das denn dann aus? Oder ist das nur nen Ausschnitt vom Code und mehr fehlt irgendwas anderes? Jedenfalls war der Schaden von normalen Angriffen mit oder ohne Patch gleich. Und einfach mal auf gut Glück bei PlayerDmgRevamp ebenfalls #5, #10 etc einzufügen brachte da auch nichts.
Also ja, was mach ich falsch? ^^"
Hast du alle drei Zeilen so eingefügt? Bei mir klappte das genau so und Dark Sword benutzt das auch und es funktioniert.
Also ich hab in der .ini ganz oben
eingefügt. Als Testwerte hatte ich 50 ATK und 30 DEF, sowohl bei mir als auch beim Gegner. Hat im Endeffekt um die 20 Schaden gemacht. Ohne Quickpatch ebenfalls. Und Testweise hab ich dann einfach mal die #5, #10, #10, #20 vom SkillDmgRevamp auch noch bei Player und Enemy einegfügt, alsoCode:[QuickPatches]
PlayerDmgRevamp=4B9847,D1E0,4B985F,909090
EnemyDmgRevamp=4C0B3E,D1E0,4C0B54,909090
SkillDmgRevamp=4C0DE4,#5,4C0DF8,#10,4C0E1A,#10,4C0E2F,#20
Hat aber auch nichts gebracht. Ich hab bisher keine Quickpatches, vielleicht steht das Ding auch an einer falschen Stelle in der .ini (aber die Position dürfte doch eigentlich egal sein, oder?)Code:[QuickPatches]
PlayerDmgRevamp=4B9847,#5,D1E0,#10,4B985F,#10,909090,#20
EnemyDmgRevamp=4C0B3E.#5,D1E0,#10,4C0B54,#10,909090,#20
SkillDmgRevamp=4C0DE4,#5,4C0DF8,#10,4C0E1A,#10,4C0E2F,#20
Hast du DynRPG in der Version, die QuickPatches unterstützt?
Hast du im Ordner DynPatches zufällig RPS[+].ips oder PDFix.ips rumflattern? (ansonsten gilt das PlayerDmgRevamp= und EnemyDmgRevamp= von der oberen CODE-Box)
In den readmes steht, dass die Adressen dafür anders sind:
(für Gegner und Helden; normaler [Attack]-Befehl)Zitat:
Zitat von DynRPG.ini
Ähm... nein. Eine einzige zweistellige Zahl wird sich nicht auf magische Weise von selbst ausmisten und sich auch nicht zu mehreren Prozessoranweisungen kompilieren.Zitat:
PlayerDmgRevamp=4B9847,#5,D1E0,#10,4B985F,#10,909090,#20
Falls der DynRPG Loader beim Start nicht "Error in quick patch [...]" ausgibt, dann solltest du sicherstellen, dass du die 0.20 Version von DynRPG hast. Bitte eine neue RPG_RT.exe nehmen, auf der bisher noch kein DynRPG draufgepatcht wurde.
Edit:
Ansonsten kann ich das mit den Stats oberhalb von 999 nochmal zusammensuchen.
Erwarte aber keine Wunder mit Schadenszahlen, solange kein Callback onDamageCalculation existiert.
Man sollte mittels Plugin nachverfolgen können, welche Items im Shop gekauft / verkauft werden:
unsigned char ShopSubScene = ( *reinterpret_cast<char ***> (0x4CDE4C) )[0][12];
Beim Array mit den verkauften Items bin ich mir nicht ganz sicher.Code:#include <DynRPG/DynRPG.h>
int getItem() {
return ( *reinterpret_cast<char ****> (0x4CDE4C) )[0][9][25];
}
int getItemAmount() {
return ( *reinterpret_cast<char ****> (0x4CDE4C) )[0][9][26];
}
/*void onFrame() (?)
oder sonst irgendwo, wo es besser angebracht wäre*/
if (scene == RPG::SCENE_SHOP) {
// [...]
if (ShopSubScene == 3) {
// Items werden/wurden in das Inventar gepackt
int A = getItem();
int B = getItemAmount();
// [...] "Du hast B mal Item A gekauft"
} else if (ShopSubScene == 6) {
// Items werden/wurden aus dem Inventar entfernt
int A = getItem();
int B = getItemAmount();
// [...] "Du hast B mal Item A verkauft"
}
}
Ich kann den Zugriff auf den Pointer auf das Array momentan nur in (mehr oder weniger) numerischer Form angeben:
int ShopListArraySize = ( *reinterpret_cast<int ****> (0x4CDE4C) )[0][7][2];
int ShopListArrayPtr = ( *reinterpret_cast<int ****> (0x4CDE4C) )[0][7][1]; // Inhalte vom Array sind jeweils 4 Byte / long int groß
Wobei im Array dann [0] = Item#1 Item_ID, [1] = Item#2 Item_ID, etc.
Entweder per C++ das Array ausweiten (wäre empfehlenswert) oder versuchen die RPG_RT-interne Funktion dafür aufzurufen:
Könnte sein, dass es dort irgendwo knallt, weil der Pointer normalerweise mittels load effective address in das Register geladen wird...Code:int eax = ShopListArrayPtr; // bin mir hierbei nicht sicher, ob das so angenommen wird; zu ätzend das selbst nachzuprüfen
int edx = (newShopListArraySize)*4; (ArraySize in Bytes)
asm volatile("call *%%esi":
: "S" (0x4027AC), "a" (eax), "d" (edx)
: "cc", "memory");
Okay, der Quickpatch geht jetzt, hatte noch ne alte Version drin.
Haben die Gegner im 2k3 eigentlich sowas wie Aggro Verhalten? Falls ja, könnte man das durch Statusveränderungen auf den Charaktere beeinflussen? Also das ein Charakter Status X hat, wodurch er nun zu 40% angegriffen wird. Oder Status Y, dass er zu 70% angegriffen wird. Oder gibts dazu schon ein Dyn Plugin?
Standard: Reiner Zufall. Ich meine im amerikanischen Raum mal ein Plugin gesehen zu haben, dass laut Beschreibung wohl einen mit einer bestimmten Condition belegten Helden zum bevorzugten Angriffsziel macht.
Das umfangreichste mir bekannte System dieser Art ist mein eigenes aus meinem Kampfsystemspielplatzprojekt, eine Art "World of Warcraft-Aggro Light" für Rundenkampfsysteme.
Ich habe für Dark Sword ein Plugin in der Planungsphase, dass so etwas ähnliches bietet und als Teil meiner PluginSammlung veröffentlich werden soll, aber das ist Zukunftsmusik. Das überschneidet sich mit dem Thema KI und dort sehe ich noch Raum für eine Menge Spielereien, denn mit DynRPG kann man dort gut wirken.
Ich habe ein Problem mit dem ItemEquipSkillmenüfix von elvissteinjr
http://www.multimediaxis.de/threads/...=1#post3075375
https://dl.dropboxusercontent.com/u/...pSkillMenu.ips
Der Patch benutzt die Variablen 3386 und 3387. Der Bereich ist bei mir belegt mit einer umfangreichen Datenstruktur.
Normalerweise kann man einfach ändern durch verhexen der ips Datei.
3386 = 0x0D3A, in der IP findet man einmal 3A0D, übliche Schreibweise in IPS-Daten.
Wenn ich das jetzt ändere:
-> in Dez.65 , also 0x001A ( in IPS: 1A00) -> gibts einen Crash bei Verwendung
-> in Dez.3366 , also 0x0D26 ( in IPS 260D ) -> wird es ignoriert und weiterhin die Defaultadresse benutzt.
Ich würde das gerne verstehen.
Die Variable ID steht zweimal im Code. Einmal direkt, wie bereits richtig erkannt, und einmal als Adressenoffset zum Variablen Array.
Sprich: Ändere Offset 0xd4 in der ips Datei zu (VarID - 1) * 4, also beispielsweise dez. 256 bzw. hex 0001.
Ungetestet, sollte aber so hinhauen.
Ich versuchs mal. Danke dir :-)
Edit: hat Funktioniert mit 3366 als neue Variable. Wenn ich versuche die 65 zu benutzen gibt es weiterhin Probleme. Kurios.
Ich möchte in meiner Textbox (RM2k3) im Text sehen wie weit ich schreiben kann bevor es "weggeschnitten" wird. Ich weiss nur, dass es da mal ein Programm zum Bearbeiten gab... worin ich dann Änderungen vornehmen kann... Forensuche ist ohne Ergebnis geblieben... wer kann mir helfen?
Hab das erst letztes Mal irgendwo gepostet, da bin ich mal so frei, es ist immer noch bei meinen Anhängen dabei: Anhang 22076
Wenn du eine individuelle TB hast, kannste dir halt einfach merken, wie viel Zeichen in die Zeile passen, die wird in dem Programm nämlich angezeigt :)
Ich weiß garnicht wem du für dieses tolle Programm danken musst ^^; müsste fast mal nach dem Author sehen...
In diesem Thread gibt es eine Anleitung, wie das Problem mit einem Resource Editor behoben werden kann. Meinst du das?
Gibts theoretisch eine Möglichkeit die EXP Kurven zu beeinflussen? Die vom 2k3 ist nämlich ziemlich kacke.
Mal etwas genauer: Im 2k3 kann man nur einstellen, dass jedes Level X EXP mehr braucht. Z.B. 1000 -> 1500 -> 2000 -> 2500 -> ... also immer 500 mehr pro level. Oder 800 mehr. Oder 1000 mehr. Aber ich hätte gerne etwas, dass es kein fester sondern ein steigender Wert wäre. Also z.B. 1000 -> 1500 -> 2100 -> 2800 -> 3600 -> ... also 500, 600, 700, 800, etc. Oder eben nochmal anders, z.B. ne art exponentielle Kurve oder etwas ähnliches. Ginge sowas mit Dyn?
Primary ist ein Fixwert für den Ext-Wert Pro Level, der immer da ist, als Konstante.
Secondary wird mit dem Level multipliziert.
Wenn du also einen Anstieg a la 500, 600, 700 pro Level willst, dann P=400,S=100,T=0.
Hab mich vielleicht etwas schlecht ausgedrückt. Ich hab zur Zeit P = 250, S = 500, T = 250. Da brauch ich dann 1000, 1500, 2500, 4000, 6000... also immer 500 mehr als für das vorherige Level benötigt wurden. Es steigt halt so immer fest um diese 500 Punkte an. Aber es soll eben nicht um einen festen Wert ansteigen sondern mit jedem Level um mehr ansteigen. 500, 600, 700, 800... statt 500, 500, 500, 500. Und das geht mit dem 2k3 nicht.
http://i.imgur.com/A9EcXPb.png
Statt dem was auf dem Bild steht sollten die Werte für die Level eher sein:
1: 1000
2: 1500 (+500)
3: 2100 (+600)
4: 2800 (+700)
5: 3600 (+800)
6: 4500 (+900)
7: 5500 (+1000)
etc.
Edit:
Hier nochmal das gleiche aus dem 2k. Zwar sind die Werte da maximiert, aber da sieht man, dass es eben nicht mit jedem Level um einen fixen Wert ansteigt, sondern mit jedem level immer mehr wird:
http://i.imgur.com/yYkV7vh.png
Wäre es wie beim 2k3 würde es nach Level 2 so aussehen:
1: 50
2: 100 (+50)
3: 150 (+50)
4: 200 (+50)
5: 250 (+50)
6: 300 (+50)
7: 350 (+50)
Achso~
Es gibt nur zwei/vier Stellen in der 2k3DirectItemEquipSkillMenu.ips die entsprechend geändert werden sollten:
Var_3386 (Item 0; Equip):
0xC9 = Var_ID; safety check, ob VarArray nicht bis zu dieser Var_ID initialisiert ist
0xD4 = (Var_ID -1)*4
Var_3387 (Skill):
0x1B = Var_ID; safety check
0x26 = (Var_ID -1)*4
Dass es mit 1000 anfängt irritiert irgendwie.
Ansonsten wäre die simpelste Lösung einfach nur den Editor anzupassen:
download DBX.ini
P = 0
S = 500
T = 0
Und wenn es nicht simpel sein soll, dann gibt es immernoch den Overkill:
Wenn richtig viel Einfluss da sein soll ("mehr exponentieller", eigene EXP-Listen, Ändern der EXP-Kurven während des Spielens, etc.), dann wird das (nur) über ein entsprechendes Callback gehen können. Du kannst gerne irgendwo beantragen, dass dies auf irgendeine Liste gesetzt wird, um dann in einer späteren Version aufzutauchen.
Du kannst auch einen Blick da rein werfen:
download ExpBug-in
Frag jemanden, der mit C++ versiert ist, falls die EXP-Kurven über ein paar Textzeilen in der DynRPG.ini konfiguriert werden sollen oder ganze EXP-Sheets für jeden Helden eingelesen / bearbeitet werden sollen. Jede x-beliebige Person sollte mit z.B. Code :: Blocks und etwas Mathematik daran rumschrauben können (oder Werte aus Variablen, zB. für's Skalieren von Schwierigkeitsgraden, in die Rechnung hineinnehmen können.)
Sorry, ich kann gerade nicht mit dem Auslesen von Text / Zahlen aus irgendwelchen Textdateien oder verschlüsselten Dateien (damit nicht jeder Spieler daran rumpfuschen kann) dienen. Dafür reicht bei mir weder das Verständnis für C++ noch allgemein das Verständnis für's Programmieren.
Für ein Pseudo-Callback reicht es aber aus irgendeinem Grund.
Ich habe ein Problem. Die Wettereffekte sind unter den Pictures. Über den Pictures will ich sie aber auch nicht haben.
Ich schätze mal an der Stelle nach Events/Chipset und vor den Pictures wird eine Funktion aufgerufen um die Wettereffekte zu zeichnen, sofern diese aktiviert sind. Ich würde diese Funktion gerne im Plugin zu einem von mir gewünschten Zeitpunkt aufrufen.
Makeraufrufe werden in DynRPG so gemacht.
asm [volatile] ( AssemblerTemplateCode:void Map::updateEvents()
{
asm volatile("call *%%esi" : "=a" (_eax) : "S" (0x4AB8B4), "a" (events.ptr) : "edx", "ecx", "cc", "memory");
}
: OutputOperands
[ : InputOperands
[ : Clobbers ] ])
Der Call kriegt "esi" mit und bezieht sich damit auf Register "S", welches in den Inputs mit einer Adresse beschrieben wird.
Als ersten Schritt müsste man also wissen, welche Adresse die Funktion zum Zeichnen der Wettereffekte hat und welche Parameter dafür notwendig sind.
Was die Exp Kurven betrifft, es ist nichts zwingend notwendiges (man kann ja die Exp drumherum balancen), aber wenn jemand so eine Kurve wie beim 2k hinbekommen würde (oder etwas ähnliches - zumindest nicht son Murks wie beim 2k3) würde ich das sofort benutzen. Aber schonmal dan ke soweit.
Ich hoffe doch, das ich jetzt nicht zur falschen Zeit frage...
Und auch nicht im falschen Thread ...
Aber, gibt es ein Dyn-plugin, womit ein script ein Screenshot machen kann, dass man dann direkt dann einbinden könnte?
Z.b. für ein Selbstgebasteltes Savesys? Ich hab ja gehört, das es für den 2k ein programm gibt, aber das man dafür
Inelukis Tastenpatch braucht. Ich nutze ja vorzugsweise den 2k3. ^^
Zu welchem Zeitpunkt und wie oft werden die onDrawXYZ() callbacks durchgeführt? Die Funktion zum Drüberpinseln der Wettereffekte (oberhalb von X und unterhalb von Y, zum Zeitpunkt des Aufrufes) muss in jedem Frame passieren.
Ich wollte eigentlich sowieso schauen, inwieweit man die Zeichenreihenfolgen zur Laufzeit ändern kann plus/minus entsprechende callback-Strukturen (weil jemand mal danach gefragt hatte).
Erstmal das eigentliche Zeichnen der Wettereffekte (unterhalb der Pictures, BAni, MessageBox) ausknipsen:
Das wirst du unter Umständen wieder entfernen müssen, wenn sich an dem Ort neuer Code befinden wird.Code:( *reinterpret_cast<char *> (0x4A3ECB)) = 0xEB;
( *reinterpret_cast<char *> (0x4A3ECC)) = 0x0A;
Update / Zeichnen von Wettereffekten je Frame erfolgt durch:
Code:int eax = ( *reinterpret_cast<int **> (0x4CDDA8) )[0]; //ScreenEffect pointer
asm volatile("call *%%esi"
:
: "S" (0x4C33D0), "a" (eax)
: "cc", "memory");
//draws WeatherEffects on current (depends on when this is called) map drawing layer
download ExpBug-in
Entsprechende Koeffizienten sind die Selben wie beim 2k (heißt die Obergrenze für Erfahrungspunkte wird schnell mal bei Level 50 erreicht), man kann diese auch anpassen (oder einfach niedrigere Zahlen für EXP(Prim) und EXP(Sec) in der Database nutzen). Es gibt nur kleine Abweichungen von den 2k-Werten, wenn man die selben EXP(Prim) und EXP(Sec) nutzt (es musste über ganze Zahlen geregelt werden statt mit Kommazahlen).
Edit:
Mit einer Kombination hiervon und [irgendwas], was die Werte [irgendwo] auflistet und/oder einen Graph zeichnet, damit man die Kurvenverläufe richtig einschätzen kann. Weil die Database wird eben nicht die neuen resultierenden Werte anzeigen.
P.S.:
Kann es sein, dass GCC Probleme mit float-Multiplikation hat, wenn von einer beliebigen Anzahl an Schleifendurchläufen (oder Größe der floats?) ausgegangen wird und der Versuch da etwas möglichst effizientes zu Kompilieren in die Hose geht?
Code:do
{ fNewExp = fNewExp + fTert + fPrim;
fPrim = fPrim * fSec; //hier knallt es ständig wegen einer "invalid floating point operation"
fSec = (fSec - fCoeffE) * ((fLevel * fCoeffC) + fCoeffD) + fCoeffE;
i = i--;
} while (i != 0);
int newExp = (int)fNewExp;
Danke! Ich teste da mal etwas rum.
Edit: Bissel rumexperimentiert und diese Werte hier:
A = 500
B = 1500000
C = 1525
D = 800000
E = 1000000
...funktionieren ganz gut. Muss den Anfang etwas rebalancen was Exp betrifft, aber ansonsten gleichen sich meine und diese Kurve etwa bei Level 29/30 an (29 der neuen ist ziemlich genau 30 der alten - nur danach wirds natürlich sehr viel mehr). Also nochmal danke dafür. :A
@bugmenot: Funzt wunderbar! Danke:-)
Da Erfahrungspunkte gerade ein echt beliebtes Thema zu sein scheinen:
Wäre es vielleicht auch drin, den aktuellen NEXT-Wert, den man auch im Spielmenü sehen kann,
in Variablen auszuwerfen?
Bei was ich mich aber ganz besonders frage, warum man es nicht auch in Vars ausgeben kann,
sind die Held-IDs auf den 4 Partyslots.
Beide Dinge würden gelegentlich so manchen unangenehmen Umweg abkürzen. Ersteres wäre
etwas dringender als zweiteres.
Was mir auch noch helfen könnte, wäre der Aufruf von Load über die bekannte BAEP-Methode
mit ExitEventProcessing bei V3350=1, ohne den Titleskip zwingend mitreinpatchen zu müssen.
2k v1.07?
download VarExtender[+]
...ersetzt die alte VarExtender.ips (es kann ruhig mit der neuen drübergepatcht werden).
Wuuunderbar, funktioniert bestens. =D
Könnte man theoretisch die Items im Inventar auf etwas anderes als 99 beschränken, z.B. auf 10 oder 20? Das ginge ja auch "ohne Probleme" (also über nen Common Event) jetzt, aber damit kann man den Spieler nicht davon abhalten einfach mehr als diese fiktive Obergrenze im Shop zu kaufen.
Edit:
Okay, nach mehrfachem rumprobieren mit MagicMaker hab ich jetzt folgenden Code und der scheint auch zu funktioniere (spontan konnte ich jedenfalls keine Fehler finden):
Daher ein Danke an ihn und... ja, hat sich soweit wohl erledigt. xDCode:ChangeItemMaximum=494262,#10,49427D,#10,490234,#10,4A6251,#10,4A62E1,#10,492F99,0A,494783,0A
Die ersten zwei/drei Zahlen sind generell für das Inventar / Hinzufügen für Items. Der Rest ist für den Shop.Zitat:
Zitat von DynRPG.ini
20 (decimal) = 14 (hexadecimal)
Es wird wohl Leute geben, die mehr als 99 Items (warum auch immer) haben wollen:
Beim Standard-Shop wird es Probleme mit einem ItemCap über 127 geben (hex = 7F).
Das Maximum kann nur 255 sein (hex = FF), das hat mehr damit zu tun, wie die Daten des Inventars verteilt sind. Da ist nur Platz für 8bit Zahlen.
Die Itemanzahl im Itemmenü, Equipmenü, Shop muss dann auch nach links hin eingerückt werden:
Zitat:
Zitat von DynRPG.ini
Edit:
Argh, Ninja'd.
Und Irgendwas in irgendwas übersehen. (490234 ist für den F8 BattleTest)
Bei MMs Variante ist ja noch diese Adresse mit drin, wieso fehlt die bei dir?
Edit: Okay, soviel dazu. xDZitat:
490234,#10
Und hier mal gleich für diverse Versionen die Hex-Adressen für das Item-Maximum zum manuellen Bearbeiten:
Manche Beschränkungen des Makers scheinen ja sinnvoll, zumindest für die damalige Zeit. Andere sind weniger nachvollziehbar.
Ich denke dabei grade an die Größenbeschränkungen für Chipsets.
Vermutlich wurde darüber schon vielfach nachgedacht, aber gab es schon irgendwelche Bestrebungen etwas in die Richtung der Aufhebung der Begrenzungen zu basteln? Vielleicht sogar mit UiD Mod o.ä.?
Das würde auch die "größeren Charsets" nicht mehr so notwendig machen. aus meiner Sicht zumindest, denn das meiste was man damit macht, ist doch eher Mapping. Ein überdimensionales Charset, was herumläuft macht ja auch dahingehend weniger Sinn, weil es sich mit anderen ständig überschneidet, wenn man die Größe der Tiles überschreitet. Aber das geht nur mir so.
Richtig! Wir sind hier, um einer antiquierten Engine mit endlosen chirurgischen Eingriffen zu Aktualität zu verhelfen ;)
So, ich hätte da noch etwas. Und zwar gehts um die Verkaufspreise von Items. Standardmäßig ist der Wert ja 50% vom Einkaufspreis. Ich würde das gerne reduzieren, auf z.B. 25%.
Da fallen mir spontan drei Möglichkeiten ein.
Für das Beispiel da oben geht es simpel:
Da erfolgt eine ganzzahlige Division durch eine Zweierpotenz (2^x).Zitat:
Zitat von DynRPG.ini
Für etwas mehr Kontrolle von Kaufs- / Verkaufspreisen habe ich mal das hier gemacht.
Das sollte eher Anwendung dafür finden, dass man durch Fähigkeiten / eingesetzte Items einstellbare Rabatte oder mehr Geld beim Verkauf von Kram erhält.
Dann sollte aber der oben genannte QuickPatch (und FullSellPrice=49455C,9090,4932EF,9090) nicht damit verwendet werden.
Dritte Möglichkeit wäre der Zugriff auf einzelne Itempreise mittels Plugin mit RPG::items[ID]->price
(Nicht vergessen den Inhalt von DynRPG-master in ../CodeBlocks/MinGW/include/DynRPG einzufügen.)
Problem ist ja nur, dass hier mit einer Kopie der .ldb-Datenbank gearbeitet wird -> Änderungen wirken sich auf die gesamte Spielsession aus (auch bei F12 -> Laden/Neu) und werden wieder resettet, wenn man die RPG_RT.exe schließt und neustartet.
Edit:
Und die default-Werte müssen irgendwo zwischengelagert werden. ...oder ich muss mir etwas einfallen lassen, wie man trotzdem noch an database-default-Werte herankommt.
Theoretisch würde mir in diesem Falle der Quickpatch reichen (zumindest wenns um ne 2er Potenz geht, und das ist 25% ja). Speziell bei mir gehts nur darum, dass Geld durch drops kommt (die ich im nachhinein anpassen kann), aber der Verkaufspreis von Ausrüstungsgegenständen zu hoch ist, weshalb neue Waffen immer sehr viel teurer sein müssen (und das wird auf Dauer echt eklig).
das blau markierte 02 ist also dann 2x2, und 03 wäre dann 2x2x2, also 8, richtig?
Kann man sagen.
Intern werden aber die Bits der Zahl nach rechts verschoben, dabei sinkt der Exponent mit jeder Verschiebung um 1, was im Endeffekt jedes Mal die Zahl halbiert. (+ Informationsverlust wenn zB. die originalen 2^1 und 2^0 wegfallen).
Damit mein Post jetzt nicht zu inhaltslos ist:
Ich kann momentan nicht sagen, ob hier gerade nach einer Gehirntransplantation gefragt wird (denn die ganze Mapping-Engine anpassen kommt dem doch sehr nahe) oder einfach nur ein Pflaster hilft. Unbegrenzte TileSets wie mit dem RMXP könnte zig Stunden an Arbeitszeit kosten.
Ist es möglich, den RPG Maker um ein System zu erweitern, dass Reaktionen zwischen Events erkennt, also Berührungen usw. die dann auch durch Bedingungen abgefragt werden können?
Der RPG Maker kann ja soziemlich alles, nur das nicht. Eben solche Bedingungen wie: Wenn Event A > Event B berührt, mach XY.