Archiv verlassen und diese Seite im Standarddesign anzeigen : +++ DynRPG - Das RM2k3-Plugin-SDK +++
DynRPG ist ein Plugin-SDK für den RPG Maker 2003. “SDK” bedeutet “Standard Development Kit”, und in diesem Fall heißt das dass jeder nun seine eigenen Erweiterungen für den RPG Maker erstellen kann, solange er C++ beherrscht. DynRPG bietet nicht nur dem Durchschnittsprogrammierer Zugang zu der Welt des “Patchens” sondern es stellt auch eine Basis für weitaus mächtigere Erweiterungen dar als all die “Patches” die für den RPG Maker bisher erstellt wurden.
DynRPG funktioniert mithilfe von Plugins. Plugins können in C++ geschrieben werden, sie werden geladen wenn das Spiel startet und von bestimmten Ereignissen informiert (wie das Zeichnen eines neuen Frames, der Schreibzugriff auf eine Variable, usw.) und sie können auf diese Ereignisse reagieren.
Was bisher “Patches” waren werden nun Plugins. Jedes Spiel welches DynRPG verwendet kann mit einem neuen Feature erweitert werden indem man einfach eine Plugindatei in einen Ordner namens "DynPlugins" kopiert. Das ist viel einfacher als “Patchen”, etwas wovor viele Spielemacher sogar Angst haben weil sie denken, es könnte ihrem Spiel schaden. Und wenn jemand ein bestimmtes Plugin nicht mag, braucht er es nur zu löschen.
DynRPG nützt also sowohl Plugin-Erstellern als auch Spielemachern:
- Plugin-Macher können eine einfache C++-Bibliothek verwenden um mächtige Plugins zu schreiben und diese anderen Spielemachern zu Verfügung zu stellen!
- Spielemacher bekommen viele neue Möglichkeiten nur durch das Kopieren der Plugins in ihr Spiel!
- Professionelle Spielemacher sind in der Lage, Plugins zu schreiben, die exakt auf die Bedürfnisse ihres Spiels abgestimmt sind, z.B. könnten sie einen Teil ihres Action-Kampfsystems in C++ schreiben, ein eigenes Design für das Standardkampfsystem erstellen, oder sie könnten sogar ein komplettes Minispiel mit DynRPG erstellen… Die Möglichkeiten sind unendlich!
Es gibt auch eine komplette Dokumentation (in Englisch!), online und auch als CHM-Datei im Download.
Features des Patches:
- Der DynRPG-Patch ermöglicht die Verwendung der DynRPG-Plugins!
- Der DynRPG-Patch erlaubt 2000 Pictures, wovon alle ab ID 1001 beim Mapwechsel nicht gelöscht werden.
- Der DynRPG-Patch behebt einige Bugs des RPG Makers und verbessert einige Kleinigkeiten.
Mehr Info hier: http://rpg-maker.cherrytree.at/dynrpg/patch.html
Features des SDK:
- Zugriff auf viele Spiel-Objekte, u.a.:
--- Helden
--- Monster (aktuelle Monstergruppe)
--- Aktuelle Map
--- Events
--- Pictures
--- Bildschirm (!!!)
--- Switches und Variablen
--- Systemeinstellungen
--- Musik und Sound
--- und mehr
- Abfangen von Ereignissen und die Möglichkeit, darauf zu reagieren und u.U. den Standard zu unterbinden, u.a.:
--- Beim Zeichnen eines Events
--- Beim Zeichnen eines Pictures
--- Beim Zeichnen von best. Fenstern im Kampf
--- Beim Zeichnen von Helden und Monstern im Kampf
--- Bei der Aktion eines Helden oder Monsters im Kampf
--- Jedes Mal wenn des Bildschirm neu gezeichnet wird
--- Beim Ausführen eines Eventbefehls
--- und mehr
Überlegt mal, was damit möglich ist! Anregungen:
- Ein Alles-Anpointern-Plugin
- Ein Größere-Charsets-Plugin
- Ein Fast-Pixelmovement-Plugin
- Ein Alphachannel-Plugin
- Ein Eigenes-Statusfenster-im-Kampf-Plugin
- und VIEL, VIEL mehr.
Mehr Info, Dokumentation und Download:
>>> http://rpg-maker.cherrytree.at/dynrpg <<<
Richtig interessant und mächtig wird die Angelegenheit erst durch gute Plugins. Im Moment stehe ich noch ganz am Anfang damit, daher habt etwas Geduld bis nützliche Plugins entstehen!
Es gibt bis jetzt ein kleines Beispiel-Plugin, welches Conditions im Kampf als Icons anzeigt. Es ist hier (http://rpg-maker.cherrytree.at/dynrpg/getting_started.html) weiter unten beschrieben und zum Download verfügbar.
mfG Cherry
EDIT:
Neuer DynLoader mit Direktpatch-Feature!
Wird dann auch in die (hoffentlich bald mal kommende ;)) nächste DynRPG-Version integriert.
http://share.cherrytree.at/showfile-10117/dynloader.dll << Die dynloader.dll im Projekt hiermit ersetzen.
Erstens mal ist da auch das Problem mit dem Müll am Ende von Stringparametern von Comments gefixt, und zweitens gibt es jetzt zwei Arten von Direktpatches:
1) IPS-Dateien
Ganz simpel: Ihr legt einen Ordner "DynPatches" an und schmeißt da einfach alle IPS-Dateien rein. Die Patches werden dann ohne RPG_RT.exe-Modifikation "on-the-fly" angewendet, d.h. das Entfernen eines Patches ist ganz einfach - nur die Datei wieder löschen (oder die Dateiendung umbenennen)!
Beispiel für eine sinnvolle Anwendung wäre z.B. BetterAEP als IPS-Datei: http://share.cherrytree.at/showfile-10054/betteraep.ips
Der PicPointerPatch liegt beispielsweise schon von Haus aus als IPS-Datei vor, da reicht reinkopieren. :)
2) "Quick Patches"
Für ganz kleine Patches ist es fast zu viel verlangt, eine IPS-Datei zu erzeugen, außerdem gibt es ja solche wo der Benutzer einen Wert (z.B. eine Koordinate) selber einstellen können soll. Dazu gibt es Quick Patches. Diese werden in die Section "QuickPatches" in der DynRPG.ini geschrieben und haben folgendes Format:
BeliebigerName=Adresse,Daten,Adresse,Daten,...
Die Adresse ist eine hexadezimale VA, die Daten können drei Formen haben:
a) Hexstring: Eine Aneinanderreihung von Bytes in Hexadezimalschreibweise (Leerzeichen werden ignoriert und können also zur Übersicht verwendet werden). Beispiel: 49E148,EB71 - schreibt die 2 Bytes EB 71 an Adressen 49E148 und 49E149.
b) Dezimale Zahl mit %-Prefix: Schreibt ein Byte an die angegebene Adresse, die Zahl ist dabei nicht hexadezimal angegeben (negative Zahlen möglich). Beispiel: 49E0BC,%48 - schreibt ein Byte 30 an Adresse 49E0BC.
c) Dezimale Zahl mit #-Prefix: Schreibt einen 32-Bit-Integer an die angegebene Adresse, die Zahl ist dabei nicht hexadezimal angegeben (negative Zahlen möglich). Beispiel: 49E1F1,#270 - schreibt die 4 Bytes 0E 01 00 00 an Adressen 49E1F1-49E1F4.
b) und c) sind dafür gedacht dass man leicht selber Werte eintragen kann (also Expertenuser A gibt Ottonormaluser B so eine Patchzeile und User B braucht nur die Zahlen nach % bzw. # seinen Bedürfnissen anpassen ohne irgendwas hexadezimal umrechnen zu müssen, Bytes zu vertauschen oder sonstwas).
Hier ein Beispiel wie sowas aussehen kann:
[QuickPatches]
; Versteckt die EXP im Hauptmenü und im Statusscreen
VersteckeEXP=49E148,EB71,49F1CA,EB67,49F095,EB21
; Setzt die Koordinaten des Titelbildschirmfensters auf 144/56
VerschiebeTitelbildschirmFenster=490821,#144,490828,#56
(Hinweis zum Titelfensterbeispiel: Der Maker verwendet da die X-Koordinate für die Mitte des Fensters aber die Y-Koordinate für die obere Kante.)
mfG Cherry
PS: Wer Dateioffsets in virtuelle Adressen umrechnen will: Für Offsets 0 - 400 addieren wir 400000, für Offsets 400 - C9200 addieren wir 400C00, für Offsets C9200 - CD400 addieren wir 400E00. Also normalerweise braucht man nur 400C00 zu addieren.
EDIT: Quellcode ist jetzt verfügbar! https://github.com/CherryDT/DynRPG
nette sache das ganze, eben schon ein wenig herum probiert und mit cherrys hilfe dann auch wenigstens mal das testprojetkt hinbekommen...
aber ich muss sagen, da es wohl nicht möglich ist, hier mit visual studio zu arbeiten macht es das ganze doch recht unattraktiv für mich. bisher noch keiner IDE begegnet die ansatzweise das konnte, nur leider kann man das ja wohl so knicken :(
das ist mein einzigster kritikpunkt bisher (außer das der "how to start" artikel vll ein bisschen größer hätte ausfallen können, da das auch für leute, die ein BISSCHEN ahnung von sowas haben, so wie ich, doch nicht ganz so ersichtlich ist, was jetzt genau zu tun ist, aber vll hab ich mich auch einfahc nur zu blöd angestellt^^).
schönes ding, das ganze, performance test hab ich noch keine gemacht, aber wie gesagt, ich komm mit dem anderen zeugs einfach nicht klar, es ist spät, und ich bin müde. vll widme ich mich demnächst dem ganzen nochmal, grade bin ich ein wenig demotiviert :(
nunja, gn8
elvissteinjr
07.02.2012, 17:16
Die deutschsprachige Resonanz scheint sich in Grenzen zu halten, was?
Momentan kann ich nur sagen dass es episch klingt, muss es aber noch ausprobieren.
Da ich C++ kann, würde ich liebend gerne was zusammenfrickeln, weiß bloß noch nicht was.
Wenn ich jetzt nur noch den Maker nutzen würde...hach, jede meiner Patchanfragen würde ich "einfach" selbst erledigen.
Mit Code::Blocks + GCC dürfte es dann wohl auch keine Problem geben. Aber mal schauen...
Edit: Das Testplugin lies sich ohne Problem kompilieren und funktioniert, wunderbar.
Werd ich mir ansehen wenn ich mit "Human Revolution"-Suchten fertig bin ^.^
Ich finde keine Worte das du das wirklich so schnell fertig und veröffentlicht bekommen hast :A
Jetzt habe ich keine Ausrede mehr und muss sofort anfangen mehr C++ zu lernen ^_^
http://cherrytree.at/misc/smilies/arms.gif sektkorkenknallenlässt http://cherrytree.at/misc/smilies/070link.gif
@anti-freak: Best IDE ever: Notepad++ ;)
Gab ein Update. Bitte neu laden und neu patchen da auch ein kleiner Bugfix enthalten war. Siehe: http://rpg-maker.cherrytree.at/dynrpg/changelog.html
Außerdem ein bisschen Info zu Problemen mit Dev-C++ bei Getting Started dazugeschrieben.
Die deutschsprachige Resonanz scheint sich in Grenzen zu halten, was?
Momentan kann ich nur sagen dass es episch klingt, muss es aber noch ausprobieren.
Da ich C++ kann, würde ich liebend gerne was zusammenfrickeln, weiß bloß noch nicht was.
Wenn ich jetzt nur noch den Maker nutzen würde...hach, jede meiner Patchanfragen würde ich "einfach" selbst erledigen.
Mit Code::Blocks + GCC dürfte es dann wohl auch keine Problem geben. Aber mal schauen...
Edit: Das Testplugin lies sich ohne Problem kompilieren und funktioniert, wunderbar.
Liegt wohl daran dass nur wenige wirklich C++ programmieren können... und selbst wenn weiß ich nicht ob man dann gleich das Wissen hat mit dem Patch umzugehen...
Ich selbst hab an der Uni etwas Pascal programmiert (in Lazarus irgendwelche Formulare mit bestimmten Funktionen hinter irgendwelchen Buttons, dann noch php, javascript und dann noch etwas java...
Ob das jetzt reichen würde um auf C++ umzusteigen wage ich zu bezweifeln... wüsste auch garnicht womit ich anfangen müsste... ob ich mir erst mal die ganzen Bibliotheken ankucken müsste, was möglich
ist (also den externen code den man immer einbinden kann) oder erstmal ne IDE ankucke und schaue was man überhaupt mit irgendwelchen Befehlen machen kann (mit Grafiken etc. hab ich bisher garnix gemacht)
Das Einzige was ich vielleicht hinbekommen würde wäre dann ein paar eigene Scripts für die Berechnung von Schaden etc.
Generell kann ich aber wieder nur sagen Respekt Cherry ^^y Freu mich schon wenn erste Leute damit schönes Patches schreiben! Mir graut es schon vor dem Tag an dem Cherry
Arbeit oder Studium anfängt... und keine Zeit mehr für die Community hat, weil er sich irgendwo als Programmierer dumm und dämlich verdient ;D
Bei seinen Programmierkenntnissen müssten sich doch irgendwelche Softwareschmieden um ihn schlagen ^^
Schon längst der Fall. Drum hab ich so wenig Zeit.
Im Moment Zivi (muss ich - Österreich!) und freiberuflicher EDV-Dienstleister. Meine Kunden hab ich übers Internet gefunden, und wenn ich jetzt nicht Zivi wäre, was mir ja 40 Stunden pro Woche stiehlt (für etwa ein Zehntel von dem was ich anderswo für diese Stunden berechnen würde), würde ich mich wohl wirklich dumm und dämlich verdienen :-)
Glückwunsch zur Fertigstellung Cherry. Hört sich rein theoretisch toll an. Finde übrigens den Contest eine großartige Idee, kann aber selber überhaupt nichts beisteuern. Ich hoffe jedenfalls, dass es in Zukunft hierfür nützliche Plugins geben wird, aber da du dich auf internationaler Ebene bewegst, sollte man da keine allzugroßen Bedenken haben.
Wäre höchstens noch interessant, ob es auch möglich wäre, andere Programmiersprachen einzubinden. Würde vielleicht einigen helfen.
Bitte updatet euer SDK! Ich hab einen kritischen Bug gefixt wo Funktionen "zufällig" crashten, je nach Optimierung des Compilers.
Es gibt jetzt auch ein erstes "offizielles" Plugin, für Tastatur- und Mausabfrage: http://www.multimediaxis.de/threads/134303-RM2k3-DynRPG-Plugin-Tastatur-und-Mauseingabe
Übrigens empfehle ich jetzt Code::Blocks als IDE und hab eine Schritt-für-Schritt-Anleitung bei Getting Started dazugepackt.
Bug gefixt: Das Spiel stürzte ab wenn man im Shop was gekauft hat. Ein Tippfehler in einer Adresse, wie dumm von mir X_x
Bitte neu laden und neu patchen.
Oktorok3
18.02.2012, 21:13
Naja, ich versteh den Code sowieso nicht, weil ich die Programmiersprache nicht verstehe. Da bringt zusammenzusetzen eher mit Cherry etwas,
aber setzen wir die Diskussion lieber im richtigen Forum fort-> Pathfinding
öhm, jo, warum schreib ich denn hier? o.O
und ja, ich meinte cherry^^
elvissteinjr
18.02.2012, 23:34
Bin gerade dabei ein simples Plugin zu schreiben, allerdings macht mir das Variablenlimit einen Stirch durch die Rechnung.
Müsste fähig sein mit größeren Zahlen zu rechnen, das Limit lässt sich doch bestimmt hochschrauben, oder?
welche variablen meinst du? die vom maker, oder die deines plugins?
elvissteinjr
19.02.2012, 00:09
Die vom Maker. Mit 32bit ints in C++ komm ich schon zurande, keine Sorge.
Der Pluginnutzer sollte halt bestenfalls mit Makercode rechnen können. Das bleibt dann auch flexibler, spart Code und Abfragen im Plugin.
Es ist ja so, dass man problemlos Variablen monströse Werte geben kann, bloß der kann halt damit nicht rechnen.
Die Beschränkung die von "<> Change Variable" erzeugt wird, lässt sich hiermit aufheben (in onStartup verwenden).
*reinterpret_cast<unsigned char *>(0x4AD36F) = 0xEB;
*reinterpret_cast<unsigned char *>(0x4AD399) = 0xEB;
(Achtung Hack! :) )
Ich habs auch mal ausprobiert.
Schonmal sehr gut die bis zu 2000 bilder!
Aber da die wenigsten c++ können, wäre es möglich nicht eher eine hohe sprache als interpreter zu benutzen, etwa wie die neueren rpg maker versionen selbst ruby oder halt phyton, javascript. Vllt wäre dann der einstieg nicht so schwer.
Aber ansonsten daumen hoch für das tolle projekt!
Oktorok3
28.02.2012, 16:10
Ich habe mir einige Gedanken gemacht und dadurch neue Ideen bekommen, die in Plugins verwirklicht werden könnten.
Da ich selbst die Programmiersprache nicht beherrsche, schreibe ich diese Ideen hier nieder, damit andere damit vielleicht etwas anzufangen wissen! :|
- Eventjump Plugin: Man kann die Sprunghöhe bestimmen und eingeben, sodass das Event z.B. 5Tiles hoch und 1 Tile weiter springt und die Bewegung beim Sprung einen perfekt an Höhe + Weite des Sprungs einen perfekt angepassten Bogen beschreibt - als Ergänzung dazu wäre es eine schöne Sache, wenn außerdem ein Schatten unter dem Event auftaucht ,bei steigender Höhe transparenter wird und bei Bodennäherung des Events wieder an Transparenz verliert(also dunkler wird).
-Event with Pictureoperations-Plugin-> das es möglich machen soll, die gleichen Operationen, die bei Pictures möglich sind auch bei Events zu benutzen (sprich: wabern, rotieren, Transparenz-,Farbe ändern...)
-Diagonal random move event: Die Möglichkeit bei der Zufallsbewegung auch die Diagonalrichtungen standartmäßig mit zu benutzen.
-tracking face direction plugin: Ein Event kann ein anderes Event fixieren und dreht sich automatisch zur Richtung, in welcher sich das andere Ereignis/Der Held gerade befindet.
-event-event follow/away movement plugin: Plugin mit der Möglichkeit, dass Events die "Move toward" und "Move away" Funktion auch auf andere Events statt auf den Helden beziehen können.
-Pixelmovement Plugin: Okay, das hat Cherry bereits geschrieben-> aber das könnte (wenn erstellt) auch damit erweitert werden, das man die Standartzahl bei jedem Event festlegen kann, mit der es sich Pixelgenau von der Stelle bewegen soll (Bsp.: Ein Event, welches bei jedem Schritt 1/2/3/4...Pixel herumläuft).
-Event formed shadow plugin->welches die Sillouette eines Events (Bsp. Eines Vogels) nimmt und optional bestimmbar 1 bis X Tiles nach unten versetzt, wobei der Schatten bei Frameänderung (Bsp.Vogel:Flügelschlagen)
sich ebenfalls genau angepasst mitverändert.
-Shadow and light source plugin: Welches die Sillouette eines Event nimmt und vom jeweiligen Event in die entgegengesetzte Richtung (Gradzahl) der festgelegten Lichtquelle wirft +optional erweiterbar mit mehreren Lichtquellen und manueller Transparenzbestimmung der geworfenen Schatten.
tut sich hier nochmal was?^^
Im Grunde genommen warte ich nur darauf, dass die nächste Version rauskommt, wo die im Pathfinding-Thread genannten Bugs behoben sind.
Wobei ein Plugin für Alpha-Channel oder (Achtung - Luftschlösser) gleich 32bit-Grafiken schon verdammt nice wäre... xD
Im Grunde genommen warte ich nur darauf, dass die nächste Version rauskommt, wo die im Pathfinding-Thread genannten Bugs behoben sind.
dito^^
Was mich im Moment am meisten Favoritisieren würde, ist ein Plugin, das verschiede Blendmodi für Pictures zulässt. Ein Traum für jeden Licht- oder Schatteneffekt... :)
Davy Jones
12.03.2012, 13:50
Hier ist noch eine Idee, die wahrscheinlich auch extrem einfach umzusetzen wäre:
Autosave.
MajinSonic
12.03.2012, 14:32
Ich weiß nicht, ob es evtl schon geschrieben wurde.
Wie wäre es mit einem Skript,welches einem erlaubt die Standards relativ leicht anzupassen?
Sowas wie:
KS Spiegeln
KS ATB--->CTB (+leiste evtl)
Normales Menü verändern.
SaveMenü ändern
Kaufskripte ändern usw?
Was wäre noch mit Farbtiefe? Kriegt man vllt mehr als 8 bit hin?
LG
MajinSonic
RTP Contest um...mal schaun womit ich mich dann beschäftige... ^_^
tut sich hier nochmal was?^^
Hoffentlich. Leider war bei mir Zeit = 0 in den letzten Wochen.
Im Grunde genommen warte ich nur darauf, dass die nächste Version rauskommt, wo die im Pathfinding-Thread genannten Bugs behoben sind.
Ich weiß... Tut mir Leid. Ich hoffe, bald dazu zu kommen.
Wobei ein Plugin für Alpha-Channel oder (Achtung - Luftschlösser) gleich 32bit-Grafiken schon verdammt nice wäre... xD
32 Bit geht nicht, aber 16 Bit + Alpha Channel sollte gehen.
Was mich im Moment am meisten Favoritisieren würde, ist ein Plugin, das verschiede Blendmodi für Pictures zulässt. Ein Traum für jeden Licht- oder Schatteneffekt... :)
Sollte auch recht einfach gehen, in dem man (wie bei der 16-Bit/Alpha-Idee) in onDrawPicture die Bilder selbst anzeigt, dann kann man damit ja machen was man will.
Ich weiß nicht, ob es evtl schon geschrieben wurde.
Wie wäre es mit einem Skript,welches einem erlaubt die Standards relativ leicht anzupassen?
Sowas wie:
KS Spiegeln
KS ATB--->CTB (+leiste evtl)
Normales Menü verändern.
SaveMenü ändern
Kaufskripte ändern usw?
Was wäre noch mit Farbtiefe? Kriegt man vllt mehr als 8 bit hin?
LG
MajinSonic
Mit dem KS hatte ich eigentlich einiges vor, nur leider, wie gesagt, keine Zeit. Ich baue gerade ein Unternehmen auf UND mache Zivildienst nebenbei, da geht Zeit relativ schnell flöten :)
Vyzzuvazzadth
05.04.2012, 23:41
Ich hätte da noch eine nette Idee für ein Plugin.
Beliebige Daten von einer beliebigen Spielstanddatei lesen oder in eine reinschreiben. Also Variable -> Wert in Spielstanddatei oder umgekehrt.
Beispiel: @GetValueFromSaveFile [Wertkennzeichnung], [Zielvariable] oder @WriteValueToSaveFile [Wertkennzeichung], [Quellvariable]
Halt bloss ein Wert auf einmal.
So liesse sich ein hübsches eigenes Speichermenü basteln, welches diverse Daten der anderen Spielstände anzeigen kann oder auch Daten spielstandübergreifend speichern (Sammlungen, Statistiken, Auszeichnungen, gewisse Einstellungen oder was auch immer).
Ich würde ein solches Plugin gerne selber entwickeln, doch leider kenne ich mich weder mit C++ noch mit der Datenstruktur der Spielstanddateien aus.
Müsste mich erst in beides einarbeiten und dazu fehlt mir momentan etwas Zeit und Motivation.
Wenn sich jemand diese Mühe machen würde, wär ich dieser Person extrem dankbar ^^
Ich glaube das geht schon ansatzweise mit dem Power Patch (http://www.multimediaxis.de/threads/100410-Power-Patch-v0.3-0.4x), also Variablen/Switches auslesen und ändern, speichern und laden. Nur eben nicht aus den normalen Savestate-Datein.
Ich kapiers nicht xD
Hab den DynRPG Patcher benutzt der im Download war und ihn auf mein Projekt gerichtet.
Aber ich hab keine 2000 Pics bekommen :/
Hilfe! x3
Das hier beachtet? http://rpg-maker.cherrytree.at/dynrpg/patch.html#more_pics
Habs schon gelöst, danke^^
Jetzt lägts und Hängts auch nciht mehr :)
Noch ein Vorschlag für ein Plugin:
Wenn man mit dem Call Event-Befehl auf eine ungülitge Seite bzw. ein ungültiges Event zugreift bekommt man lediglich die Fehlermeldung:
"Event script referenced an event that does not exist"
Könnte man hier nicht auch noch die angesteuerte Event-ID und Event-Seite mit in die Fehlermeldung packen?
Bekomme diese Fehlermeldungen zZ sehr häufig und dann heißt es einfach mal wild drauf los raten wo jetzt gerade was nicht passt, da
einen die Fehlermeldung in keinster Weise weiterbringt :/
Sollte man die Event-ID und Seite auch anders auslesen können wäre ich für jede Hilfe dankbar :)
dragonheartman
09.04.2012, 18:43
Noch ein Vorschlag für ein Plugin:
Wenn man mit dem Call Event-Befehl auf eine ungülitge Seite bzw. ein ungültiges Event zugreift bekommt man lediglich die Fehlermeldung:
"Event script referenced an event that does not exist"
Könnte man hier nicht auch noch die angesteuerte Event-ID und Event-Seite mit in die Fehlermeldung packen?
Bekomme diese Fehlermeldungen zZ sehr häufig und dann heißt es einfach mal wild drauf los raten wo jetzt gerade was nicht passt, da
einen die Fehlermeldung in keinster Weise weiterbringt :/
Sollte man die Event-ID und Seite auch anders auslesen können wäre ich für jede Hilfe dankbar :)
Calling Events from variable values can be difficult to debug. For these situations I usually display the variable values in a message before I do the call event if my "Debug" switch is on. :)
This is a wonderful plugin. I've used it to make some changes to the default battle system.
http://www.youtube.com/watch?v=MUvhna9qKsU
Davy Jones
09.04.2012, 19:26
Bekomme diese Fehlermeldungen zZ sehr häufig und dann heißt es einfach mal wild drauf los raten wo jetzt gerade was nicht passt, da
einen die Fehlermeldung in keinster Weise weiterbringt :/
Kommt drauf an, in normalen Zwischensequenzen ist das nicht schwer nachzuvollziehen. Die Fehlermeldung heißt lediglich, dass irgendwo ein Event aufgerufen wird, das nicht mehr auf dieser Map existiert. In den Common Events kann übrigens nur der Hero referenziert werden, alles andere ergibt die von dir beschriebene Fehlermeldung.
In Custom Kampfsystemen ist das natürlich komplexer, wenn man sich da mal verhaspelt und nach einer Eventlöschung den Code nicht umstellt, sind Schwierigkeiten nicht zu vermeiden.
@dragonheartman
Calling Events from variable values can be difficult to debug. For these situations I usually display the variable values in a message before I do the call event if my "Debug" switch is on. :)
Yep, that's how i handle it too. But i always deleted those Message Commands afterwards. Keeping them with such a Switch seems a good idea, i guess I'll do it like that from now on ;) My biggest problem here is, that I have many iterations (~100) where I use the Call Event-Command and having that much Messages is very unhandy.
I already found a workaround for my problem but i guess this could be useful in the future too :)
@Davy Jones
Japs ich bastle zZ an einem Taktik-KS und wies oben schon steht ist das leider nicht nur ein Befehl den ich prüfen muss sondern ein ganzes Rudel.
In den Common Events kann übrigens nur der Hero referenziert werden, alles andere ergibt die von dir beschriebene Fehlermeldung.
Was du damit meinst ist mir allerdings schleierhaft.
Es funktioniert sehrwohl dem Call-Event irgendeine Event-ID + ne Seite zu geben und die wird dann auch aufgerufen. Außer die Event-ID existiert nicht
oder ich will auf eine Seite eines Events zugreifen die noch nicht angelegt wurde.
Dann krieg ich eben diese Fehlermeldung.
Was meinst du denn mit "nur der Hero kann referenziert werden"?
Gibts irgendwo die Active-Wait Einstellung vom ATB oder muss das weiterhin reingehackt werden?
Edit: Frage hat sich erledigt. PS: C++ Syntax ist zum kotzen ^.^
Vyzzuvazzadth
13.04.2012, 09:20
Gibt es eine Möglichkeit Common-Events direkt von einem Plugin aus aufzurufen?
Hab auf der DynRPG-Webseite in der Dokumentation bis jetzt noch nichts gefunden...
Nein, geht aus technischer Sicht nicht so einfach weil ein Common-Event-Call nicht den Programmablauf blockiert sondern quasi nur einen Eintrag im Scripter-Objekt erzeugt der besagt "Beim Events verarbeiten bitte dieses CE berücksichtigen", sozusagen.
Vyzzuvazzadth
13.04.2012, 19:10
Alles klar. Dann muss ich wohl mehr Logik ins Plugin auslagern (was eigentlich viel intelligenter ist, aber mehr Zeit und Aufwand kostet).
Wär ja zu schön gewesen ^^
Kannst du es nicht per Switches und PP freischalten und prüfen, ob es durchgelaufen ist?
Vyzzuvazzadth
13.04.2012, 23:04
Hmmm, gute Idee. Muss ich mal versuchen.
Also Schalter X an vor dem Call, CE callen vom Plugin aus, In einer While-Schleife warten (mit kurzem "Sleep", damit das Warten nicht Unmengen an Ressourcen frisst), bis dieser Schalter X wieder aus ist (wird am Ende der jeweiligen CEs wieder ausgeschaltet) und dann erst weiterfahren.
Nun müsste ich nur noch wissen, wie man ein CE überhaupt callen kann... ^^ *zu Cherry rüberschiel*
Zur Info: hab mit dem Plugin übrigens noch nicht begonnen, werde dies aber nächstens tun. Wollte erstmal abklären, was überhaupt umsetzbar ist, bevor ich etwas überkompliziertes bastle, das auch einfacher gegangen wäre.
CE callen würde wohl am ehesten durch einen Switch gehen...
Vyzzuvazzadth
19.04.2012, 18:00
Ich Depp, logisch. Hab wieder mal zu weit gedacht.
Wobei ich bei meinem jetzigen Ansatz gar kein CE zu callen brauche. Doch vielleicht wird das in einer anderen Situation mal nötig, wer weiss...
Moin!
ich würde gern RPG::monsters ? count() benutzen um die Anzahl der Monster auszulesen. Ich kann kein C++ und jede mögliche Variante mit oder ohne Punkt, -> oder Sternchen hier und da, die mir irgendwie sinnvoll schien hab ich durch, die Catalog/NamedCatalog-Zugriffsbeispiele aus der Doku und aus den Headern funktionieren bei RPG::monsters nicht oder ich kriegs nicht hin sie richtig einzusetzen.
Wie mach ich das? Ist sicher eine Zeile und voll einfach, stimmts?
Vyzzuvazzadth
23.04.2012, 12:12
Ist zwar nicht die Lösung zu deinem Problem, aber diese Seite (http://www.cplusplus.com/doc/tutorial/) könnte dir in vielerlei Hinsichten helfen. Benutze ich auch ständig als Nachschlagwerk.
Danke für den Tipp, die Seite kannte ich aber schon, leistet auch gute Dienste bei greifbareren Problemen nur bei diesen Mist halt nicht.
Wenn ich wüsste was genau ich suche hätte ich wohl längst die Lösung.
Momentan verbringe ich in meinen Plugin-Versuchen ca. 95% der Zeit damit mich mit C++ rumzuärgern und minimalst welche mit der eigentlichen Anwendung -_- und hab eigentlich auch nicht das geringste bischen Bock drauf, nur leider lösen sich Probleme nicht wenn man nicht alles selbst macht.
Vyzzuvazzadth
23.04.2012, 14:15
Die Einarbeitung in C++ ist wirklich nicht ganz einfach.
Ich schau heute Abend mal rein, vielleicht finde ich einen Weg, die Monsteranzahl abzufragen. Hab schon eine Idee, aber da ich mit C++ immer noch nicht wirklich vertraut bin, will ich das erst selbst mal ausprobieren, bevor ich irgendwelchen Mist erzähle ^^
EDIT:
RPG::monsters ist ja ein Array. Die Anzahl der Elemente in einem Array kannst du auf 2 Arten auslesen
1. int monsterCount = RPG::monsters.size()
2. int monsterCount = sizeof(RPG::monsters)
Hier noch als Referenz:
C++ Array (http://www.cplusplus.com/reference/stl/array/size/)
DynRPG RPG::monsters (http://rpg-maker.cherrytree.at/dynrpg/group__game__objects.html#ga854ff7a467102ae957f43839360d72fc)
Hab dies nicht getestet, aber meiner Meinung nach solltest du so die Anzahl Monster im Kampf herausfinden können.
Muss ich morgen mal testen. sizeof hatte ich schon auf dem Zeiger, allerdings gibt das die Größe des Arrays aus, nicht die Anzahl der Elemente im Array und ich hatte keine Ahnung wie man analog zu sizeof(array) geteilt durch sizeof(int) bei int-arrays die Elementanzahl der errrr Templatedingsdalisteneintragspointer wasauchimmer draus macht, aber size() klingt gut.
Danke dir!
Vyzzuvazzadth
23.04.2012, 22:52
Kein Ding ^^
size() sollte gut funktionieren, da ich damit auch die Anzahl Zeichen in einer Zeichenkette (String) abfragen kann. Ein String ist von der Logik nichts anderes als ein Char-Array (Char = ein Zeichen).
error: 'class RPG::CatalogPtr<RPG::Monster*>' has no member named 'size'|
Schade, das klappt wohl nicht. Ist ja auch kein einfaches string/char-array.
Wenn ich nicht etwas übersehen habe:
int count = RPG::monsters.count();
sollte eigentlich klappen. Ist das eine Variante, die du bereits ausprobiert hast? Wenn ja, wie lautet die Fehlermeldung des Compilers?
Vyzzuvazzadth
24.04.2012, 07:52
Mist... und (*RPG::monsters).size() ?
Ich stehe eben auch erst an Anfang bei C++. Hab zwar schon einiges an Erfahrung mit anderen Programmiersprachen, doch C++ ist da schon etwas speziell...
Mist... und (*RPG::monsters).size() ?
Ich stehe eben auch erst an Anfang bei C++. Hab zwar schon einiges an Erfahrung mit anderen Programmiersprachen, doch C++ ist da schon etwas speziell...
Ich denke in anderen Programmiersprachen kannst du auch nicht Methoden aufrufen, die in der Klasse nicht implementiert sind. Das Objekt ist vom Typ
RPG::CatalogPtr<...> und nicht
std::array<...> count() ist schon die richtige Methode, er scheint eher an der Syntax zu scheitern.
@Kyuu:
||=== CortiSys, Release ===|
D:\Daten\Privat\Project1\DynPlugins\CortiSys\GameCallbacks.cpp||In function 'void onBattleFrame()':|
D:\Daten\Privat\Project1\DynPlugins\CortiSys\GameCallbacks.cpp|30|warning: unused variable 'count'|
d:\developementtools\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\DynRPG\Catalog.h||In member function 'int RPG::Catalog<T>::count() [with T = RPG::Monster*]':|
d:\developementtools\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\DynRPG\Catalog.h|64|instantiated from 'int RPG::CatalogPtr<T>::count() [with T = RPG::Monster*]'|
D:\Daten\Privat\Project1\DynPlugins\CortiSys\GameCallbacks.cpp|30|instantiated from here|
d:\developementtools\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\DynRPG\Catalog.h|34|error: 'class RPG::DListPtr<RPG::Monster*>' has no member named 'count'|
||=== Build finished: 1 errors, 1 warnings ===|
Ok, damit kann ich etwas anfangen. Cherry hat in Catalog.h, Zeile 34, einen Fehler und zwar überspringt er eine Instanz.
Quick fix: Ändere in Catalog.h die Definition der count()-Methode der Catalog-Klasse zu
int count() {
return list.list->count;
}
Vyzzuvazzadth
24.04.2012, 09:15
Ich denke in anderen Programmiersprachen kannst du auch nicht Methoden aufrufen, die in der Klasse nicht implementiert sind.
Natürlich nicht. In der Beschreibung in Cherrys Klassenreferenz steht eben, dass RPG::monsters ein Array sei. Die Typisierung in der Titelzeile des Abschnitts hab ich zu wenig beachtet. Dass es vom Typ RPG::CatalogPtr ist, welches anstatt der size() die count() Methode besitzt, ändert die Sache natürlich.
Danke fürs Finden dieses kleinen Fehlers. Werde ich bei mir auch so ändern.
Mit dem Kyuu-Fix bekomme ich als Ergebnis aus dem count solche Werte...
189376208
183740112
183936720
183467396
MajinSonic
25.04.2012, 10:10
Wie wäre es mit einem Plugin, welches alle werte im Standardmenü durch variablen ersetzt? Vom Level über die MP HP EP usw?
Aber ich habe mal eine Frage zum Thema Plugin.... kann man damit die Makergrenzen überwinden? Kann man z.B. Alphachannels verwenden und sowas?
Dies würde mich doch einmal ganz schwer interessieren.
LG
MajinSonic
Das hat Cherry doch schon hier (http://www.multimediaxis.de/threads/134256-DynRPG-Das-RM2k3-Plugin-SDK?p=2934131&viewfull=1#post2934131) beantwortet: Ja, sollte gehen, müsste nur jemand mal ein Plugin für schreiben.
Mit dem Kyuu-Fix bekomme ich als Ergebnis aus dem count solche Werte...
189376208
183740112
183936720
183467396
Entweder der Speicher wurde falsch interpretiert, oder die Variable ist kleiner als 4 Byte. Da kann ich nicht mehr helfen. :(
Ich hätte mal ne Frage bezüglich einer ATB-Leiste als Plugin, würd dies gehen?
Das man für mindestens 3 Helden eine Leiste machen kann ohne irgendwas aufwendiges im Maker zutun?
Meinst du sowas wie in Grandia, wo die Helden & Monstericons auf einer Leiste längsflitzen und wer am Ende ankommt ist dran?
Möglich wär sowas, allerdings müsste man dazu die Anzahl der Monster und Partymitglieder auslesen können.
Ja, sowas ^^
Also es wär möglich, okay ich muss langsam mal C++ lernen :D
2k3 KS Plugin ist in Arbeit, bitte haben Sie etwas Geduld;-)
Mag von den anderen Nutzern des Patches mal jemand ausprobieren ob bei ihm der Aufruf "RPG::monsters[2]->notHidden;" funktioniert ? Ich bekomme da Speicherzugriffsfehler.
Edit:
hp = RPG::monsters[i+1]->hp;
//RPG::variables[12] = hp;
-> works fine
hp = RPG::monsters[i+1]->hp;
RPG::variables[12] = hp;
-> speicherzugriffsfehler ...ist meine RPG_RT.exe falsch oder was?
@Soul96: Aber bitte verlass dich aber nicht oder warte gar drauf. DynRPG benutzen macht leider echt gar keinen Spass und ich hab genug andere Hobbys die das tun.
Edit: Gott, ich will Timeline-Knockback im 2k3 KS....ARGH! Das muss funzen !
Auge des Sterns
29.04.2012, 16:23
Ich warte zwar immer noch auf mehr PlugIns, aber jetzt schon ist DynRPG sehr nützlich. So einfach geht es sonst nur mit Mods in der The Elder Scrolls Serie.
Ein großes Lob an dieses Projekt. Es wird mir sicher sehr viel helfen können um diverse Dinge anzupassen.
Wär ein Plugin möglcih, das ein Chipset, also nicht die auf Layer 2 oder 3 sondern 1, etwas Transparenter macht?
Also wie bei den Events, nur ein ganzes Chipset?
Mal wieder was zu Monstern und Helden. Ich frage mich natürlich, wie man am besten abfragen kann, welche von ihnen gerade im Kampf aktiv sind.
Aktueller Ansatz:
"onBattlerDrawn" wird jeweils für jeden Akteur vor "onFrame" aufgerufen. d.h. man könnte folgendes Konstrukt machen (in Pseudocode)
onBattlerDrawn()
{
// gezeichneter Kampfteilnehmer setzt sich für diesen Drawzyklus auf vorhanden
actorsActive[id] = true;
}
onFrame()
{
// hier hat man Information, welche Kampfteilnehmer vorhanden sind
DoStuffs();
for(balbla i)
{
// resetten aller Kampfteilnehmer, da Tote /
// nicht vorhandene sich nicht selbst austragen können
actorsActive[i] = false;
}
}
Irgendwelche Meinungen, Vorschläge / Verbesserungen dazu?
Edit:
Testversion eines Plugins zur dynamischen Anpassung der Kampfsystemgeschwindigkeit
http://share.cherrytree.at/showfile-6142/tweakedatb.zip
Testen, Fehler finden, konstruktiv meckern ausdrücklich erwünscht. Verwendung im eigenen Projekt auf eigene Gefahr.
Edit 2:
Angenommen ich hätte ein RPG::Battler und weiss, dass es ein RPG::Monster ist, wie kann ich das casten? mit (RPG::Monster) klappts nicht.
Auge des Sterns
30.04.2012, 22:24
Ich habe direkt mal einen Charakter wesentlich schneller eingestellt und ich muss sagen, dass es mir gefällt wie schnell die ATB-leiste sich füllte. Die Geschwindigkeit ist jedenfalls zufriedenstellend. Jetzt werden Kämpfe wesentlich besser ausschauen. Fehler habe ich soweit keine bemerkt.
13505
Edit 2:
Angenommen ich hätte ein RPG::Battler und weiss, dass es ein RPG::Monster ist, wie kann ich das casten? mit (RPG::Monster) klappts nicht.
ich nehme an, das dein Battler ein pointer is, weswegen du (RPG::Monster*) schreiben musst, was anderes macht nämlich keinen Sinn. Du kannst nicht ein weiter entwickeltes Object einem niedrigerem zuweisen, außer du überlädst operatoren, dann ist das aber kein default weg.
bei polymorphy arbeitet man mit pointern, weil es anders nicht funktioniert :)
hoffe ich konnte helfen.
Arg stimmt macht Sinn, vor jahrelanger (angenehmer) Verweichlichung durch C# hätte ich das noch noch selbst gewusst *g
Danke dir!
Vyzzuvazzadth
01.05.2012, 11:46
...jahrelanger (angenehmer) Verweichlichung durch C#...
Dito xD
Ist für mich auch eine etwas mühsame Umstellung. Aber so langsam gehts.
Okey wir haben ein Problem mit DynRPG-Patch ansich. Irgendwas an dem Patch wirkt sich sehr negativ auf die Eventseitenverarbeitung aus, dazu sind keine Plugins notwendig, allein die gepatche RPG_RT.exe macht das.
In der Featureliste steht beim KS:
Improvement: Monsters are now flashed more intensively when they do their turn. Before, it was hard to follow what was going on in battle, especially if a monster used the "Attack" command.
Improvement: The skill information window is longer visible in battle. This makes it easier to understand the moves of monsters.
Hallo Cherry: Wär es möglich diese zwei Features mal rauszunehmen? Ersteres gabs afaik ja schon beim Revolution-Preview-Patch, dessen Eventseitenverarbeitung ja ebenfalls nicht ganz sauber war.
dragonheartman
04.05.2012, 03:33
Okey wir haben ein Problem mit DynRPG-Patch ansich. Irgendwas an dem Patch wirkt sich sehr negativ auf die Eventseitenverarbeitung aus, dazu sind keine Plugins notwendig, allein die gepatche RPG_RT.exe macht das.
In der Featureliste steht beim KS:
Improvement: Monsters are now flashed more intensively when they do their turn. Before, it was hard to follow what was going on in battle, especially if a monster used the "Attack" command.
Improvement: The skill information window is longer visible in battle. This makes it easier to understand the moves of monsters.
Hallo Cherry: Wär es möglich diese zwei Features mal rauszunehmen? Ersteres gabs afaik ja schon beim Revolution-Preview-Patch, dessen Eventseitenverarbeitung ja ebenfalls nicht ganz sauber war.
Cherry created a patch to fix the skill length:
http://share.cherrytree.at/showfile-5932/dynrpg_normal_skill_window_duration.ips
I also wanted to share a plugin I wrote to animate monsters with the default battle system!
http://rpgmaker.net/forums/topics/10855/
You can see it here
http://www.youtube.com/watch?v=-T4FumopV3c&t=790
Enjoy!
Auge des Sterns
04.05.2012, 03:51
@dragonheartman
That's something, which is very awesome. I'm think about to use it for myself (although, perhaps only in the complete game). You actually made the Default Battle System more impressive than most Custom Battle Systems. It's still a lot of pose working, to have something done, but that doesn't matter that much.
And people use "stop using rm2k3" phrases? That's somehow very dump, since it's not their business.
@Corti: Kyuu hat Recht, allerdings verstehe ich nicht wieso count() mit Kyuu's Fix nicht funktioniert. Als Workaround kannst du die get-Methode benutzen in einer Schleife, bis sie 0 zurückgibt (erster nichtexistierender Index)... Ich muss mir das Anschauen sobald Zeit dafür da ist.
Davy Jones
05.05.2012, 15:45
I also wanted to share a plugin I wrote to animate monsters with the default battle system!
http://rpgmaker.net/forums/topics/10855/
You can see it here
http://www.youtube.com/watch?v=-T4FumopV3c&t=790
Enjoy!
Wow... this is awesome =D
I waited for this =)
@dragonheartman:
Hey, cool :D
Its very good and this is a of the "Tools" or "Plugin" that i need :)
Thx :)
Hallo Kirsche,
eine Sache müsste echt nochmal gefixt werden: Die Eventpageverarbeitung im Kampfsystem geht so ganz und gar nicht, weil einfach nicht mehr sicher ist, dass Code ausgeführt wird wenn man es erwartet. Das ist irgendwie bitter, denn mit DynRPG könnte man echt tolles Gameplay basteln. Ohne ist das 2k3 System ätzendst langsam, mit dem Eventpageproblem allerdings ist man zurück in der Ära des blinden Enterdrücken weil einfach keine eigenen Systeme mehr verlässlich funktionieren.
Am nachvollziehbarsten passiert das Verschlucken immer wenn gerade auch Monster am Zug sind und angreifen ausserdem kommen Monsterangriffe sehr verzögert wenn parallel ein Spielercharakter dran ist.
Normal:
Monster turn elapsed (+aufblinken)
Monsterangriff
Spieler Does X Command
Spielerangriff
Spielernachbearbeitung (wichtiger Code)
DynRPG:
Monster turn elapsed (+aufblinken)
Spieler Does X Command
Spielerangriff
Monsterangriff
Je nach genauen ATB Werten ab und an etwas zufällig anders, diese Reihenfolge entspricht dem was ich gerade eben nochmal getestet hab.
Hast du den IPS-Patch draufgetan der das längere Skillwindow entfernt? Damit sollte das nämlich für den Moment eigentlich behoben sein...
(Übrigens, so als Tipp: In RPG::updateBattleEvents steckt immense Power ;) )
Auge des Sterns
08.05.2012, 00:37
Wo tue ich diese .ips-Datei eigentlich rein? Ich habe zwar noch keine Probleme gehabt, aber man kann ja nie sicher genug gehen.
Hast du den IPS-Patch draufgetan der das längere Skillwindow entfernt? Damit sollte das nämlich für den Moment eigentlich behoben sein...
Sauber! Das tuts!
@Auge des Sterns:
Benutz den mal, machts nur besser.
(Übrigens, so als Tipp: In RPG::updateBattleEvents steckt immense Power ;) )
Leider hilft das nicht. Der Moment des Aufrufens muss nach der Handlung des Akteurs passieren. Diese beiden...
bool onDoBattlerAction (RPG::Battler *battler)
bool onBattlerActionDone (RPG::Battler *battler, bool success)
...werden beide vor der eigentlichen Action ausgeführt. Um den Kniff des gezielten "Switch on" um im nächsten Zyklus Code aufzurufen kommt man also nicht herum.
RPG Hacker
14.05.2012, 23:08
Hey! Netter Patch. Habe gerade auf die Schnelle für einen Freund ein Plug-In zusammengeschrieben.
Aber mal eine Frage (wurde vielleicht schon gefragt, aber keine Lust, mir alle Seiten durchzulesen):
Gibt es einen besonderen Grund, wieso RPG::Key kein KEY_SHIFT enthält? Fom RM2K3 wird die Taste ja immerhin unterstützt. Kam mir ein bisschen komisch vor. Ist zwar kein Ding, die Taste mit C++ nachträglich auszulesen, aber wäre natürilch schön, wenn ich mein Plug-In komplett über RM-Funktionen bedienen könnte.
In der Doku steht:
"The Shift key is handled differently by the RPG Maker, thus it can't be used the way other keys can be used by DynRPG."
( Quelle ) (http://rpg-maker.cherrytree.at/dynrpg/namespace_r_p_g.html#a7053ce23d03f84eeffeb9d1d4149c4e7)
Der 2k3 ist, wenn man den Disassemblern unserer Community glauben schenkt, zuweilen etwas schräg zusammengehackt. Da die Shi8fttaste ein neues Features des 2k3 ist kanns gut sein, dass es in diese Kategorie fällt.
RPG Hacker
15.05.2012, 12:26
Mann, wie konnte ich das nur übersehen? Genau die Beschreibung habe ich mir doch durchgelesen und mich gewundert, wieso kein KEY_SHIFT dabei ist. Ich stehe echt neben der Spur! 0_o
Naja, hier mal mein erstes Plug-In:
http://rpg-hacker.de/RPGMaker/Downloads/DynPlugins/DynRunningScript.rar
Es ist nichts weltbewegendes. Nur ein Lauf-Skript (Laufen, durch Drücken der Shift-Taste). Als ich mal versucht habe, sowas im Maker direkt einzubauen, hat es seltsamerweise zu unerklärlichen Bugs geführt.
Nutzung (per Comment in einem Parallel Process Common Event):
@DynRun X, Y, Z
Wobei
X: Laufgeschwindigkeit (1 bis 6)
Y: Gehgeschwindigkeit (1 bis 6)
Z: Aktivierungs-Switch
Der für Z verwendete Switch muss im Maker auf ON gestellt werden, damit der Held per Shift laufen kann. Entsprechend kann er nicht mehr laufen, wenn man den Switch wieder auf OFF stellt.
Und hier noch der Source Code:
http://pastebin.com/pgsxzPnQ
Ich garantiere nicht für Fehlerlosigkeit.
RPG Hacker
16.05.2012, 10:53
Wie kann ich mir das mit den Neben-Modulen eigentlich vorstellen? Wenn ich
#define NOT_MAIN_MODULE
in einem Modul definiere, kann ich dann mein Plug-In in mehrere DLLs aufsplitten? Und kann ich einem Neben-Modul dann immer noch alle Callbacks verwenden? Und wann werden die aufgerufen? Günstig wäre es, wenn sie erst nach dem Haupt-Module aufgerufen werden.
Ich plane nämlich, ein paar Plug-Ins auf Basis der Spiele-Library Allegro 5 zu schreiben. Logischerweise benötigen alle Plug-Ins dann auch Allegro 5 (was somit mein Haupt-Modul wäre), aber ansonsten soll man - wenn man bestimmte Funktionen haben will - auch nur Teil-Module verwenden können, solange nur das Haupt-Modul vorhanden ist und die Library initialisiert hat. Geplant sind unter anderem eine Library für Musik (und somit alle Musik-Dateien, die von Allegro unterstützt werden) und eine Library für Tastenabfrage (Tastatur und Gamepad).
Das würde dann so aussehen:
-DynA5Main (Mindesvoraussetzung)
--DynA5Keys (Optional)
--DynA5Music (Optional)
--Weitere optionale, auf Allegro 5 aufbauende Plug-Ins
EDIT:
Nope, scheint wohl nicht so zu funktionieren. Schade!
Oktorok3
19.05.2012, 12:32
Hi,
Ich habe versucht das Plugin zu testen und wurde sofort von folgenden Fehlermeldungen begrüßt:
13748
RPG Hacker
19.05.2012, 14:23
Ach Mist... Das ist der GNU GCC Compiler. Scheinbar habe ich es wiedermal nicht hinbekommen, das Ding ordentlich statisch zu verlinken. :/
Ich gucke mir das ganze nochmal an.
EDIT:
So, neue Version ist oben (selber Link). Kannst du es nochmal ausprobieren? Hoffe das statische Verlinken hat diesmal funktioniert.
Engel der Furcht
20.05.2012, 07:39
Ich hab zwar keine Ahnung von C++, aber das ganze scheint interessant zu sein :P
Bin am Überlegen ob ich vllt ein Mode7 Plugin schreibe? Kp xD
RPG Hacker
20.05.2012, 10:53
Das würde sicherlich schwer und performancelastig werden, denn letztendlich müsste das ja trotzdem alles über die Grafik-Engine des Makers laufen.
MagicMaker
20.05.2012, 10:53
Bin am Überlegen ob ich vllt ein Mode7 Plugin schreibe? Kp xD
Wenn du Ahnung hast, wie M7 aufgebaut ist, nur zu.
Mein Versuch, allein nur die perspektivische Anzeige ohne irgendwelche Rotationen zu machen (ohne Dyn),
laggt leider extrem und braucht etwa 180MB extra im RAM.
http://garden.magicmaker.cherrytree.eu/media/pichost/gebims/M7-alpha009B.png
Engel der Furcht
20.05.2012, 12:20
Okay, dann lass ichs lieber xD
MagicMaker
22.05.2012, 11:31
Okay, dann lass ichs lieber xD
Es würd mich aber wirklich interessieren, wie sowas mit Dyn läuft.
RPG Hacker
22.05.2012, 13:45
Naja, da man in Dyn ja Threads verwenden kann, sollte es zumindest theoretisch sein. Wobei ich jetzt nicht weiß, inwiefern man da mit der Grafik-Engine des Makers arbeiten muss. Die dürfte ja die größte Begrenzung bei dem ganzen sein, da man weiterhin alle Bilder darüber anzeigen muss.
Engel der Furcht
22.05.2012, 15:54
Es würd mich aber wirklich interessieren, wie sowas mit Dyn läuft.
wie gesagt ich kenn mich nicht mit C++ aus. war nur so ne Idee von mir.
WIe hast du denn das ganze ohne Dyn geregelt?
MagicMaker
22.05.2012, 17:45
Mit Referenzbildern die aussehen wie die Map und der Kopierfunktion von Destiny.
Wenn die jetzt noch selbst 2 Streckungsparameter hätte, könnte ich eine ganze Menge Rechenarbeit und RAM-Verbrauch sparen.
Bitte mal um Gegenchecken seitens der Community: onDrawBattleStatusWindow funktioniert bei mir nicht. Checkt das mal bzw. gibt es da Dinge, die ich nicht weiss?
Dann gibt es da eine Irreführung in der Dokumentation der Funktion onBattlerDrawn
id Zero-based party member Id of the battler
im Falle eines Monsters ist es die 0-basierte ID des Monsters in der Monstergroup, Monster 4: id=3
im Falle eines Helden ist es die Id des Heldens in der Datenbank, Held 0001: id = 1
djeurissen
31.05.2012, 17:27
Ich hoffe das wurde hier noch nicht gefragt... Aber ich habe bis jetzt nur kenntnisse was C# angeht. Und soweit ich weiß ist da der große Unterschied die komplette Objektorientierung... Aber was muss ich beachten wenn ich eben C++ für dieses Plugin benutzen will?
RPG Hacker
31.05.2012, 18:51
Syntaktisch gibt es zwischen C# und C++ zwar keine so großen Unterschiede, allerdings wirst du dennnoch stark umdenken müssen beim Umstieg. Insbesondere im Hinblick auf Klassen ist C++ so viel unflexibler und fehleranfälliger als C#. So ohne weiteres wirst du jedenfalls nicht umsteigen können. Ich empfehle dir, zumindest ein kompaktes Tutorial zu überfliegen. Durch die C#-Kenntnisse dürftest du zwar schneller reinfinden, als jemand komplett ohne C-Kenntnisse, aber ohne irgendein Nachschlagewerk dürfte das recht schwer bis unmöglich werden. Wenn auch nur, weil C++ immer schon bei den dümmsten Kleinigkeiten rummeckert und man als User oftmals die Fehler weder sehen noch nachvollziehen kann. Zumindest ist hier ein Vorteil für dich, dass für ein Plug-In eine Source-Dateie völlig ausreicht, also musst du dir nicht erst angucken, wie Header-Dateien funktionieren. Die gibt es ja in C# gar nicht erst.
dragonheartman
07.06.2012, 19:38
Thanks for the positive feedback. Cherry provided me some tips and I have updated the plugin to fix a memory leak. Links are still the same:
https://www.dropbox.com/s/a4bsrvp5kq1xjzo/animated_monsters.dll - plugin
https://www.dropbox.com/s/si7cfu0imsjm3yy/animated_monsters.cpp - source code
Moreover, here is a sneak peek of a diablo3-style minimap I am working on:
http://sphotos.xx.fbcdn.net/hphotos-ash3/553392_10150987181171474_1735881844_n.jpg
The map is dynamically created using terrain data and to make things even cooler you can resize/reposition it real-time. The player is always at the origin of the map so it looks great even at small sizes. Lastly, the minimap is revealed as you explore more of the map (with fancy alpha effects), so large maze-like dungeons are rewarding to explore.
Thanks for the positive feedback. Cherry provided me some tips and I have updated the plugin to fix a memory leak. Links are still the same:
Moreover, here is a sneak peek of a diablo3-style minimap I am working on:
The map is dynamically created using terrain data and to make things even cooler you can resize/reposition it real-time. The player is always at the origin of the map so it looks great even at small sizes. Lastly, the minimap is revealed as you explore more of the map (with fancy alpha effects), so large maze-like dungeons are rewarding to explore.
AWESOME! Thank you very much! I really appreciate your hard work!
And I'm looking forward to your new plugin too! ^^
Auge des Sterns
07.06.2012, 23:34
Minimap? If you create such a plugin, hours of work will be spared. That is something I'm looking forward to.
I can't really say how cool this actually is.
Awesome work! Can't wait to see the sourcecode for that one.
Edit:
There's one question i have. Your'e changing the monsters image using that (as you call it) "ugly cast" and setting it back to the original every time it is drawn~
Here's what i would have done:
Return "false" in "onDrawBattler" prevents monster from being drawn
Draw it manually
My disadvantage is that other plugins won't receive the callback after returning false...
What reasons made you chose your current approach? Did you try others before? This is not meant to be critical, i'd just like to read your thoughts as a developer.
.:Flarestar:.
13.06.2012, 20:57
Jetzt mal ne vermutlich saublöde Frage:
Ist es, zumindest theoretisch, möglich, einen "Patch" zu schreiben bzw. ein eigenständiges Programm, das es ermöglicht, RPG-Maker Games für Konsolen zugänglich zu machen?
Dabei denke ich beispielsweise an Download-Contents für aktuelle Konsolen (z.B. Wii); aber auch an Apps für Smartphones und andere neuartige High-Tech Wunder.
Ein solches Programm könnte der Makerszene völlig neue Möglichkeiten bieten, auch wenn die Projekte wohl primär als Freeware angeboten werden würden.
Was denkt ihr?
Solange die RPG Maker Engine auf Windows-Schnittstellen zugreift, nicht möglich, weil diese nicht portabel sind. Soweit ich es verstanden habe, injiziert Cherrys DynRPG lediglich Sprungpunkte in die RPG Maker Engine, d.h. daran, auf welche Schnittstellen die RPG Maker Engine zugreift, wird nichts geändert.
RPG Hacker
14.06.2012, 20:15
Naja, soweit ich weiß sind ja sämtliche Daten des eigentlichen Spiels in den Unterordnern und den Datenbank-Files gespeichert. Deswegen wäre es theoretisch möglich, vorausgesetzt man könnte diese Datenbank-Files entschlüsseln und mit einer selbst geschriebenen Engine auf der Ziel-Konsole verwerten. Wobei ich da aber schwarz sehe bei deinem Beispiel mit Download-Content, inbesondere mit der Wii. Erstens wäre das ja dann eine illegale Entschlüsselung und zweitens würden die Hersteller dieser Konsolen diese Spiele wohl kaum in ihr Online-Angebot aufnehmen. Es bleibt als nur die Möglichkeit, das ganze über Wii-Homebrew laufen zu lassen (und wie gesagt nur, wenn man die Engine erst eigens dafür programmiert).
Projekte diese Art gibts schon mehrere. Das größte ist easyRPG, davon gibts Runtimes für DS, A320, PSP (I think), Anrdoid (?) und andere.
Kann man mit nem Plugin die Pfeiltasten ausmachen?
Bräuchte das nähhmlich, will mit den WASD Tasten spielen und nicht mit den Pfeiltasten, außerdem ist das auch bequemer wenn man die Maus noch benutzen muss^^
MagicMaker
02.07.2012, 18:21
außerdem ist das auch bequemer wenn man die Maus noch benutzen muss^^
Ich finds ja schön, wie Linkshänder bei der Bedienbarkeit ignoriert werden. Und überhaupt, WASD ist ein
unglaublich dummer Tastenblock umgeben von anderen Tasten, die Pfeiltasten sind als Pfeiltasten perfekt
weil man sich bei ihnen nicht verdrücken kann.
Ich will ja eine Einstellung einbauen, mit der man zwischen den WASD- und Pfeiltasten wechseln kann.
Ich spiel nähmlich persönlich lieber mit WASD, da verdrück ich mich auch nicht xD
RPG Hacker
02.07.2012, 23:08
Ich will ja eine Einstellung einbauen, mit der man zwischen den WASD- und Pfeiltasten wechseln kann.
Ich spiel nähmlich persönlich lieber mit WASD, da verdrück ich mich auch nicht xD
Wobei du zugeben musst, dass du keinen wirklichen Nutzen davon hast, die Pfeiltasten gezielt zu deaktivieren. Die bessere Frage wäre also gewesen "Kann man durch ein Plugin WASD als Pfeiltasten-Ersatz verwenden?"
Ich glaube, dass das sogar möglich ist. WASD auszulesen ist mit C++ ohnehin kein Problem. Ich meine aber, dass man in DynRPG auch irgendwie auf die Tasten des Makers zugreifen kann. Deshalb muss man nur WASD von der Tastatur abfragen und dann die Tasten des Makers updaten.
djeurissen
02.07.2012, 23:10
Kann man das nicht einfach mit Inelukis Tastenpatch regeln O.o? Oder gibt es da irgendwelche Konflikte mit den Move Events?
Ich hab das jetzt so das man beides WASD und die Pfeiltasten benutzen kann.
Ich will aber das nur eins möglich ist.
Ich benutze für die Maus, sowie für Tasten das Plugin von Cherry.
Leider kann man damit die Standard-Maker-Tasten nicht abschalten :/
Zumindestens weiß ich ncihts davon...
Naja, ein Plugin das die Tasetn abschaltet wäre nciht schlecht.
Die ESC bzw. Menü-Taste lässt sich ja durch das abschalten des Menü ausschalten.
MagicMaker
02.07.2012, 23:44
Ich will aber das nur eins möglich ist.
Bitte konkret erläutern, ich sehe keinen Sinn.
Kann man das nicht einfach mit Inelukis Tastenpatch regeln O.o?
Wer 2012 immernoch damit Tasten abfängt obwohl es zuverlässigere Möglichkeiten gibt, wird verhauen.
[zB ist das wahrscheinlich besser was Soul schon nutzt ↓]
Ich benutze für die Maus, sowie für Tasten das Plugin von Cherry.
Damit ist es doch sowieso getan oder? Wenn nicht, antworte mal auf meine erste Zeile. ^-^
Ich würds noch für verständlicher halten, wenn man die von ASCII damals seltsam gewählten Alternativen
H J K L für die Richtungstasten ausknipsen will (wenn man die Adressen mit den Tastencodes kennt
könnte man da sogar ohne Dyn WASD oder alles andere Mögliche einstellen ohne ↑←↓→ zu löschen).
Derzeit kann man mit WASD und den Pfeiltasten sich bewegen.
Ich will aber nur das eins aktiv ist.
Beim beginn des Spiel soll man das wechseln können.
Außerdem will ich die Pfeiltasten auch über das Plugin von Cherry abfragen, damit kommt das Menü dann nciht durcheinander^^
Btw. hier mal das Plugin:
http://forum.rpg2000.4players.de/phpBB3/viewtopic.php?f=3&t=98107&hilit=+plugin
MagicMaker
03.07.2012, 00:10
Derzeit kann man mit WASD und den Pfeiltasten sich bewegen.
Ich will aber nur das eins aktiv ist.
Beim beginn des Spiel soll man das wechseln können.
Alte Argumente wiederholen bringt keine Erleuchtung dem Gegenüber, next try.
Wie ich es noch genauer sagen soll, hab ich keine Ahnung :/
Die Möglichkeit der Wahl zwischen WASD und Pfeilen bringt gegenüber der gleichzeitigen Verfügbarkeit von beidem keinerlei, absolut null spielerischen Mehrwert.
MajinSonic
03.07.2012, 10:54
Leute, ich habe mal eine Frage. Ich persönlich habe von der Programmiererei ÜBERHAUPT keine Ahnung, also bin ich auf euch angewiesen :)
Ich glaube es war mal davon die Rede, dass ein Mode7 Plugin erstellt werden soll, oder? (Das ist doch diese "gekippte" Map, nicht wahr?)
Und sowas könnte ich an sich gut gebrauchen, die Frage ist nun nur, ist sowas in der Mache? Oder wird sowas gemacht werden?
LG
MajinSonic
MagicMaker
03.07.2012, 11:08
(Das ist doch diese "gekippte" Map, nicht wahr?)
Pedia gibt Aufschluss:
Im Mode 7 ist es unter anderem möglich, eine Hintergrund-Ebene zu rotieren und skalieren. Durch eine zeilenweise Veränderung der Position und Skalierung lässt sich ein einfacher Effekt räumlicher Tiefe erzeugen, der zum Beispiel in Rennspielen oder Flugsequenzen verwendet wird.
Die Frage hier ist ob Dyn und das Drumherum genug Möglichkeiten dafür bereithält und ob ein Plugin
auch schnell genug mit der RPG_RT arbeiten kann, um sowas flüssig darzustellen.
MajinSonic
03.07.2012, 11:27
Hm, naja gut, man ist bisher auch ganz gut ohne das zurecht gekommen, doch es würde mich wirklich interessieren, ob das gehen würde, oder ob das jemand vor hat. :D Ich finde diesen Effekt immer ganz tollig :D
RPG Hacker
03.07.2012, 12:04
Da DynRPG nichts an der Grafik-API des Makers ändert, halte ich es für unwahrscheinlich, dass man damit ein effektives Mode 7-Plugin machen kann. Zwar sind Matrix-Transformationen auch auf Software-Basis möglich, allerdings doch recht langsam und ineffektiv, was bei der Langsamkeit, die der Maker eh schon hat, unpraktisch ist. Heutzutage unterstützen alle Grafikkarten solche Transformationen. Man müsste also irgendwie dafür sorgen, dass man über den Maker (per Open GL oder so) direkt die Grafikkarte ansprechen kann. Ich kann mir aber kaum vorstellen, dass das gut mit der normalen Grafik-API zusammenspielt.
Wie wärs mit: Unter DynRPG einen eigenen Thread anknipsen, DirectX hernehmen und das Ergebnis auf 320*240 Rendern. Im "onFrameDrawn" jeweils aktuellstes Bild drüberzeichnen...
MagicMaker
03.07.2012, 12:31
(per Open GL oder so)
Dann wäre die Katastrophenmischung aber wirklich komplett, RPG_RT hybridiert sowieso schon zwischen GDI und...
DirectX
wie wild herum.
Warum nicht OpenCL, schön die nVidia Chips nutzen und "Benötigt Shader Model 2.0" in den Hardware-Anforderungen des Spiels =p
RPG Hacker
03.07.2012, 13:15
Naja, wenn der Maker eh schon DirectX verwendet ist das was anderes. Open GL ist ja im Prinzip nichts anderes als eine Cross-Plattform-Alternative zu DirectX. Wenn man es schafft über den Maker auf DirectX zuzugreifen dürfte es durchaus möglich sein damit etwas Mode 7-artiges auf die Beine zu stellen.
Tastenbelegung ändern (z.B. WASD statt Pfeiltasten): http://rpg-maker.cherrytree.at/dynrpg/class_r_p_g_1_1_input.html#af2ec21499d982629c7be5e8f4918dccc
z.B.:
RPG::input->key(RPG::KEY_UP)[0] = 'W';
RPG::input->key(RPG::KEY_LEFT)[0] = 'A';
RPG::input->key(RPG::KEY_DOWN)[0] = 'S';
RPG::input->key(RPG::KEY_RIGHT)[0] = 'D';
Bewegungssteuerung deaktivieren: http://rpg-maker.cherrytree.at/dynrpg/class_r_p_g_1_1_hero.html#a891142fbd73c8a2d3d01e56aa969660b
z.B.:
RPG::hero->setControlMode(RPG::CONTROL_EVERYTHING_EXCEPT_MOVEMENT);
RPG Hacker
03.07.2012, 22:14
Tastenbelegung ändern (z.B. WASD statt Pfeiltasten): http://rpg-maker.cherrytree.at/dynrpg/class_r_p_g_1_1_input.html#af2ec21499d982629c7be5e8f4918dccc
z.B.:
RPG::input->key(RPG::KEY_UP)[0] = 'W';
RPG::input->key(RPG::KEY_LEFT)[0] = 'A';
RPG::input->key(RPG::KEY_DOWN)[0] = 'S';
RPG::input->key(RPG::KEY_RIGHT)[0] = 'D';
Ich nehme an, wenn man stattdessen einen Index von 0 oder höher benutzt, wird stattdessen eine der Alternativsteuerungen überschrieben?
Und mit welchen Chars setzt man Zurück auf Pfeilsteuerung? (Denn genau das wollte Soul ja: Dass man dazwischen umschalten kann)
Soweit ich weiß haben die Pfeiltasten ja keine normalen ASCII-Codes.
http://msdn.microsoft.com/en-us/library/windows/desktop/dd375731(v=vs.85).aspx
RPG::input->key(RPG::KEY_UP)[0] = VK_UP;
RPG::input->key(RPG::KEY_LEFT)[0] = VK_LEFT;
RPG::input->key(RPG::KEY_DOWN)[0] = VK_DOWN;
RPG::input->key(RPG::KEY_RIGHT)[0] = VK_RIGHT;
Index 1 müsste Num2/4/6/8 sein normalerweise, Index 2 müsste HJKL sein. Index 3 bis 7 sind vom Maker normal nicht fürs Steuerkreuz benutzt. (Man kann natürlich eigene Alternativsteuerungen da reintun.)
RPG Hacker
04.07.2012, 11:06
Optimal wäre dann sicherlich, HJKL zu überschreiben. Da hätte man einerseits beide Steuervarianten implementiert und könnte andererseits die Tasten HJKL für anderen Kram nutzen.
Kopie aus dem englischen Forum:
Currently, it's not possible to detect what is going on in the menu (which screen, which item selected, etc.). The only thing a developer can find out is whether the menu in general is active or not.
But I can tell you an undocumented way to find out which menu screen is shown.
int getMenuScreen() {
return (**reinterpret_cast<char ***>(0x4CDC60))[12];
}
0 = main screen
1 = item screen
2 = item target selection
3 = skill screen
4 = skill target selection
5 = teleport screen
6 = equipment screen
7 = end confirmation screen
8 = status screen
9 = party order screen
What's also possible is drawing a custom (maybe even animated) menu background, by handling the onSystemBackgroundDrawn callback.
Also, it's of course possible to draw something on top of the menu, using the normal onFrame callback.
By combining these things it would indeed be possible to add additional stuff to the menu, at least to the main menu screen. Other screens would still be difficult because additional information (which hero is selected, which item is selected, etc.) is not available yet.
Hallo!
Ich wollte jetzt den DynRPG Patch installieren, habe aber den neuen KS Bugfix drauf der in der 14a Version vom Patch noch nicht enthalten ist(?).
Muss ich, nachdem ich den DynRPG Patch installiert habe den KS Bugfix nochmal nachreichen oder wird er beibehalten?
Und gibt es irgendwelche Kompatibilitätsprobleme oder kann man den Single Fix und den Patch beide ohne Probleme drauf haben?
Harmonisiert alles miteinander.
Harmonisiert alles miteinander.
Okay!
Die dynrpg_patcher.exe sagt Version 0.13b. Ich dachte die neuste sei 0.14a? Oder wie ist das?^^
Edit: Hat sich erledigt, habe eben den Changelog gelesen ;D
Edit2: Ich habe gerade entdeckt, dass wenn man beim Battlelayout "Small Window" ausgewählt hat und dann Choices im Kampf anzeigt,
der Cursor bei den Choices 2-4 nicht an der richtigen Stelle ist, sondern sich immer ein kleinwenig nach oben verschiebt je weiter man runter geht.
Könnte man das noch fixen?
@Edit2: Der Bug ist mir neu, wird notiert. Gibt jetzt aber noch keinen Fix, im Zweifelsfall Large Window verwenden...
@Edit2: Der Bug ist mir neu, wird notiert. Gibt jetzt aber noch keinen Fix, im Zweifelsfall Large Window verwenden...
Kein Problem. Drängt nicht. :)
Mir ist noch etwas aufgefallen, weiß nicht ob das beabsichtigt ist oder nicht:
Der DynRPG Patch verlängert ja die Zeit, in der Ein Skill am oberen Bildschirmrand angezeigt wird.
Wenn der Spieler einen Skill einsetzt wird der Skillname früher gelöscht als die Box.
Vom Timing her würde ich die Box dann mitlöschen.
In den Patchlogs habe ich zwar nichts davon gelesen aber, beim Benutzen von Items würde ich die Verlängerung weglassen, da nach dem Ende der Itemuse Animation,
eine unnatürliche Pause entsteht, wo nichts geschieht und erst nach dieser Pause tritt der Itemeffekt in Kraft.
Joa, das ist leider sowieso buggy, wird in Zukunft wohl entfernt oder zumindest verbessert. Irgendwo hier im Thread fliegt ein Patch-Patch rum der das wieder wegpatcht. :)
Hatte einen Fehler in dem getMenuScreen-Code den ich hier gepostet hatte, der richtige Code ist:
int getMenuScreen() {
return (**reinterpret_cast<char ***>(0x4CDC60))[12];
}
Joa, das ist leider sowieso buggy, wird in Zukunft wohl entfernt oder zumindest verbessert.
Mhh, schade. Finde es eigentlich ganz hilfreich.
Irgendwo hier im Thread fliegt ein Patch-Patch rum der das wieder wegpatcht. :)
Drauf gemacht. Danke!
Und noch ein Beitrag :P
Ich hab festgestellt, dass Pictures mit der ID 1001 und höher (sie sollen ja nach dem Mapwechsel angezeigt bleiben) auch angezeigt werden nachdem man zum Titlescreen per Spiel verlassen oder F12 geht und dann auf neues Spiel geht. Lässt sich das nicht anders vereinbaren falls sie beim Mapwechsel erhalten bleiben sollen?
Known Bug... Man könnte natürlich ein Plugin als Bugfix machen was einfach bei onInitTitleScreen sowas wie for(int i = 1001; i <= 2000; i++) RPG::pictures[i].erase(); macht.
Wenn ich das könnte, würde ich es natürlich selbst machen ^^´
Wird der Bug in der nächsten Version von DynRPG behoben?
Auge des Sterns
13.10.2012, 21:22
Ich meine irgendjemand hat bereits von den Transparenzbug mit Charsets berichtet. Als ich es ausprobierte waren die Transparenzen recht unmerkbar und auf Transparent eingestellte Events waren völlig sichtbar. Daher wollte ich mal wissen, ob bereits Lösungsansätze hierzu bestehen.
Achja, und natürlich pushe ich diesen Thread mal etwas.
Ich meine irgendjemand hat bereits von den Transparenzbug mit Charsets berichtet. Als ich es ausprobierte waren die Transparenzen recht unmerkbar und auf Transparent eingestellte Events waren völlig sichtbar. Daher wollte ich mal wissen, ob bereits Lösungsansätze hierzu bestehen.
Achja, und natürlich pushe ich diesen Thread mal etwas.
Das möchte ich an dieser Stelle auch einfach nochmal fragen. Sorry falls das Problem mittlerweile behoben sein sollte, aber das werde ich dann wohl nicht mitbekommen haben.
Und eine weitere Frage noch:
Kann ich irgendwie das battle command window (oder wie das heißen mag), wo ich eine Auswahl treffe zwischen Angriff, Abwehr usw., versetzen, z.B. in die untere rechte Ecke des Bildschirms? Es verdeckt scheußlicherweise dauernd die Gegner und den an ihnen angerichteten Schaden, was für den Spieler ein wenig unkomfortabel ist.
Wäre dankbar über Hilfe :)
Ok, damit kann ich etwas anfangen. Cherry hat in Catalog.h, Zeile 34, einen Fehler und zwar überspringt er eine Instanz.
Quick fix: Ändere in Catalog.h die Definition der count()-Methode der Catalog-Klasse zu
int count() {
return list.list->count;
}
Nicht nur das, anscheinend hab ich noch einen Fehler gemacht, deswegen funktionert das ganze RPG::monsters nicht wirklich... Bäh.
DList.h: Zeile 10 und 11 (Definition von "int count" und "T *items") gehört getauscht, sodass "items" vor "count" kommt.
Davy Jones
16.01.2013, 07:37
Das möchte ich an dieser Stelle auch einfach nochmal fragen. Sorry falls das Problem mittlerweile behoben sein sollte, aber das werde ich dann wohl nicht mitbekommen haben.
Und eine weitere Frage noch:
Kann ich irgendwie das battle command window (oder wie das heißen mag), wo ich eine Auswahl treffe zwischen Angriff, Abwehr usw., versetzen, z.B. in die untere rechte Ecke des Bildschirms? Es verdeckt scheußlicherweise dauernd die Gegner und den an ihnen angerichteten Schaden, was für den Spieler ein wenig unkomfortabel ist.
Wäre dankbar über Hilfe :)
http://www.multimediaxis.de/threads/68025-Tutorial-Sammelthread?p=3030978&viewfull=1#post3030978
Funktioniert wunderbar =)
Hab ein Problem mit "RPG::map->events".
Ich kriegs nicht gebacken auf ein Event zuzugreifen.
RPG::Event *ev = RPG::map->events[0];
RPG::Event *ev2 = RPG::map->events.get(0);
if(ev->doesEventPageExist(0)) // Speicherzugriffsfehler hier
{
CortiHelper::ShowInfoBox("Event Page Exists","hahaha");
}
Kurioserweise bekomme ich nach z.B.
RPG::Event *ev3 = new RPG::Event();
für ev3-> allemöglichen Member und Methoden im Intellisense. Die oben genannten machen zwar keinen Compilerfehler, aber Intellisense tut nichts.
Das hier:
int i = RPG::map->events.count();
CortiHelper::ShowInfoBox(i,"hahaha");
Gibt Zahlen wie 12343242343254 um den Dreh. Erinnert mich an RPG::monsters, da gab es das Problem ja auch.
In diesem Falle gibts für das was ich vorhabe leider kein einfaches Workaround ohne die Liste.
Zwei Posts über dir steht die Lösung (ich Depp hab zwei Member in RPG::DList vertauscht, nämlich "items" und "count" - erklärt alles, ne?).
Übrigens wird events[0] immer fehlschlagen, weil du als Index die Event ID nehmen musst und Event 0 gibts nicht. Willst du über alle Events iterieren, kannst du über events.ptr->list die zugrundeliegende RPG::DList (eigentlich DListPtr) erreichen, deren Indizes normal 0, 1, 2, 3... sind und nicht die Event IDs.
Erklärung: events ist vom Typ NamedCatalogPtr. Das ist eigentlich nur eine Hilfsklasse die NamedCatalog* ersetzt um die Zugriffe zu vereinfachen, also damit events[1] geht und nicht (*events)[1] notwendig ist. event.ptr erreicht den eigentlichen NamedCatalog*, und da NamedCatalog von Catalog erbt, ist der Member "list" dort verfügbar, welcher vom Typ DListPtr ist (was wiederum eine Hilfsklasse ist die DList* ersetzt). Der Maker kennt da leider so viel verschiedene Klassen (DList, Catalog, NamedCatalog) dass der Zugriff ohne die Hilfsklassen wie DListPtr, CatalogPtr und NamedCatalogPtr sehr beschwerlich wäre.
doesEventPageExist(0) ist auch nicht sinnvoll, weil die Event Page IDs ja im Maker bei 1 anfangen.
Okey. Hab gemerkt, dass ich zwei Versionen der DynRPG Dateien rumliegen hab und hab immer in den falschen rumeditiert.
Nach dem ich nun die richtigen erwischt habe funktioniert die Countmethode, hurray ^.^
Was die Events angeht, da bekomme ich weiterhin Speicherzugriffsfehler. Hab die DList Änderung wie beschrieben durchgeführt.
Hm, wie greifst du jetzt drauf zu? Wie gesagt, Index 0 wird nie gehen.
Mit 'ner eins ;-)
RPG::Event *ev = RPG::map->events[1];
if(ev->doesEventPageExist(1))
{
CortiHelper::ShowInfoBox(1,"Event Page Exists");
}
Access violation in module "CortiSysRTP2k13,dll" in with address 68702079 and offset 00000004 of type Read occurred.
Schick mir doch einfach mal die DLL, dann kann ich sehen was an Adresse 68702079 ist.
Ich hab ein kleines Problem, arbeite seit ein paar Tagen mit dem DynRPG und nun wollte ich ein kleines Plugin schreiben!
Der Held soll bei jedem "normalen" Angriff und Abwehr-Befehl eine kleine Menge seiner MP wiederherstellen (Ich weiß das würde wahrscheinlich auch ohne DynRPG gehen, aber egal...^^)!
Der Abwehr-Befehl regeneriert auch die MP, aber leider der "normale" Angriff nicht... :>!
Hab erst gedacht es läge vll an der onDoBattlerAction-Methode, aber auch mit der onBattlerActionDone-Methode funktioniert es nicht >,>.
Hier ist mal der Code:
bool onDoBattlerAction ( RPG::Battler * battler) {
// MP Aufladen bei einem Angriff
if (battler->action->basicActionId == RPG::BA_ATTACK ) {
battler->mp += 10;
}
// MP Aufladen bei Abwehr
if (battler->action->basicActionId == RPG::BA_DEFEND) {
battler->mp += 10;
}
return true;
}
Erstmal:
Sowohl onBattlerAction als auch onBattlerActionDone werden pro Charakter mehrfach in Folge ausgelöst. Wenn du eine Handlung genau ein mal abfragen willst, dann solltest du dies in onBattlerActionDone mit success == true machen.
bool onBattlerActionDone (RPG::Battler *battler, bool success)
{
if(success && !battler->isMonster() ) // Bei Helden, nur das eine mal nach dem die Handlung wirklich ausgeführt wurde
{
if(battler->action->kind == RPG::AK_BASIC &&
(battler->action->basicActionId == RPG::BA_ATTACK ||
battler->action->basicActionId == RPG::BA_DEFEND))
{
battler->mp = battler->mp + 10;
}
}
return true;
}
Ob BA_ATTACK bei mir funktioniert kann ich derzeit nicht testen, da musste dich gedulden ;-)
@Corti: onDoBattlerAction sollte eigentlich nicht mehrfach ausgeführt werden... Bist du sicher? Das hat nämlich auch keinen success-Parameter.
Grad getested:
Helden (BA_DEFEND):
onDo 1x
onDone 1x
Monster (AK_SKILL):
onDo 11x
onDone 12x (davon 1 mal success)
Immer abwechselnd onDo onDone(!success) ~ 11 mal in Folge, dann passiert die Handlung dann nach ner halben Sekunde kommt "onDone" mit Success.
Interessante Eigenheit des Makers, ich dachte bisher dass nur onDone mehrmals kommt. Muss ich mal anschauen und berücksichtigen...
Tja, man lernt nie aus. Btw. hattest du schon Zeit dir meinen Speicherzugriffsfehler anzusehen?
Oje, ich hab noch nichtmal in die PM geschaut und so die liebe Geburtstagsüberraschung versäumt...!! :(
Naja, zum Problem:
1) Du überprüfst nicht ob ev != NULL, dadurch crashst du natürlich sofort weil im Titelscreen kein Event #1 vorhanden ist.
2) doesEventPageExist funktioniert nicht weil ich einen Fehler gemacht habe.
Du kannst derweil diese gefixte Version von doesEventPageExist verwenden:
bool doesEventPageExist(RPG::Event *event, int id) {
void **script;
asm volatile("call *%%esi" : "=a" (script), "=d" (RPG::_edx) : "S" (0x47A0D0), "a" ((**reinterpret_cast<void ****>(0x4CDD14))[15]), "d" (event->id) : "ecx", "cc", "memory");
NamedCatalogPtr<void *> pages;
pages.ptr = reinterpret_cast<NamedCatalog<void *> *>(script[5]);
return pages[id] != NULL;
}
@Corti MP wird immernoch nicht regeniert bei einem Angriff und wenn ich nun Abwehr ausführe crasht mir das Spiel XD
http://img404.imageshack.us/img404/5825/crashcg.png (http://imageshack.us/photo/my-images/404/crashcg.png/)
Welche GCC-Version hast du?
Uhm 4.6.1
das spielt crasht auch nur wenn ich isMonster() abfrage :>
Kann ich die DLL mal haben? isMonster kann nämlich eigentlich gar nicht crashen (außer "battler" wäre ein ungültiger Pointer), schon gar nicht mit Adresse 0x00000001, weil es nämlich nur den (nicht in der Dokumentation verzeichneten) ersten Member von jeder Makerklasse, nämlich vTable, mit einem Wert vergleicht.
Wen es interessiert:
bool Battler::isMonster() {
return vTable == reinterpret_cast<void **>(0x4BD35C);
}
Habe die DLL per PM erhalten.
Es sieht eigentlich so aus als würde der Compiler davon ausgehen dass die Klassenmethoden thiscall (die MS Visual C++ Variante) als Calling Convention verwenden, sie verwenden aber cdecl mit this als erstem Parameter. Dadurch geht das ganze schief. Daher wurdert es mich gerade sehr dass das Problem bei 4.6.1 auftritt (bist du sicher dass du diese Version hast, und nicht etwa Code::Blocks seinen eigenen GCC verwendet? Überprüfe die Pfadeinstellungen mal.), weil das nämlich erst in GCC 4.7.x geändert wurde.
Du könntest versuchen in den Projekteinstellungen einzustellen dass dem GCC der Parameter -mabi=sysv mitgegeben wird.
Ich habe bei meinem Projekt jetzt DynRPG und das verwendbare TastaturMausPlugin angewendet. Die Maus funktioniert auch wunderbar. Es gibt nur zwei Probleme:
1. Die Maus hat keine Begrenzung am Bildrand sondern geht auch ins Leere hinaus. Im Fenstermodus gibt es nirgends eine Begrenzung (ich kann in alle Richtungen darüber hinaus) und im Vollbildmodus kann ich rechts und unten so weit ich will fahren. Gibt es dafür eine Lösung?
2. Hin und wieder (bei ca. einem von fünf Spielstarts) öffnet sich das Spiel und minimiert sich wieder in die Taskleiste. Dann muss ich auf das Icon unten klicken und dann läuft das Spiel normal. Das passiert im Test-Modus des Makers wie auch wenn ich das Spiel vom Spielordner aus starte. Gibt es dafür eine Erklärung?
Achja: Das Problem mit der Startposition des Mauszeigers (rechte untere Ecke), das ich auch schon bei Inelukis Mauspatch hatte, habe ich auch mit dem Plugin. Kann ich die Startposition irgendwie mit der .ini-Datei beeinflussen?
LG Mike
Ich habe folgendes Codestück aus Kaze's Picture Blend Plugin.
bool onEventCommand(RPG::EventScriptLine *scriptLine, RPG::EventScriptData *scriptData, int eventId, int pageId, int lineId, int *nextLineId)
{
if(scriptLine->command == RPG::EVCMD_ERASE_PICTURE)
{
[...]
Verwendung der Parameter aus dem Callback führt zu einem EInfrieren der RPG_RT.exe wenn das auslösende EventCommand ein ErasePicture Befehl ist, der per PicturePointer Patch abgeändert wurde soweit ich das feststellen kann.
Der PicPointerPatch funktioniert ein bisschen anders, er ändert den Parameter nicht sondern er ersetzt den Funktionsaufruf wo die Erase-Picture-Funktion den Parameter abfragt mit einem anderen, der den berechneten Wert statt dem echten zurückgibt. Sollte auf DynRPG keinen Einfluss haben, weil das an einer anderen Stelle ansetzt (du solltest du als Parameter z.B. 10123 sehen). Kannst du mir ein fehlerhaftes Projekt geben damit ich im Debugger sehen kann wo da eine Endlosschleife entsteht?
(Im Notfall kannst du auch den PicPointerPatch in DynRPG neu schreiben, sollte eine Sachen von 10 Minuten sein)
===
Ich habe bei meinem Projekt jetzt DynRPG und das verwendbare TastaturMausPlugin angewendet. Die Maus funktioniert auch wunderbar. Es gibt nur zwei Probleme:
1. Die Maus hat keine Begrenzung am Bildrand sondern geht auch ins Leere hinaus. Im Fenstermodus gibt es nirgends eine Begrenzung (ich kann in alle Richtungen darüber hinaus) und im Vollbildmodus kann ich rechts und unten so weit ich will fahren. Gibt es dafür eine Lösung?
Im Vollbildmodus solltest du rechts und unten sehr wohl eine Begrenzung haben, immerhin ist die Bildschirmauflösung nur so groß wie das Bild ist... das kann eigentlich nicht sein. Im Fenstermodus ist das normal, du kannst ja händisch Begrenzungen einbauen (Werte < 0 als 0 behandeln und so).
2. Hin und wieder (bei ca. einem von fünf Spielstarts) öffnet sich das Spiel und minimiert sich wieder in die Taskleiste. Dann muss ich auf das Icon unten klicken und dann läuft das Spiel normal. Das passiert im Test-Modus des Makers wie auch wenn ich das Spiel vom Spielordner aus starte. Gibt es dafür eine Erklärung?
Das ist merkwürdig, ich kann dir im Moment nicht sagen warum (bei mir passierts nicht).
Achja: Das Problem mit der Startposition des Mauszeigers (rechte untere Ecke), das ich auch schon bei Inelukis Mauspatch hatte, habe ich auch mit dem Plugin. Kann ich die Startposition irgendwie mit der .ini-Datei beeinflussen?
Nein, man könnte aber natürlich ein Plugin schreiben was die SetCursorPos (http://msdn.microsoft.com/en-us/library/windows/desktop/ms648394%28v=vs.85%29.aspx)-Funktion verwendet um die Maus zu einem Punkt zu bewegen.
Werd mal was reproduzierendes zusammen fummeln.
djeurissen
26.02.2013, 21:15
Ich warte eigentlich nur darauf das es tausend kleine Plugins gibt, bis jemand auf die idee kommt alles zussammenzufügen XD
Mir misslang das Nachstellen, wie schlechte Stalker. -_-' :hehe::%
K.a. was es nun war. Nachdem ich den Code ein bischen umgebaut und verschoben hab gibts keine Probleme mehr. O_o
Ein bisschen Code was der eine oder andere gebrauchen könnte (weil diese Funktionen noch nicht im SDK sind):
function getLowerLayerTileId(RPG::Map *map, int x, int y) {
int ret;
asm volatile("call *%%esi" : "=a" (ret), "=d" (RPG::_edx), "=c" (RPG::_ecx) : "S" (0x4A80CC), "a" (map), "d" (x), "c" (y) : "cc", "memory");
return ret;
}
function getUpperLayerTileId(RPG::Map *map, int x, int y) {
int ret;
asm volatile("call *%%esi" : "=a" (ret), "=d" (RPG::_edx), "=c" (RPG::_ecx) : "S" (0x4A80F4), "a" (map), "d" (x), "c" (y) : "cc", "memory");
return ret;
}
function getTerrainId(RPG::Map *map, int tileId) {
int ret;
asm volatile("movl 20(%%eax), %%eax; call *%%esi" : "=a" (ret), "=d" (RPG::_edx) : "S" (0x47D038), "a" (map), "d" (tileId) : "cc", "memory");
return ret;
}
Um damit z.B: die Terrain ID eines Feldes zu bekommen:
int terrainId = getTerrainId(RPG::map, getLowerLayerTileId(RPG::map, x, y));
djeurissen
27.02.2013, 21:04
Gibt es eigentlich ne Möglichkeit das Terrain zu verändern? Also sozusagen Gras in Wasser zu ändern oder so, wäre echt Praktisch und würde mich auf eine idee bringenXD
Bis jetzt nicht, ist mir jetzt auch zu kompliziert mir da was einfallen zu lassen.
Hallöchen ich hab ein kleines Problemchen ^^;
Offensichtlich vertragen sich DynRPG und BetterAep nicht bei allen Funktionen...
17111
(Der Dateipfad in der Fehlermeldung hat so auf meinem Rechner nie existiert)
Der Fehler tritt auf, seit ich eine BetterAep rpg_rt.exe mit Dynrpg verwende und wird genau dann ausgelöst, wenn ich die Funktion nutze, Bilder mit einer ID höher als 50 anzuzeigen. In meinem Fall genau bei Show Picture 143 usw.
Könnte jemand mit DynRPG + BetterAep testen, ob Bilder mit einer ID über 50 im 2k3 v1.08 funktionieren oder ob der gleiche Fehler auftritt? Ansonsten würde ich wohl wieder auf BetterAep verzichten müssen ^^;
@Davy: Danke ^^;
Davy Jones
08.03.2013, 19:25
Der Dateianhang ist ungültig.
Hallöchen ich hab ein kleines Problemchen ^^;
Offensichtlich vertragen sich DynRPG und BetterAep nicht bei allen Funktionen...
17111
(Der Dateipfad in der Fehlermeldung hat so auf meinem Rechner nie existiert)
Der Fehler tritt auf, seit ich eine BetterAep rpg_rt.exe mit Dynrpg verwende und wird genau dann ausgelöst, wenn ich die Funktion nutze, Bilder mit einer ID höher als 50 anzuzeigen. In meinem Fall genau bei Show Picture 143 usw.
Könnte jemand mit DynRPG + BetterAep testen, ob Bilder mit einer ID über 50 im 2k3 v1.08 funktionieren oder ob der gleiche Fehler auftritt? Ansonsten würde ich wohl wieder auf BetterAep verzichten müssen ^^;
@Davy: Danke ^^;
Ich würde mich ausnahmsweise mal selbst zitieren, da das Problem noch immer besteht ;_; (sorry wenn ich nicht lange genug auf eine antwort gewartet habe.. ^^° will nur sicher gehen, dass es nicht übersehen wurde...)
Habe mich etwas schlau gemacht über google und bin auf den gleichen Fehler gestoßen, wenn es um den PicPointer Patch geht:
http://www.multimediaxis.de/threads/107583-PicPointerPatch-Bild-ID-durch-Variable-angeben?p=2298698&viewfull=1#post2298698
http://www.multimediaxis.de/threads/107583-PicPointerPatch-Bild-ID-durch-Variable-angeben?p=2793975&viewfull=1#post2793975
http://www.multimediaxis.de/threads/107583-PicPointerPatch-Bild-ID-durch-Variable-angeben?p=2793688&viewfull=1#post2793688
Danach könnte der Fehler auftreten, wenn:
-die RPG2003.exe nicht an allen Stellen gleich verändert wurde --> bei mir nicht so, hab alles richtig gemacht und im Ultimate auch noch mal getestet
-man Pictures anzeigt/bewegt/löscht, welche es nicht gibt (etwa Picture 0, oder ein Picture mit größerer ID als 50) --> bei mir nicht so, der Fehler kommt bereits beim Show Picture von nur einem gewöhnlichen, importierten Bild mit ID 142
-wenn man andere Transparenzen als 0 oder 100 wählt? --> bei mir nicht so
Ich habe es auch noch einmal mit meiner gewöhnlichen RPG_RT.exe versucht, die nur mit DynRPG gepacht ist und da klappt es...
--> Bestätigt mich darin, dass DynRPG und BetterAep sich nicht vollständig vertragen ;_;
Wie genau hast du den BetterAEP draufgemacht?
Wie genau hast du den BetterAEP draufgemacht?
Ich hab ein neues Projekt gemacht, die BetterAEP RPG_RT.exe reinkopiert, DynRPG drauf gepatcht und dann die exe in meinen richtigen Projektordner ^^°
Interessant, das sollte normal klappen (und andere haben auch so eine Kombo verwendet, also das ist komisch).
Du könntest versuchen, den BetterAEP als IPS nochmal drüberzupatchen: http://cherrytree.at/misc/RPG_RT.ips
Interessant, das sollte normal klappen (und andere haben auch so eine Kombo verwendet, also das ist komisch).
Du könntest versuchen, den BetterAEP als IPS nochmal drüberzupatchen: http://cherrytree.at/misc/RPG_RT.ips
Danke für die Hilfe :) Der Link funktioniert allerdings nicht...
Das andere diese Kombo verwenden, habe ich auch schon gelesen... allerdings haben alle davon ihr Projekt verschlüsselt -.-;
edit: Danke! :) werds gleich mal testen
http://share.cherrytree.at/showfile-9270/rpg_rt.ips
Hey Cherry, wann wird es eine aktuellere Version des DynRPG SDKs geben, mit allen bisherigen Korrekturen und Erweiterungen, die hier herumschwirren? Ich pflege zwar meine eigene Kopie von DynRPG, aber eine aktuelle Version auf deiner Webseite (die Anlaufstelle für DynRPG) wäre nicht schlecht.
Und, wie stehen die Chancen für ein onMapChanged()-Callback?
Stehen schlecht.
Ich hab, wie man sicher merkt, einfach keine Zeit für den Maker. Ich hab eine Datei BUG2.txt, die sieht so aus:
- Bilder >1000 werden bei New Game nicht gelöscht
- RPG::monsters.count scheint nicht zu gehen
- Strange nextLineId thing
- Wrong map (page?) ID on teleport
- Freeze when loading save files if plugins changed
- Transparency on map doesn't work
- "Longer skill window" problem
- Enemy attack sound plays even when OFF, if monster is unable to do its move (??!!)
- If last command parameter is a string, characters may be cut off or added (?)
- In Image.copy "create" (wrong) instead of "init" (right) - I already changed it in the file now
- https://easy-rpg.org/blog/2012/07/crowdsourcing-unknown-savegame-data/#comments / https://github.com/EasyRPG/Readers/blob/master/include/lsd_chunks.h === LcfgSystem => unknown music is the music played before entering vehicle!!!
- https://github.com/EasyRPG/Readers/blob/master/include/lmu_chunks.h / https://github.com/EasyRPG/Readers/blob/master/include/ldb_chunks.h / https://github.com/EasyRPG/Readers/blob/master/include/lmt_chunks.h
- RPG::Actor::_unknown_128 maybe two weapon/lock equipment/auto battle/mighty guard
- Add this bugfix:
@BattleActionBugfix:
push eax
mov eax, [ebp]
mov eax, [eax+4c]
mov eax, [eax+10]
mov byte ptr [eax+4], 4 ; action->kind = RPG::AK_NONE
pop eax
jmp 47f7e0 ; GetBattleCommand2
<0049625A>
call @BattleActionBugfix
http://www.multimediaxis.de/threads/121175-RPG2000-und-2003-Sammelthread-f%C3%BCr-Probleme?p=2982219#post2982219
- BUG (kazesui PM @ rpgmaker.net)
@HookOnEventCommandExecuted:
mov edx, [@NextLineOffset] ; HookOnEventCommandExecuted proc
cmp edx, -1
je @NoOffsetChange
mov [ebx+18], edx ; <<<<<<<<<<<<<<<<<<<<<<<<<< ebx may be NULL here!! (Also, why does it even jump here? [@NextLineOffset] was supposed to be -1)
-----aaaah, @HookOnEventCommandExecuted may be reached without any event command being executed at all! We have to check for edx > 0x10000 or something like that (because ebx may be used for counting before).
- Chili:
Edit2: Ich habe gerade entdeckt, dass wenn man beim Battlelayout "Small Window" ausgewählt hat und dann Choices im Kampf anzeigt,
der Cursor bei den Choices 2-4 nicht an der richtigen Stelle ist, sondern sich immer ein kleinwenig nach oben verschiebt je weiter man runter geht.
Könnte man das noch fixen?
- PageID may be wrong because pages can also be CALLED!!!
- Chili:
Mhhh... Habe jetzt irgendwie noch ein Problem mit den Conditions:
Wenn ein Monster einen Status mit "No Action Allowed" (sowas wie z.B: Schlaf) hat, dann blinkt es trotzdem auf, der Enemy Attack Sound kommt und Punch A wird ausgeführt aber nicht gezeigt, nur der Sound (also die drei Hit sounds). Wenn ich Punch A von den Animations lösche kommt letzteres natürlich nicht mehr. Die Monster greifen nicht an, und machen auch sonst nichts außer das was ich genannt habe, wenn sie den Status haben. Meine Monster besitzen keine Standard Attacke sondern nutzen immer Skills als "standard" Attacken.
- Chili:
Ohne DynRPG funktioniert die Transparenz. Mit DynRPG (mit und ohne Plugins) funktioniert sie nicht. Auch die Event Transparenz scheint nicht zu gehen.
!!!!!!!!!!!!!!!!!!
- Brendon Kelly
Okay well, for some reason, the DynRPG patch must have changed the order of commands processed or something.... in the common event I had, it changed the variable depending on if you were "inside" or "outside" and changed your speed accordingly...after the speed change I had an "erase event" command...the event must have some how erased itself before the other commands could process and the game had nothing to point to, so it crashed. I got rid of the erase event and now it works fine
- In Actor.cpp and System.cpp there was == string comparision, should use .s_str() to force std::string comparison (char* comparisons would be wrong!) FIXED
- CatalogPtr, etc.: Check functions. Like "list->list.count" instead of "list.count"
- @RayCast V4,V5,-1,V5,12,13,4
-1 is recognized as a token rather than a number
FIXED
- Extra stuff might be appended to tokens: http://i112.photobucket.com/albums/n179/Deflaktor/bug_zps2a2253bc.png (FIXED)
- onDoBattlerAction multiple times (Corti):
Grad getested:
Helden (BA_DEFEND):
onDo 1x
onDone 1x
Monster (AK_SKILL):
onDo 11x
onDone 12x (davon 1 mal success)
Immer abwechselnd onDo onDone(!success) ~ 11 mal in Folge, dann passiert die Handlung dann nach ner halben Sekunde kommt "onDone" mit Success.
- doesEventPageExist doesn't work (shouldn't be "map", which is LcfgMap, but LcfMap, ALREADY FIXED!! to ((**reinterpret_cast<void ****>(0x4CDD14))[15])
- 490FF9: MOV EAX, 4956FC << Bugfix damit HP 4 Stellen im Savemenü haben (Platz??)
- RPG::Map +20 = Tiles/Terrain/kA, 4A80CC = GetLowerLayerTile(LcfgMap, x, y), 4A80F4 = GetUpperLayerTile(LcfgMap, x, y), 47D038 = GetTerrainID(LcfgMap, tileId)
function getLowerLayerTileId(RPG::LcfgMap *map, int x, int y) {
int ret;
asm volatile("call *%%esi" : "=a" (ret), "=d" (RPG::_edx), "=c" (RPG::_ecx) : "S" (0x4A80CC), "a" (map), "d" (x), "c" (y) : "cc", "memory");
return ret;
}
function getUpperLayerTileId(RPG::LcfgMap *map, int x, int y) {
int ret;
asm volatile("call *%%esi" : "=a" (ret), "=d" (RPG::_edx), "=c" (RPG::_ecx) : "S" (0x4A80F4), "a" (map), "d" (x), "c" (y) : "cc", "memory");
return ret;
}
function getTerrainId(RPG::LcfgMap *map, int tileId) {
int ret;
asm volatile("movl 20(%%eax), %%eax; call *%%esi" : "=a" (ret), "=d" (RPG::_edx) : "S" (0x47D038), "a" (map), "d" (tileId) : "cc", "memory");
return ret;
}
...ich hätte also genug zu tun.
Ich hab dir jetzt hier aber mal mein MinGW mit DynRPG hochgeladen, d.h. da ist auch der Compiler dabei der garantiert funktioniert (ein relativ alter). Außerdem ist da eine DynLoader.dll die neuer ist als die die vom Patcher erzeugt wird (die hat den Bug gefixt dass wenn der letzte Parameter bei einem Comment ein String oder Token ist dass da zusätzliche Müll-Zeichen angehängt werden können).
http://share.cherrytree.at/showfile-9356/mingw_dynrp.7z
Davy Jones
17.03.2013, 22:31
Verstehe ich das richtig? Wenn ich mein Projekt mit DynRPG patche, bekomme ich einen riesigen Haufen an bekannten und unbekannten Bugs?
Ja leider, wobei das meiste davon das SDK selber betrifft, nicht die Spielmechanik - bis auf das Problem mit der Eventseitenverarbeitung im Kampf (da gibts einen IPS-Patch dagegen), die Tatsache dass Bilder >1000 (die "permanenten") bei New Game nicht gelöscht werden und den Transparenzbug (der ist wohl das Ärgerlichste im Moment, und ich hab auch mal versucht den Fehler zu suchen aber noch nicht gefunden).
Der Rest sind z.T. schon gefixte Sachen bzw. Vermutungen, die vielleicht gar kein wirklicher Fehler sind.
Was ist denn dieser Transparenzbug?
@Davias:
So wie du es schreibst klingt es schlimm. Ist es aber nicht. Mit dem erwähnten Patch, der die Skill Window Duration wieder auf Standard setzt ist wieder alles in Butter. Da du momentan bei Elektra Kingdom den Atb-Entfernungspatch einsetzt hast du was das angeht allerdings sowieso schon wesentlich schlimmere Phänomene in deiner Maker.exe ;-)
Mit DynRPG kann man wunderbar arbeiten.
Davy Jones
18.03.2013, 12:32
- Wo finde ich diesen IPS-Patch für die Eventseitenverarbeitung? Ist dieser Bug mit der fehlerhaften Eventseitenverarbeitung durch den ATB-Entfernungspatch vergleichbar?
- Die Sache mit den "permanenten" Bildern und dem Löschdingens verstehe ich nicht. Sind mit >1000 die Picture-IDs gemeint?
- Der Transparenzbezug ist mir btw wichtig, hab keine Lust das halbe Spiel durchzufixen nur weil der Patch bei mir Grafikmüll verursacht (verwende das sowohl im KS als auch in der normalen Spielwelt).
@Corti:
Das schlimmste was ich kenne: Peter ist dran, kommt im KS nicht mehr zum Zug, wird danach aus der Gruppe geschmissen, nächster Kampf: Absturz. Nach einmal Neuladen ist dies verschwunden und man kann normal weiterspielen.
Cherry hatte mir mal einen Patch dagegen gemacht, aber damals hört es sich so an als wenn der nur für bestimmte Gruppenmitglieder geschneidert wurde und nicht alle möglichen Kombinationen beinhaltete:
http://www.multimediaxis.de/threads/104116-Programmwunsch-und-erstellungsthread-2?p=2989560&viewfull=1#post2989560
Ansonsten hab ich im Moment keine Probleme, auch nicht mit der Eventseitenverarbeitung im KS (weil ich in dieser Hinsicht relativ simpel arbeite).
Stehen schlecht.
Ich hab, wie man sicher merkt, einfach keine Zeit für den Maker. Ich hab eine Datei BUG2.txt, die sieht so aus:
Zensiert.
...ich hätte also genug zu tun.
Kein Problem. Deine Liste ist übrigens zu chaotisch und kann einen schlechten Eindruck von DynRPG vermitteln, wenn man wenig mit dem Inhalt anfangen kann (siehe Davy Jones). Und was machen getLowerLayerTileId, getUpperLayerTileId und getTerrainId in deiner BUG2.txt? ;)
Ich hab dir jetzt hier aber mal mein MinGW mit DynRPG hochgeladen, d.h. da ist auch der Compiler dabei der garantiert funktioniert (ein relativ alter).
GCC 4.4.1 (die mit CodeBlocks 10.05 mitgeliefert wird) funktioniert eigentlich recht gut mit DynRPG, zumindest soweit ich getestet habe. Die GCC in deinem Paket ist auf Version 3.4.5, aus dem Jahr 2004. Ehrlich gesagt, so ein alter Compiler schreckt mich etwas ab, da die Compiler sich seit 2004 stark verbessert haben sollten. Ich bin schon mit GCC 4.4.1 (2009) nicht wirklich zufrieden. :p
Außerdem ist da eine DynLoader.dll die neuer ist als die die vom Patcher erzeugt wird (die hat den Bug gefixt dass wenn der letzte Parameter bei einem Comment ein String oder Token ist dass da zusätzliche Müll-Zeichen angehängt werden können).
http://share.cherrytree.at/showfile-9356/mingw_dynrp.7z
Cool, danke.
@Kyuu: Ich dachte bisher, 4.6.1 ist okay, aber da gabs anscheinend ein Problem mit RPG::Battler::getMaxHp, was mit 3.4.5 nicht vorhanden war. Keine Ahnung ob 4.4.1 da geht oder nicht. Ich weiß übrigens selber nicht warum mein Compiler so alt ist, weil 2004 hatte ich mit C++ noch null am Hut.
Ja, die Liste ist chaotisch, ist auch keine öffentiche. Und es sollte eher TODO.txt heißen, das stimmt. Einige Sachen sind nämlich auch einfach neue Ideen bzw. Details die ich erst nachher rausgefunden habe und integrieren müsste (wie RPG::DBActor::_unknown_128).
@Kyuu: Ich dachte bisher, 4.6.1 ist okay, aber da gabs anscheinend ein Problem mit RPG::Battler::getMaxHp, was mit 3.4.5 nicht vorhanden war. Keine Ahnung ob 4.4.1 da geht oder nicht.
Habe es gerade mit 4.4.1 getestet und es funktioniert einwandfrei. Eine Test Suite wäre natürlich optimal, mit der man automatisiert die Kompatibilität mit einem Compiler prüfen könnte.
Eine andere Frage: Sind die 2000 Pictures, die mit DynRPG zwangsläufig kommen wirklich so eine gute Idee? Zum einen bin ich mir ziemlich sicher, dass niemand (bei klarem Verstand) so viele Pictures brauchen wird und zum anderen, (das ist nur eine Vermutung, da ich die Interna nicht kenne) so eine große Menge an Pictureobjekten, die jeden Frame abgearbeitet werden müssen, könnte wertvolle Zeit verschwenden, die einem Plugin gerade fehlen könnte. Ich vermute, dass DynRPG noch weitere Änderungen im Programmablauf vornimmt, die Zeiteinbußen einbringen. Wäre vielleicht eine abgespecktere Version von DynRPG möglich, ohne die 2000 Pictures und eventuellen anderen Kram, den man nicht wirklich braucht, der aber wertvolle Zeit verschlingt?
Möglich wärs schon, aber die Pictures verbrauchen, was ich so sehe, nicht wirklich viel Zeit (außer man zeigt auch wirklich alle an).
Ich halte eigentlich nichts von Mikrooptimierung, daher, wenn du sagst, dass inaktive Pictureobjekte schnell genug durchlaufen werden, habe ich im Moment nichts einzuwenden.
BTW: Ist es möglich mit DynRPG einen Tastendruck zu simulieren, oder gleich auf den internen Key Cache zuzugreifen? Ich würde gerne den Umweg über die WinAPI-Funktion SendMessage() vermeiden.
BTW²: Es scheint nicht zu funktionieren die Musik im RPG::system-Objekt zu ändern. Im RPG::dbSystem-Objekt funktioniert es allerdings. Bei den Sounds scheint es auch Probleme zu geben.
Was ist die beste Möglichkeit zu ermitteln auf welcher Karte man gerade spielt? Den Wechsel der Karte zu erkennen würde auch schon ausreichen
Und ist es irgendwie möglich das Lesen eines switches zu erkennen? (und den Rückgabewert zu ändern) Ja, brauch das wirklich beim Lesen, nicht beim Schreiben ^^
Was ist die beste Möglichkeit zu ermitteln auf welcher Karte man gerade spielt? Den Wechsel der Karte zu erkennen würde auch schon ausreichen
Also ich weiß nicht ob es die beste Möglichkeit ist, aber du wirst mMn nicht daran vorbeikommen, auf jeder Map einen PP mit Erase Event zu packen, der vor dem Erase Event entweder selbst testet, ob die Map gewechselt wurde oder der einen Common Event callt, der das prüft. Funktionieren tut es dann so, dass du ein Set Variable mit der Map ID füllst. Dazu musst du dann wissen, welche Map ID welcher Map entspricht. Danach kannst du damit "rechnen"...
Und ist es irgendwie möglich das Lesen eines switches zu erkennen? (und den Rückgabewert zu ändern) Ja, brauch das wirklich beim Lesen, nicht beim Schreiben ^^
Ich verstehe nicht, was der Unterschied von lesen und schreiben eines Switches sein soll? Bzw. was du erreichen willst?
Das klingt so als willst du erkennen ob ein PP prüft ob ein Switch gesetzt ist? Wenn du das willst, dann kannst du doch gleich die im 2k3 enthaltene Funktion nutzen und suchen, welche Events auf den Switch zugreifen ^^; (hoffe ich hab das richtig verstanden)
Was ist die beste Möglichkeit zu ermitteln auf welcher Karte man gerade spielt? Den Wechsel der Karte zu erkennen würde auch schon ausreichen
Öh, lass immer bei Betreten einer Map eine Vari einen bestimmten Wert annehmen und frag den ab.
Und ist es irgendwie möglich das Lesen eines switches zu erkennen? (und den Rückgabewert zu ändern) Ja, brauch das wirklich beim Lesen, nicht beim Schreiben ^^
Conditional Branch: "Branch if Switch XXX is ON/OFF ..."
MagicMaker
25.04.2013, 20:44
Was ist die beste Möglichkeit zu ermitteln auf welcher Karte man gerade spielt?
<>SetVariable [0001:Map] = Object[Player]'s MapID
Ich frage schon absichtlich im DynRPG Thread, kommt mir nicht mit Maker-Eventcode. Will bisschen mit DynRPG rumspielen :)
<>SetVariable [0001:Map] = Object[Player]'s MapID
Hmm stimmt. Da muss ich wohl mal testen, ob man über RPG::hero->mapId die aktuelle Map ID bekommt.
Das klingt so als willst du erkennen ob ein PP prüft ob ein Switch gesetzt ist? Wenn du das willst, dann kannst du doch gleich die im 2k3 enthaltene Funktion nutzen und suchen, welche Events auf den Switch zugreifen ^^; (hoffe ich hab das richtig verstanden)
Den Satz versteh ich nicht.
Also geht wirklich darum, dass ich alle Switch-Leseversuche mitbekomme und so das Ergebnis des Lesevorgangs verändern kann (für Schreiben gibts nen Callback, das ist daher kein Problem)
Bei Events ist das einfach, da könnte ich über onEventCommand alle Events behandeln, die Switche lesen und schreiben können, z.B. EVCMD_CHANGE_SWITCH. Gibt aber noch einen weiteren Fall, wo Switche vorkommen: Die Überprufung, ob ein(e) Event(seite)/ein CommonEvent die Startbedingungen erfüllt hat. Da würde ich Switch lesen auch gerne behandeln.
Oder vielleicht weiß Cherry zufällig die Adressen im ASM-Code wo das passiert (Startbedingungen von Events überprüfen)? Die jmp-Anweisungen patch ich dann selber rein.
RPG::hero->mapId ist korrekt.
Übrigens hatte DynRPG am Anfang onGetVariable und onGetSwitch Callbacks. Diese hab ich allerdings entfernt weil das Spiel einfach nur saulangsam wurde, sogar wenn keine Plugins das verwendet haben (rein durch den Aufruf der Funktion in dynloader.dll), weil das Auslesen von Switches und Variablen einfach extrem oft intern stattfindet.
Und warum willst du das Lesen des Switches abfangen? Willst du eine Art Selfswitch-Ding machen? Die Funktion zum Lesen eines Switches ist übrigens an VA 0x48B324, eax ist RPG::system, edx ist die Switch-ID. Rückgabewert ist 0 oder 1 in al.
Damit fängst du allerdings kein RPG::switches[xyz] von DynRPG-Plugins ab, weil diese direkt auf das Switcharray zugreifen (schau dir switches.h an).
Vielleicht kannst du einfach den Switch setzen, statt das Lesen abzufangen? Mit RPG::map->updateEvents() erreichst du dass die Startbedingungen neu evaluiert werden nachdem du den Switch geändert hast.
RPG::hero->mapId ist korrekt.
Übrigens hatte DynRPG am Anfang onGetVariable und onGetSwitch Callbacks. Diese hab ich allerdings entfernt weil das Spiel einfach nur saulangsam wurde, sogar wenn keine Plugins das verwendet haben (rein durch den Aufruf der Funktion in dynloader.dll), weil das Auslesen von Switches und Variablen einfach extrem oft intern stattfindet.
Wundert mich, dass das langsamer wurde, gehe mal davon aus, dass du einfach in eine Funktion der DLL reinjmpst?
Und warum willst du das Lesen des Switches abfangen? Willst du eine Art Selfswitch-Ding machen? Die Funktion zum Lesen eines Switches ist übrigens an VA 0x48B324, eax ist RPG::system, edx ist die Switch-ID. Rückgabewert ist 0 oder 1 in al.
Ja, genau sowas wollte ich mal versuchen :)
Damit fängst du allerdings kein RPG::switches[xyz] von DynRPG-Plugins ab, weil diese direkt auf das Switcharray zugreifen (schau dir switches.h an).
Ja, das ist dann Pech. Müssen die Pluginentwickler halt beachten. ;)
Und ach stimmt ja, muss mit gcc compilen, die ihre Assembler-Syntax ist so hässlich :/
Edit: und __attribute__ ((naked)) funktioniert unter x86 nicht, toll, macht alles nur unnötig kompliziert -.-
Vielleicht kannst du einfach den Switch setzen, statt das Lesen abzufangen? Mit RPG::map->updateEvents() erreichst du dass die Startbedingungen neu evaluiert werden nachdem du den Switch geändert hast.
Was spricht hiergegen?
Hey. Stichwort: "ShakeScreen", gibt es die Möglichkeit das per DynRPG zu verwenden/zu setzen?
Vom Makerbefehl her scheint das ein globales Setting zu sein, Shakestärke, Speed, Restdauer~ kriegt man das irgendwie zugegriffen?
@Corti
Eine Möglichkeit wäre wohl direkt auf die Pixel bzw. das Bitmap vom RPG::screen->canvas zuzugreifen und damit eine Art ShakeScreen zu erzeugen. Ansonsten würde mir keine Möglichkeit einfallen diesen Befehl per DynRPG zu erzeugen. Außerdem wirkt der ShakeScreen des Makers auf alles, außer die Font!
Du kannst direkt beim ausführen des EventCommands darauf zugreifen. In onEventCommand().
Edit: Dabei kannst du dann auch direkt auf die EventCommandParameter zugreifen und diese eben auch ändern und/oder dem Wert gewisser RPG::variables verpassen. Du kannst übrigens auch durch ein EventScript "springen", wenn du *nextScriptLine clever verwendest ;)
Edit:
Weitere Idee: Z.B. Screenshottool (SFX.exe) per DynRPG aufrufen und einen Screen machen lassen und diesen dann shaken. Hätte aber den Nachteil, dass es dann ein fixes Bild wäre.
PeAcE
MorDen
Die Frage war auch eher an Cherry gerichtet.
Ich hab's wenigstens versucht ^.^
Ich weiss das zu würdigen, danke :-)
Hi. Ich dachte ich frag mal hier bei euch nach. ;)
Gibt es eine Möglichkeit mehrere Variablen miteinander zu vergleichen um die größte bzw. kleinste Variable herauszufinden?
Die Frage kam im Probleme-Sammelthread auf und mich würde auch interessieren, ob sowas möglich ist und - wenn ja - wie man das angehen könnte.
Wenn die Variablen alle in einer Reihe liegen, also z. B. 401, 402, 403, 404, geht das einfach und ohne Plugins mit einem Pointer und einer Schleife.
Hier ein Beispiel für den größten Wert:
pointer = 401
vergleich = 0
ergebnis = 0
label #1
vergleich = variablen[pointer]
if vergleich > ergebnis
ergebnis = vergleich
endif
if pointer < 404
pointer += 1
goto label #1
endif
Danke. Aber wenn die Varis jetzt nicht in einer Reihe liegen, sondern wild gestreut sind? :/
Klaro. Geht sogar ohne DynRPG. Kannst du dir selbst in einem CE bauen. Musst halt nur den Index der zu vergleichenden Variablen in einen Datenbereich schreiben und dir dann einen CE basteln, der die an diesen Punkten liegenden Daten miteinander vergleicht.
djeurissen
23.05.2013, 13:37
Tagchen, ich hätte da mal ne frage...
Ich benutze den Callback "onSetSwitch" und das klappt auch super, aber gibt es eine Möglichkeit nun die EventID und die MapID vom Event zu bekommen, das diesen Befehl ausführt?
Es gibt den Callback "onEventCommand" da bekommst du Daten zum ausführenden Event gleich mit.
http://rpg-maker.cherrytree.at/dynrpg/group__callbacks.html#ga3449a167d8426369cb44142110ee9776
Im Parameter (EventCommand command) kannst du den Typen des Befehls abfragen, hier gibts mögliche Commands.
http://rpg-maker.cherrytree.at/dynrpg/namespace_r_p_g.html#a712802617b9e73c5ff143a88beab89d5
djeurissen
23.05.2013, 14:19
Sry, bin noch relativ neu mit C++ und generell verstehe ich vieles noch nicht XD...
Also ich benutze "onEventCommand" aber was muss dan gemacht werden, damit ich abfragen kann ob nun ein switch verändert wird? Weil das hier klappt nicht wirklich so wie ich es mir gedacht habe...
if (RPG::EventCommand(EVCMD_CHANGE_SWITCH(1))
{
return false;
}
Und wenn ich schon dabei bin, ich verstehe nicht wann ich -> benutzen muss und wann ::
Ich habs bisher selbst nicht benutzt und hab jetzt auch grad keine Möglichkeit es zu testen daher mal blind gescriptet.
onEventCommand ( RPG::EventScriptLine * scriptLine, RPG::EventScriptData * scriptData, int eventId, int pageId, int lineId, int * nextLineId )
{
// in scriptline ist enthalten welcher Befehl verwendet wurde.
// scriptLine hat einen Member namens "command" vom Typ RPG::EventCommand, das ist ein enum, aus dem Namensraum RPG
// (http://rpg-maker.cherrytree.at/dynrpg/class_r_p_g_1_1_event_script_line.html)
if(scriptLine->command == RPG:: EVCMD_CHANGE_SWITCH) // darum hier der Vergleich mit dem Enumwert, der dem Switchbefehl entspricht
{
}
return true;
}
Und wenn ich schon dabei bin, ich verstehe nicht wann ich -> benutzen muss und wann ::
:: ist wenn du an einen Namensraum willst, z.B. RPG, kennst du von std::string, dort ist std der Namensraum.
-> wenn du auf Inhalte von etwas zugreifen willst, dass dir als Pointer vorliegt, wie hier scriptLine, siehe Sternchen ;-)
Schau dir am besten dies hier mal an:
http://www.youtube.com/watch?v=YurDkWSh41M
erklärt das einfach und schnell. Die insgesamt 20 Minuten sinds wert wenn man da noch unsicher ist.
Ich kann dich beruhigen Corti; es funktioniert genau so^^ Benutze das ziemlich viel, muss ich sagen.
Wobei man aber dazu sagen muss, dass die jeweiligen Parameter der einzelnen EventCommands nicht von Cherry dokumentiert sind, was heißt dass man die selbst herausfinden muss. Ich habe mir dafür schon den ein oder anderen enum geschrieben^^
[Nachtrag:]
Wobei deine Beschreibung zum "::" nicht *ganz* korrekt ist. Es ist der ScopeResolution-Operator, auch Geltungsbereichsauflösungsoperator, wie er im Deutschen ja auch so schön heißt und er dient allgemein dazu den Geltungsbereich aufzulösen und das nicht nur für NameSpaces, sondern z.B. auch für statische Member oder Methoden einer Klasse. Dieser werden üblicherweise auch durch Klassenname::StatischerKlassenmember aufgerufen ;)
Der "->" hingegen dereferenziert einen Zeiger und greift auf den Member des dereferenzierten Objektes zu, alternativ könnte man dort nämlich auch schreiben (*scriptLine).command, was eben genau das Gleiche wie scriptLine->command bedeutet.
PeAcE
MorDen
Hört auf Morden, dessen Beschreibung ist genauer ^.^
djeurissen
23.05.2013, 15:05
Ist irgendwie blöd hier nochmal was zu fragen, aber ich habe eben noch ein letztes Problem XD...
Nun kann ich zwar "EVCMD_CHANGE_SWITCH" abfragen, aber wie kann ich nun herausfinden ob der Switch auf True oder False gesetzt wird. Ich dachte ja an Value, aber das funktioniert nicht ._.
Edit: Oder ich weiß welcher Switch überhaupt verändert wird...
Ich kann dir jetzt keine genaue Antwort geben, da ich nicht zu Hause bin, aber normalerweise solltest du diesen Wert bekommen, indem du auf scriptLine->parameters[1] zugreifst, denn scriptLine->parameters[0] sollte - wenn ich nicht ganz falsch liege - die SwitchID beinhalten (so, wie sie auch im Maker selbst indexiert wird, also beginnend bei "1").
Genaueres kann ich dir aber erst sagen, wenn ich zu Hause bin, wobei ich mir relativ sicher bin, dass das so hinhauen müsste.
Edit:
Hinweis: Bei onEventCommand ist jeder Eintrag im parameters[]-Array ein Zahlenwert und es gibt maximal einen String-Wert, welcher sich mit scriptLine->stringParameter auslesen und manipulieren lässt!
PeAcE
MorDen
Siehe Morden, die Paramter der einzelnen EventCommands sind nicht dokumentiert. Musst selber mal schauen was dir da als Parameter übergeben wird und was bei verschiedenen Aufrufen so drin ist.
djeurissen
23.05.2013, 15:12
Achso, ich dachte ich müsste über "EVCMD_CHANGE_SWITCH" auf das ganze zugreifen, aber das ist alles schon in nem Array drinne...
Jetzt habe ich es verstanden, danke XD
Du greifst quasi auf das SkriptKommando selbst zu! Dabei musst du dir das so vorstellen, dass du alle Parameter auslesen kannst, die du in diesem SkriptKommando im Maker selbst auch vergeben kannst! Diese Parameter kannst du aber nicht nur auslesen, sondern halt auch manipulieren.
PeAcE
MorDen
djeurissen
23.05.2013, 16:04
Okay, vielen dank^^
Hab mir auch ein Enum erstellt um den Überblick zu behalten, wobei es nicht gerade einfach war herauszufinden wo der unterschied zwischen parameters[1] und parameters[2] liegt XD
@djeurissen
Was wäre denn der Unterschied, den du herausfinden konntest?
@Topic
Um euch mal die Arbeit zu erleichtern herauszufinden, welche Parameter ein EventCommand hat möchte ich euch hier mal mein kleines »EventTracker« PlugIn zur Verfügung stellen.
Im Endeffekt ist es extrem billig und macht nichts weiter, als jedes einzelne EventCommand zu tracken und mit seinem Namen und Parametern in einen stream zu schreiben. Dieser wird beim Beenden dann in die Datei "dbg.txt" im root-Verzeichnis des Spieles gespeichert.
Hier mal ein Beispiel, wie ein solches EventCommand vom Tracker abgespeichert wird (hier im Beispiel das ShowPicture-Command):
Command: Show picture (11110)
EventID: 1
PageID: 6
lineID: 19
nextLineID: -1
Parameter-0 --> 15
Parameter-1 --> 0
Parameter-2 --> 160
Parameter-3 --> 224
Parameter-4 --> 0
Parameter-5 --> 100
Parameter-6 --> 100
Parameter-7 --> 1
Parameter-8 --> 100
Parameter-9 --> 100
Parameter-10 --> 100
Parameter-11 --> 100
Parameter-12 --> 0
Parameter-13 --> 100
Parameter-14 --> 100
Parameter-15 --> 68
StringParameter -->tb-facebox
Das tut der Tracker mit allen EventCommands, außer dem Comment - da ich das für nicht nötig hielt das mit zu tracken.
Hier der Download: EventTracker.dll (https://dl.dropboxusercontent.com/u/47382298/rm2k3/dynrpg/EventTracker.dll)
PeAcE
MorDen
Das Teil schwirrt schon ewig in meinem TestProjekt rum^^ Und wenn ich damit jemanden helfen kann, dann bin ich schon froh =D
Ich möchte aber noch dazu sagen: Verwendet es bitte NUR für solche Einsatzzwecke, da es bei sehr vielen EventCommands doch schon eine beträchtliche Datenmenge erzeugt und diese ja auch im Speicher hält. Anfangs hatte ich noch sofort nach jedem EventCommand speichern lassen, das hat sich aber als sehr, sehr langsam erwiesen - deshalb entschloss ich mich die Datei erst beim Beenden speichern zu lassen.
Also: Zum rausfinden der Parameter -> PlugIn reinkopieren und wenn ihr eure Daten habt, schmeißt es wieder raus. Das PlugIn meldet ja, ob es geladen wurde oder nicht.
Ist nur eine Empfehlung von mir, was ihr natürlich macht ist eure Sache ;)
PeAcE
MorDen
[Nachtrag:]
Vielleicht sollten wir mal irgendwie die EventCommands zusammentragen - ich denke das würde vielen von uns einiges an Zeit ersparen.
Deswegen fange ich mal an - hier meine enums zu ShowPicture und MovePicture, leider weiß ich nicht, was der letzte Zahlenparameter bei ShowPicture bedeutet; deshalb habe ich ihn als "UNKOWN" gekennzeichnet:
// Event parameter list for "Show Picture" command //
// Filename saved as string parameter!
enum EVPRM_SHOW_PICTURE {
EVPRM_SHOW_PICTURE__PICTURE_ID,
EVPRM_SHOW_PICTURE__COORDINATE_OR_VARIABLE,
EVPRM_SHOW_PICTURE__POSITION_X,
EVPRM_SHOW_PICTURE__POSITION_Y,
EVPRM_SHOW_PICTURE__PICTURE_SCROLLS_WITH_MAP,
EVPRM_SHOW_PICTURE__MAGNIFICATION,
EVPRM_SHOW_PICTURE__TRANSPARENCY_TOP,
EVPRM_SHOW_PICTURE__TRANSPARENCY_BOTTOM,
EVPRM_SHOW_PICTURE__USE_MASK_COLOR,
EVPRM_SHOW_PICTURE__COLOR_RED,
EVPRM_SHOW_PICTURE__COLOR_GREEN,
EVPRM_SHOW_PICTURE__COLOR_BLUE,
EVPRM_SHOW_PICTURE__COLOR_SATURATION,
EVPRM_SHOW_PICTURE__EFFECT,
EVPRM_SHOW_PICTURE__EFFECT_VALUE,
EVPRM_SHOW_PICTURE__UNKNOWN_1
};
// Event parameter list for "Move Picture" command //
// There's no filename parameter for the "Move Picture" command
enum EVPRM_MOVE_PICTURE {
EVPRM_MOVE_PICTURE__PICTURE_ID,
EVPRM_MOVE_PICTURE__TRANSITION_TIME,
EVPRM_MOVE_PICTURE__COORDINATE_OR_VARIABLE,
EVPRM_MOVE_PICTURE__POSITION_X,
EVPRM_MOVE_PICTURE__POSITION_Y,
EVPRM_MOVE_PICTURE__MAGNIFICATION,
EVPRM_MOVE_PICTURE__TRANSPARENCY_TOP,
EVPRM_MOVE_PICTURE__TRANSPARENCY_BOTTOM,
EVPRM_MOVE_PICTURE__COLOR_RED,
EVPRM_MOVE_PICTURE__COLOR_GREEN,
EVPRM_MOVE_PICTURE__COLOR_BLUE,
EVPRM_MOVE_PICTURE__COLOR_SATURATION,
EVPRM_MOVE_PICTURE__EFFECT,
EVPRM_MOVE_PICTURE__EFFECT_VALUE,
EVPRM_MOVE_PICTURE__WAIT
};
djeurissen
23.05.2013, 17:42
Wäre dafür nicht ein eigener Thread besser geeignet, der dann alle Enum(s?) im Hauptthread zussammenfasst?
Naja, ich zeig hier einfach mal meinen Enum(Und wer die hier besser bennenen kann, kann das gerne tun ._.):
enum EVCMD_CHANGE_SWITCH {
EVCMD_CHANGE_SWITCH_Switch_to_Change,
EVCMD_CHANGE_SWITCH_SwitchID_Beg,
EVCMD_CHANGE_SWITCH_SwitchID_End,
EVCMD_CHANGE_SWITCH_Operation};
So, wo liegt jetzt der Unterschied zwischen "SwitchID_Beg" und "SwitchID_End", beide geben die SwitchID aus. Sollte man jedoch "Switch Range" benutzen, kann man mit diesen beiden Variablen die Range festlegen. Das habe ich leider ohne dein Plugin herausfinden müssen, Gott war das eine Qual...
PS: Wie macht ihr das mit dem "Codefenster"
Edit: Den String habe ich jetzt nicht rausgesucht, kann mir aber gut vorstellen das es der Name des Switches ist...
Ich denke, wenn das gerechtfertigt ist dafür einen eigenen Thread aufzumachen, wäre das wohl angebracht^^
Dann wirst du ja beim nächsten Mal hoffentlich nicht mehr solch eine Qual beim rausfinden erleiden müssen xD Und ich habe gerade nachgeschaut: Das Change Switch Command hat keinen StringParameter. Dieser wäre dann beim abfragen einfach leer.
Das Code-Fenster erzeugst du, wenn du in eckigen Klammern <CODE></CODE> schreibst. Also anstatt der spitzen Klammern die eckigen []. Dazwischen denn den Code^^
PeAcE
MorDen
Zum Thema Event-ID und so: Ich muss sagen dass das leider noch unzuverlässig ist, insbesondere die Page-ID. Also Event-ID für Map-Events sollte eigentlich funzen, aber Page-ID gibt manchmal einen falschen Wert an.
Zum Thema "was bewirken Parameter" - hier ist der Sourcecode von jenem Modul was u.a. im EasyEventExporter, der RMEventFactory und dem RM2k3-Debug-Addon verwendet wird, was Eventcode als Text ausgibt. Da kann man gut die Bedeutungen rauslesen: http://pastebin.com/WxhXpFP8
Zur Erklärung des Codes hier noch das Modul was das Clipboard-Interface darstellt und die Eventdatenstrukturen liest/schreibt, in diesem sind einige Enums definiert die vom anderen Modul verwendet werden: http://pastebin.com/KGKizyNt
Hiermit sieht man z.B. dass bei Show Picture Parameter 7 nicht Transparency Bottom sondern "Transparente Farbe verwenden?" ist, während Parameter 14 Transparency Bottom ist (das kommt daher dass dieser Wert erst im 2k3 eingeführt wurde und daher hinten angehängt). Zeile 1079/1080 der ersten Datei.
@djeurissen: Der String ist bei Set Switch gar nichts.
EDIT: Zur Analyse könnte auch dieses Tool nützlich sein: http://suppy.bob.buttobi.net/tool/tb.html (Direktdownload: http://suppy.bob.buttobi.net/tool/tkoolbridge205.lzh) << Links in die Adresszeile einfügen, sonst kommt ein Fehler
Ihr kopiert einfach eine oder mehrere Eventzeilen aus dem Maker und klickt dann den Button oben links und seht die Parameter.
(Das Tool ist eigentlich dazu gedacht, Events in - verschickbaren und editierbaren - Text und zurück zu wandeln.)
Oh, da ist mir wohl ein ziemlich heftiger Schlusigkeitsfehler unterlaufen - wie peinlich xD
Ich muss aber zu meiner Verteidigung sagen, dass ich die enums zwar "komplett" geschrieben, aber nie komplett genutzt habe ^^''
@Cherry
Auf jeden Fall Danke Cherry - das hilft ungemein dabei. Ist außerdem mal sehr interessant in deinen Quellcode zu schauen ;)
Eine kleine (unaufdringliche) Frage: Planst du eigentlich DynRPG noch weiterzuentwickeln? Ich weiß, dass du nicht viel Zeit hast und mehr Arbeit als Zeit - ich frage nur ganz pauschal, ob man sich vielleicht innerhalb des nächsten halben Jahres noch über ein DynRPG-Update freuen kann? Ansonsten möchte ich dir auf jeden Fall meinen vollen Respekt zollen - ich verfolge dich und deine Arbeit ja schon von Beginn an, wenn auch sonst immer als stiller Mitleser xD
PeAcE
MorDen
Es wär mir eine Freude, dran zu basteln. Aber ich bin jetzt nicht nur selbstständig und grade sehr beschäftigt, sondern ich bin jetzt dann auch noch CEO in einer Firma, um deren Gründung wiederum ich mich kümmern muss (weil die Geschäftspartner im Ausland sind). :/
Who knows.
Cherrüüüü ~ Findest du denn Zeit fürs BMT? ^^
Ja, das schon, keine Sorge.
Es ist nur so dass bei solchen Sachen wie bei DynRPG und allem was mit dem Maker zu tun hat ich mich immer so reinhänge dass dann alles andere eine Zeitlang im Hintertreffen bleibt, und das muss irgendwie so sein weil dann entstehen normalerweise die genialsten Sachen ;) Ich kann irgendwie nicht so was wie "2 Stunden die Woche an Makerzeugs arbeiten" machen, da kommt nichts dabei raus.
Stichwort "onDrawBattleActionWindow", das wird pro Frame 2 mal ausgelöst. Was das erste ist weiss ich nicht. Das zweite ist das Fenster von wegen "Angreifen, Verteidigen, Items" etc.
Beim ersten funktioniert das isVisible-Flag nicht, der Callback kommt auch wenn da nichts zu sehen ist.
Anmerkung: Ich hab den Patch drauf, der das "Kämpfen - Autokampf - Flucht"-Menü entfernt. Kanns damit zusammen hängen?
Mein neuer Lieblingsbug:
bool onDrawBattleActionWindow ( ...)
{
return true;
}
----> Fenster wird angezeigt
bool onDrawBattleActionWindow ( ...)
{
return false;
}
----> Fenster wird NICHT angezeigt
bool onDrawBattleActionWindow ( ...)
{
RPG::screen->canvas->draw (...) etc.
return false;
}
----> Fenster WIRD angezeigt (!!!!)
Neuer DynLoader mit Direktpatch-Feature!
Wird dann auch in die (hoffentlich bald mal kommende ;)) nächste DynRPG-Version integriert.
http://share.cherrytree.at/showfile-10117/dynloader.dll << Die dynloader.dll im Projekt hiermit ersetzen.
Erstens mal ist da auch das Problem mit dem Müll am Ende von Stringparametern von Comments gefixt, und zweitens gibt es jetzt zwei Arten von Direktpatches:
1) IPS-Dateien
Ganz simpel: Ihr legt einen Ordner "DynPatches" an und schmeißt da einfach alle IPS-Dateien rein. Die Patches werden dann ohne RPG_RT.exe-Modifikation "on-the-fly" angewendet, d.h. das Entfernen eines Patches ist ganz einfach - nur die Datei wieder löschen (oder die Dateiendung umbenennen)!
Beispiel für eine sinnvolle Anwendung wäre z.B. BetterAEP als IPS-Datei: http://share.cherrytree.at/showfile-10054/betteraep.ips
Der PicPointerPatch liegt beispielsweise schon von Haus aus als IPS-Datei vor, da reicht reinkopieren. :)
2) "Quick Patches"
Für ganz kleine Patches ist es fast zu viel verlangt, eine IPS-Datei zu erzeugen, außerdem gibt es ja solche wo der Benutzer einen Wert (z.B. eine Koordinate) selber einstellen können soll. Dazu gibt es Quick Patches. Diese werden in die Section "QuickPatches" in der DynRPG.ini geschrieben und haben folgendes Format:
BeliebigerName=Adresse,Daten,Adresse,Daten,...
Die Adresse ist eine hexadezimale VA, die Daten können drei Formen haben:
a) Hexstring: Eine Aneinanderreihung von Bytes in Hexadezimalschreibweise (Leerzeichen werden ignoriert und können also zur Übersicht verwendet werden). Beispiel: 49E148,EB71 - schreibt die 2 Bytes EB 71 an Adressen 49E148 und 49E149.
b) Dezimale Zahl mit %-Prefix: Schreibt ein Byte an die angegebene Adresse, die Zahl ist dabei nicht hexadezimal angegeben (negative Zahlen möglich). Beispiel: 49E0BC,%48 - schreibt ein Byte 30 an Adresse 49E0BC.
c) Dezimale Zahl mit #-Prefix: Schreibt einen 32-Bit-Integer an die angegebene Adresse, die Zahl ist dabei nicht hexadezimal angegeben (negative Zahlen möglich). Beispiel: 49E1F1,#270 - schreibt die 4 Bytes 0E 01 00 00 an Adressen 49E1F1-49E1F4.
b) und c) sind dafür gedacht dass man leicht selber Werte eintragen kann (also Expertenuser A gibt Ottonormaluser B so eine Patchzeile und User B braucht nur die Zahlen nach % bzw. # seinen Bedürfnissen anpassen ohne irgendwas hexadezimal umrechnen zu müssen, Bytes zu vertauschen oder sonstwas).
Hier ein Beispiel wie sowas aussehen kann:
[QuickPatches]
; Versteckt die EXP im Hauptmenü und im Statusscreen
VersteckeEXP=49E148,EB71,49F1CA,EB67,49F095,EB21
; Setzt die Koordinaten des Titelbildschirmfensters auf 144/56
VerschiebeTitelbildschirmFenster=490821,#144,490828,#56
(Hinweis zum Titelfensterbeispiel: Der Maker verwendet da die X-Koordinate für die Mitte des Fensters aber die Y-Koordinate für die obere Kante.)
mfG Cherry
PS: Wer Dateioffsets in virtuelle Adressen umrechnen will: Für Offsets 0 - 400 addieren wir 400000, für Offsets 400 - C9200 addieren wir 400C00, für Offsets C9200 - CD400 addieren wir 400E00. Also normalerweise braucht man nur 400C00 zu addieren.
Exzellent Master Cherry! =D
Endlich kann ich die nutzlosen »end«-Token am Ende mancher Comment-Befehl rausschmeißen. Vor allem, weil diese dynloader.dll funktioniert - im Gegensatz zu der, die du damals mal gepostest hast. Ich glaube es war bei rmn. Diese hatte bei mir komischerweise nicht funktioniert, aber ich hatte mich dann nicht weiter damit auseinandergesetzt und einfach die »originale« weiter verwendet >.<
Auf jeden Fall zwei sehr geniale Features, muss ich sagen. Vor allem für Sachen, die sich so mit DynRPG nicht, oder noch nicht realisieren lassen =D
EDIT:
Cherry! Es gibt doch Probs mit der neuen dynloader.dll! Sie funktionierte in meinem Testprojekt mit dem ich die ganze Zeit rumgespielt habe perfekt. Als ich dann ein neues angelegt hatte und dort ein - auch mit der neuen dynloader.dll - funktionierendes PlugIn dort reingepackt habe, meldet mir DynRPG, dass die dll nicht geladen werden konnte. Dazu muss ich sagen, dass sich in meinem Testprojekt mehr als ein PlugIn und auch die ganzen Entwicklungsdaten befinden, in dem neu erstellten nicht. Aber wenn ich in das neue die alte dynloader.dll hineinkopiere, startet das PlugIn problemlos. Ich versuche das heute Abend mal genauer zu reproduzieren und geb' dir dann Bescheid.
EDIT2:
Das Problem tritt nur auf, wenn ich dieses eine PlugIn einzeln im »DynPlugins«-Ordner habe. Schiebe ich noch ein anderes dazu, dann funktioniert es o.O Mit der alten dynloader.dll funktioniert es sowohl einzeln, als auch mit anderen PlugIns.
PeAcE
MorDen
Fixed: http://share.cherrytree.at/showfile-10117/dynloader.dll
djeurissen
15.06.2013, 15:56
Tagchen,
gibt es eine Möglichkeit abzufragen ob eine Variable verändert wird? Zb. wenn der Wert der Variable durch "Memorize Position" verändert wird oder durch "Store Event ID"...
Das selbe gilt für "Change Event Location" wo der Wert nicht verändert sondern drauf zugegriffen wird.
MagicMaker
15.06.2013, 16:53
Du könntest ja einen Switch an machen, während du Änderungen vornimmst und den dann abfangen.
djeurissen
15.06.2013, 17:30
Das Plugin ist ja nicht nur für mich gedacht...
Ich kann ja nicht erwarten das die Entwickler nun immer nen Switch aktivieren.
Tagchen,
gibt es eine Möglichkeit abzufragen ob eine Variable verändert wird? Zb. wenn der Wert der Variable durch "Memorize Position" verändert wird oder durch "Store Event ID"...
Das selbe gilt für "Change Event Location" wo der Wert nicht verändert sondern drauf zugegriffen wird.
Du könntest versuchen direkt die jeweiligen Kommandos abzufragen in onEventCommand. Das wäre zwar aufwändig, aber so hättest du die Möglichkeit festzustellen, wann mit einem solchen Befehl auf eine Variable zugegriffen wird.
PeAcE
MorDen
djeurissen
19.06.2013, 22:03
Ja, das weiß ich auch^^...
Ist halt ziemlich aufwändig, wenn es aber keine anderen weg gibt...
Geht es dir darum zu wissen, was die Veränderung hervorgerufen hat? Weil wenn es nur wäre dass eine Veränderung einer bestimmten Variable stattfand, dann gibts ja genau dafür onSetVariable.
Ich habs heute geschafft mein 2k3-KS in einen "geht nicht weiter"-Zustand zu bringen. Das geht in dem man Monster und Helden hat, die quasi zur selben Zeit ihren Zug machen, dazu ist allerdings sehr exaktes Timing notwendig, ist mir bisher auch nur in dem derzeitigen Zustand gelungen. Dabei wird vom Monster die "Monster takes turn"-Eventseite ausgelöst, danach passiert nichts mehr, geht nicht weiter und kommt auch kein Angriff.
Wenn ich den maximalen Wert für RPG::battleSpeed reduziere ist es immer schwerer möglich den Fehler zu reproduzieren. Während des "geht nicht weiter"-Zustandes kommt der "Cancel"-Sound wenn ich Esc. drücke.
Powered by vBulletin® Version 4.2.3 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.