PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Programmwunsch und -erstellungsthread #2



Seiten : 1 2 3 4 5 6 7 8 [9] 10

bugmenot
02.04.2014, 20:14
EXPlus
Edit: (15.06.2014)
download EXPlus(fixed) (http://share.cherrytree.at/showfile-14982/explus_fixed_.rar)
download EXPlus[+](fixed) (http://share.cherrytree.at/showfile-14983/explus____fixed_.rar)


Erlaubt es, einen EXP-Bonus (nach dem Kampf) für einzelne Helden getrennt festzulegen.
Var[3333] = PartySlot #1
Var[3334] = PartySlot #2
Var[3335] = PartySlot #3
Var[3336] = PartySlot #4

EXP-Erhalt nach dem Kampf ist 100% + Var[333x]% (falls Var[333x] kleiner -100, dann werden EXP vom Helden abgezogen (es gibt leider keine "Level down!"-Meldungen.))
Dieser EXP-Bonus lässt sich auch mit veränderten EXP durch den MonSca Patch kombinieren.

download LunarIPS (http://fusoya.eludevisibility.org/lips/)
Erster Schritt: legt euch eine Sicherungskopie eurer RPG_RT.exe an (für den Fall der Fälle)
Lunar IPS öffnen -> apply IPS patch -> .ips-Datei (den Patch) wählen > Dateityp: all types -> RPG_RT.exe auswählen

Nach dem Patchen lassen sich die Variable_IDs in der RPG_RT.exe unter 0x73B92 (2k) und 0x990D2 (2k3) per HexEditor umstellen. Oder packt den Patch in den Ordner DynPatches und:


[QuickPatches]
EXPVar=499CD2,#3333

Die drei darauffolgenden Var_IDs sind für die Gruppenmitglieder 2-4.

Alles oben Genannte gilt auch für EXPlus[+]. EXPlus sollte gelöscht werden und durch EXPlus[+] ersetzt werden (bzw. EXPlus[+] über die RPG_RT patchen).
EXPlus[+] erlaubt es über den Eventbefehl <ConditionalBranch> bei 'Hero: Is in the Party' den PartySlot in Var[3332] auszugeben. (1-4 wenn in Party, 0 wenn nicht.)
Nach dem Patchen lässt sich die Variable_ID in der RPG_RT.exe unter 0x88974 (2k) und 0xAFAB8 (2k3) per HexEditor umstellen.


[QuickPatches]
EXPVar[+]=4B06B8,#3332



This allows to to assign a separate EXP bonus (after battle) for each Hero.
Var[3333] = PartySlot #1
Var[3334] = PartySlot #2
Var[3335] = PartySlot #3
Var[3336] = PartySlot #4

EXP gain after battle is 100% + Var[333x]% (if Var[333x] smaller -100, the EXP of the Hero is decreased instead of increased (there's no 'Level down!' messages, though))
This EXP bonus can be combined with modified EXP by means of the MonSca Patch.

download LunarIPS (http://fusoya.eludevisibility.org/lips/)
First step: make a backup of your RPG_RT.exe (just in case)
open Lunar IPS -> apply IPS patch -> select the .ips file (this patch) -> file type: all types -> select the RPG_RT.exe

Upon patching you can change the Variable_ID in the RPG_RT.exe at 0x73B92 (2k) and 0x990D2 (2k3) by using a HexEditor. Or put this patch into your DynPatches folder and:


[QuickPatches]
EXPVar=499CD2,#3333

The next three Var_IDs after that are for the party members 2-4.

Everything mentioned above applies to EXPlus[+] as well. EXPlus should be deleted and replaced with EXPlus[+] (or patch EXPlus[+] over the RPG_RT).
EXPlus[+] allows to output the PartySlot of a Hero in Var[3332] when using the event command <ConditionalBranch> with 'Hero: Is in the Party'. (1-4 when in the party, 0 when not.)

Upon patching you can change the Variable_ID in the RPG_RT.exe at 0x88974 (2k) and 0xAFAB8 (2k3) by using a HexEditor.


[QuickPatches]
EXPVar[+]=4B06B8,#3332

Davy Jones
04.04.2014, 16:04
Ouh yeah, das kann ich doch gleich gebrauchen =)

Held legt Titel an -> EXP-Bonus durch Variablen. Wunderbar =D

Raildex
12.04.2014, 10:52
Gibt es ne Möglichkeit, die Party Plätze abzufragen?
Also im RM2k3 kann man ja die Reihenfolge ändern (Order-Befehl).
Ich würde das ganze allerdings gerne in meinem Custom-Menü machen.
Geht das irgendwie?

Corti
12.04.2014, 15:12
*grübel* hatte ich da nicht für Davias mal ein Plugin gebaut oder so? Davey, sag mal!

BDraw
12.04.2014, 15:31
Gibt es ne Möglichkeit, die Party Plätze abzufragen?
Also im RM2k3 kann man ja die Reihenfolge ändern (Order-Befehl).
Ich würde das ganze allerdings gerne in meinem Custom-Menü machen.
Geht das irgendwie?

Schlimmstenfalls lässt sich das auch ohne Plugins, etc. machen. Leg im Spiel Variablen für die Partyplätze an und speichere dort die ID des Chars, wenn du jemanden der Gruppe hinzufügst. Etwas weniger elegant als das einfach abfragen zu können, aber macht im Endeffekt dasselbe. Denn wenn du einmal die Korrekten Plätze und IDs hast ist der Rest ja simples abfragen und neu-zuweisen.

Davy Jones
13.04.2014, 14:53
*grübel* hatte ich da nicht für Davias mal ein Plugin gebaut oder so? Davey, sag mal!
Ich glaube das war mal eine Zeit lang im Gespräch, hat sich dann aber wieder erledigt weil du mir Davclasses angefertigt hattest. Das war das Plugin mit den Klassen und Rängen.


Also im RM2k3 kann man ja die Reihenfolge ändern (Order-Befehl).
Ich persönlich fand das so nutzlos, dass ich mithilfe eines Quickpatches das ganze in einen Doppelauslöser für Switch + Variable umgewandelt habe xD

bugmenot
23.04.2014, 01:46
VisuCommands
download VisuCommands(fixed) (http://share.cherrytree.at/showfile-14277/visucommands_fixed_.rar)
download VertiCommands(fixed) (http://share.cherrytree.at/showfile-14276/verticommands_fixed____rpg_rt2k3_v108.ips)


Edit (30.04.14)
Bug beim Abbrechen von Angriff/Item/Skill gefixt.

VisuCommands
Setzt das Fenster mit den Kampfbefehlen direkt über das FaceSet des Helden, der gerade am Zug ist. (im Gauge Layout)

VertiCommands
Das Selbe in vertikaler Ausrichtung. (für VertiGauge (http://www.multimediaxis.de/threads/104116-Programmwunsch-und-erstellungsthread-2?p=3140152&viewfull=1#post3140152) gedacht)

Den Patch einfach in den Ordner DynPatches schieben, oder man kann alternativ auch manuell patchen:

download LunarIPS (http://fusoya.eludevisibility.org/lips/)
Erster Schritt: legt euch eine Sicherungskopie eurer RPG_RT.exe an (für den Fall der Fälle)
Lunar IPS öffnen -> apply IPS patch -> .ips-Datei (den Patch) wählen > Dateityp: all types -> RPG_RT.exe auswählen

Für VisuCommands:


[QuickPatches]
CmdWindow_y-Pos(Draw)=497E81,#80
CmdWindow_y-Pos(Open)=497F1D,#80
CmdWindowHeight=4950BF,#80
CmdWindowWidth=4950D0,%76
CmdWindowDelta-X=4963DD,#80
CmdWindowFirst-X=4963E6,#0

HexEditor (falls ohne DynRPG gearbeitet wird): die 4xxxxx Adressen mit 400C00 subtrahieren und zu den fünfstelligen Adressen springen. Und die 50er ändern.

Für VertiCommands:


[QuickPatches]
CmdWindow_x-Pos(Draw)=497E81,#A4
CmdWindow_x-Pos(Open)=497F1D,#A4
CmdWindowHeight=4950BF,#60
CmdWindowWidth=4950D0,%76
CmdWindowDelta-Y=4963DD,#60
CmdWindowFirst-Y=4963E6,#0



Edit (30.04.14)
Bug fixed when canceling Attack/Item/Skill.

VisuCommands
Draws the window with the battle commands directly above the FaceSet of the hero that's currently doing his/her turn. (in Gauge Layout)

VertiCommands
Same thing in a vertical orientation. (for VertiGauge (http://www.multimediaxis.de/threads/104116-Programmwunsch-und-erstellungsthread-2?p=3140152&viewfull=1#post3140152))

Paste this patch into the folder named DynPatches. Alternatively you can also patch manually:

download LunarIPS (http://fusoya.eludevisibility.org/lips/)
First step: make a backup of your RPG_RT.exe (just in case)
open Lunar IPS -> apply IPS patch -> select the .ips file (this patch) -> file type: all types -> select the RPG_RT.exe

For VisuCommands


[QuickPatches]
CmdWindow_y-Pos(Draw)=497E81,#80
CmdWindow_y-Pos(Open)=497F1D,#80
CmdWindowHeight=4950BF,#80
CmdWindowWidth=4950D0,%76
CmdWindowDelta-X=4963DD,#80
CmdWindowFirst-X=4963E6,#0

HexEditor (if you are not using DynRPG): subtract the 4xxxxx addresses by 400C00 and jump to those 5-digit adresses. And change the 50's.

For VertiCommands:


[QuickPatches]
CmdWindow_x-Pos(Draw)=497E81,#A4
CmdWindow_x-Pos(Open)=497F1D,#A4
CmdWindowHeight=4950BF,#60
CmdWindowWidth=4950D0,%76
CmdWindowDelta-Y=4963DD,#60
CmdWindowFirst-Y=4963E6,#0

elvissteinjr
23.04.2014, 18:23
Habt ihr zufällig die Adresse parat an der die X-Position vom dem Auswahl Rechteck im Speicher- und Lademenü festgelegt ist?

Ich hatte das Menü vor ca. nem Jahr selbst rechtsbündig gemacht und da passt das jetzt nicht mehr so ganz vom Abstand her beim englischen Begriff.
Unglücklicherweise scheinen meine OllyDbg Kommentare irgendwie verschollen, sonst wäre das ja alles kein Problem.
Wenn ich mich recht entsinne hatte die Veränderung auch die Auswahl im Standardmenü verschoben gehabt, falls das hilft.

Die X-Position für den Text hab ich schon selber wieder herausgefunden, nur halt bei dem Auswahlding hakt's.

bugmenot
23.04.2014, 19:58
Irgendwo nahe 46E7C7 (2k) bzw. 490E1F (2k3) lassen sich Werte an den Cursor vergeben. Hab da noch keine Dokumentation dazu.

mov [esi+30],... -> x-Pos
mov [esi+34],... -> y-Pos

elvissteinjr
23.04.2014, 21:56
Bei 46E7C7 ist zwar der Speicher- und Ladebildschirm Code, allerdings leider nichts was mit dem Cursor zu tun hat.

Deine Pointer-Offsets haben mich aber auf die richtige Fährte gebracht.

Für 2k:
0x493C69 - X-Position
0x493C70 - Y-Position

Nicht auf Nebeneffekte getestet. Wirkt sich aber nicht auf ShowChoice aus, was das einzige vom Standard Makerzeug neben dem besagten Lade/Speichermenü wäre, welches ich bei mir verwende.

Eventuell ließe sich das auch eleganter Lösen, reicht bei mir aber so. Bin etwas eingerostet, aber das ist doch am Anfang der Funktion, welche fürs Textbox anzeigen verantwortlich ist, nicht?

bugmenot
23.04.2014, 22:43
sub_493C30? Das ist generell für alle Fenster. Also nicht unbedingt optimal... der Cursor ist da immer 8 pixel in die Fenster eingeschoben.

Probier mal:
[0046E7CF]
90 E8 75 B4 00 00

[00479C48]
EB BE
[00479C4A]
C7 46 30 xx xx 00 00 mov [esi+30],0000xxxx
C7 46 34 xx 00 00 00 mov [esi+34],000000xx
8B 15 24 AE 49 00 C3


Das lässt sich auch alles in der Funktion 46E768 unterbringen, ist mir jetzt aber etwas zu umständlich den ganzen Code zusammenzurücken.

Davy Jones
23.04.2014, 23:17
Ersetzt den Patch KSFensterDYNRPG.ips (falls der Patch verwendet wurde: bitte alles, was damit zu tun hat entfernen).
Den hatte ich selbst angefertigt und nirgends verbreitet (außer im Hilfethread wo ich das Projekt hochgeladen hatte). Ich selber hab ihn bereits gelöscht, weil ich durch den Eintrag in der .ini-Datei bereits voll zufrieden bin =)

bugmenot
23.04.2014, 23:42
Aha, jetzt tun sich nur noch mehr fragen auf.

Falls du den VisuCommands Patch nutzen willst, müssen die Einträge:


[QuickPatches]
CmdWindowHeight(L)=4950C7,%32
CmdWindowHeight(S)=442834,%32
CmdWindow_y-Pos(Draw)=497E81,#153
CmdWindow_y-Pos(Open)=497F1D,#153

aber wieder raus.



Edit:

Gibt es ne Möglichkeit, die Party Plätze abzufragen?
Stelle deine Anfrage mal im PluginWunschthread (http://www.multimediaxis.de/threads/135603-DynRPG-Der-Pluginwunschthread/). Falls all die Leute, die zumindest etwas C++ können, immer noch keinen Bock haben: Hier (http://www.multimediaxis.de/threads/104116-Programmwunsch-und-erstellungsthread-2?p=3162833&viewfull=1#post3162833) liegt seit drei Wochen eine Lösung rum. EXPlus[+], lies dir die readme durch.

Davy Jones
23.04.2014, 23:58
Die Fenstergröße der KS-Auswahlbox und dieses VisuCommands sind inkompatibel? Ich denke, da ist mir die Fenstergröße wichtiger, macht sich halt nicht so gut wenn der Gegner von einer Auswahlbox verdeckt wird.

bugmenot
24.04.2014, 00:08
Doch, die lassen sich mit dem Patch ansteuern (nur an anderer Stelle):

CmdWindowHeight=4950BF,#80
CmdWindowWidth=4950D0,%76
(siehe readme)

VisuCommands platziert die KS-Auswahlbox versetzt, je nachdem, wer an der Reihe ist. Der Rest (und exotische Platzierung, falls jemand VisuGauge nutzt) sind frei konfigurierbar.

Davy Jones
26.04.2014, 12:02
Gut zu wissen.

IndependentArt
29.04.2014, 15:01
erschießt mich, wenn ich grad was total abwegiges frage ... aber ich meine neulich mal was gelesen zu haben, wie man die RM fonts gleich in das projekt integrieren kann, ohne, dass sie der spieler erst installieren muss. wo/wie geht das?

ist halt ganz praktisch für eine spielerschaft, die nicht zwingend mit dem RM zu tun hat.

Davy Jones
29.04.2014, 17:50
Nennt sich AutoFontInstall:
http://www.multimediaxis.de/threads/99506-Programmvorstellung-RM2K-Font-Changer?p=2092166&viewfull=1#post2092166

IndependentArt
30.04.2014, 08:05
4. Eine Datei "fonts.cfg" anlegen, dort die zu installierenden Dateien eintragen. Jede Font in eine neue Zeile. z.B.:
jsmalle.fon
pala.ttf

wie genau leg ich denn diese datei an? also, das scheint ja kein textdokument zu sein oder so.

Morden
30.04.2014, 08:13
wie genau leg ich denn diese datei an? also, das scheint ja kein textdokument zu sein oder so.

Doch - es ist eine ganz normale Textdatei mit der Endung ".cfg". Unter Windows kann das ein wenig tricky sein, wenn man die Dateiendungen ausgeblendet hat. Sonst einfach den Editor öffnen, Speichern unter und dann musst du unten "Alle Dateien" auswählen und die Datei dann als "fonts.cfg" abspeichern. Wenn du unten "Textdatei" statt "Alle Dateien" gewählt hast, dann wird der Editor dir eine Datei erstellen, welche "fonts.cfg.txt" heißt.

Hoffe, ich habe das jetzt auf die Schnell nicht zu unverständlich erklärt xD

PeAcE
MorDen

IndependentArt
30.04.2014, 08:24
Es scheint zu funktionieren :D Zumindest hab ich alles so gemacht, wie beschrieben und dann die Schriften aus dem Windows Verzeichnis gelöscht. Und es wird korrekt angezeigt.
Jetz stört mich nur, dass die neue RPG_RT.exe kein Symbol hat. Bzw. scheinen ja beide Exen zu funktionieren. Bei der Gelegenheit: Es gab doch auch ein Tool, um die Symbole zu editieren?! ^^

Morden
30.04.2014, 08:59
Es scheint zu funktionieren :D Zumindest hab ich alles so gemacht, wie beschrieben und dann die Schriften aus dem Windows Verzeichnis gelöscht. Und es wird korrekt angezeigt.
Jetz stört mich nur, dass die neue RPG_RT.exe kein Symbol hat. Bzw. scheinen ja beide Exen zu funktionieren. Bei der Gelegenheit: Es gab doch auch ein Tool, um die Symbole zu editieren?! ^^

Naja, wenn du die alte ".EXE" benutzt, dann sollten aber die Schriften nicht geladen werden, da du ja die originale Datei ausführst und diese ja nicht die Fonts temporär installiert.

Das Tool zum Symbole editieren, was du meinst ist glaube ich der Resource Hacker^^

EDIT: http://www.angusj.com/resourcehacker/

PeAcE
MorDen

IndependentArt
30.04.2014, 09:38
Okay, danke soweit.

Folgendes Problem: der Resource Hacker erkennt die neue RPG_RT.exe nicht(die alte schon). Bzw. er scheint es schon zu öffnen, zumindest steht es oben in der Leiste dann, aber ich bekomm keine Optionen angezeigt und wenn zB versuche auf "replace icon" zu klicken, passiert nix.

Und btw. funktionieren immernoch beide .exen für das korrekte Anzeigen der Schrift.
Die alte müsste ich ja dann entfernen können, nicht?

Morden
30.04.2014, 11:02
Okay, danke soweit.

Folgendes Problem: der Resource Hacker erkennt die neue RPG_RT.exe nicht(die alte schon). Bzw. er scheint es schon zu öffnen, zumindest steht es oben in der Leiste dann, aber ich bekomm keine Optionen angezeigt und wenn zB versuche auf "replace icon" zu klicken, passiert nix.

Und btw. funktionieren immernoch beide .exen für das korrekte Anzeigen der Schrift.
Die alte müsste ich ja dann entfernen können, nicht?

Sonst kannst du mir die ".EXE" und das Logo auch mal zukommen lassen => PN oder so. Dann würde ich heute Abend versuchen das Icon auszutauschen.

Und nein, soweit ich das noch in Erinnerung habe muss die alte ".EXE" da bleiben, da der AutoFontInstaller ja nichts anderes macht als die ".CFG" einzulesen, die Schriften temporär zu installieren und dann die "old_RPG_RT.exe" zu starten. Deshalb muss die auch "old…" heißen.

PeAcE
MorDen

Cherry
01.05.2014, 19:06
Jetzt auch als DynRPG Plugin hier: http://www.multimediaxis.de/threads/140611-RM2k3-Font-Changer-DynRPG-Plugin-%28ersetzt-RM2k-3-Font-Changer-und-AutoFontInstall%29

Raildex
08.05.2014, 18:02
Hat mal jemand versucht, ne Art Maske mit nem Plugin zu ermöglichen, wie es z.b. in alten SNES Spielen der Fall ist?
20313
Der schwarze Sternenhintergrund verläuft diagonal, während die Maske - das Dreieck - sich dabei dreht.

Cool wäre es auch, dass man bspw. die Map durch ne Maske löschen könnte und durch die Maske dann das Panorama zu sehen ist.

Corti
19.05.2014, 13:48
Ich wüsste nicht wohin sonst mit dem Wissen aber nicht dass es verloren geht:

Skills, die auf den ausführenden Helden eine Condition setzen führen dazu, dass die Art der Eventseitenverarbeitung sich ändert. Das Phänomen ( Bug ) habe ich bereits einmal beschrieben, doch das hier ist neu:

Wenn ein Monster eine Condition auf sich selbst setzt per Skill, geht auch was schief. Der DynRPG-Callback behauptet dann, die Action wäre nicht Typ AK_SKILL

Cherry
22.05.2014, 07:00
Sondern? O_o

Corti
22.05.2014, 10:28
Ich hatte seit dem noch nicht die Zeit mich genauer darum zu kümmern. Weitere Infos werden geliefert sobald ich sie habe.

bugmenot
04.06.2014, 13:03
RPS(2k3)
download RowPhysSkills (http://share.cherrytree.at/showfile-14716/rowphysskills___rpg_rt2k3_v108.ips)


Erlaubt es, dass Skills mit mindestens einem "Weapon" / physischen Attribut einen Schadensbonus ähnlich wie bei regulären Angriffen (durch die Position eines Helden in der Reihe) erhalten. +25% ausgeteilter Schaden in der FrontRow, -25% erhaltener Schaden in der BackRow. Wirkt nicht auf Heilungs- oder Supportskills, die den Nutzer / einen Helden / die eigene Party anvisieren.

Patches und QuickPatches, die sich auf den Schaden von verschiedenen Row-Positionen auswirken, sollten vorher entfernt werden.


Allows Skills with at least one "Weapon" / physical attribute to have a damage bonus like regular attacks (depends on the hero's row position). +25% dealt damage in the front row, -25% suffered damage in the back row. Does not apply to healing / support skills that target the user / an ally / all allies.

Patches and QuickPatches that alter the damage from row positions should be removed first.

Corti
04.06.2014, 13:14
Oh , Stichwort Row!

Dies hab ich mal von dir bekommen:
HeroPhysVariance(Inverted)=49B2AB,#150
EnemyPhysVariance(Inverted)=49B687,#150
NoFrontDamagePlus(Hero)=4B989C,90909090,4B98B5,90909090,4B98C8,90909090
NoBackRowDefensePlus(Hero)=4C0D83,909090,4C0D9A,909090,4C0DAB,909090

Der Patch verhält sich komisch. Es gibt bei identischen Statuswerten Unterschiede zwischen Spielmodus und Kampfsystemtestmodus. Hast du eine Idee woran das liegen könnte?

bugmenot
04.06.2014, 13:33
Inwiefern?

Was ist das genaue Setup, das zu den Abweichungen führt?

Corti
04.06.2014, 15:53
Held mit zwei Waffen im Testmodus -> 52 Atk vs 52 Def Attribute bei 100 -> 52/2 - 52/4 = ca. 13 Schaden // Theoretisch richtiger
Held mit zwei Waffen im Spielmodus -> 52 Atk vs 52 Def Attribute bei 100 -> 52/2 - 52/4 = ca. 10 Schaden

Entfernt man die "NoFrontDamagePlus"-zeile in den Quickpatches so haben beide einen Schadensoutput von 10.

bugmenot
05.06.2014, 11:48
Sicher, dass das keine internen Rundungsfehler der Schadensformeln sind? (Weil die BattleTest_flag eigentlich nur für ein paar Wechsel der GameScenes zuständig ist.)

Probier mal:


[QuickPatches]
PlayerDmgRevamp=4B9847,EB05,4B9861,01,4B9AAE,D1F883C4145D5F5E5BC3
EnemyDmgRevamp=4C0B3E,EB05,4C0B56,01,4C0DB1,D1F89083C4145D5F5E5BC3
SkillDmgRevamp=4C0DC6,93A1C4DB4C008B00E819E3FBFF978B6F44D1E5,4C0DE4,#10,4C0DF8,#20,4C0E1A,#20,4C0E2F,#40,4C0F57,EB10,4C0FF7,E95DFFFFFF,4C0F59,D1F85D5F5E5BC3


Das ändert die Schadensformel bei phys. Angriffen von ([0.5]Str(u) - [0.25]Def(t)) x [Rest]
zu 0.5 x (([1.0]Str(u) - [0.5]Def(t)) x [Rest]

Sowie bei Skills von (EffectRating + [1/20]Str(u) x AtkInf + [1/40]Int(u) x IntInf - [1/40]Def(t) x AtkInf - [1/80]Int(t) x IntInf) x [Rest]
zu 0.5 x ([2.0]EffectRating + [1/10]Str(u) x AtkInf + [1/20]Int(u) x IntInf - [1/20]Def(t) x AtkInf - [1/40]Int(t) x IntInf) x [Rest])

...wobei die blauen Werte in SkillDmgRevamp den Einfluss des Int stats angeben (entweder erhöhen den #Wert senken, wenn man Int nutzen will... oder den Quotient gegen Null laufen lassen, falls man Int <-> Crit drin hat)

...grüner Wert für Str, roter für Def.

Ändert zumindest das alle 4 Punkte in Def reduzieren den Schaden effektiv um 2 Punkte zu alle 2 Def macht 1 Schaden weniger.

Corti
05.06.2014, 12:59
Hey, ich kann es jetzt gerade nicht ausprobieren, werde das aber bei Gelegenheit nachholen. Die Formeländerung klingt übrigens wundervoll.

Könntest du das 0.5* vor den Formel auch entfernen, so dass es nur noch atk - Def/2 ist? Auch großartig wäre 2Atk - Def. Hauptsache weniger Division drin.

Btw. gibt es irgendetwas im Code, dass verhindert, dass AttackInfluence-Werte von >10 verrechnet werden? Cherry und ich hatten die Grenze mal im Maker verändert, aber wenn man einen höheren Wert nimmt, ist der Skill nicht mehr benutzbar.


Zwei Dinge irritieren mich aber:

Ändert zumindest das alle 4 Punkte in Def reduzieren den Schaden effektiv um 2 Punkte zu alle 2 Def macht 1 Schaden weniger.
Du verdoppelst die Koeffizienz von Def, setzt aber ein 0.5 vor die Formel, d.h. in absoluten Schadenswerten ist alles wie zuvor und 4 def = -1 Schaden, oder wo irre ich mich da?


...wobei die blauen Werte in SkillDmgRevamp den Einfluss des Int stats angeben (entweder erhöhen, wenn man Int nutzen will... oder den Quotient gegen Null laufen lassen, falls man Int <-> Crit drin hat)
Durch die blauen Werte wird geteilt, daher würde ich nun schätzen, dass ein erhöhter Wert dort Int ausknipst und ein geringerer Int wertvoller macht.

bugmenot
05.06.2014, 14:05
Könntest du das 0.5* vor den Formel auch entfernen, so dass es nur noch atk - Def/2 ist?


PlayerDmgRevamp=4B9847,EB05,4B9861,01
EnemyDmgRevamp=4C0B3E,EB05,4C0B56,01
SkillDmgRevamp=4C0DE4,#10,4C0DF8,#20,4C0E1A,#20,4C0E2F,#40
[1/x] Str (user)
[1/x] Def (target)


gibt es irgendetwas im Code, dass verhindert, dass AttackInfluence-Werte von >10 verrechnet werden?
Ich kann mal nachschauen.



Zwei Dinge irritieren mich aber: [...] oder wo irre ich mich da?
Der Maker rechnet hier mit Integern, wodurch bei 1/2 Str - 1/4 Def nur ganzzahlige Vielfache von 4 Def etwas ändern werden.


Durch die blauen Werte wird geteilt [...] ein erhöhter Wert dort Int ausknipst und ein geringerer Int wertvoller macht.
Genau.

Corti
05.06.2014, 14:12
Nice! Und eine Variante 2*Str - 1*Def, ginge das auch?

bugmenot
05.06.2014, 14:20
Nice! Und eine Variante 2*Str - 1*Def, ginge das auch?



PlayerDmgRevamp=4B9847,D1E0,4B985F,909090
EnemyDmgRevamp=4C0B3E,D1E0,4C0B54,909090
SkillDmgRevamp=4C0DE4,#5,4C0DF8,#10,4C0E1A,#10,4C0E2F,#20

...mit oder ohne Division am Ende? (So sind die Schadenszahlen generell höher.)

Corti
05.06.2014, 14:42
Ohne, ich werds mal ausprobieren :herz:

Das beseitig echt eine Menge Ekligkeit. Wenn du jetzt noch rauskriegst was mit der AttackInfluence >10 los ist,...oh ich wage zu träumen.

bugmenot
05.06.2014, 15:30
gibt es irgendetwas im Code, dass verhindert, dass AttackInfluence-Werte von >10 verrechnet werden?


[QuickPatches]
maxAtkInf(CureCondByDmg)=49D0ED,#10
maxAtkInfl+1(Usability)=4C08D8,#11
maxIntInfl+1(Usability)=4C08E0,#11
In der database im Tab für Conditions gab es noch Werte für "Prevent Skills from being invoked" mit Atk/Int Influence größer/gleich irgendwas.

Corti
05.06.2014, 15:40
Bei den letzten beiden Zeilen kann ich mir denken, was sie tun, nämlich das Limit aufheben. Was tut die erste?

Und das wichtigste! VIELEN VIELEN DANK!

bugmenot
05.06.2014, 16:02
Whoops, ..0ED nicht ..0E0.

Wenn irgendeine Art von Angriff Schaden an den HP verursacht, wird 0..10 gewürfelt. Wenn das Ergebnis unterhalb von AtkInf landet (da ist eine falsche Logikabfrage drin, selbst wenn's auf AtkInf landet passiert nichts... verhindert aber Probleme mit AtkInf = 0) dann erst wird die Recovery (% each hit) in einem seperaten Algorithmus abgearbeitet.

Corti
05.06.2014, 16:30
Achso, okay.

Ich hab nun btw. meinen Schadensschwankungsfehler gefunden. Es war...
a) Rundungsfehler*
b) Der Maker berechnet scheinbar, wenn ein Held zwei Waffen ausgerüstet hat für die Waffenangriffe nur mit den Atk der jeweils benutzen Waffe.Bei Skills wird aber brav die ganze Atk genommen. Bei meinem DebugMode Hat der Held die Atk, im Livemode ist die Atk verteilt auf Held und Waffen, daher ein Unterschied bei identischen Werten.

*( Problem gelöst, dank dir )

Davy Jones
14.06.2014, 23:47
http://www.multimediaxis.de/threads/104116-Programmwunsch-und-erstellungsthread-2?p=3162833&viewfull=1#post3162833

Der Patch EXPlus[+] funktioniert bei mir leider hinten und vorne nicht.

Hab die Datei in DynPatches gepackt und in die Ini-Textdatei unter [Quickpatches] die entsprechenden Zeilen aus deiner Readme. Sobald der Gegner allerdings besiegt ist, bekomme ich eine Fehlermeldung (violates RPG_RT with adress / offset dingens) und einen darauffolgenden Absturz.

Gekämpft habe ich mit einem Partymitglied, die Variable 3333 hatte ich auf 50 gestellt. Nehme ich den Patch raus und lasse die Zeilen in der Ini-Datei, kommt der Absturz ein bisschen später (man sieht noch das "Du hast gewonnen").

bugmenot
15.06.2014, 02:39
[...]bekomme ich eine Fehlermeldung (violates RPG_RT with adress / offset dingens)
Die Fehlermeldung wäre hilfreich.

Davy Jones
15.06.2014, 11:19
Habs eben nochmal mit 2 Partymitgliedern und verschiedenen Monstern versucht, ist immer dieselbe Meldung:


Access violation in module 'RPG_RT.exe' in with address 00475717 and offset 00000008 of type Read occured.

bugmenot
15.06.2014, 12:00
Hast du seit der letztens geposteten Demo 5.00 irgendwelche Patches oder Plugins reingenommen, die etwas an Monster-Angelegenheiten ändern?

Ich weiß, wo der Fehler auftritt, aber nicht warum (Demo 5.00 mit EXPlus[+] läuft reibungslos). Ich bräuchte eine Kopie deiner RPG_RT.exe, der DynRPG.ini, die Ordner DynPlugins und DynPatches.
PM oder whatever.

Davy Jones
15.06.2014, 12:50
Hier sind die entsprechenden Dateien und Ordner:
http://www.file-upload.net/download-9064456/EK-Dyn-Sachen.rar.html

An den Monstern habe ich im Grunde nichts verändert, lediglich mit dem Resource Hacker war ich an der EXE zugange. Und selbst da habe ich nur die Text-Sonderzeichentabelle ausgetauscht.

bugmenot
15.06.2014, 17:41
download EXPlus[+](fixed) (http://share.cherrytree.at/showfile-14983/explus____fixed_.rar)
Das habe ich nun davon, einen Slalom um einen anderen Patch machen zu wollen...

Jeder, der EXPlus[+] auf dem RM2k3 nutzt und den MonScaPatch nicht drauf hat, sollte den fix hier runterladen. (Ja, ist beides immernoch miteinander kompatibel.)

Edit:
download MonSca(fixed) (http://share.cherrytree.at/showfile-14981/monsca_fixed_.rar)

Davy Jones
17.06.2014, 19:49
Danke für den Fix, jetzt funktioniert alles wunderbar =)

bugmenot
22.06.2014, 16:09
RowSwap[+]
download RowSwap[+] (http://share.cherrytree.at/showfile-15145/rowswap______rpg_rt2k3_v108.ips)


Ersetzt den Befehl [Row] im Kampf mit einem anderen (siehe erste Zeile der QuickPatches). Befehle können unter Battle Layout -> Default Battle Commands -> [Set] eingesehen werden. Zusätzlich ändert dieser Patch alle BattleCommands mit der in der zweiten QuickPatch-Zeile angegebenen ID (IDs müssen zwischen 1..255 liegen) zu einem [Row] Befehl um. (Dieser Row-Befehl kann von dem BattleEventTrigger [Hero] uses [BattleCommand] erkannt werden.)

download LunarIPS (http://fusoya.eludevisibility.org/lips/)
Erster Schritt: legt euch eine Sicherungskopie eurer RPG_RT.exe an (für den Fall der Fälle)
Lunar IPS öffnen -> apply IPS patch -> .ips-Datei (den Patch) wählen > Dateityp: all types -> RPG_RT.exe auswählen

Nach dem Patchen lassen sich die BattleCommand_IDs unter 0x9546E und 0x95609 ändern. Oder packt den Patch in den Ordner DynPatches und:


[QuickPatches]
RowSwapCommand(ID)=49606E,#1
RowBattleCommand(ID)=496209,%99


Replaces the [Row] command in battle with another command (see first line of the QuickPatches). Command_IDs can be found under Battle Layout -> Default Battle Commands -> [Set]. Additionally, this patch replaces all BattleCommands with the assigend ID (IDs have to be within 1..255) in the second QuickPatch line with a [Row] command. (This row command can be detected by the BattleEventTrigger [Hero] uses [BattleCommand].)

download LunarIPS (http://fusoya.eludevisibility.org/lips/)
First step: make a backup of your RPG_RT.exe (just in case)
open Lunar IPS -> apply IPS patch -> select the .ips file (this patch) -> file type: all types -> select the RPG_RT.exe

Upon patching you can change the BattleCommand_IDs under 0x9546E and 0x95609. Or put this patch into your DynPatches folder and:


[QuickPatches]
RowSwapCommand(ID)=49606E,#1
RowBattleCommand(ID)=496209,%99


QuickRow
download QuickRow (http://share.cherrytree.at/showfile-15164/quickrow___rpg_rt2k3_v108.ips)


Wechseln der Reihe im Kampf verbraucht keinen Zug. Somit kann ein weiterer Befehl im selben Zug ausgeführt werden.
(Ist mit SwapRow[+] kombinierbar... jedoch kann der Row-Befehl nicht mehr als BattleEventTrigger erkannt werden.)

download LunarIPS (http://fusoya.eludevisibility.org/lips/)
Erster Schritt: legt euch eine Sicherungskopie eurer RPG_RT.exe an (für den Fall der Fälle)
Lunar IPS öffnen -> apply IPS patch -> .ips-Datei (den Patch) wählen > Dateityp: all types -> RPG_RT.exe auswählen

Oder packt den Patch in den Ordner DynPatches.


Changing rows in battle will not waste a turn. Thus another battle command can be executed in the same turn.
(Can be combined with SwapRow[+]... however, the row command can't be detected by the BattleEventTrigger anymore.)

download LunarIPS (http://fusoya.eludevisibility.org/lips/)
First step: make a backup of your RPG_RT.exe (just in case)
open Lunar IPS -> apply IPS patch -> select the .ips file (this patch) -> file type: all types -> select the RPG_RT.exe

Or put this patch into your DynPatches folder.

Cherry
25.06.2014, 12:55
Nur mal schnell auf Anfrage zusammengeschmissen: https://www.dropbox.com/s/jpc3h7ujx1uwpu8/rm2k3_mapinmenu.ips

Im Standardmenü wird statt dem Systemhintergrund die Map gezeigt. Damit es nicht dumm ausschaut, wurden die Fades im Menü auch entfernt.

goldenroy
25.06.2014, 13:12
@bugmenot: Passend zu Cherrys Ding, hättest du vielleicht Adressen für die x-Pos/y-Pos/Größe der Fenster im MainMenu? :0

bugmenot
26.06.2014, 05:07
[...]Adressen für die x-Pos/y-Pos/Größe der Fenster im MainMenu?

Edit: (03.04.15) (Inkompatibilität mit anderen Patches behoben)

VisuMenu
download VisuMenu(fix) (http://share.cherrytree.at/showfile-19942/visumenu.rar)

Update (02.07.2014)
Werte für Fensterinhalte in der readme.
Update (23.01.2015)
Einige Werte in der readme fehlten.

So im nachhinein betrachtet: gefühlt die Hälfte davon gibt es gar nicht. 2 Byte Push und xor

Wie immer nur für 2k RPG_RTs v1.07 und 2k3 RPG_RTs v1.08 (bzw. DynRPG). QuickPatches in der readme.

Aus irgendeinem Grund bleibt das Fenster mit den MenüOptionen im 2k3 am oberen Eck kleben.
Edit:
Ah, dammit (war wohl noch nicht richtig wach). Da fehlen " = " hinter den Main: Options

[QuickPatches]
Main: Options(y)=4A0FF3,#0
Main: Options(x)=4A0FF8,#0



Nur mal schnell auf Anfrage zusammengeschmissen
download MapInMenu (http://share.cherrytree.at/showfile-16674/mapinmenu.rar)
Für 2k und 2k3 und ohne Crash mit F9 im Kampf. Credits an Cherry's erste 2k3 Version.

Davy Jones
29.06.2014, 14:07
Ich möchte gerne Hinweise für Quests verkaufen und das Abbrechen-Neuladen vermeiden.

Gibt es deshalb eine Möglichkeit, das Saven zu erzwingen?

bugmenot
29.06.2014, 15:47
Gibt es deshalb eine Möglichkeit, das Saven zu erzwingen?
Jain. Autosave erzwingen ist nicht wirklich die beste Möglichkeit.


Überdenke lieber das Design deiner Quests. Save Scumming wird nicht durch eine Brachialmethode verhindert, sondern duch einen besseren Aufbau.

z.B. Schatzsucher Quest:
kaufbarer Hinweis: "Suche in der Mitte der drei Linden."
alternativer Kauf: "Hier hast du einen besser funktionierenden Metalldetektor. Kannst meinetwegen gefundene Goldmünzen behalten."

z.B. Schmetterlings-Fang-Quest:
kaufbarer Hinweis: "Nachts schlafen die menschenfressenden Petunien und stören dich nicht."
alternativer Kauf: "Hier hast du eine Blumendecke. Wenn du dich nicht bewegst, ignorieren dich die Petunien. Das Ding könnte vielleicht auch Schmetterlinge anlocken."

Übersetzung: Ja, ich habe momentan keine Lust

Davy Jones
29.06.2014, 17:29
Problem ist aber, das die Quests bereits existieren und ich sie nicht umgestalten kann. Es sind halt viele "Finde-Person/Kaufe-Item/Töte-Monster"-Quests dabei. Die sind ziemlich simpel und brauchen keine zusätzlichen Items.

Edit:
Hab den Platz in der Messagebox so aufgeteilt, dass ich jetzt mehr Details zu den Quests geben kann. Damit haben sich die Hinweise erledigt.

goldenroy
29.06.2014, 21:07
Hey!
Gibt es eine Möglichkeit, beim Anwählen von der Ausrüstung-Menüoption diese Auswahlbox für die Helden zu überspringen und direkt den Bildschirm von Hero 1 aufzurufen? Man kann ja immernoch mit Links/Rechts navigieren.
Oh, und beim Aufruf von Skills direkt nur die von Hero 1 aufzurufen.
Ich will essentiell diese Auswahlbox entfernen und kann die Skills von Hero 1 zu nem Allgemeinen Skillmenü umfunktionieren, denke ich.

bugmenot
02.07.2014, 16:22
download VisuMenu (http://share.cherrytree.at/showfile-15391/visumenu.rar)

Update (02.07.2014)
Werte für Fensterinhalte in der readme.
Noch mehr Zeugs.



Gibt es eine Möglichkeit, beim Anwählen von der Ausrüstung-Menüoption diese Auswahlbox für die Helden zu überspringen

[QuickPatches]
SemiDirectSkillMenu=4A2502,B027,4A1877,33D290
SemiDirectEquipMenu=4A2506,B027,4A22FB,33D290

goldenroy
03.07.2014, 14:14
Erstmal: Vielen Dank das du dir die ganze Mühe machst. VisuMenu ist verdammt umfangreich und hat bestimmt Lange zum Zusammensuchen gebraucht. x3
Ich fühl mich langsam richtig blöd, ständig was neues zu fragen, aber ich hoffe das ist das Letzte in nächster Zeit - wäre es möglich, im Skillmenü die Anzahl der benötigten MP und den Bindestrich zu entfernen (Feuerball - 3)?

bugmenot
03.07.2014, 14:28
[QuickPatches]
Hide(- MP)=4C9440,00

Entfernt diese "- MP" Anzeige aber auch im Kampf.

goldenroy
03.07.2014, 14:48
Danke! °O°

bugmenot
16.07.2014, 14:52
PDFix(2k3)
download PhysDamageFix. (http://share.cherrytree.at/showfile-15806/physdamagefix.rar)


Nicht kompatibel mit der ersten Version von RowPhysSkills (WIP)

Bei einem "Back Attack" Kampf wird der physische Schaden nicht mehr zusätzlich um 25% gesenkt. (Gegner wurde als "in der hinteren Reihe" interpretiert.)
Das Selbe mit der Treffgenauigkeit.


Der Code für physische Angriffe von Spieler und Gegner wurde zusammengefasst, das heißt dass QuickPatches, welche die Schadensformeln von Spieler/Gegner (Formeln für Skills bleiben unverändert) und den RowBonus betreffen aus der DynRPG.ini entfernt werden müssen. Als Ersatz gibt es:


[QuickPatches]
PhysDmgRevamp=4C0B53,D1E0,4C0B69,909090
PhysDmgVariance(inverted)=49B687,#10
Dmg(%)InFrontRow=4C0BAB,#125
Dmg(%)OnBackRow=4C0D91,#75
CritDmg(%)=49B0B0,#300
ChargeDmg(%)=49B0BB,#200



P.S.

[QuickPatches]
UseDexStat=49B4BE,50,49B4C9,28,49B4CD,28,49B4D1,2C,49B4D3,5840EB03
Schaden bei einem "2 Weapon Style" Helden wird seperat für beide Waffen berechnet. Das Selbe wurde nicht wirklich mit der Trefferchance (anhand AGI der Waffe) durchgezogen.


Not compatible with the first version of RowPhysSkills (WIP)

Physical damage isn't reduced by additional 25% on a "Back Attack" encounter. (Enemy was interpreted as being in the back row.)
The same thing for the accuracy.


The code for physical attacks of player and enemy was combined, so QuickPatches that alter the damage formulas of player/enemy (formulas for Skills were not altered) and the RowBonus have to be removed from the DynRPG.ini. Instead there is:


[QuickPatches]
PhysDmgRevamp=4C0B53,D1E0,4C0B69,909090
PhysDmgVariance(inverted)=49B687,#10
Dmg(%)InFrontRow=4C0BAB,#125
Dmg(%)OnBackRow=4C0D91,#75
CritDmg(%)=49B0B0,#300
ChargeDmg(%)=49B0BB,#200



P.S.

[QuickPatches]
UseDexStat=49B4BE,50,49B4C9,28,49B4CD,28,49B4D1,2C,49B4D3,5840EB03
Damage of a "2 Weapon Style" hero is calculated seperately for both weapons. The same thing wasn't done with the accuracy (calculated with the weapon's AGI)


Und noch ein Fehler der auftritt, wenn der Quotient aus AGI(target) / AGI(user) gegen Null läuft:

mit PDFix.ips

[QuickPatches]
AccuracyFix=49B4E8,EB04,49B4F4,EB04,49C70E,EB04,49C71A,EB04

ohne PDFix.ips

[QuickPatches]
AccuracyFix=49B4E7,EB04,49B4F3,EB04,49C70E,EB04,49C71A,EB04,49B119,EB04,49B125,EB04


Wer jedoch seine Trefferchance bei 50% lassen will, selbst wenn der Nutzer eines Angriffs/Skills blind ist, braucht diese Zeile nicht.




... got some prep work done for callbacks...
49B11E bis 49B3F7 = 729 Byte CodeCave

49B097 <>onGetCritRate
49B58A <>onCalcPhysAccuracy
49C761 <>onCalcSkillAccuracy
49C76C <>onCalcSkillAccuracy
49B65F <>onCalcPhysDmg
49C683 <>onCalcSkillDmg

PhysAccuracy: qword @ ESP
SkillAccuracy: [esp+0C]


Ist bloß freigeräumter Platz.
Kann nur eine Zahl zwischen 1 und endlos vielen Tagen dauern, bis ich rausfinde, wie callbacks funktionieren. Bzw. die Zeit nehme das rauszufinden. Bzw. Motivation finde mir Zeit zu nehmen.



Edit:
download Crit% (http://share.cherrytree.at/showfile-15808/crit_.rar)

Wie immer für RPG_RT2k v1.07 und RPG_RT2k3 v1.08.
Entfernt dieses "1 in x chance to crit" und ersetzt es durch einen vernünftigen %-Wert.

goldenroy
18.07.2014, 23:33
Hey. Man kann ja per Skill einen Switch aktivieren. Wäre es möglich, dass man per Skill direkt ein CommonEvent callt? Betroffene Skills/CEs könnten ja per ID in der .ini angegeben werden, falls das möglich ist.
Würde auf jeden Fall eine konstante Abfrage im Hintergrund vermeiden, was nicht schlecht wäre. °>°

Davy Jones
19.07.2014, 19:13
Im Grunde aktiviert der Switch einen Common Event und wird in diesem auch wieder abgeschaltet. Das verbraucht eigentlich so gut wie keine Leistung.

Stray
27.07.2014, 13:37
Ist ein Patch oder Plugin möglich, das den Farbraum, den der RPG Maker 2k(3) benutzt, von 256 Farben erweitert bzw. importierbar macht?

goldenroy
27.07.2014, 13:38
Ist ein Patch oder Plugin möglich, das den Farbraum, den der RPG Maker 2k(3) benutzt, von 256 Farben erweitert bzw. importierbar macht?

RPGSS (http://www.multimediaxis.de/threads/140584-DynRPG-RPGSS) mit dem mitgelieferten spritelib.

Stray
27.07.2014, 17:15
Inwiefern? Leider habe ich mich mit anderen Programmiersprachen bisher kaum außereinander gesetzt.

Corti
28.07.2014, 06:01
Ist ein Patch oder Plugin möglich, das den Farbraum, den der RPG Maker 2k(3) benutzt, von 256 Farben erweitert bzw. importierbar macht?
Die Scheissfarben vom 2k/2k3 liegen imo nicht an den 8Bit der Grafiken, sondern daran, dass der Bildbuffer 16Bit hat und die 24Bit-Einzelfarben aus der 8Bit-Palette zur Anzeige auf 16Bit runtergebrochen werden.
Theoretisch wäre es also möglich, ein Plugin zu schreiben, das 16Bit Grafiken lädt und anzeigt.

Davy Jones
28.07.2014, 08:09
Das... wäre wohl revolutionär.

Corti
28.07.2014, 08:39
RPGSS kann Grafiken schicker verarbeiten, deine Revolution lebt.

goldenroy
28.07.2014, 12:41
RPGSS kann Grafiken schicker verarbeiten, deine Revolution lebt.

Ja, das hat nur irgendwie nie irgendwer bemerkt. RPGSS, man, it's real.

Davy Jones
29.07.2014, 08:02
Ich muss es im Thread wohl irgendwie übersehen haben.

Also lassen sich wirklich Tilesets mit höherer Farbtiefe (16 oder 24 Bit) in den Maker importieren und dieser werden dann auch mit den originalen Farben (keine Ersatzfarben) angezeigt?

Morden
29.07.2014, 09:16
Ja, das hat nur irgendwie nie irgendwer bemerkt. RPGSS, man, it's real.

Ich denke, dass das vor allem daran liegt, dass es nicht die Beschränkung entfernt, dass der Maker selbst, bzw. die RPG_RT selbst, nur mit 8-Bit-Grafiken umgehen können. Man müsste sich das selbst skripten. Man kann also nicht ohne weiteres 24-Bit TileSets/ChipSets oder CharSet im Maker importieren und nutzen.


Ich muss es im Thread wohl irgendwie übersehen haben.

Also lassen sich wirklich Tilesets mit höherer Farbtiefe (16 oder 24 Bit) in den Maker importieren und dieser werden dann auch mit den originalen Farben (keine Ersatzfarben) angezeigt?

Nein, es entfernt nicht die Beschränkung, dass man mit dem Maker selbst nur 8-Bit-Grafiken nutzen kann, man kann aber per Skript 24-Bit-Bilder laden und anzeigen. Es liefert auch schon Bibliotheken/Skripte zum Anzeigen von Sprites mit.

PeAcE
MorDen

Stray
29.07.2014, 13:38
Das es möglich ist, ist auf jeden Fall genial, aber so wie das Morden beschrieben hat, wirkt es so als wäre der Aufwand nicht nennenswert kleiner als die Bilder/Sprites einfach schnell mal in 256 Farben umzuwandeln.

Etwas ausgefallenes:
Können die maximal einstellbaren Dimensionen von Maps mit einem Programm oder Plugin erweitert werden?

Und noch eine Frage, die ich aber mal auf dieses Thema verlinke (bezüglich Pixelgenaues Scrollen): Link (http://www.multimediaxis.de/threads/135603-DynRPG-Der-Pluginwunschthread?p=3190338&viewfull=1#post3190338)

Corti
30.07.2014, 07:37
Etwas ausgefallenes:
Können die maximal einstellbaren Dimensionen von Maps mit einem Programm oder Plugin erweitert werden?
Mit dem RPG Maker Ultimate und seiner UI-Mod-Funktion kannst du die Eigenschaften von Makerfenstern ändern z.B. maximale Zahleneingaben.
Mit dem Programm RessourceHacker kann man rausfinden, wie die Eigenschaften heissen.

Bei einigen Zahlenwerten kann man auf die Art erweitern, bei anderen geht es nicht so einfach.

btw. was zur Hölle hast du vor, dass du sowas überhaubt willst?

Davy Jones
30.07.2014, 08:08
man kann aber per Skript 24-Bit-Bilder laden und anzeigen.
Also lässt sich die Beschränkung umgehen, man muss aber alles selber skripten. Mh, gut zu wissen.

Ich hab mir jetzt Version 0.9 von RPGSS geladen, mal schauen was sich da so an Bibliotheken und Skripten anfindet.

bugmenot
30.07.2014, 11:02
MoveEventPointer
download MoveEventPointer (http://share.cherrytree.at/showfile-16044/moveeventpointer.rar)

Erlaubt es, die Event_ID für einen <Move Event> Befehl über eine Variable anzugeben.

Var[3330] = Event_ID

Event_IDs:
1 .. 10000 = Events
10001 = Hero
10002 = boat
10003 = ship
10004 = airship
10005 = this event

Ist die Variable Null oder unter Null, dann wird das angegebene Event aus dem <Move Event> Befehl bewegt.

download LunarIPS (http://fusoya.eludevisibility.org/lips/)
Erster Schritt: legt euch eine Sicherungskopie eurer RPG_RT.exe an (für den Fall der Fälle)
Lunar IPS öffnen -> apply IPS patch -> .ips-Datei (den Patch) wählen > Dateityp: all types -> RPG_RT.exe auswählen

Nach dem Patchen lässt sich die Variable_ID in der RPG_RT.exe unter 0x8807A (2k) bzw. 0xAF006 (2k3) per HexEditor umstellen. Oder packt den Patch in den Ordner DynPatches und:


[QuickPatches]
MEPVar=4AFC06,#3330


This patch allows you to assign the Event_ID for a <Move Event> by variable.

Var[3330] = Event_ID

Event_IDs:
1 .. 10000 = Events
10001 = Hero
10002 = boat
10003 = ship
10004 = airship
10005 = this event

If the variable has a value of zero or below, the event that was assigned by the <Move Event> command will be moved instead.


download LunarIPS (http://fusoya.eludevisibility.org/lips/)
First step: make a backup of your RPG_RT.exe (just in case)
open Lunar IPS -> apply IPS patch -> select the .ips file (this patch) -> file type: all types -> select the RPG_RT.exe

Upon patching you can change the Variable_ID in the RPG_RT.exe at 0x8807A (2k) or 0xAF006 (2k3) by using a HexEditor. Or put this patch into your DynPatches folder and:


[QuickPatches]
MEPVar=4AFC06,#3330

Stray
30.07.2014, 22:35
btw. was zur Hölle hast du vor, dass du sowas überhaubt willst?

Ich will es noch nicht ganz verraten, aber ich arbeite zur Zeit an etwas mit Side-Scrolling. Und da ist eine Map in 2 Minuten durchgespielt, wenn's schnell geht. Es müsste zwar nicht zwingend länger sein, aber es täte nicht schlecht.

bugmenot
30.07.2014, 23:11
Wenn du nicht mit dem RessourceHacker umgehen kannst, dann hol' dir Cherry's RM2k9 (http://cherrytree.at/cms/download/?did=1)

Und das hier:
download MapSizeDelimiter (http://share.cherrytree.at/showfile-16077/mapsizedelimiter.rar)


Einfach die MaxValue auf... 9000 setzen oder so.

Stray
01.08.2014, 01:55
Danke! Meine Gebete wurden erhört!

Ich hab wieder eine Idee! Es gab ja schon mal für den RPG Maker XP ein AntiLag-Script, das einfach Events, die außer Sichtweite waren angehalten hat (außer es waren Parallele oder Automatische Prozesse). Gibt's sowas auch schon für DynRPG?

(vllt. sollte ich mal langsam halb lang machen, ich Spam hier sonst vor lauter Freude noch alles zu! :'D)

Corti
01.08.2014, 06:40
Such mal bugmenots Posts durch. Irgendwo hat er was gemacht mit Optimierung der Performance, war aber ein Fix und kein Plugin.

goldenroy
01.08.2014, 11:52
Such mal bugmenots Posts durch. Irgendwo hat er was gemacht mit Optimierung der Performance, war aber ein Fix und kein Plugin.

>>AntiLagSwitch<< (http://www.multimediaxis.de/threads/104116-Programmwunsch-und-erstellungsthread-2?p=3160250&viewfull=1#post3160250)?

Stray
01.08.2014, 15:39
Ja, den kenn' ich schon. Aber ich meine genau noch so etwas.

Eigentlich suche ich auch viel mehr etwas, was die Route von Events erst beginnen lässt, wenn sie in Bildschirmnähe auftauchen. Aber beim XP hat das mit diesem Script auch funktioniert... :/

bugmenot
01.08.2014, 16:07
etwas, was die Route von Events erst beginnen lässt, wenn sie in Bildschirmnähe auftauchen
Nennt sich Logik und eine Prise Mathematik. Vielleicht noch ein bisschen Coden mit den Funktionen, die dir das Werkzeug (mit dem du arbeitest) bereits zur Verfügung stellt.

Wenn es trotzdem ruckelt, kannst du ja posten, welche Eventbefehle du am meisten ausführen lässt. Lösungen gibt es nur für definierbare Probleme.


[...]Route von Events erst beginnen lässt, wenn sie in Bildschirmnähe auftauchen. Aber beim XP hat das mit diesem Script auch funktioniert
Entschuldigung, dass ich dem jetzt ohne gentleman'sche Wortwahl antworte, aber das klingt dämlich. Also das Konzept von "Was nicht auf dem Screen ist, wird nicht aktualisiert".


Die VXP-Reihe leidet an irgendetwas anderem, was die Performance so grottig werden lässt.

Da helfen auch keine asynchronen Wasserfallgrafiken.

Stray
01.08.2014, 18:51
Na gut. Es hat beim RmXP damals zumindest geholfen. Es hat natürlich nicht das Problem beseitigt, dass der RPGXP ohnehin viele Ressourcen frisst usw.

Es geht dabei auch um eine ganze Menge Events, da es ja sonst nicht laggen würde. Es wäre nämlich etwas großer Aufwand für eine große Anzahl an Ereignissen eine Horde an extra Variablen und co. für die Berechnung dessen, wann ein solches im Bildschirmbereich auftaucht aufzustellen und für jedes davon gesondert anpassen zu lassen.
Aber es war nur eine kleine Idee und sicher ist die Performance vom Rm2k(3) in den meisten Fällen auch gut genug.

Davy Jones
01.08.2014, 19:37
Die Performance sämtlicher RPG Maker ist mit Ausnahme des XP hervorragend. Es sei denn, du hast einen wirklich alten PC.

Beim XP hilft wiederum die Fusion mit dem VX Ace, d.h. du benutzt den RMXP mit RGSS3. Sofern du Skripte benutzt, müssten die dafür aber extra abgeändert werden.

Die 2k-/2k3-Performance-Schwierigkeiten resultieren dagegen meistens aus diesen Sachen:
- größere, rotierende Pictures (nicht bei jedem PC)
- keine 0.0s oder 0.1s waits am Ende eines parallelen Prozesses
- zu riesige Maps mit zuvielen Objektcharsets

*senf

goldenroy
01.08.2014, 20:47
Beim XP hilft wiederum die Fusion mit dem VX Ace, d.h. du benutzt den RMXP mit RGSS3. Sofern du Skripte benutzt, müssten die dafür aber extra abgeändert werden.


Soweit ich weiß funktioniert dann die native Encryption vom XP allerdings ebenfalls nicht mehr.

bugmenot
01.08.2014, 21:49
eine ganze Menge Events, da es ja sonst nicht laggen würde.
Sofern du nicht auf die Idee kommst mehr als 200 mal <MoveEvent> je Frame ausführen zu lassen. (Das kann man zB. mit einem 0.0 wait in 200er Blöcke aufteilen.) MovementRoutes sind da weniger anspruchsvoll im Hinblick auf Prozessorauslastung.




großer Aufwand für eine große Anzahl an Ereignissen eine Horde an extra Variablen und co. für die Berechnung dessen, wann ein solches im Bildschirmbereich auftaucht
Dazu braucht man insgesamt nur 5 (Hero_x, Hero_y, Event_ID, Event_x, Event_y). Für alle Events. Und nicht für jedes Event x Werte. Bei Differenz von Hero_x - Event_x falls kleiner -20 / größer +20 bzw. Differenz in y-Pos wird halt... ich weiß nicht... so eine Art SelfSwitch umgelegt, welcher die zweite EventPage aktiviert, bei der der MovementType auf [stationär] steht. Wenn das Event wieder im Screen ist -> SelfSwitch OFF, dann geht die MovementRoute soweit ich weiß da wieder weiter, wo sie unterbrochen wurde.

Oder besser noch: Event_ID[xyz] bis Event_ID[zyx], welche sich in einem Bereich der Map aufhalten, erst stillegen, wenn man eine bestimmte Entfernung verzeichnet. Dann laufen die Events zumindest nicht mehr asynchron oder sonstwie ungeplant durcheinander. (Ich nehme mal an, auf das Problem stößt man mit dem XP Skript?)

Item&EventPointer-Ersatz (http://www.multimediaxis.de/threads/137417-DynRPG-Plugin-Dynamic-Variable-Pointer)

Aber es sieht auch irgendwo dämlich aus, wenn etwas, das aus dem Bild raus ist, auf einmal nicht mehr hinterherkommt.

Davy Jones
02.08.2014, 17:05
Soweit ich weiß funktioniert dann die native Encryption vom XP allerdings ebenfalls nicht mehr.
Die XP-Verschlüsselungen wurden schon vor Jahren geknackt, dementsprechend ist der Kram so unnötig wie ein Kropf.

Stray
14.08.2014, 13:16
Ich möchte aber eine wirklich große Menge Events auf einer Map verwenden, die blöderweise alle gleichzeitig einen Parallelen Prozess bräuchten. Waits habe ich bereits überall eingefügt. Laggen tut es trotzdem immer wieder mal und ich bin mir nicht sicher, ob das auf jedem anderen Rechner noch genauso 'knapp-gut' läuft, obwohl mein Computer nicht gerade eine Low-End-Maschine ist. Er ist relativ neu und funktioniert gut.

@bugmenot:
Auch bei 5 Variablen wäre es bei der Menge an Events und den damit zu ersetzenden Variablen extrem, da in einem Event nicht nur die Werte abgespeichert werden, sondern auch in Bedingungen abgefragt werden, was auch wieder ersetzt werden muss. Ich benutze zur Zeit für jedes Event die selben Variablen, was verrückterweise sogar ganz okay funktioniert.


Aber es sieht auch irgendwo dämlich aus, wenn etwas, das aus dem Bild raus ist, auf einmal nicht mehr hinterherkommt.
In meinem Fall wäre es nicht so wichtig, weil es ein Sidescroller ist, bei dem sich der Bildschirm während des Spielens automatisch verschiebt.

Morden
18.08.2014, 07:09
Ich möchte aber eine wirklich große Menge Events auf einer Map verwenden, die blöderweise alle gleichzeitig einen Parallelen Prozess bräuchten. Waits habe ich bereits überall eingefügt. Laggen tut es trotzdem immer wieder mal und ich bin mir nicht sicher, ob das auf jedem anderen Rechner noch genauso 'knapp-gut' läuft, obwohl mein Computer nicht gerade eine Low-End-Maschine ist. Er ist relativ neu und funktioniert gut.

Wäre es nicht sicherer und einfacher die Events von einem globalen Loop-Event zu callen? So hättest du a) nur einen PP und b) verhinderst du von vornherein, dass sich die Events - wenn sie die gleichen Variablen nutzen - gegenseitig in die Quere kommen.

PeAcE
MorDen

Stray
27.08.2014, 12:08
Aber das würde ja bedeuten, dass man wieder für jedes einzelne Event neue Variablen schaffen muss - und gerade das will ich nicht.
Die Überschneidung ist nicht das große Problem, denn die funktioniert sogar ganz gut, wenn man sie in den Griff kriegt.

SuperSimon
02.09.2014, 14:20
Aber das würde ja bedeuten, dass man wieder für jedes einzelne Event neue Variablen schaffen muss - und gerade das will ich nicht.
Die Überschneidung ist nicht das große Problem, denn die funktioniert sogar ganz gut, wenn man sie in den Griff kriegt.

Hi Stray. Vielleicht misverstehe ich das Problem mit den eigenen Variablen aber vielleicht hilft dir meine Vorgehensweise bei solchen Sachverhalten.

Ich benutze für den Rm2k den Destinypatch und habe auf meinen Maps bis zu 40 Events die sich per Call einer Datenbankevents registrieren.
Im Anschluss daran wird in einem einzigen Event der Datenbank über die IDs geloopt und je nach Eventnamen zu der ID oder weiteren Infos reagiert.

Dabei ist der Destinypatch unersetzlich, denn er hat die Möglichkeit ein Events per ID aus einer Variable fernzusteuern oder sogar ihr Aussehen zu verändern.
Das Minimum was du brauchst ist eine reservierte Anzahl von Variablen des RPGMaker für die ID-Liste.

Falls deine Events Gegner sind, die eine gewisse Energie haben brauchst du logischerweise für jeden Gegner mindestens eine eigene Variable für die Energie. Der DestinyPatch bietet hier zusätzlich eigene Datentypvariablen an, die hierfür sehr praktisch sind.
Du kannst damit beispielsweise die HP-Variable in den dworten des Destinypatch zusammensetzen aus (MapID * 1000) + EventID.
d.h. Event 1 auf Map 1 = d[1001]
Event 90 auf Map 150 = d[150090]
Der DestinyPatch lässt maximal 900.000 dworte zu, soweit ich weiß.
Auf diese Weise kannst du deinen Events eigene globale Variablen zugestehen aber du kannst ganz ohne konkrete Variablen arbeiten indem du die entsprechende Variable immer über die Formel (MapID * 1000) + EventID = dwordPointer erhälst.

Kann man überhaupt verstehen, was ich meine?

Cherry
05.09.2014, 16:20
AntiLagSwitch 2k(3)
download AntiLagSwitch (http://share.cherrytree.at/showfile-13611/antilagswitch.rar)


Reduziert Ruckler bei exzessivem Gebrauch der Eventbefehle <Change Switch> und <Change Variable>.

(Der RPG-Maker ist nicht dafür ausgelegt viele Rechenoperationen in kurzer Zeit durchzuführen. Da bei jedem <Change Switch> oder <Change Variable> alle Events auf der Map einmal geupdatet werden, kommt es vorallem auf großen Maps mit vielen Events gerne mal zu Frameeinbrüchen.)

Dieser Patch umgeht bei jedem <Change Switch> oder <Change Variable> das Updaten der Events, solange Switch[1000] = ON. Ein Change Switch[1000] = OFF kann dann selber ein Event-Update auslösen. (Dann werden die Conditions auf der ersten Eventseite wieder abgeprüft und das Starten neuer ParallelProcesses oder Eventgrafik-Updates ermöglicht. Kein Starten neuer Events und keine Änderung der Eventgrafiken, solange Switch[1000] = ON)

download LunarIPS (http://fusoya.eludevisibility.org/lips/)
Erster Schritt: legt euch eine Sicherungskopie eurer RPG_RT.exe an (für den Fall der Fälle)
Lunar IPS öffnen -> apply IPS patch -> .ips-Datei (den Patch) wählen > Dateityp: all types -> RPG_RT.exe auswählen

Nach dem Patchen lässt sich die Switch_ID in der RPG_RT.exe unter 0x85DDC + 0x8550E (2k) und 0xAC7CF + 0xABEEE (2k3) per HexEditor umstellen. Oder packt den Patch in den Ordner DynPatches und:



Reduces lag spikes when excessively using the event commands <Change Switch> and <Change Variable>.

(The RPG-Maker isn't designed to handle many calculations within a short amount of time. Given that each <Change Switch> or <Change Variable> updates each and every event on the entire map, there is a tendency for it to cause dropping frame rates on large maps with lots of events.)

This patch bypasses the updating of events when using <Change Switch> or <Change Variable>, as long as Switch[1000] = ON. Using Change Switch[1000] = OFF can cause an event update by itself. (Conditions on the first event page will be tested afterwards and allow new ParallelProcesses to start or event graphics to update. New events won't start and no event graphics will change as long as Switch[1000] = ON)

download LunarIPS (http://fusoya.eludevisibility.org/lips/)
First step: make a backup of your RPG_RT.exe (just in case)
open Lunar IPS -> apply IPS patch -> select the .ips file (this patch) -> file type: all types -> select the RPG_RT.exe

Upon patching you can change the Switch_ID in the RPG_RT.exe at 0x85DDC + 0x8550E (2k) and 0xAC7CF + 0xABEEE (2k3) by using a HexEditor. Or put this patch into your DynPatches folder and:


Könnten wir nicht die UpdateEvents-Funktion so umbauen, dass sie nur ein Flag setzt, und am Ende der Eventverarbeitung in einem Frame das eigentliche UpdateEvents ausführen, wenn das Flag gesetzt ist? Ich seh momentan keinen Grund warum man mehr als 1x pro Frame die Events aktualisieren sollte, was meinst du?

bugmenot
05.09.2014, 23:07
[...]was meinst du?
Der Einfall ist mir vor vier Monaten auch in den Sinn gekommen. Mir war aber kein freier Platz in den Pointern bekannt (ohne groß zusammenfassen + anpassen zu müssen) um die Flag unterzubringen, und keine Funktion bekannt, welche jeden Frame nur 1 mal abgerufen wird.

Das lässt sich beides doch extern in einer DynRPG-Routine unterbringen?
...und die loop in loc_4AB8C5 verlassen, solange Flag = true (nach Durchlauf der Schleife setzen) und das ding/flag halt nach jedem Frame per externe Funktion auf false (= do not block EvUpdate) flippen. Warum brauchst du dafür meinen Konsens?



P.S.

[...]bis irgendjemandem einfällt, wie die Kämpfe nicht mehr crashen.
Mir ist etwas eingefallen:

download MapInMenu (http://share.cherrytree.at/showfile-16674/mapinmenu.rar)

Keine Ahnung, was ein transparentes F9-Menü bringen soll. Credits an Cherry's erste 2k3 Version.

Cherry
06.09.2014, 06:29
Ich würd mir meinen eigenen Platz für das Flag suchen, z.B. 4CE100, oder irgendwo ein unbenutztes Byte klauen, wie z.B. Offset 5 (nach der Scene, die nur als Byte und nicht als DWord verwendet wird) in TLcfgSystem, also [[4CDC7C]]+5.
Dann würde ich das richtige UpdateEvents (wenn nötig) einfach bei 4903AB machen, also nachdem die Scene geupdated, aber noch nicht gedrawt wurde (weil letzteres vom Maker ja auch geskipt werden kann wenn ersteres zu lange gedauert hat).

Ich werd das bei Gelegenheit mal einbauen, wenn du es noch nicht gemacht hast bis dahin.

Deinen Konsens: Naja, weil du den AntiLagSwitch gemacht hast, dich also schon mit den Auswirkungen auseinandergesetzt hast, wenn man UpdateEvents nicht aufruft, und daher, sollte meine Idee fehlerhaft sein, was gesagt hättest :)

@all: Kann mir mal wer ein Spiel verlinken was derbe laggt (und zwar nicht wegen Show Picture)? Ein Real Life Example wär praktisch.

Btw, ich frag mich ja auch woran es liegt, dass das Rotieren von größeren Pictures so extrem laggt. Ich vermute ja, dass sich der Frameskip-Mechanismus da selber ein Ei legt, sobald das Updaten länger dauert als 1/60 Sekunde (weil es das ja jedes Frame braucht).

bugmenot
06.09.2014, 11:07
[[4CDC7C]]+5
... du meinst sicher das Byte neben der GameScene, welche durch den [MainPtr]+4 dargestellt wird?
Wenn nicht, dafür sind die 90 90 da. GameScene auf [+4] wird sowieso überall als BytePtr gesetzt/abgefragt bzw. mit zero extend für jmp off_4...[eax*4] ausgelesen.

Eine nicht so schwachsinnige Version. (http://www.multimediaxis.de/threads/104116-Programmwunsch-und-erstellungsthread-2?p=3198004&viewfull=1#post3198004)
UpdateEvents setzt eine Byte_flag und in sub_4A35D0 wird dann die flag wieder = false gesetzt und das eigentliche UpdateEvents durchgeführt (ohne nach dem ersten EventBefehl zu blockieren).


@all: Kann mir mal wer ein Spiel verlinken was derbe laggt
Frag mal Itaju, ob er noch den Downloadlink der semi-aktuellen Version von AtV hat.
Oder copy&paste dir ein paar dutzend Events mit 100 EventPages (zählt dann als ca. 50 Events) zusammen und einige hundert mal inc(Var1) in einem parallel process.

Cherry
06.09.2014, 12:59
Ja, sollte alles beschreibbar sein... was crasht da bei dir?

Davy Jones
06.09.2014, 13:40
@all: Kann mir mal wer ein Spiel verlinken was derbe laggt (und zwar nicht wegen Show Picture)? Ein Real Life Example wär praktisch.
Alone - Cold Winter und Eternal Legends 2. Allerdings ist ersteres mit Molebox verschlüsselt (deswegen auch die Ruckler) und bei letzterem kommt es auf den PC an, von welchem es gestartet wird. Bei einigen laggt es sich langsam bis zur Unspielbarkeit, bei anderen passiert garnix.

Ansonsten fallen mir keine Spiele ein, die stark ruckeln.

MarcL
06.09.2014, 14:04
Alone - Cold Winter und Eternal Legends 2. Allerdings ist ersteres mit Molebox verschlüsselt (deswegen auch die Ruckler) und bei letzterem kommt es auf den PC an, von welchem es gestartet wird. Bei einigen laggt es sich langsam bis zur Unspielbarkeit, bei anderen passiert garnix.
Ansonsten fallen mir keine Spiele ein, die stark ruckeln.

Weiß zwar nicht genau worums geht, aber mein Spiel (Legend of the Silverstone) ruckelt im Gebirge (MarcLMaps-->GebirgeTeilLinks/GebirgeRECHTSunten) ziemlich stark, da sind auf den Maps ~1000-2000 Events? und dann noch PPs... Wenn man den alten AntiLag einschaltet, geht es merklich schneller, aber ich müsste erstmal kucken, worauf ich dann noch achten müsste, damit sonst von der Technik alles hinaut (man muss das Teil ja zu bestimmten Zeiten wieder ausschalten bzw. resetten oder so....)

bugmenot
07.09.2014, 10:10
Ja, sollte alles beschreibbar sein... was crasht da bei dir?

Das. (http://share.cherrytree.at/showfile-16703/als____byte_4acb17___rpg_rt2k3.ips)

Edit:
...
Die Festlegung des Datenbereiches mit einem FF FF FF FF 01 00 00 00 fehlt?

Cherry
07.09.2014, 18:23
4ACB17 ist ja mitten im Code-Segment, das ist natürlich nicht beschreibbar... drum hatte ich ja zwei Vorschläge im Datensegment respektive in einem zur Laufzeit allozierten beschreibbaren Speicherbereich gebracht.
See also: http://msdn.microsoft.com/en-us/library/ms809762.aspx

Und FF FF FF FF 01 00 00 00 hat damit nix zu tun, das ist nämlich keine "Festlegung eines Datenbereiches" sondern gibt die Stringlänge (und das ist kein String) an.

Kleiner Exkurs zu Delphi-Strings, falls es dich interessiert: Delphi-Strings sind nämlich ein relativ geniales Konzept: Sie sind quasi erweiterte C-Strings. C-Strings sind ja einfach nullterminierte Strings ohne Längenangabe, d.h. da steht dann z.B. "Hello World" + ein 00-Byte im Speicher, letzteres gibt das Ende des Strings an. Das heißt natürlich im Umkehrschluss, dass ein String selber kein 00-Byte enthalten kann, und dass jedes mal die Bytes im String durchgezählt werden müssen wenn man dessen Länge rausfinden will. Delphi hängt davor noch zwei DWords an (davor, weil man dann den eigentlichen Stringpointer genauso Delphi- und C-/WinAPI-Funktionen geben kann und es funktioniert). Und zwar Reference Counter und Länge. Angenommen, eax ist gerade ein Pointer auf den eigentlichen String (also quasi auf das "H"-Byte in "Hello World"), dann kann man mit [eax-4] die Länge des Strings und mit [eax-8] den Reference Counter auswählen. Der Reference Counter wird für zur Laufzeit erstellte Strings verwendet - dadurch kann derselbe String mehrfach verwendet werden, ohne jedes mal neu erzeugt zu werden, solange bis ihn keiner mehr verwendet, dann wird der Speicher freigegeben. Nun sind aber hardgecodete Strings im Code-Segment anders, weil sie eben nicht zur Laufzeit erstellt worden sind, können sie auch keinen Reference Counter haben (er wäre ohnehin nicht beschreibbar weil Code-Segment). Deshalb ist der Wert des Reference Counters bei Stringkonstanten -1 (FF FF FF FF), als "Special Value" quasi. Leere Strings werden übrigens gar nicht gespeichert, sondern durch einen Nullpointer repräsentiert.
See also: http://www.codexterity.com/delphistrings.htm (runterscrollen zu AnsiString)

EDIT:
Sag mal, was machst du denn da eigentlich? Wieso baust du so viel Code um, an nichts damit zu tun habenden Stellen, sodass andere Patches oder Offsetsuchprogramme daran verzweifeln, anstatt eine vernünftige Codecave an einer unbenutzen Stelle zu verwenden? Da ist so viel nicht verwendet...

Um nicht alles unnötig zu verkomplizieren, würde ich dich dringend bitten, nur mehr minimale Änderungen am Code vorzunehmen, und zwar da, wo es auch logisch hingehört. Wir müssen unsere Codecaves natürlich koordinieren, deshalb wird ich sagen, du kannst im 2k3 446D30-449DD3 haben. (Da sind Funktionen für Kontextmenüs, aber es gibt ja keine im Spiel, kann man also überschreiben). 442600-443A6F und 45CDF4-45D84B bitte nicht anrühren, das ist für DynRPG, und irgendwo in der Nähe von 433XXX hab ich noch Zeugs für PicPointerPatch, wenn ich mich Recht erinnere. Die Zone nach dem Ende des Codes ab 4C9D10 ist auch schon belegt, BetterAEP z.B.

Beim 2k kannst du 432CAC-436FE3 haben.
Ist das OK für dich?

Ich hätte noch eine große Bitte an dich... ich hab mir nämlich mit meinem Vorschlag, wo du den Code der 1x pro Frame ausgeführt wird, hintun sollst, selber ein Ei gelegt. Genau die Stelle brauche ich nämlich in meinem neuen Projekt, einem Debugger, und ich habe eh überlegt ob ich eine andere Lösung finde, aber es ist mir fast unmöglich, mit deiner Änderung da noch vernünftig zu arbeiten. Also bitte sei so nett und lege den Code stattdessen auf 4A35D0, das ist der Anfang der Routine die 1x pro Frame die Map updated. Sollte für dich denselben Effekt haben, ohne dass dann mein Debugger bei keinen Projekten mit AntiLagSwitch+ funktioniert! Vielen lieben Dank!

bugmenot
08.09.2014, 09:32
download AntiLag(Fast) (http://share.cherrytree.at/showfile-16791/antilag_fast_.rar)

Jetzt sollten eigentlich alle Fehler raus sein.


download ALS DePatch (http://share.cherrytree.at/showfile-16728/als_depatch.rar)
(entfernt den AntiLagSwitch Patch restlos, wenn man ihn nicht im Ordner DynPatches hatte, sondern direkt auf die RT gepatcht hat).


CodeCaves:
432CAC..432D02 (2k v1.07 )
446D30..446D85 (2k3 v1.08 )

Ich stell heute noch welche für 2k v1.51 Value! und 2k3 v1.09 raus. Wer was anderes benutzt bitte laut rufen.



Da ist so viel nicht verwendet...
Da hat eine gewisse Person (http://www.multimediaxis.de/threads/138195-Textbox-Modifikation?p=3071566&viewfull=1#post3071566) vor knapp 17 Monaten etwas anderes behauptet.



Wieso baust du so viel Code um, an nichts damit zu tun habenden Stellen
1. ...hat sich erledigt... (DePatch)
2. Generell: wenn einem gesagt wird, dass in der RPG_RT kein Platz mehr ist, dann macht man sich Platz. Ohne vorher raten zu müssen, welche Funktionen im Programm nie ausgeführt werden.

Cherry
08.09.2014, 13:28
Ja, du hast Recht, ich hab vor 17 Monaten echt was anderes geschrieben (da kannte ich diese Stelle auch noch nicht, aber das ist jetzt egal). Und wenn ich jetzt meinen Satz von vorher lese, nämlich den da: "Sag mal, was machst du denn da eigentlich? Wieso baust du so viel Code um, an nichts damit zu tun habenden Stellen, sodass andere Patches oder Offsetsuchprogramme daran verzweifeln, anstatt eine vernünftige Codecave an einer unbenutzen Stelle zu verwenden?", dann denke ich mir "WTF, klingt das unfreundlich". Dafür möchte ich mich wirklich entschuldigen, weil es nicht deine Schuld war, ich glaube ich war gestern gerade prinzipiell weniger guter Laune, was nicht an dir lag, und hab mich dann darüber geärgert dass plötzlich mein Zeugs mit deinem Patch nicht mehr ging und ich dann auch noch selber dir die Adresse gesagt habe. Ich hätte auf mich selber sauer sein sollen, also vergiss es bitte einfach, es tut mir Leid. Danke, dass du dir überhaupt die Arbeit machst a) diese Patches zu machen und b) noch meinen Bitten nachzukommen.

Ghabry
08.09.2014, 19:05
Könnten wir nicht die UpdateEvents-Funktion so umbauen, dass sie nur ein Flag setzt, und am Ende der Eventverarbeitung in einem Frame das eigentliche UpdateEvents ausführen, wenn das Flag gesetzt ist? Ich seh momentan keinen Grund warum man mehr als 1x pro Frame die Events aktualisieren sollte, was meinst du?

Also ich hab nicht probiert, ob das mit diesem neuen Antilag-Patch Probleme verursacht, aber eine Situation würde mir einfallen, wo man zwischendurch neu evaluieren muss:



Event:

Seite 1 (Paralleler Prozess, ohne Startbedingung):

Message "A"
Schalter 1 an
Message "B"

Seite 2 (Autostart, Bedingung Schalter 1 an):

Message "C"


Ausgabe muss sein: AC, das parallele Event bricht sofort ab, sobald eine andere Bedingung erfüllt ist.
Wenn Seite 1 nen anderer Typ ist, ist die Ausgabe immer "ABC".

Das Verhalten weicht übrigens beim XP und neuer ab, da ist die Ausgabe auch bei parallelen Events "ABC", ist also ne 2k/3-Besonderheit.

bugmenot
08.09.2014, 19:56
Also ich hab nicht probiert, ob das mit diesem neuen Antilag-Patch Probleme verursacht
Ohne Patch: AC
Mit Patch: ABC
Mit Patch mit [0.0 Wait] vor B: AC



zwischendurch neu evaluieren
Inwiefern?
Wieder zum Ausgangszustand des "alle Events abklappern, wo Eventbedingungen erfüllt sein könnten und viele Frameeinbrüche verursachen" zurück?
Einen CommentCommand @Update für einen erzwungenen Eventupdate einführen? (wovon ältere Spiele dann nichts haben)
Sich darüber aufregen wie dämlich es sich anhört, den Code für irgendeine Funktion auf mehrere EventPages zu verteilen statt irgendwo intern zu verschachteln oder <CallEvent> richtig zu nutzen?
Edit:
"EventUpdate(Global)" = 1x je Frame, updatet jedes Event auf der Map nach einem Eventbefehl
und
"EventUpdate(Local)" = nach jedem einzelnen Eventbefehl, updatet nur das Event, aus dem der Befehl hervorgeht (+eigene EventPages)
?

Ghabry
08.09.2014, 20:55
Also eigentlich wollte ich mich nicht in die Diskussion einmischen, sondern Cherry ein Beispiel bringen, wo die Annahme nicht funktioniert, weil ihm spontan keins einfiel.

Die einfachste Lösung wäre natürlich nur 1x neu zu evaluieren. Würde ich auch persönlich für die sauberste halten, als so ein rumgefrickel wie @Update oben hinzuschreiben. Vorm patchen sollte sich nur der Entwickler bewusst sein, dass seine parallelen Events im Spiel sich anders Verhalten, wenn der von mir genannte Fall eintritt.

Cherry
08.09.2014, 21:16
Hm, für diesen Fall könnte man ja einführen, dass UpdateEvents nur das aktuelle Event (das am Bottom des Calltrees) updatet.

Stray
09.09.2014, 02:27
@SuperSimon:
Es fällt mir sehr schwer das so nachzuvollziehen und glaube auch nur ungefähr verstanden zu haben. Aber es liest sich zumindest irgendwie vielversprechend. Ich werde mir den DestinyPatch später mal näher ansehen.

bugmenot
12.09.2014, 15:56
Nach stundenlangem Suchen kann ich Folgendes mit Stolz verkünden: keine Ahnung, wie ich an den CallTree herankommen soll.
Ich habe es mal mit etwas anderem versucht (über die Event_ID):

Post-Umleitung (http://www.multimediaxis.de/threads/104116-Programmwunsch-und-erstellungsthread-2?p=3198903&viewfull=1#post3198903)


P.S.

download AntiLag(Fast) (http://share.cherrytree.at/showfile-16791/antilag_fast_.rar)

Patches für RPG_RT2k v1.51 und RPG_RT2k3 v1.09 hinzugefügt. EventUpdates allesamt am Ende eines Frames.





Edit:

(MarcLMaps-->GebirgeTeilLinks/GebirgeRECHTSunten) ziemlich stark, da sind auf den Maps ~1000-2000 Events?
Die Parent Map dazu hat übrigens 2190 Events. Und da ist kein Text...

Habe den Kram mal mit MarcL's Zeug durchgetestet. Der Patch nennt sich zwar "Slow", aber einen großartigen Unterschied zur schnellen Variante gibt es, hinsichtlich der Performance, nicht (außer man hat zig Events mit 50 Eventseiten und in jedem eine ganze Menge <ChangeSwitch> und <ChangeVariable>).

Ach und: nicht vergessen die Zeile AntiLagSwitch aus der DynRPG.ini zu löschen.

Cherry
13.09.2014, 17:39
Wenn jetzt Event A das Event B aufruft, Event B setzt einen Switch der Event A (und dadurch auch die Ausführung vom gecallten Event B!) deaktivieren würde, funktioniert das mit deiner Methode nicht.

Meine Methode mit dem Call Stack ginge so:

In den einzelnen Funktionen für die Eventbefehle (z.B. 4ACB18 ProcChangeVariable) gibt es ja drei Parameter: eax = aktueller TLcfgScripter, edx = aktuelle TLcfgScriptData, ecx = aktuelle TLcfEventScriptLine.
Davon ausgehend:


; angenommen, eax ist der TLcfgScripter
mov eax, [eax+4] ; TLcfgScriptDataList
mov eax, [eax+8] ; innere TList der TLcfgScriptDataList (quasi der Call Stack)
mov eax, [eax+4] ; Pointer auf Array
mov eax, [eax] ; Erster Eintrag (ursprünglicher Caller)
mov eax, [eax+1c] ; Event ID (0 wenn kein Map Event)

Der Vollständigkeit halber müsste das ganze btw auch bei Item Management und Change Party ausgeführt werden.

EDIT: Bei DynRPG oder beim RM2k3 Debug Addon oder der Revolution Patch Preview-Version kann die Event ID da auch negativ sein, das ist dann eine Common-Event-ID, du solltest also überprüfen ob sie >= 0 ist, nicht != 0.

bugmenot
14.09.2014, 14:57
download AntiLag(Slow) (http://share.cherrytree.at/showfile-16845/antilag_slow_.rar)


Sollte jetzt oben beschriebene Fälle (AC statt ABC; A callt B, B bricht A ab) und Folgendes richtig durchführen:

Im 2k(3) wird nicht nur der Caller (@ bottom of CallTree) sondern auch der Callee (@ current CallTree_pos) geupdatet.

...im Falle, wenn der Caller eine höhere Event_ID hat als der Callee, wird der Ausgangspunkt des <CallEvent> als letztes geupdatet. Ist klar von den Zahlen her. Wenn der Callee aber eine höhere Event_ID als der Caller hat, dann wird der Ausgangspunkt des <CallEvent> auch als letztes geupdatet. Das mit dem "aktuellen Event (das am Bottom des Calltrees)" funktioniert nicht in beide Richtungen.

Setze mal im 2k3 Patch 0x35 = EB und 0xB1 = EB, dann wird nur das Event da vorne im CallTree geupdatet.

Wenn der Switch, welcher das erste Event ausstellen soll, beim gecallten Event eine neue Seite öffnet, dann wird diese Seite vorher ausgeführt, bevor der Ausgangspunkt des <CallEvent> seine neue Seite ausführt.

mov eax,[MainPtr]
mov eax,[eax]
[EAX+4] = Byte, GameScene
[EAX+5] = Byte, GlobalUpdate_flag
[EAX+6] = Word, LocalUpdate(Caller)_flag (Event_ID)
[EAX+4E] = Word, LocalUpdate(Callee)_flag (Event_ID)

...wenn +4E schon irgendwo eingeplant ist, habe ich noch +36 und +45 anzubieten.


Der Vollständigkeit halber müsste das ganze [...]
Okay, LocalUpdate jetzt bei
<ChangeSwitch>
<ChangeVariable>
<ChangeTimer>
<ChangeItem>
<ChangeParty>
<KeyInput>


Revolution Patch Preview-Version kann die Event ID da auch negativ sein
Ich hoffe das Ding ist nur für den 2k3.

bugmenot
17.09.2014, 18:04
download AnimationBugFix (http://share.cherrytree.at/showfile-16906/animationbugfix___rpg_rt2k3_v108.ips)

Die Skillanimation wird beim Benutzen von SkillScroll und InvokeSkill wieder vernünftig angezeigt. Vorher ploppten Schadenszahlen während der Skillanimation auf oder der Gegner starb mitten in der Animation.






[QuickPatches]
DmgCapper=49D03B,E8F69DFAFF,446E36,B800000000E86C34FEFF92B80F270000C3
minDMG=446E37,#0
maxDMG=446E42,#9999

MarcL
17.09.2014, 20:47
download AnimationBugFix (http://share.cherrytree.at/showfile-16906/animationbugfix___rpg_rt2k3_v108.ips)
Die Skillanimation wird beim Benutzen von SkillScroll und InvokeSkill wieder vernünftig angezeigt. Vorher ploppten Schadenszahlen während der Skillanimation auf oder der Gegner starb mitten in der Animation.

Awesome! Hat mich schon immer genervt der Fehler ^^;

PS: Werde den Antilag bezeiten mal testen danke :)

Davy Jones
21.09.2014, 23:51
Den hab ich mir mal sofort reingeschmissen =)

bugmenot
22.09.2014, 17:23
Damage over own Time
download DooT(2k3) (http://share.cherrytree.at/showfile-16973/doot_2k3_.rar)

Hiermit wird bei Zuständen, welche HP/MP (je Zug) heilen/abziehen, nicht mehr in jedem getätigten Zug (von irgendetwas im Kampf) der Heilungs-/Schadenseffekt ausgelöst, sondern nur nach dem Zug vom betroffenen Kampfteilnehmer.


BugFix(2k3)
download BattleEndBugFix (http://share.cherrytree.at/showfile-16976/battleendbugfix___rpg_rt2k3_v108.ips)

Wenn der Kampf beendet wurde (Sieg/Niederlage), dann werden die ganzen geöffneten Fenster geschlossen. (Es konnte vorher z.B. eine transparente Skillbeschreibung unter dem "Sieg" Text liegen oder andere Fenster waren noch offen.)
Entfernt auch den Cursor, welcher auf wartende Helden zeigt. Manche plugins müssten vielleicht angepasst werden, wenn sie zusätzliche HUD-Grafiken anzeigen.

Hmm... BattleEnd_flags gibt es bisher nicht in DynRPG?

bugmenot
26.09.2014, 12:09
Okay, man sieht im Endeffekt nur 16-bit, da der RPG Maker Framebuffer nur 16-bit unterstützt...

Edit: Fade-In gefixt
download 32bit(fix) (http://share.cherrytree.at/showfile-20449/32bit_fix_.rar)

Smooth color gradients. Jetzt auch für DynRPG hinzugepackt.

Solange sich an den Adressen 45D030, 45D50F, 45D554, 45D58B, 45D59E nichts ändert... sollte es mit künftigen DynRPG-Versionen kompatibel sein.

Edit²: Fade-In gefixt für 2k:
download DestinyV2 32bit fix (http://share.cherrytree.at/showfile-20450/destinyv2_32bit_fix___rpg_rt2k_v107.ips)
(erst Bananen-Joe's Destiny Patcher (http://www.bananen-joe.de/DestinyDLL/) dann .ips anwenden)

goldenroy
26.09.2014, 12:46
download 32Bit (http://share.cherrytree.at/showfile-17023/32bit.rar)

Smooth color gradients. Jetzt auch für DynRPG hinzugepackt.

O________________________O

BDraw
26.09.2014, 13:23
Verstehe ich das richtig, in Kombination mit Kyuus RPGSS wären somit 32Bit-Bilder mit Alphakanal möglich? Das wäre ja wahnsinn!
Endlich hochwertige Portraits mit sauberen Rändern anstatt diesen kleinen Facesets xD

Cherry
26.09.2014, 14:40
download 32Bit (http://share.cherrytree.at/showfile-17023/32bit.rar)

Smooth color gradients. Jetzt auch für DynRPG hinzugepackt.

Solange sich an den Adressen 45D030, 45D50F, 45D554, 45D58B, 45D59E nichts ändert... sollte es mit künftigen DynRPG-Versionen kompatibel sein.

Äh, was genau hast du da gemacht? Banenen-Joe hat extrem viel umändern müssen weil ja überall die Palettengröße auf 16 Bit zugeschnitten ist, die Logik die Paletten anpasst, etc... also inwiefern kann das jetzt mit DynRPG gehen? Besonders weil ja die Headerfiles und die Library auch von 16 Bit ausgehen.

Bitte erklär mal... Danke

bugmenot
26.09.2014, 15:44
@goldenroy
Ähh, warum das lange Gesicht? Obwohl, ich kann es mir schon vorstellen...



was genau hast du da gemacht?
Da ich nichts von Framebuffern verstehe, kann ich darauf nicht wirklich - im Sinne des Fragenden - antworten.


Banenen-Joe hat extrem viel umändern müssen
Nur ca. 400 Adressen. Ich dachte mir da:
1) die RPG_RTs von 2k und 2k3 zum größten Teil auf der selben Software beruhen
2) die 32bit-Einstellung von Destiny auch unabhängig vom restlichen Destiny Patch auf dem 2k laufen kann
3) die Auflösung des Framebuffers auch verändert werden kann, ohne extern was machen zu müssen
...könnte man das, was Bananen-Joe für den 2k gemacht hat, auch für den 2k3 nachbauen, die restlichen Zugriffe auf Bildeigenschaften anpassen und zumindest mal durchtesten.



inwiefern kann das jetzt mit DynRPG gehen?
Verdammt... Plugins, die irgendwelche Grafiken laden führen zu Crashes.

Soviel zum Thema null Ahnung haben und einen ganzen Abend mit dem Kram verschwenden.

Cherry
26.09.2014, 15:54
Oh, du hast das nur geportet, verstehe.

Naja, verschwendet ist nix, es ist sicher hilfreich für Leute die keine Plugins verwenden. Erzeugt halt leider eine "entweder-oder"-Situation, und es ist nicht leicht oder fast nicht möglich, das vernünftig zu beheben.

(Und ich muss jetzt wohl doch Support für diese "komischen" Framebuffer in UniDebug einbauen. Pöh. ;) )

bugmenot
26.09.2014, 16:02
Läuft die Anzeige von Bildern über Plugins etwa über diese beiden dll files die... irgendwo sind? Oder über die kompilierten Plugins, welche die Bilder einfach nur in den Framebuffer injizieren?

Kann man wirklich nirgendwo umschreiben, dass bei Fund von 8B 92 08 06 00 00 an offset 45D02D header und lybrary nicht von 16bit ausgehen?

Cherry
26.09.2014, 16:32
Die kompilierten Plugins.
Nein, 1. weil Header die Datenstrukturen definieren und die müssen zur Compile-Time bekannt sein. Man müsste sonst 2 Strukturen definieren und jeder Pluginentwickler müsste überall Abfragen einbauen, welche verwendet wird. Und die Library ist ja auch statisch gelinkt und daher kann man das nicht vernünftig ändern, besonders nicht die existierenden Plugins. Außerdem können Plugins direkt mit dem 16-Bit-Bildpuffer arbeiten, das ist auch so vorgesehen, was natürlich nicht funktioniert wenn der nicht 16 Bit hat.

Cherry
27.09.2014, 10:41
@bugmenot:

http://i.imgur.com/kP9EFCx.png

Zumindest damit ist es jetzt kompatibel ;) (kommt in nächster Version)

EDIT: Ja, es sollte "bits" heißen. Ich ändere den Screen jetzt aber nicht mehr.

aleksy
28.09.2014, 01:17
Hey Cherry,

wollte mich mal hier im Thread erkundigen, ob es möglich wäre, mit einem Plugin eine Art "Filter" über den Maker zu werfen (oder wie man das nennen kann),
mit dem man zumindest ähnliche Effekte erzielen kann wie bspw. in Max Payne 3 (bei Einnahme von Painkillern etc.)?
In diesem Video sieht man diese "Bildverzerrungs- und verfärbungseffekte" öfters mal: https://www.youtube.com/watch?v=SlP7hKLhsaE

Ich bräuchte solche Effekte (wenn auch in niedrigerer Anzahl und Intensität) für mein Spiel, aber wie ich es mir hätte denken können ist das mit dem "Vanilla-Maker" ohne halbwegs ordentliche Filter kaum bis gar nicht möglich.
Ob es mit einem zusätzlichen Plugin (auch DynRPG Plugin) geht, weiß ich selber leider auch nicht so genau, aber deshalb frage ich ja.
Wenn es bereits ähnliche Anfragen gab, entschuldige ich mich, aber ich habe keine Lust mich um diese Uhrzeit noch durch 106 Threadseiten zu buddeln..

Ich hoffe du kannst mir helfen :)

lg/ aleksy

Cherry
28.09.2014, 13:58
Ich hab dazu jetzt keine Zeit, aber man (= jemand anderer) kann dafür sicher ein DynRPG Plugin schreiben. Mit DynRPG kann man nämlich auf den Bildschirminhalt zugreifen.

aleksy
28.09.2014, 14:41
Das hört sich ja gut an :) Dann müsste ich ja jetzt nur jemanden finden der sowas kann.. Oder ich lerne, selber DynRPG Plugin zu schreiben ^_^

Corti
01.10.2014, 02:43
Kazesui hat ein Plugin für Blendmodes gemacht. Damit kannst du Verfärbungen umsetzen. Wie du aus den Blendmodes aber etwas künstlerisch Wertvolles machst, musst du selbst rausfinden.

bugmenot
01.10.2014, 15:45
Verstehe ich das richtig, in Kombination mit Kyuus RPGSS wären somit 32Bit-Bilder mit Alphakanal möglich? Das wäre ja wahnsinn!
Endlich hochwertige Portraits mit sauberen Rändern anstatt diesen kleinen Facesets
Kurioserweise bringen .lua Skripte das Spiel nicht zum Abstürzen. Das Bild ist zumindest schonmal verzerrt und verfärbt, so we got that.

Also könnte DynRPGSS da potentiell noch was aus Bananen-Joe's umgeschriebenem Framebuffer rausholen, falls der Zugriff auf den Framebuffer seitens DynRPG auf einen 32bit-Mode umgestellt werden könnte - hat doch auch mit unidebug funktioniert? (weil keine inflexiblen header und so)

Cherry
02.10.2014, 09:04
Ich vermute, dass DynRPGSS "funktioniert", liegt daran, dass es nicht Bildpuffer für einzelne "Bildobjekte" verwendet (wie es der Maker und andere Plugins normal tun), sondern direkt auf den Framebufer zugreift. Das hat zur Folge dass es nur dasselbe Problem hat wie UniDebug es hatte. Bei UniDebug war es deshalb leicht lösbar, weil meine Grafikbibliothek bei nicht-indizierten Bildmodi (also 16-Bit und 24-/32-Bit) sowieso immer RGB mit 8 Bit pro Farbe verwendet hat im seinem Interface (die intern halt auf 16-Bit-Farben reduziert wurden). Ich musste also nur der Grafikbibliothek die andere Farbtiefe mitteilen (und meiner Methode, die Zeugs auf dem Puffer der Grafikbibliothek in den Framebuffer vom Maker kopiert oder andersrum, und es lief.

Es wäre also tatsächlich für DynRPGSS möglich, sich da anzupassen, ich aber nicht was Kyuu dafür intern alles tun müsste. (Und es ist natürlich immer noch blöd dass nix anderes damit funktioniert.)

bugmenot
04.10.2014, 18:39
GuardRevamp
download GuardRevamp (http://share.cherrytree.at/showfile-17117/guardrevamp.rar)

Dieser Patch erlaubt es die Schadensreduzierung beim Abwehren festzulegen.

download LunarIPS (http://fusoya.eludevisibility.org/lips/)
Erster Schritt: legt euch eine Sicherungskopie eurer RPG_RT.exe an (für den Fall der Fälle)
Lunar IPS öffnen -> apply IPS patch -> .ips-Datei (den Patch) wählen > Dateityp: all types -> RPG_RT.exe auswählen

Nach dem Patchen lassen sich die Prozentzahlen in der RPG_RT.exe mit jedem beliebigen HexEditor verändern:
2k:
0x75CEA (normal defense)
0x75CF1 (strong defense)

2k3:
0x9C428 (normal defense)
0x9C42F (strong defense)


Oder packt den Patch in den Ordner DynPatches und:


[QuickPatches]
GuardRevamp(normal)=49D028,%50
GuardRevamp(mighty)=49D02F,%25


This patch allows you to set the damage reduction when defending.


download LunarIPS (http://fusoya.eludevisibility.org/lips/)
First step: make a backup of your RPG_RT.exe (just in case)
open Lunar IPS -> apply IPS patch -> select the .ips file (this patch) -> file type: all types -> select the RPG_RT.exe

Upon patching you can change the percentages in the RPG_RT.exe with any kind of HexEditor:
2k:
0x75CEA (normal defense)
0x75CF1 (strong defense)

2k3:
0x9C428 (normal defense)
0x9C42F (strong defense)


Or put this patch into your DynPatches folder and:


[QuickPatches]
GuardRevamp(normal)=49D028,%50
GuardRevamp(mighty)=49D02F,%25

Davy Jones
06.10.2014, 23:17
Gleich mal alles in den DynPatch-Ordner geschmissen =)

Nur der 32-Bit-Patch ist mir schleierhaft. Hab die DynRPG-Variante im Ordner und wollt gleich mal ein beliebiges PNG-Bild als Panorama benutzen. Unsupported PNG Image sagt er mir dann.

Den kann man wohl nur für ganz spezielle Sachen benutzen, oder?

bugmenot
07.10.2014, 00:08
Alle Plugins, die irgendetwas auf den Bildschirm zeichnen führen zu einem Absturz. Mal so... nebenbei.


Nur der 32-Bit-Patch ist mir schleierhaft.
Soll ja auch Farbschleier und Ähnliches verhindern. Der Image Loader (oder wie auch immer das Ding heißt) vom 2k(3) ist bisher immernoch nur in 8bit.

Der 32bit Patch erhöt die Anzahl der Farben in der Farbpalette des 2k(3), das heißt es gibt:
A) bei irgendwelchen Farbverläufen (zB. default Menühintergrund oder 8bit Bilder mit Farbverläufen) keine auffallenden, abweichenden Verfärbungen.
B) bei Transparenzen oder Änderung der Farbe/Tint weniger milchige Schlieren oder diese sich bildenden Farbbereiche, welche sich scheinbar hin- und herbewegen (probier einfach mal ein <TintScreen> mit irgendeinem detaillierteren Panorama aus. Bevorzugt eines, welches einen Farbverlauf drin hat).

Corti
07.10.2014, 11:18
@Davy: Da kommen einige Sachen zusammen.

Die Grafiken die wir im Maker benutzen haben nicht 8 Bit Farbtiefe, sondern eine 8Bit Palette mit 24Bit Farbtiefe. Jeder Pixel enthält einen Wert zwischen 0 und 255 ( 8 Bit ) , dieser entspricht dem Index der Farbe in der Palette. Die Farben in der Palette haben für Rot,Grün, Blau jeweils einen Wert von 0 bis 255, wieder 8 Bit, also in Summe 24 Bit.

Wenn der RPG Maker diese Grafiken lädt, dann erstellt er intern eine weitere Palette mit einer Farbtiefe von 16 Bit, damit diese in den 16Bit Bildbuffer geschrieben werden können. In 16 Bits bleiben nur 5/5/6 Bit für die einzelnen Farbkanäle. Der z.B. Rot-Wert von 0 bis 255 wird in einen Wert zwischen 0 und 31 konvertiert. Dadurch werden Farbwerte, die vorher nur gering unterschiedlich waren, z.B. 254 und 250 zu dem selben Farbwert, und Farbverläufe werden dadurch unsauberer.

Dieses Verkrüppeln der Farben ist es, was der Patch angeht.

Corti
07.10.2014, 15:23
Hey!

ich habe folgende Fixes rumliegen, alle mit dem Zweck das Standardmenü zu beenden und irgendwas zu setzen.

SA Switch -> Beendet bei Status und Atb
SOA Switch -> Beendet bei Status, Order und Atb
SROA Switch -> Beendet bei Status, Order, Row und Atb
RowVar[2+] -> Beendet bei Row mit Variable des gewählten Helden


Gibts auch einen Fix, der nur Atb zum Switchbefehl macht, falls ich Status wie gewohnt benutzen möchte?
Deaktiviert sich die Funktion der Hacks, wenn man die SwitchID mit 0 parametriert? Die Readme sagt dazu nichts und ich möchte ungern Bomben ins Projekt anderer Leute einbauen.

bugmenot
07.10.2014, 17:03
der nur Atb zum Switchbefehl macht
download A Switch (http://share.cherrytree.at/showfile-15943/a_switch___rpg_rt2k3_v108.ips)


[QuickPatches]
ATBSwitch_ID=4A26B7,#1008



RowVar[2+] -> Beendet bei Row
und Order und Switches werden gesetzt.



Deaktiviert sich die Funktion der Hacks, wenn man die SwitchID mit 0 parametriert?
Bei ID = 0 werden zwar keine Switches oder Variablen verändert, aber die ursprünglichen Funktionen werden auch nicht wieder hergestellt.
Ich könnte da eine Abfrage reinpacken, sodass bei ID = 0 der ursprüngliche Code ausgeführt wird, aber das ist irgendwo kontraproduktiv auf zwei oder mehr Ebenen.


ich möchte ungern Bomben ins Projekt anderer Leute einbauen.
Gibt es da nicht bereits seitens DynRPG die Möglichkeit, dies über Plugins zu regeln? Z.B. Quit Switch Plugin (http://rpgmaker.net/engines/rm2k3/utilities/28/) (da ist eine dokumentierte(?) source Datei mit bei) oder du fragst PepsiOtaku selbst.

Edit:
Ich sehe gerade, dass das einfach nur ein Patch ist.
Da hätte ein callback an loc_4A24EE (bool onMenuOption (int OptionID)) und ein "jl short loc_4A2545" dahinter irgendwie mehr gebracht. Bei positiver Pluginaktivität ein call sub_4A1054 sowie [[4CDC1C]+0C] = 1) und ein return -1


Planst du zufällig Plugins an Patches zu binden?
Ich habe ein paar Sachen auf Eis gelegt (Zugriff auf die Condition- und Attribute-Arrays; Zugriff auf das Setzen und Ausführen von BattleCommands; etc.), weil die Initialisierung irgendwann nicht mehr funktionieren würde (zB. durch das Ändern von Variablen) oder es sich auf 1 mal je Frame eingrenzen würde.

Und weil es für den Endnutzer mehr Sachen gibt, auf die er/sie achten muss = höhere Wahrscheinlichkeit Mist zu bauen.
Und es würde eine Eingrenzung von Plugins auf nur ein paar bestimmte zusätzliche Funktionen bedeuten.
Und am Ende würde niemand mehr damit hinterherkommen, wer was wo benutzt und wo Bomben oder Eier eingebaut wurden... ugh, Entschuldigung.



Kann man per C++ einen Pointer auf den Ort im RAM der laufenden RPG_RT Applikation erhalten und zur Laufzeit damit interagieren? Es fehlen bisher noch zu viele Zugriffe auf Objekte, Klassen und interne Funktionen.

Corti
08.10.2014, 09:28
Noch 'ne Anfrage: elvissteinjr hat hier für den 2k3 einen patch gemacht, mit dem man Item- und Ausrüstungs/Skill-Menüs direkt aufrufen kann. Funzt das auch für den 2k, bzw. kanns jemand darauf umbiegen?

Originalpost & Patch - Item & Equip (http://www.multimediaxis.de/threads/104116-Programmwunsch-und-erstellungsthread-2?p=3075375&viewfull=1#post3075375)
Originalpost & Patch - Items, Skill & Equip (http://www.multimediaxis.de/threads/104116-Programmwunsch-und-erstellungsthread-2?p=3110609&highlight=eine+Anfrage+bekommen+hab%2C#post3110609)


__________________________________________________________________

@bugmenot: Die Dark Sword Crew dankt für den Patch! :)


Ich habe ein paar Sachen auf Eis gelegt (Zugriff auf die Condition- und Attribute-Arrays;
Sowas gehört mit zu meinen Traumwünschen bisher *g


Kann man per C++ einen Pointer auf den Ort im RAM der laufenden RPG_RT Applikation erhalten und zur Laufzeit damit interagieren? Es fehlen bisher noch zu viele Zugriffe auf Objekte, Klassen und interne Funktionen.

Man kann in DynRPG Adressen beschreiben

// im NormalPlay eine Zeile sofort anzeigen
*reinterpret_cast<unsigned short *>(0x4C7C42) = 0x9090; // Default: 0x1074
// im NormalPlay alle Zeilen sofort anzeigen
*reinterpret_cast<unsigned short *>(0x4C7C88) = 0x9090; // Default: 0x1074


Oder auslesen:

int getMenuScreen()
{
return ( **reinterpret_cast<char ***> ( 0x4CDC60 ) ) [12];
}

Wenn du also sagen kannst, wo die Conditions und Attribute rumliegen, könnte man Funktionen basteln, die das komfortabel handlen.

bugmenot
08.10.2014, 12:48
Mal schauen, was sich zusammenpuzzeln lässt...

Ein Problem vorweg: ich bin mir nicht sicher, wann die Arrays für Attribute bereits vorliegen, weswegen man unter Umständen das Zeug manuell initialisieren muss:


int getAttributeAmount () //gibt Anzahl der Einträge in der Database aus
{ return ( **reinterpret_cast<char32_t ***> ( 0x4CDE44 ) ) [8] [8]; //Kann man eigentlich mehrmals hintereinander dereferenzieren? }

int getConditionAmount ()
{ return ( **reinterpret_cast<char32_t ***> ( 0x4CDE84 ) ) [8] [8]; }

void initACArrays (int BattlerID)
{
int A = getAttributeAmount ();
int C = getConditionAmount ();
int BattlerPtr;
//RPG:: Battler gibt doch einen Pointer auf ein Array aus? Dieser wird als Parameter für eine interne Funktion der RPG_RT benötigt.
//über " RPG:: Battler (BattlerID); " an den BattlerPtr herankommen[...]
call RPG_RT.004BFE1C (BattlerPtr, A); //mal angenommen die calling convention ist: Param1 = %EAX, Param2 = %EDX
call RPG_RT.004BFF5C (BattlerPtr, C);
//deswegen (unter Anderem) wird der Zugriff auf die laufende RPG_RT-Instanz benötigt
}

int main ()
{
initACArrays (BattlerID);
}


Die Pointer für die Arrays von Attributen und Conditions sollte man eigentlich über RPG:: Battler ansteuern können (die selben Ptr gelten für Actor und Monster).


//Attribute_ID als Parameter ID angeben
int getAttribute (int BattlerPtr, int ID)
{
int ArrayPtr = BattlerPtr [48]; //Ptr auf das AttributeArray
return ArrayPtr [ID*2-1];
}

//Condition_ID als Parameter ID angeben
int getCondition (int BattlerPtr, int ID)
{
int ArrayPtr = BattlerPtr [56]; //Ptr auf das ConditionArray
return ArrayPtr [ID*2-1];
}
Ehrlich gesagt steige ich noch nicht ganz durch bei der ganzen Re- und Dereferenzierung von C++. Kann also sein, dass da ein paar & oder * fehlen.
Schreibzugriff sollte eigentlich auch möglich sein(?).

Die ArrayStruktur sieht wie folgt aus (IDs starten nicht bei 0):
[ID*2-1] die zweiten 8bit für die Resistenzangabe (0=A, 1=B, ...) und
[ID*2-2] die ersten 8bit für zusätzliche Information (-1|+0|+1 Modifier für Attribute oder die Uptime von Conditions)
Arraygröße ist 2 x 8-bit x get[xyz]Amount

Cherry
08.10.2014, 15:25
Es gibt schon Klassen für die internen Arraystrukturen ,wie z.B. DArray bzw. DList...

was genau hast du da vor? Ich versteh das momentan grade nicht.

bugmenot
08.10.2014, 18:41
Direct Menu Patch
download DirectMenuPatch(fix) (http://share.cherrytree.at/showfile-20564/directmenupatch_fix_.rar)



Dieser Patch erlaubt es Untermenüs durch Gebrauch von Variablen und dem Eventbefehl <OpenMainMenu> direkt zu öffnen.

Var[3326] = 1 (öffnet das ItemMenü)
Var[3326] = 2 (öffnet das SkillMenü)
Var[3326] = 3 (öffnet das EquipMenü)
Alle anderen Werte öffnen das normale Menü.
Var[3326] = 4 (öffnet das StatusMenü)
Var[3326] = 5 (öffnet das OrderMenü)
Alle anderen Werte öffnen das normale Menü.

Wenn man das SkillMenü oder das EquipMenü öffnet, bestimmt eine zweite Variable, wessen Untermenü geöffnet wird.
Die Var_ID der zweiten Variable ergibt sich aus Var_ID +1 der ersten Variable (default = 3327).

Diese kann genutzt werden, um die Menüs der Partymitglieder zu öfnen:
Var[3327] = 1 (Untermenü vom Helden an PartyPosition #1)
Var[3327] = 2 (Untermenü vom Helden an PartyPosition #2)
Var[3327] = 3 (Untermenü vom Helden an PartyPosition #3)
Var[3327] = 4 (Untermenü vom Helden an PartyPosition #4)
Null oder alles oberhalb der gegenwärtigen Partygröße öffnet standardmäßig das Menü von PartyPosition #1.

Wenn keiner in der Party ist, dann wird das normale Menü geöffnet und die erste Variable wird auf Null zurückgesetzt.

Die Varable kann auch genutzt werden, um die Menüs von jedem im Spiel befindlichen Helden zu öffnen. Dafür muss man die negative Hero_ID angeben:
Var[3327] = -17 (Untermenü vom Helden #17)


download LunarIPS (http://fusoya.eludevisibility.org/lips/)

Erster Schritt: legt euch eine Sicherungskopie eurer RPG_RT.exe an (für den Fall der Fälle)
Lunar IPS öffnen -> apply IPS patch -> .ips-Datei (den Patch) wählen > Dateityp: all types -> RPG_RT.exe auswählen

Nach dem Patchen lässt sich die Variable in der RPG_RT.exe mit jedem beliebigen HexEditor verändern:
2k:
0x321B5 (default = 3326)

2k3 Adresse:
0x462DE (default = 3326)


Oder packt den Patch in den Ordner DynPatches und:


[QuickPatches]
DMPVar=446EDE,#3326


This patch allows you to open a SubMenu directly by using variables and the <OpenMainMenu> command.

Var[3326] = 1 (open ItemMenu)
Var[3326] = 2 (open SkillMenu)
Var[3326] = 3 (open EquipMenu)
Anything else opens the usual menu.
(2k3)
Var[3326] = 4 (open StatusMenu)
Var[3326] = 5 (open OrderMenu)
Anything else opens the usual menu.

When opening the SkillMenu or the EquipMenu, a second variable specifies which Hero's SubMenu is opened.
The Var_ID for the second variable is Var_ID +1 of the first variable (default = 3327).

It can be used to open a menu of the current party members:
Var[3327] = 1 (open SubMenu of Hero at PartyPosition #1)
Var[3327] = 2 (open SubMenu of Hero at PartyPosition #2)
Var[3327] = 3 (open SubMenu of Hero at PartyPosition #3)
Var[3327] = 4 (open SubMenu of Hero at PartyPosition #4)
Zero or anything above the current party's size will open the menu of PartyPosition #1 by default.

When the party is empty, the default menu will open up instead and the first variable will be set to zero.

It can also be used to open a menu of any Hero that is in the game. Just use negative numbers and the Hero_ID as input:
Var[3327] = -17 (open SubMenu of Hero #17)


download LunarIPS (http://fusoya.eludevisibility.org/lips/)

First step: make a backup of your RPG_RT.exe (just in case)
open Lunar IPS -> apply IPS patch -> select the .ips file (this patch) -> file type: all types -> select the RPG_RT.exe

Upon patching you can change the variable in the RPG_RT.exe with any kind of HexEditor:
2k:
0x321B5 (default = 3326)

2k3 address:
0x462DE (default = 3326)


Or put this patch into your DynPatches folder and:


[QuickPatches]
DMPVar=446EDE,#3326

goldenroy
08.10.2014, 20:29
Langsam verlier ich den Überblick über diese ganzen Menüpatches. xD
Da gibt es welche, um Menüpunke direkt zu öffnen, welche um Menüpunkte auszuhebeln, dann noch VisuMenu für generelles umgestalten, Cherrys MapInMenu und von allen irgendwie zig verschiedene Versionen und dann noch für 2k/2k3 und manche als Plugin und aaaah. D8
Ich glaub ich such die mal zusammen und mach nen "Pimp my menu"-Thread oder so. °3°

Corti
08.10.2014, 22:14
Besten Dank!

bugmenot
13.10.2014, 12:00
Update (http://www.multimediaxis.de/threads/104116-Programmwunsch-und-erstellungsthread-2?p=3203452&viewfull=1#post3203452)

... da ist jetzt ein Patch für 2k3 mit bei, sowie ein Bugfix für die 2k Version (bei leerer Party kein Crash mehr).


"Pimp my menu"
... es müsste eigentlich auch möglich sein mit einem geupdateten SystemClock w/ Foreground & Background Plugin noch mehr Zeug in die ganzen anderen Menüs reinzupacken.

Ohne mal an zusätzliche Möglichkeiten des Zugriffs von DynRPG (irgendwann vielleicht) auf Menünavigation zu denken (Ordnungsfunktion + Reihenwechsel in Einem. Wie in den gängigen klassischen Rollenspielen... so mal als Beispiel)



Edit:

Es gibt schon Klassen für die internen Arraystrukturen, wie z.B. DArray bzw. DList...
Solange ein Battler noch nie angegriffen wurde, ist

call sub_4A6014
mov eax,[eax+30h]
immernoch gleich Null. Lese- und Schreibzugriff auf das Array mit den ganzen Attributresistenzen ist somit nicht möglich. Man kann vielleicht noch über die Klassen Actor und Monster(nicht "subtype of battler") die ganzen Resistenzen auslesen.

Andere Frage: mit

int MonGroupID = ( **reinterpret_cast<long ***> (0x4CDD38) ) [3];
bool BatDefeat = ( **reinterpret_cast<char ***> (0x4CDD38) ) [132];
bool BatVictory = ( **reinterpret_cast<char ***> (0x4CDD38) ) [133];
kommt man an einige Informationen ran... wie dreht man das jetzt aber um (einen Pointer erhalten, über den man neue Werte setzen kann)?

Und wie kann man Code wie

mov eax,[eax]
mov eax,[eax+8]
mov eax,[eax+8]
gescheit in C++ umsetzen?




was genau hast du da vor?
Wenn man mittels RPG:: Action die Parameter kind, basicActionId, skillId, monsterId, itemId, target, targetId setzen würde... sowie
target an [[0x4CDD38]+B0h],
targetId an [[0x4CDD38]+B4h] und
Hero_ID (bzw. -1 if isMonster=true) an [[0x4CDD38]+B8h]
schreiben würde, dann würde es noch lange nichts nützen, solange

call sub_4A6014
xchg eax,edx
mov eax,off_4CDD38
mov eax,[eax]
mov eax,[eax+5Ch]
call sub_4175DC
nicht aufgerufen wird (entspricht manuellem Ausführen eines Kampfbefehls... wäre nützlich für Kontern, eigene KI, SkillCombo, etc.)

Cherry
14.10.2014, 08:00
http://rpg-maker.cherrytree.at/dynrpg/class_r_p_g_1_1_battler.html#a24237e95d2c3acd80cc8c3785a52161a ?

Und wegen "umdrehen": Eine Referenz erstellen - int &monGroupID, etc.

Sowas wie dein +8 +8 Beispiel würd ich so direkt natürlich nicht einbauen (außer halt eben wenn ich noch keine Strukturen habe, aber das ist ja da nicht der Fall), sondern - mal davon ausgehend dass da von einem TCatalog die Länge willst - einen DListPtr setzen und die length property verwenden (dafür ist sie ja da).

bugmenot
25.10.2014, 13:19
Link (http://rpg-maker.cherrytree.at/dynrpg/class_r_p_g_1_1_battler.html#a24237e95d2c3acd80cc8c3785a52161a) ?
Habe ich übersehen. Kann mit der Information vielleicht etwas anfangen, wenn ich insgesamt mehr als 3-4 Stunden Erfahrung mit C++ habe.

@DArray
Du meinst, dass sich über

static RPG::DArrayPtr *&namegoeshere = (**reinterpret_cast<RPG::DArrayPtr ***>(0xoffset));
mit dem angepointerten Array arbeiten lässt?

Andere Frage: hat man per Plugin Zugriff auf den address space von der RPG_RT.exe Applikation? Lesen und Schreiben geht ja über reinterpret_cast bereits. Was mir persönlich fehlt, ist ein bequemes Angeben von Funktionsadressen aus der RPG_RT zum Ausführen jener Funktionen und um schnell mal ein paar dutzend Sachen durchzuprobieren.

Edit³:
Dammit... Soetwas wie:

function RuntimeFunction(RPG::AppropriateClass *PtrOnObject, int x, int y) {
int ret;
asm volatile("call *%%esi" : "=a" (ret), "=d" (RPG::_edx), "=c" (RPG::_ecx) : "S" (0xFunctionOffset), "a" (Object), "d" (x), "c" (y) : "cc", "memory");
return ret;
}
Werde das beizeiten mal auseinandernehmen. Der Aufbau hiervon sagt mir nur leider nicht viel, außer dem Zuweisen der %Register.



Ach und: Bugfix.

Im 2k3 fehlt im Database Editor der Zugriff auf einen Parameter von Skills (dieses "failure message" Ding beim 2k). Wenn man Skills löscht und neue erstellt, dann setzt sich der Parameter zurück auf 'magic type evasion' und ignoriert AGI-Werte und Conditions für die Berechnung von Trefferwahrscheinlichkeiten.



[QuickPatches]
SkillAccuracyFix=49C69A,38000F84
Wenn man ATK influence auf Null setzt, dann werden AGI-Werte und Zustandsänderungen (wie Blind) ignoriert (für klassische Zauber). Damit eine Ausweichrate durch AGI berücksichtigt wird, muss man die ATK influence auf 1 oder höher setzen.


Und nochmal:
Wenn AGI(target) / AGI(user) gegen Null läuft:


[QuickPatches]
AccuracyFix=49B4E8,EB04,49B4F4,EB04,49C70E,EB04,49C71A,EB04
Falls die Trefferrate nicht bei 50% hängen bleiben soll, egal wie blind der Nutzer eines Skills ist.



Edit:
Oder für Diejenigen, welche den Int Stat nicht für die Schadensberechnung nutzen


[QuickPatches]
SkillAccuracyFix=49C69A,3C000F85
AGI und conditions ignorieren, solange INT influence größer/gleich 1 ist.


Edit²:
Oder wenn sich die Skill_ID innerhalb eines festlegbaren ID-Bereiches befindet, gehen AGI und conditions in die Trefferrate mit ein:

[Quickpatches]
SkillAccuracyFix=49C698,E940A8FAFF,446EDD,817B04000000007C0D817B04000000000F8EAF570500E974580500
SkillAccFixRange=446EE0,#1,446EE9,#2

bugmenot
04.11.2014, 13:09
SkillSubsets sollten nun wieder funktionieren.
Und ein paar kleine Änderungen... nützlich für "Stehlen" Fähigkeiten oder Ähnliches (siehe Readme).
"Miss!" Verarbeitung wurde etwas verbessert.
Einen Fehler beseitigt, bitte nocheinmal herunterladen:

Update/BugFix (19.02.2015); Crash bei explodierenden Gegnern.
RowPhysSkills[+] (2k3)
download RPS[+] (http://share.cherrytree.at/showfile-19241/rps___.rar)

Dieser Patch hat den PhysDamageFix bereits integriert (PDFix.ips kann gelöscht werden):
Bei einem "Back Attack" Kampf wird der physische Schaden nicht mehr zusätzlich um 25% gesenkt. (Gegner wurde als "in der hinteren Reihe" interpretiert.) Das Selbe für die Treffgenauigkeit.

Dieser Patch hat den ReflectBugFix bereits integriert (ReflectBugFix(Plus).ips kann gelöscht werden):
Entfernt viele Fehler die auftreten, wenn ein Skill von einem Gegner abprallt.

Zusätzlich wird bei Attributresistenzen von 0% das Wort "Immune" angezeigt, anstelle einer Null. (lässt sich per HexEditor in der .ips Datei an 0x4B2 ändern oder nach dem Patchen in der RPG_RT.exe an 0x467A0 ändern) Oder für eine schnelle Übersetzung folgendes in die DynRPG.ini unter [QuickPatches] einfügen:
RPSImmun=4473A5,00

Außerdem wird bei einem Skill, welcher keine der Statuswerte (HP/MP/Str/Def/Int/Agi), Conditions oder Attribute-Resistenzen verändert kein "Miss!" angezeigt.


Dieser Patch erlaubt es %Attribute zu nutzen, um normalen Angriffen (mit Waffen) und Skills (normale oder durch Items ausgeführte) zusätzliche Effekte zuzuweisen. Der Attributname muss dafür mit einem % beginnen, gefolgt von einer Zahl. Alles hinter der Zahl hat keinen Effekt (man kann es für eine kurze Beschreibung nutzen). Bestimmte %Attribute verlangen eine Angabe eines Parameters im "damage multiplier [A]" (bei den Resistenzen A/B/C/D/E).

Um %Attribute zu nutzen muss man bei der Waffe oder dem Skill entsprechend ein Häkchen bei 'Attack Attribute' setzen.
Verschiedene %Attribute lassen sich kombinieren, aber nicht die mit gleicher Nummer (nur jenes mit der niedrigsten Attribut_ID wird erkannt).


%Attribute:

%1 (Row)
[Attack]
-> Treffer% and Schaden% werden nicht von der Reihe beeinflusst
-> Schaden wird nicht reduziert, wenn das ziel in der hinteren Reihe ist
[Skills]
-> Treffer% and Schaden% WERDEN von der Reihe beeinflusst
-> -25% Schaden, wenn das ziel in der hinteren Reihe ist


%2 (Pierce)
[Attack]
-> DEF des Zieles wird ignoriert
[Skills]
-> das Ziel erhält umso mehr Schaden je höher seine DEF ist
-> addiert "DEF x AtkInfl / [A]" zum Schaden (anstatt es abzuziehen)
-> Modifikator [A] kann in DmgMultiplier[A] angegeben werden
-> der Standard-Modifikator für DEF ist 40 (je niedriger, umso mehr Schaden)


%3 (Reflect)
[Skills]
-> Skills ignorieren den "reflect Skills" Zustand des Zieles


%4 (Evade)
[Attack]
-> Angriffe ignorieren den "evade all attacks" Zustand des Zieles
[Skills]
-> Skills verfehlen ein Ziel mit dem "evade all attacks" Zustand


%5 (Name)
[Skills]
-> das Fenster mit dem Skillnamen wird (beim Nutzen) nicht angezeigt


%6 (Fast)
[Attack]+[Skills]
-> der Nutzer erhält [A]% seines ATB-Balkens nach einem Angriff (selbst bei "MISS")
-> Modifikator [A] kann in DmgMultiplier[A] angegeben werden


%7 (Slow)
[Attack]+[Skills]
-> der Nutzer verliert [A]% seines ATB-Balkens nach einem Angriff (selbst bei "MISS")
-> Modifikator [A] kann in DmgMultiplier[A] angegeben werden
-> nutzt negative ATB-Werte (ATB-Balken braucht einfach nur länger zum Aufbauen)


%8 (Delay)
[Attack]+[Skills]
-> das Ziel verliert [A]% seines ATB-Balkens nach erfolgreichem Treffer
-> Modifikator [A] kann in DmgMultiplier[A] angegeben werden


%9 (Switch(A))
[Attack]+[Skills]
-> Switch = ON, bevor der Angriff ausgeführt wird (selbst bei "MISS")
-> Switch_ID kann im Item/Skill type "Switch" geändert werden
HINWEIS: BattleEventTrigger erst NACHDEM die Animation ihren letzten Frame beendet
HINWEIS: etwas buggy im TestBattle (in F8 Database), im normalen Spiel funktioniert's


%10 (Switch(B))
[Attack]+[Skills]
-> Switch [A] wird auf ON gesetzt, nach erfolgreichem Treffer
-> Switch_ID kann in DmgMultiplier[A] angegeben werden


%11 (Switch(C))
[Attack]+[Skills]
-> Switch [A] wird auf ON gesetzt, nach verfehltem Angriff
-> Switch_ID kann in DmgMultiplier[A] angegeben werden


%12 (Damage Cap)
[Attack]+[Skills]
-> min.DMG = [A] (überschreibt keine Immunität oder Schaden unter Null)
-> max.DMG = (setze [B] = 0 um kein max.Cap zu nutzen)
-> Modifikatoren können in DmgMultiplier[A] und [B] angegeben werden


download LunarIPS (http://fusoya.eludevisibility.org/lips/)
[b]Erster Schritt: legt euch eine Sicherungskopie eurer RPG_RT.exe an (für den Fall der Fälle)
Lunar IPS öffnen -> apply IPS patch -> .ips-Datei (den Patch) wählen > Dateityp: all types -> RPG_RT.exe auswählen



[QuickPatches]
PhysDmgRevamp=4C0B53,D1E0,4C0B69,909090
PhysDmgVariance(inverted)=49B687,#10
Dmg(%)InFrontRow=4C0BAB,#125
Dmg(%)OnBackRow=4C0D91,#75
SkillDmg(%)InFrontRow=4471FC,#125
SkillDmg(%)OnBackRow=447206,#75
CritDmg(%)=49B0B0,#300
ChargeDmg(%)=49B0BB,#200

This patch has the PhysDamageFix already integrated (you can delete PDFix.ips):
Physical damage isn't reduced by an additional 25% on a "Back Attack" encounter. (Enemy was interpreted as being in the back row.) The same thing for accuracy.

This patch has the ReflectBugFix already integrated (you can delete ReflectBugFix(Plus).ips):
Removes a lot of bugs that occur when a Skill is reflected off an enemy.

Additionally, if an Attribute resistance of 0% would result in 0 damage, the word "Immune" is displayed instead. (can be changed with a HexEditor at 0x4B2 in the .ips file or in the RPG_RT.exe at 0x467A0 after patching)

Furthermore, if a Skill does not affect any stats (HP/MP/Str/Def/Int/Agi), Conditions or Attribute resistances, the word "Miss!" will not be displayed.


This patch allows you to use %Attributes to assign certain effects to regular attacks (with weapons) and Skills (regular Skills or Skills invoked by Items). The Attribute name has to start with " % " followed by a number (e.g. %1). Anything written after the number will not have any effects (you can use it to describe an effect). Certain %Attributes require you to assign a parameter that has to be written into the damage multiplier [A] (the one in the resistances A/B/C/D/E).

To use %Attributes on a weapon or Skill you have to check it in the 'Attack Attribute' section.
Different %Attributes can be combined, but not those with the same numbers (only the one with the lowest Attribute_ID will be recognized).


%Attributes:

%1 (Row)
[Attack]
-> Hit% and Dmg% not affected by Row
-> no damage reduction if target is in back Row
[Skills]
-> Hit% and Dmg% ARE affected by Row
-> -25% Dmg if target is in back Row


%2 (Pierce)
[Attack]
-> ignores the DEF of the target
[Skills]
-> target suffers more damage the higher its DEF is
-> adds "DEF x AtkInfl / [A]" to the damage (instead of subtracting it)
-> modifier [A] can be set in DmgMultiplier[A]
-> default modifier for DEF is 40 (the lower the number, the higher the damage)


%3 (Reflect)
[Skills]
-> Skills ignore a target's "reflect Skills" condition


%4 (Evade)
[Attack]
-> attacks ignore a target's "evade all attacks" condition
[Skills]
-> Skills miss if the target has an "evade all attacks" condition


%5 (Name)
[Skills]
-> the Window with the Skill's name (when casting it) is not shown


%6 (Fast)
[Attack]+[Skills]
-> user gains [A]% of his/her ATB gauge after attacking (even on "MISS")
-> modifier [A] can be set in DmgMultiplier[A]


%7 (Slow)
[Attack]+[Skills]
-> user loses [A]% of his/her ATB gauge after attacking (even on "MISS")
-> modifier [A] can be set in DmgMultiplier[A]
-> uses negative ATB values (the ATB bar just takes longer to fill up)


%8 (Delay)
[Attack]+[Skills]
-> target loses [A]% of its ATB after a successfull hit
-> modifier [A] can be set in DmgMultiplier[A]


%9 (Switch(A))
[Attack]+[Skills]
-> Switch = ON, before the attack/Skill is executed (even on "MISS")
-> Switch_ID can be changed in Item/Skill type 'Switch'
NOTE: BattleEventTriggers go off AFTER the Animation has played its last frame
NOTE: a little buggy in TestBattle (from F8 database) but works in normal play


%10 (Switch(B))
[Attack]+[Skills]
-> Switch [A] is set to ON after a successful hit
-> Switch_ID can be set in DmgMultiplier[A]


%11 (Switch(C))
[Attack]+[Skills]
-> Switch [A] is set to ON after the attack misses
-> Switch_ID can be set in DmgMultiplier[A]


%12 (Damage Cap)
[Attack]+[Skills]
-> min.DMG = [A] (doesn't overwrite Immunity or damage below zero)
-> max.DMG = (set [B] = 0 to not use a max.Cap)
-> modifiers can be set in DmgMultiplier[A] and [B]


download LunarIPS (http://fusoya.eludevisibility.org/lips/)
[b]First step: make a backup of your RPG_RT.exe (just in case)
open Lunar IPS -> apply IPS patch -> select the .ips file (this patch) -> file type: all types -> select the RPG_RT.exe



[QuickPatches]
PhysDmgRevamp=4C0B53,D1E0,4C0B69,909090
PhysDmgVariance(inverted)=49B687,#10
Dmg(%)InFrontRow=4C0BAB,#125
Dmg(%)OnBackRow=4C0D91,#75
SkillDmg(%)InFrontRow=4471FC,#125
SkillDmg(%)OnBackRow=447206,#75
CritDmg(%)=49B0B0,#300
ChargeDmg(%)=49B0BB,#200


http://i.imgur.com/xdtVZyy.gif



http://i.imgur.com/LY6hdMf.gif


Ich hatte eigentlich vorgehabt Sachen nicht mit reinzunehmen, die man per Plugin erreichen kann... was soll's.

Edit:
download DBX.ini (http://share.cherrytree.at/showfile-18036/dbx.ini)
(höhere DmgMul[A|B|C|D|E] für Attribute)

Corti
13.11.2014, 11:22
Nur interessehalber? Was für ne Form von Logik steckt hinter so einem fix? Steht da irgendwo in der AddCondition-Funktion ein StopMovement oder wie hat man sich sowas vorzustellen?

Btw. führt das Wechseln von Waffen zu einem ähnlichen Effekt.

bugmenot
13.11.2014, 12:17
Btw. führt das Wechseln von Waffen zu einem ähnlichen Effekt.
Ähm... Beispiel? (greift der Fix da nicht mehr?)


Was für ne Form von Logik steckt hinter so einem fix? Steht da irgendwo in der AddCondition-Funktion ein StopMovement oder wie hat man sich sowas vorzustellen?
Standardmäßig wird in dieser AddCondition-Funktion der Animation2-Parameter von RPG :: Battler sofort auf "Bad Status" gesetzt. Der Animation2-Parameter "Move back" liegt in dem Moment nicht mehr vor und das Zurückbewegen nach x/y-Pos(return) wird dadurch in der UpdateBattler-Funktion nicht abgehandelt.

Corti
13.11.2014, 12:37
Hab den Fix nicht ausprobiert. Hab mich nur dran erinnert, dass ich den Effekt daher kannte. Wenn man direkt nach einem Angriff die Waffe eines Helden tauscht, bevor er wiedr an seinem Platz ist, so bleibt er an der Stelle stehen.

bugmenot
13.11.2014, 17:03
Edit (18.11.14):
Edit (24.11.14):
Kleiner Fix, neue Version:

StatusAnimationFix[+] (2k3)
download StatusAnimationFix[+] (http://share.cherrytree.at/showfile-17903/statusanimationfix___.rar)

Falls einem Helden mitten in der Bewegung ("step forward", "jump forward", "move to target") ein Zustand zugefügt wird, bleibt er/sie nicht am falschen Ort stecken.
Falls Ausrüstung mitten in der Bewegung gewechselt wird, dann bleibt der Held auch nicht am falschen Ort stehen.


download LunarIPS (http://fusoya.eludevisibility.org/lips/)
Erster Schritt: legt euch eine Sicherungskopie eurer RPG_RT.exe an (für den Fall der Fälle)
Lunar IPS öffnen -> apply IPS patch -> .ips-Datei (den Patch) wählen > Dateityp: all types -> RPG_RT.exe auswählen

Oder packt den Patch in den Ordner DynPatches.

If a Condition is applied to a Hero mid-movement ("step forward", "jump forward", "move to target"), he/she returns to the proper location without getting stuck.
If equipment is changed mid-movement, the Hero won't stop in the wrong place either.


download LunarIPS (http://fusoya.eludevisibility.org/lips/)
First step: make a backup of your RPG_RT.exe (just in case)
open Lunar IPS -> apply IPS patch -> select the .ips file (this patch) -> file type: all types -> select the RPG_RT.exe

Or put this patch into your DynPatches folder.

Ersetzt den Vorgänger (SAF.ips)

Das ist weniger eine Behebung des eigentlichen Fehlers, sondern eher ein Exception Handling für den Fall:
Animation2 = Idle mit x|y(now) ungleich x|y(return)
Animation2 (bzw. animationId (http://rpg-maker.cherrytree.at/dynrpg/class_r_p_g_1_1_battler.html#a0febbb94e0cb435cf153d237e7757fc1)) wird auf "Move back" gesetzt, FrameCounter der Aktion auf 23 gesetzt. Idle erst, wenn die Bewegung vorbei ist.

Wer jetzt mit der Positionierung der Battler-Sprites rumspielt, muss darauf achten, dass beim RPG :: Battler die Attribute x (http://rpg-maker.cherrytree.at/dynrpg/class_r_p_g_1_1_battler.html#a2c279272e66fd1f79f7bc151cbbbc4ba), und originalX (http://rpg-maker.cherrytree.at/dynrpg/class_r_p_g_1_1_battler.html#aa4ca889036e51422ec034f4804acfc6f) gleichgesetzt werden müssen (das Selbe für y).

Corti
18.11.2014, 09:29
Ich habe noch ein Phänomen für dich.

Es gibt die Möglichkeit eine Event-Seite in den Monstergroups anzulegen mit der Bedingung "Hero X does Y command". Diese Eventseite wird ausgeführt, wenn der Held beginnt diese Sache zu tun, nicht nachdem er das getan hat.

Befehl auswählen
Eventseite "does Y command"
Held macht Y
Wenn man nun in dieser Eventseite "does Y command" ein Switch setzt, dass eine andere Eventseite schaltet, dann passiert das hier:

Befehl auswählen
Eventseite "does Y command" -> Switch1=on
Held macht Y
Eventseite (if switch1==on) -> Switch1=off

Das ist genau richtig so. Auf diese Weise kann man vor und nach der Handlung Eventcode ablaufen lassen.
Leider gibt es Ausnahmen.

Wenn der Spieler ein Item anwendet, wird die SwitchEventseite nicht ausgeführt.
Wenn der Spieler den Abwehrbefehl anwendet, wird die SwitchEventseite nicht ausgeführt.
Wenn der Spieler einen Skill nutzt und mit dieser Skil eine Condition auf den Helden selbst ausgeführt wird, wird die SwitchEventseite nicht ausgeführt.

bugmenot
30.11.2014, 23:42
BugFix(2k3)
download ClassChangeEquipFix (http://share.cherrytree.at/showfile-18013/classchangeequipfix.rar)

Wenn man einen Klassenwechsel macht, wurde vorher einfach die gesamte Ausrüstung abgelegt.

Und: StatusAnimationFix-Update (http://www.multimediaxis.de/threads/104116-Programmwunsch-und-erstellungsthread-2?p=3210960&viewfull=1#post3210960)

@Corti
Sehe ich mir schon noch an. Ich habe die Dokumentation von BattleEvents irgendwo rumflattern.


Edit:

BugFix:

[QuickPatches]
DmgCapper(p1)=49D03B,E8F69DFAFF,446E36,B800000000680F270000E922080000
DmgCapper(p2)=447667,83FA007C06E83B2CFEFF9258C3
DmgCapper(min)=446E37,#0
DmgCapper(max)=446E3C,#9999
Die Zeilen mit DmgCapper, minDMG, maxDMG damit ersetzen. Der QuickPatch hat vorher negative Schadenszahlen nicht beachtet.
Edit²:
Das Ding hat ein Problem damit, wenn absorbierter Schaden durch zu hohe Abwehr auf 0 runtergerechnet wird (Ziele, welche Schaden absorbieren würden, machen nun den oben angebenen Mindestschaden.)
Edit:
Falls damit etwas nicht zu funktionieren scheint, proiert die #Zahlen mit HexDezimal-Zahlen zu ersetzen:

HexConverter (http://www.darkfader.net/toolbox/convert/#DByte.0)
Setzt die Zahl in das rechte Feld neben dem "big-endian" und nehmt die Zahlenfolge des linken Feldes neben dem "little-endian", fügt die Zahl hinter das Komma eines QuickPatches ein:
Bsp. DmgCapper(max)=446E3C,0F270000

(Oder im Windows Rechner -> Alt+3 halten)




Und: RPS[+]-Update (http://www.multimediaxis.de/threads/104116-Programmwunsch-und-erstellungsthread-2?p=3208899&viewfull=1#post3208899)
%12 (Damage Cap)
[Attack]+[Skills]
-> min.DMG = [A] (überschreibt keine Immunität oder Schaden unter Null)
-> max.DMG = [B] (setze [B] = 0 um kein max.Cap zu nutzen)
-> Modifikatoren können in DmgMultiplier[A] und [B] angegeben werden


Edit³:

BattleMessenger(2k3)
download BattleMessenger (http://share.cherrytree.at/showfile-18041/battlemessenger)

Ausmaße und Position der message box im Kampf über Variablen steuern.
Dafür müssen alle QuickPatches entfernt werden, die direkt mit der message box im Kampf zu tun haben.

Stray
16.12.2014, 21:03
Ich träume immer noch von einem Pixelmovement für die Kamera vom RM2k3. Auch toll wäre es sogar wenn man die Kamera auf ein bestimmtes Bild scrollen lassen könnte. Gibt es dazu schon etwas?

bugmenot
18.12.2014, 18:06
Pixelmovement für die Kamera vom RM2k3



int mapOffsetX; //positiv=rechts, negativ=links
int mapOffsetY; //positiv=hoch, negativ=runter
int scrollSpeed;

//[...] Argumente zuweisen

mapOffsetX = mapOffsetX*16; //16 je pixel
mapOffsetY = mapOffsetY*16; //16 je pixel
scrollSpeed = scrollSpeed*32; //"normal" speed = 32 (2x = 64; 1/2x = 16; ...)
( **reinterpret_cast<long ***> (0x4CDE54) ) [45] -= mapOffsetX;
( **reinterpret_cast<long ***> (0x4CDE54) ) [46] -= mapOffsetY;
( **reinterpret_cast<long ***> (0x4CDE54) ) [47] = scrollSpeed;
Zuweisung der Argumente mapOffsetX/Y und scrollSpeed per onComment callback oder so.
Frag jemanden (versuch es mal an Schalter 2 (http://www.multimediaxis.de/threads/135603-DynRPG-Der-Pluginwunschthread)), der Ahnung von C++ hat.

Edit:
Und die originalen Kamerapositionen wiederherstellen:


( **reinterpret_cast<long ***> (0x4CDE54) ) [45] = 2304;
( **reinterpret_cast<long ***> (0x4CDE54) ) [46] = 1792;

Stray
20.12.2014, 22:45
Danke. Seit ich im Juli dort nachgefragt habe hat keiner mehr einen Beitrag geschrieben.

bugmenot
22.12.2014, 18:33
Wenn man nun in dieser Eventseite "does Y command" ein Switch setzt, dass eine andere Eventseite schaltet, dann passiert das hier:
[...]
Das ist genau richtig so. Auf diese Weise kann man vor und nach der Handlung Eventcode ablaufen lassen.
Leider gibt es Ausnahmen.

Wenn der Spieler ein Item anwendet, wird die SwitchEventseite nicht ausgeführt.
Wenn der Spieler den Abwehrbefehl anwendet, wird die SwitchEventseite nicht ausgeführt.
Wenn der Spieler einen Skill nutzt und mit diesem Skill eine Condition auf den Helden selbst ausgeführt wird, wird die SwitchEventseite nicht ausgeführt.


Bei einem RPG :: Battler von Typ Actor wird direkt nach einer Aktion das reguläre updateBattleEvents nur mit RPG :: BattleEventUpdateMode = BEUM_BEFORE_ACTION durchgeführt. Bei Battlern vom Typ Monster wird jedoch zuerst RPG :: BattleEventUpdateMode = BEUM_BEFORE_ACTION und dann noch ein RPG :: BattleEventUpdateMode = BEUM_AFTER_ACTION durchgeführt.

Es gibt jetzt (mindestens) zwei Sachen, die man machen kann:


[QuickPatches]
BatEvUpdate(TypeB)=498985,9090
Hiermit wird sowohl für Actors/Heroes als auch für Monster erst BEUM_BEFORE_ACTION und dann noch ein BEUM_AFTER_ACTION abgehandelt.

Oder:


[QuickPatches]
BatEvUpdate(TypeC)=498985,75
Hiermit gilt für Monster nur BEUM_BEFORE_ACTION, für Actors/Heroes jedoch auch wieder Beides.


Warum das vorher nur für Monster verwendet wurde, kann ich nicht sagen. Es scheint jetzt zumindest keine Crashes oder irgenwelchen anderen Kram auszulösen*. (*citation needed)

MagicMaker
27.12.2014, 16:24
Ich fänds toll, wenn man per Event erkennen könnte, welche der beiden Fenstergrößen gerade aktiv ist und
dass man diese auch umschalten kann. Ich halte es für verwirrend, wenn man Spielern ein Menü mit vielen
Einstellungen bietet, aber dann dabei steht, dass dieser Wechsel ausschließlich per F5-Hotkey funktioniert.

Falls jemand also richtig Langeweile hat: Betrachtet es einfach als kleinen Anstoß [RPG2000-107]

bugmenot
04.01.2015, 22:16
Falls jemand also richtig Langeweile hat

download VarExtender[+] (http://share.cherrytree.at/showfile-19774/varextender___.rar)

Eine Erweiterung für <ChangeVariable: Other> und <ChangeVariable: Hero>

download LunarIPS (http://fusoya.eludevisibility.org/lips/)
Erster Schritt: legt euch eine Sicherungskopie eurer RPG_RT.exe an (für den Fall der Fälle)
Lunar IPS öffnen -> apply IPS patch -> .ips-Datei (den Patch) wählen > Dateityp: all types -> RPG_RT.exe auswählen


RPG2000.exe im Resource Hacker (oder ähnlichem Programm) öffnen, TFORMEVCMD10220 suchen und unter ComboBoxC8 (weit unten in TFORMEVCMD10220; unter Line:510) bei Items.Strings unter 'MIDI Ticks' (bzw. 'MIDI Play Pos.(Tick)') Folgendes einfügen:
'Screen Mode'
'Screen Zoom'
'This Event ID'
'Party')

außerdem, unter ComboBoxC6B (ein Stück über ComboBoxC8; unter Line:444) bei Items.Strings, unter 'Accessory No.' Folgendes einfügen:
'next Lv EXP')

Compile. Save.


Hinweise:

<>ScreenMode (Input/Output)
Wenn die angegebene Variable vorher den Inhalt Null hatte, wird ausgegeben:
1 = gerade im Fenstermodus
2 = gerade im Vollbildmodus
Wenn die angegebene Variable vorher den Inhalt 1 oder 2 hatte, wird in den dazu entsprechenden Modus gewechselt.


<>ScreenZoom (Input/Output)
Wenn die angegebene Variable vorher den Inhalt Null hatte, wird ausgegeben:
1 = gerade im kleinen Bild
2 = gerade im großen Bild
Wenn die angegebene Variable vorher den Inhalt 1 oder 2 hatte, wird in den dazu entsprechenden Zoom gewechselt.


<>Party (Input/Output)
Wenn die angegebene Variable vorher den Inhalt Null hatte, wird ausgegeben:
1..4 = momentane Partygröße (Anzahl an Helden in der Party)
Wenn die angegebene Variable vorher den Inhalt 1, 2, 3, 4 (Partyposition) hatte, wird die Hero_ID dieser Partyposition ausgegeben (oder -1 bei ungültiger Position).

An extension to <ChangeVariable: Other> and <ChangeVariable: Hero>

download LunarIPS (http://fusoya.eludevisibility.org/lips/)
First step: make a backup of your RPG_RT.exe (just in case)
open Lunar IPS -> apply IPS patch -> select the .ips file (this patch) -> file type: all types -> select the RPG_RT.exe


Open RPG2000.exe in Resource Hacker (or similar programs), search for TFORMEVCMD10220 and below ComboBoxC8 (far down into TFORMEVCMD10220; below Line:510) at Items.Strings, right below 'MIDI Ticks' (or 'MIDI Play Pos.(Tick)') add the following:
'Screen Mode'
'Screen Zoom'
'This Event ID'
'Party')

also, below ComboBoxC6B (somehwere above ComboBoxC8; below Line:444) at Items.Strings, right below 'Accessory No.' add the following:
'next Lv EXP')

Compile. Save.


Note:

<>ScreenMode (Input/Output)
If the specified variable was set to zero before, it will contain:
1 = currently in windowed mode
2 = currently in fullscreen mode
If the specified variable was set to 1 or 2 before, the ScreenMode will change to the appropriate mode.


<>ScreenZoom (Input/Output)
If the specified variable was set to zero before, it will contain:
1 = currently in small screen
2 = currently in large screen
If the specified variable was set to 1 or 2 before, the ScreenMode will change to the appropriate zoom.


<>Party (Input/Output)
If the specified variable was set to zero before, it will contain:
1..4 = current PartySize (amount of heroes in the party)
If the specified variable was set to 1, 2, 3, 4 (party position) before, it will contain the Hero_ID from that position in the party (or -1 on an invalid position).


Ich würde die Änderung am Eventeditor ja in eine 2k9 uimod packen, aber dazu müsste mir erstmal jemand sagen, wie man in Delphi5 auf eine StringList / Array / was-auch-immer-das-ist zugreift.

MagicMaker
05.01.2015, 09:06
Wow, wundervoll. °-°

Die Verwendung ist recht ungewöhnlich (aber clever) und hab ein bisschen gebraucht, um das zu verstehen,
aber das Fenster umzuschalten läuft jetzt wie ne Eins. =D

Stray
07.01.2015, 21:43
Ein Programm, das Bilder automatisch in 16x32 große Charsets schneidet?

oder

Ein Programm/Plugin/RM2009 Erweiterung, das/die den Upper Layer vom RM2K(3) erweitert?

Manuel
08.01.2015, 19:57
Ein Programm, das Bilder automatisch in 16x32 große Charsets schneidet?So ein Programm hab ich mal vor ewigen Zeiten geschrieben. Mittlerweile ist davon alles verlorengegangen (Quellcode, das Programm selbst...), glücklicherweise habe ich noch einen Link auf das Programm gefunden (Vielen Dank an Cherry an dieser Stelle, der ein ReUp vorgenommen hat): CHA.EXE (http://share.cherrytree.at/showfile-6933/cha_install.exe) (es ist ein Wunder, dass das Programm noch unter Win8.1 64bit einwandfrei läuft, wie ich grade festgestellt habe^^).

Das Programm hat allerdings ein paar Eigenheiten, die... ähm, auf mangelnde Programmierkenntnisse meinerseits basieren^^:
Kann nur BMP und PNG umwandeln. Umgewandelte Dateien sind immer ".BMP"-Dateien und haben ein "(new)" im Dateinamen stehen.
Die Maße stimmen hinterher - allerdings wird alles, was hinter den Maßen aufgenommen wird, abgeschnitten.
Bilder sind hinterher IMMER in 32bit-Farbtiefe abgespeichert. Mit einem anderen Programm (z.B. IrfanView) müssen die Farben wieder auf 256 herabgesetzt werden.
Will man mehrere Dateien auf einmal umwandeln, geht das nur, wenn man mittels Drag&Drop die markierten Bilder zur CHA.EXE zieht.
Von diesen Macken abgesehen, sollte das Programm - und ich bin selbst überrascht davon^^ - auch heute noch einwandfrei funktionieren.

Stray
11.01.2015, 21:18
Immerhin! Das ist doch schon mal eine tolle Sache! Danke!

Corti
21.01.2015, 21:13
@bugmenot: Ich hatte auf Seite 108 nach RowVar[2+] und A Switch gefragt. Diese Fixes tun, was sie sollen, zumindest wird das Menü verlassen. Was nicht funktioniert sind die QuickPatches dafür. Ich weiss nicht, welche Variablen und Switches dabei gesetzt werden.

Die Defaultwerte werden gesetzt.
Wenn ich den Quickpatch benutze, werden diese verstellt, die 1007 und 1008 zB werden nicht mehr gesetzt. Der neu eingestellte Wert wird aber nicht angewandt.

bugmenot
21.01.2015, 21:54
Die Art und Weise, wie der dynloader mittels Größenangabe % und # im RAM patcht is scheinbar anfällig gegen Updates / Sicherheitsupdates seitens Windows / OS.

Entweder die #Dezimalzahl im QuickPatch in eine little-endian hexZahl umwandeln:
HexConverter (http://www.darkfader.net/toolbox/convert/#DByte.0)
Setz die Zahl in das rechte Feld neben dem "big-endian" und nimm die Zahlenfolge des linken Feldes neben dem "little-endian", füge die Zahl hinter das Komma eines QuickPatches ein:
Bsp. RowVar_ID=4A2834,D0070000 (statt #2000)

Bzw. im Windows Calculator Alt+3 drücken, etc.


Oder in irgendeinem Plugin onStartup(char *pluginName) mittels *reinterpret_cast<long *>(0xoffset) = Dezimalzahl; all die Werte setzen und die entsprechenden QuickPatches löschen (nur die Adresse und #Zahl/%Zahl vor einem #/%).

Oder ein Plugin schreiben, welches zuverlässiger patcht. Das reinterpret schien doch bisher noch keine Probleme mit Größenangaben verursacht zu haben (okay, 1 mal, wo ich den falschen Typ angegeben habe... aber meh.)

Corti
22.01.2015, 08:17
Hey, danke dir! Klappt nun super!

Corti
23.01.2015, 15:40
Hey bugmenot! Noch ne Anfrage:

Du hast in dem Visu Menu Patch für die Browser-Menüs zB Fähigkeiten, Items, Ausrüstung die Anzahl der Spalten veränderbar gemacht. Dies wäre auch im Kampf und im Shop eine tolle Sache, da die max. angezeigte Länge der Item/Skillnamen ab und an gerne länger sein dürfte.

Es gibt schon einige nicht so umfangreiche Fixes dafür, evtl. hilft das ja dabei die Stellen im Code schneller zu finden.

Offset 0x944C5 (1 Byte, signed): Auswahlmenübreite. Von 0x4C (76) zu 0x64 (100) ändern - oder was immer du willst.
Offset 0xC7CCB (1 Byte, signed): Itemmenühöhe. Von 0x50 (4 Zeilen) zu 0x60 (5 Zeilen) ändern - oder was immer du willst.
Offset 0xC8431 (1 Byte, signed): Skillmenühöhe. Von 0x50 (4 Zeilen) zu 0x60 (5 Zeilen) ändern - oder was immer du willst.
http://www.multimediaxis.de/threads/104116-Programmwunsch-und-erstellungsthread-2?p=3093406&viewfull=1#post3093406
Heyho, gibt es eine Möglichkeit (per HEX?) die Anzeige der Items von "ITEMNAME: 99" auf "ITEMNAME x99" zu ändern?
RPG_RT 2k (v1.07 )
0x6FF18 = [3A 20] set [20 78] (bei Sell Items)
0x7865C = [3A 20] set [20 78] (bei RüstWahl)
0x952B4 = [3A 20] set [20 78] (bei ItemMenü)

RPG_RT 2k3 (v1.08 )
0x925B0 = [3A 20] set [20 78] (bei Sell Items)
0x9F840 = [3A 20] set [20 78] (bei RüstWahl)
0xC7ED4 = [3A 20] set [20 78] (bei ItemMenü)

[3A] = " : "
[78] = " x "
[20] = Leerzeichen


Nachtrag zu Visu Menu:
Bei den Quickpatches zu, Equip Info Fenster gibt es bisher keine Möglichkeit die Position des Textes in der Box zu verändern.
Equip:Info(Width)=4A01D9,#320
Equip:Info(Height)=4A01DE,#32
Equip:Info(y)=4A01E6,#0
Equip:Info(x)=4A01EB,#0

Bei den Einträgen zum Faceset im Hauptmenü fehlt in der 2k3 Readme die Zeile zum delta Y, diese kann man sich aus der 2k Readme und den Adressabständen schätzen.
M:P:Face(deltaY)=49E409,%50

Bei den Einträgen zum Cursor im Hauptmenü gibt es keinen Wert für die Y-Konstante, lediglich delta y.

bugmenot
23.01.2015, 18:50
(2k)
0x9510E = [Item](Entries per row, battle)
0x6FDCB = [Item](Entries per row, shop)

0x94F8F = [Info:Text](y)
0x94F94 = [Info:Text](x)

(2k3)
Item(Entries per row, battle)=4A0DD6,%2
Item(Entries per row, shop)=493063,%2
Skill(Entries per row, battle)=4A0E92,%2

M:P:Face(dy)=49E409,%50

Info:Text(y)=4C8713,#8
Info:Text(x)=4C8718,#8



Bei den Quickpatches zu, Equip Info Fenster gibt es bisher keine Möglichkeit die Position des Textes in der Box zu verändern.
Das Info:Text(y/x) wirkt sich dann aber auf Item/Skillbeschreibungen (und im Speicher/Lademenü) in allen Untermenüs aus.

Man kann das per Plugin aber jederzeit während der Laufzeit (je nach aktivem Untermenü) patchen:
z.B.
int xStringOffset = 64;
*reinterpret_cast<long *>(0x4C8718 ) = xStringOffset;

Das aktuelle Untermenü erhält man über:
unsigned char MenuSubScene = ( *reinterpret_cast<char ***> (0x4CDB14) )[0][12];
0 = Main
1 = Item
2 = UseItem
3 = Skill
4 = UseSkill
5 = Teleport
6 = Equip
7 = Quit
(2k3)
8 = Status
9 = Order



Bei den Einträgen zum Cursor im Hauptmenü gibt es keinen Wert für die Y-Konstante, lediglich delta y.
Ich wähle mal die einfache(re) Methode:
MainPartyCursor(y)=49E2E3,E8CC93FAFF,4476B4,c7473400000000A174DB4C00C3,4476B7,#8



da die max. angezeigte Länge der Item/Skillnamen
Länge von Item/Skillnamen?

Corti
23.01.2015, 19:14
Vielen lieben dank! ( Mal wieder! ) Du bist awesome.


Länge von Item/Skillnamen?
Item und Skillnamen sind auf X Zeichen begrenzt. Wenn man den Maker hexxt und das Limit entfernt, werden trotzdem nur X Zeichen angezeigt, weil nicht mehr Platz da ist.
Es könnte nützlich sein, mehr davon anzuzeigen. Mir würde das gefallen. Mal schauen!

Corti
25.01.2015, 22:49
Hey! Die Info:Text Sachen funktionieren super. Könntest du noch rausfinden, welche Adresse die Höhe der Infozeile im Speichern/Laden Menü beeinflusst?

bugmenot
27.01.2015, 13:46
Das kleine Fenster am oberen Rand?

Da gibt es leider ein paar Probleme. Die Zeichenreihenfolge ist: FileWindows -> InfoWindow -> Borders -> Cursor.



[QuickPatches]
Save:Info(Width)=49128B,#320
Save:Info(Height)=491290,#32
SaveBorderTop(Width)=491723,#320
SaveBorderTop(Height)=49171C,%8
SaveBorderTop(y)=491728,#32
Für die x-Koordinaten gibt es nicht wirklich Platz.

Es wäre wohl geeignet onDrawScreen() nochmal mit der system Hintergrundfarbe drüberzupinseln



Und noch irgendwelches Zeug:

download ExpDetectBug-in (http://share.cherrytree.at/showfile-18961/expdetectbug_in.rar)

Gibt die Anzahl an gesamter Erfahrung aus, welche ein Held für das nächste Level benötigt.


>> DETECT

Nutzt einen Comment mit dem Inhalt:

@exp_detect [1], [2]

[1] = Hero_ID (aus dem Reiter actor/hero in der F8-Database)
[2] = Var_ID welche die benötigte Erfahrung ausgeben soll

Ersetze [x] mit Zahlen oder einer Var_ID mit einem vorangestellten "V"
Bsp.
"@exp_detect V32, 5"

gibt die Erfahrung, welche der Held aus Var[0032] benötigt um das nächste Level zu erreichen, in Variable 5 aus.


>> DETECT_ALT

@exp_detect_alt [1], [2], [3]

[1] = Hero_ID
[2] = Level von dem die benötigte Erfahrung abgefragt werden soll
[2] = Var_ID welche die benötigte Erfahrung ausgeben soll


>> ERROR MESSAGES

Ein Level kleiner als 1 wurde verwendet, wenn die Variable Null ausgibt.
Eine ungültige Hero_ID wurde verwendet, wenn die Variable -1 ausgibt.

Outputs the total amount of experience a hero requires to reach the next level.


>> DETECT

Use a comment with the contents:

@exp_detect [1], [2]

[1] = Hero_ID (from actor/hero tab in F8-database)
[2] = Var_ID to store the required experience into

Substitute [x] with numbers or a Var_ID with a "V" in front
e.g.
"@exp_detect V32, 5"

will get the experience the hero from Var[0032] requires to reach the next level and stores that value in variable 5.


>> DETECT_ALT

@exp_detect_alt [1], [2], [3]

[1] = Hero_ID
[2] = Level to get required experience from
[3] = Var_ID to store the experience needed into


>> ERROR MESSAGES

A Level smaller than 1 was used if the output in the variable is zero.
An invalid Hero_ID was used if the output in the variable is -1.

Corti
27.01.2015, 13:58
Bombe, wird schon klappen. ^^

Corti
08.02.2015, 17:48
Und wieder was:

Die Info-Text-Zeilen wirken sich neben dem File-Menü noch auf die Infozeilen im Kampfsystem aus.Dort werden die Beschreibungstexte von Skills und Items in diesen Boxen angezeigt. Hättest du noch eine Adresse um diese beiden auch in der Höhe zu verändern?

bugmenot
08.02.2015, 20:03
Info:Text(y)=4C8713,#8
Info:Text(x)=4C8718,#8

Itemmenü / Skillmenü innerhalb und außerhalb vom Kampf sind (bis auf ein paar Abmessungen / zusätzliche Anzeigen) das Gleiche. Das heißt die oben genannten Adressen gelten auch immer für Kampf und Esc-Menü. Du wirst also (falls sich die Platzierung des Textes im Kampf von der Platzierung im eigentlichen Menü unterscheiden soll) während der Laufzeit im RAM patchen müssen:


int infoTextY = [...]; //Item / Skill description text, position relative to window
int infoTextX = [...];
( *reinterpret_cast<long *> (0x4C8713)) = infoTextY;
( *reinterpret_cast<long *> (0x4C8718)) = infoTextX;
Je nachdem ob scene == RPG::SCENE_BATTLE oder nicht. Bzw. zu Beginn und Ende des Kampf-dings neu setzen.

*Shop nicht vergessen.
reinterpret_cast patcht nur im RAM. Das heißt wenn die Applikation geschlossen und neu gestartet wird, dann wird Alles wieder auf default zurückgesetzt.

Patch-Hierarchie:
0. direkt auf RPG_RT angewendete Patches
1. aus DynPatches geladene .ips patches
2. aus DynRPG.ini geladene QuickPatches
3. reinterpret_cast in .dll patches / plugins (session-spezifisch: man muss darauf achten, ob die Änderung noch da sein muss)

Corti
09.02.2015, 09:31
Damit komme ich klar. Danke dir :-D

IndependentArt
16.02.2015, 20:42
ich habe grad versucht mit cherrys debug addon die events meines spiels zu tracen. leider hat sich dann herausgestellt, dass das mit dyn rpg nicht klar kommt und cherry sagt auch, dass das nicht dafür gedacht ist.
wer nicht weiß, was das ist: damit kann man in einem textfile alle eventbefehle auslesen lassen, die der maker angewendet hat. das ist unersetzlich bei der suche von fehlern, weil man direkt die stelle sieht(wer kein dyn rpg benutzt, dem kann ichs auf anfrage auch zuschicken).

naja, das hier ist der "Programmwunsch und -erstellungsthread"... und ich.... wünsche mir ein tracing tool :) möglicherweise ja als dyn plugin? davon würden sicher viele was haben.

Corti
17.02.2015, 06:54
Es gibt in DynRPG die Möglichkeit mitzukriegen, welche Events ausgeführt werden. Theoretisch ginge sowas also. Kannst du mir mal eben den Inhalt einer solchen Textdatei posten, ich würd gern wissen, was du da erwartest.

Btw. was für Fehler suchst du damit? Ich habe schon mehrmals darüber nachgedacht, ein Log&Trace Plugin zu schreiben, daran alle Eventbefehle zu loggen habe ich aber nie gedacht, weil ich nicht sehe, bei welchen Problemen das helfen würde.

IndependentArt
17.02.2015, 11:42
es gibt diese möglichkeit ...? wie? muss an mir vorbei gezogen sein. ich brauche das, was zuletzt ausgeführt wurde, also den befehl. im debugger wird das ja mit event und zeile angegeben, manchmal ist die zeile nicht immer gut bestimmbar, aber das wäre auch schon sehr hilfreich. du hast aber recht, dass eigentlich nicht alle befehle nötig sind.

konkret mein problem:
ich befüchte fast, dass mir so ein report da auch nicht helfen kann. es ist der eigentlich bekannte fehler "unsopported png image". ich weiß natürlich was das bedeutet. es gibt nur 2 seltsame dinge, 1. ist es meiner auffassung nach plötzlich aufgetreten und 2. kommt der fehler nur 1 mal, solange ich das testfenster offen hab. wenn ich dann also nochmal starte, ohne es zu schließen, kommt er nicht mehr. das macht keinen sinn.

vielleicht kommt das ja jemandem bekannt vor. es kann natürlich trotzdem sein, dass irgendwas an meinem picture-management vermurkst ist. hatte schon befürchtet, dass bei zusammenspiel von dynrpg, dynpec und rpgss irgendwas schieflaufen würde ...

Corti
17.02.2015, 11:56
Ist der Fehler reproduzierbar?

IndependentArt
17.02.2015, 12:01
absolut.

Corti
17.02.2015, 12:07
kommt der fehler nur 1 mal, solange ich das testfenster offen hab. wenn ich dann also nochmal starte, ohne es zu schließen, kommt er nicht mehr. das macht keinen sinn.
Wann kommt er genau? Hast du dann schon ein Bild, oder ist es noch bevor du das erste mal was im Makerfenster siehst?

IndependentArt
17.02.2015, 12:12
nur black screen. kommt beim betreten von 2 unterschiedlichen maps im menü, egal ob ich mich auf die map teleportiere oder direkt dort starte. wenn ich den fehler auf der einen map hatte, kommt er dann auch nicht auf der anderen, wenn ich nochmal starte. scheint also zusammen zu hängen.

Corti
17.02.2015, 12:53
d.h. du startest das Spiel, beginnst auf deiner Menümap und dann kommt der Fehler ein mal, du klickst ihn weg und er kommt nie wieder. Und das passiert jedes einzelne Mal, wenn du das Spiel startest.

Auf der Map hast du also sicherlich den einen oder anderen ParallelProzess/Autostart oder? Da das Bild schwarz bleibt nehme ich an, es ist ein PP.
Verpass den PPs mal eine MessageBox als ersten Befehl, dann siehst du ja, wann es knallt.

IndependentArt
17.02.2015, 13:21
ich hab das jetzt doch noch mit dem debugger auslesen können: der sagt "battle or unknown event, line 0" oder sowas. :D battle kann natürlich nicht sein, weil ich nix mit dem normalen ks mache. und unknown ... naja, vielleicht kann galileo mytery darüber aufklären. aber es wäre auch nicht logisch gewesen, wenn es ein mir bekanntes event gewesen wäre. klar, man vergisst immer mal was, aber das sind 2 ganz unterschiedliche maps, zum einen das gegenständemnü und zum anderen das entwicklungsmenü eines(nur eines) charakters. da sind nicht viele events und ich hab auchj schon alle common events gecheckt, die vielleicht prinzipiell noch mitlaufen. ...ich hab eher die befürchtung, ich hab es tot gepatched, geplugged oder so ...der fehler kommt ja im normalfall auch beim importieren und nicht beim testen. ....insofern... ratlosigkeit.

(über die info wie man mit dynrpg events ausliest wäre ich übrigens immernoch dankbar ^^)

Corti
17.02.2015, 13:23
Verschwindet das, wenn du Plugins ( RGSS und andere Bildersachen ) entfernst?


(über die info wie man man dynrpg events ausliest wäre ich übrigens immernoch dankbar ^^)
Ich wollte sagen, dass es die Möglichkeit gibt, ein Plugin zu schreiben, dass genau das tut. Vielleicht tue ich das ja noch mal.

IndependentArt
17.02.2015, 13:31
Verschwindet das, wenn du Plugins ( RGSS und andere Bildersachen ) entfernst?

ich hab grad alles gelöscht, was mit dynrpg oder rpgss zu tun hat. ich hab außerdem noch die pictureordner gelöscht und es kommt immernoch. aber danke, dass du versuchst es mit zu ergründen :)

edit: ich habs gefunden .... arg .... manchmal ist man doch echt ............ glaub ich zumindest, moment.

edit: Okay, erklärung: meiner erinnerung zufolge, hatte ich mal eine schwarze event-grafik angelegt. ich gebe den events auf den maps verschiedene transparente grafiken, um sie unterscheiden zu können. schwarz bedeutet, dass es nur testwerte beinhaltet. gestern hab ich dann wohl einigen map events auf erwähnten maps diese grafiken gegeben. jetzt hab ich festgestellt, dass ich offenbar diese schwarze grafik nicht importiert habe, sondern einfach in den order geschoben, mit RGB farbraum. das löste den fehler aus. dass er nicht noch ein 2. mal kommt, liegt vermutlich an dyn rpg, weil es den dann unterdrückt? keine ahnung.
jaja, peinlich, peinlich, und ich dachte schon das ganze spiel ist jetzt futsch. aber galileo kann trotzdem abkacken. rpg makerer die eigene fehler produzieren, sind viel mysteriöser.


Vielleicht tue ich das ja noch mal.

das wär natürlich super. let me know.

Corti
17.02.2015, 23:36
Ich hatte heute so gegen 23:45 spontan Bock auf Programmieren. Das Traceding ist fast fertig.

IndependentArt
18.02.2015, 08:39
bin gespannt :)

Corti
18.02.2015, 15:20
Hey IndependentArt!

das hier ist Version 0.1 des CortiTrace-Plugins. LINK:CortiTrace.dll (http://share.cherrytree.at/showfile-19237/cortitrace.dll)
Was es tut: Stumpf alles in eine Textdatein schreiben, was passiert.
Was es nicht bietet: Konfiguration, aktivieren und deaktivieren.

Beispiel:

2015.02.18-16:11:46 [Event] Evcmd[SHOW_MESSAGE] EventId[1] PageId[1] lineId[3] Str.Par IN \v[61](9) SQRT -> OUT \v[63](3)
2015.02.18-16:11:47 [Event] Evcmd[END_OF_EVENT] EventId[1] PageId[1] lineId[4]
2015.02.18-16:11:47 [Event] Evcmd[CHANGE_VARIABLE] EventId[0] PageId[0] lineId[1] IntPar[7] 1, 121, 123, 1, 0, 3, 0,
2015.02.18-16:11:47 [Event] Evcmd[END_OF_EVENT] EventId[0] PageId[0] lineId[4]

Sowas hier: IntPar[7] 1, 121, 123, 1, 0, 3, 0, bedeutet, dass der Befehl 7 Zahlenparameter besitzt mit den Werten 1, 121, etc.
In diesen Werten ist kodiert, mit welchen Einstellungen der Befehl versehen ist, z.B. hier Variablen 121 bis 123 die beschrieben werden.
Das hier schön auszuformulieren oder zu einer Zeile wie im Maker zu machen würde wohl noch etwas Zeit in Anspruch nehmen.

Schau was wie du damit klar kommst.

Corti
18.02.2015, 21:54
Nur loggen in einem Plugin war gestern~ jetzt verschicke ich Funktionszeiger über die Makervariablen und kann das Tracing-Plugin aus anderen Plugins heraus benutzen.
Plugins, die sich gegenseitig pluggen. Mwahahaha! *beiläufig ein Kind opfert*

IndependentArt
19.02.2015, 19:42
Nur loggen in einem Plugin war gestern~ jetzt verschicke ich Funktionszeiger über die Makervariablen und kann das Tracing-Plugin aus anderen Plugins heraus benutzen.
Plugins, die sich gegenseitig pluggen

ich verstehe GAR NICHTS! ^^ nur das mit dem kind.

ich komme erst morgen dazu, mir das anzuschauen. aber danke schonmal.

ich komm auf die badewiese und sag ihr seid alles spasten!

IndependentArt
20.02.2015, 19:36
wo wird die datei gespeichert...? sie liegt nicht im plugin und nicht im projektordner.

Corti
20.02.2015, 22:31
Da müsste ein neuer Ordner erstellt werden. Beginnt mit Dyn*

IndependentArt
21.02.2015, 11:05
ja, läuft.
wird sich aber erst zeigen, ob es tatsächlich hilfreich oder doch ein wenig zu kryptisch ist :)

Corti
21.02.2015, 11:58
Ich werde erstmal keine weitere Arbeit in das Tracing stecken, da ich herkömmliches Debugging über MessageBox und F9 für effektiver halte.

IndependentArt
21.02.2015, 12:01
das kann auch hilfreich sein. wenn man aber zumindest weiß, welches event und welche zeile, dann ist das schon ein riesen vorteil :)

Corti
21.02.2015, 12:03
Steht da. EventId und LineID.

IndependentArt
21.02.2015, 13:35
ich weiß, ich wollte auch gar nichts anderes behaupten :D

Sölf
21.02.2015, 13:58
Dann frag ich hier doch nochmal an.

Und zwar wollte ich wissen, ob es theoretisch möglich wäre die Statuswerte der Gegner (in erster Linie den ATK Wert) über 999 zu bringen (ohne so später wie jedem Gegner vor Kampf Beginn einen zustand geben der die Angriffskraft verdoppelt). Corti meinte dann, bugmenot hat mal einen Quickpatch veröffentlicht der die Schadensformel von 4x ATK - 2x DEF in 2x ATK - DEF umwandelt. Hab dazu jetzt das hier im Thread gefunden:

http://www.multimediaxis.de/threads/104116-Programmwunsch-und-erstellungsthread-2?p=3177299&viewfull=1#post3177299

Allerdings funktioniert das nicht (und ja, ich hab auf der Seite davor geschaut). So wie ich das verstehe bezieht sich der Quickpatch dort nur auf den Schaden von Skills, nicht jedoch von normalen Angriffen. Wie genau sähe das denn dann aus? Oder ist das nur nen Ausschnitt vom Code und mehr fehlt irgendwas anderes? Jedenfalls war der Schaden von normalen Angriffen mit oder ohne Patch gleich. Und einfach mal auf gut Glück bei PlayerDmgRevamp ebenfalls #5, #10 etc einzufügen brachte da auch nichts.

Also ja, was mach ich falsch? ^^"

Corti
21.02.2015, 14:27
Hast du alle drei Zeilen so eingefügt? Bei mir klappte das genau so und Dark Sword benutzt das auch und es funktioniert.

Sölf
21.02.2015, 14:56
Also ich hab in der .ini ganz oben


[QuickPatches]
PlayerDmgRevamp=4B9847,D1E0,4B985F,909090
EnemyDmgRevamp=4C0B3E,D1E0,4C0B54,909090
SkillDmgRevamp=4C0DE4,#5,4C0DF8,#10,4C0E1A,#10,4C0E2F,#20

eingefügt. Als Testwerte hatte ich 50 ATK und 30 DEF, sowohl bei mir als auch beim Gegner. Hat im Endeffekt um die 20 Schaden gemacht. Ohne Quickpatch ebenfalls. Und Testweise hab ich dann einfach mal die #5, #10, #10, #20 vom SkillDmgRevamp auch noch bei Player und Enemy einegfügt, also


[QuickPatches]
PlayerDmgRevamp=4B9847,#5,D1E0,#10,4B985F,#10,909090,#20
EnemyDmgRevamp=4C0B3E.#5,D1E0,#10,4C0B54,#10,909090,#20
SkillDmgRevamp=4C0DE4,#5,4C0DF8,#10,4C0E1A,#10,4C0E2F,#20

Hat aber auch nichts gebracht. Ich hab bisher keine Quickpatches, vielleicht steht das Ding auch an einer falschen Stelle in der .ini (aber die Position dürfte doch eigentlich egal sein, oder?)

Corti
21.02.2015, 17:43
Hast du DynRPG in der Version, die QuickPatches unterstützt?

bugmenot
21.02.2015, 18:31
Hast du im Ordner DynPatches zufällig RPS[+].ips oder PDFix.ips rumflattern? (ansonsten gilt das PlayerDmgRevamp= und EnemyDmgRevamp= von der oberen CODE-Box)

In den readmes steht, dass die Adressen dafür anders sind:


[QuickPatches]
PhysDmgRevamp=4C0B53,D1E0,4C0B69,909090
(für Gegner und Helden; normaler [Attack]-Befehl)



PlayerDmgRevamp=4B9847,#5,D1E0,#10,4B985F,#10,909090,#20
Ähm... nein. Eine einzige zweistellige Zahl wird sich nicht auf magische Weise von selbst ausmisten und sich auch nicht zu mehreren Prozessoranweisungen kompilieren. (http://www.cs.virginia.edu/~evans/cs216/guides/x86.html)

Falls der DynRPG Loader beim Start nicht "Error in quick patch [...]" ausgibt, dann solltest du sicherstellen, dass du die 0.20 Version von DynRPG (http://share.cherrytree.at/showfile-12494/dynrpg.rar) hast. Bitte eine neue RPG_RT.exe nehmen, auf der bisher noch kein DynRPG draufgepatcht wurde.

Edit:
Ansonsten kann ich das mit den Stats oberhalb von 999 nochmal zusammensuchen.
Erwarte aber keine Wunder mit Schadenszahlen, solange kein Callback onDamageCalculation existiert.






Zu 2:
Ich wüsste nicht, dass ich per DynRPG was für dich tun könnte.
Man sollte mittels Plugin nachverfolgen können, welche Items im Shop gekauft / verkauft werden:

unsigned char ShopSubScene = ( *reinterpret_cast<char ***> (0x4CDE4C) )[0][12];

0 = in ShopMenu
1 = in BuyWindow
2 = Vending(Buy)
3 = Vending(Buy)Complete
4 = in SellWindow
5 = Vending(Sell)
6 = Vending(Sell)Complete




#include <DynRPG/DynRPG.h>

int getItem() {
return ( *reinterpret_cast<char ****> (0x4CDE4C) )[0][9][25];
}

int getItemAmount() {
return ( *reinterpret_cast<char ****> (0x4CDE4C) )[0][9][26];
}


/*void onFrame() (?)
oder sonst irgendwo, wo es besser angebracht wäre*/

if (scene == RPG::SCENE_SHOP) {
// [...]

if (ShopSubScene == 3) {
// Items werden/wurden in das Inventar gepackt
int A = getItem();
int B = getItemAmount();
// [...] "Du hast B mal Item A gekauft"

} else if (ShopSubScene == 6) {
// Items werden/wurden aus dem Inventar entfernt
int A = getItem();
int B = getItemAmount();
// [...] "Du hast B mal Item A verkauft"

}
}

Beim Array mit den verkauften Items bin ich mir nicht ganz sicher.
Ich kann den Zugriff auf den Pointer auf das Array momentan nur in (mehr oder weniger) numerischer Form angeben:

int ShopListArraySize = ( *reinterpret_cast<int ****> (0x4CDE4C) )[0][7][2];
int ShopListArrayPtr = ( *reinterpret_cast<int ****> (0x4CDE4C) )[0][7][1]; // Inhalte vom Array sind jeweils 4 Byte / long int groß

Wobei im Array dann [0] = Item#1 Item_ID, [1] = Item#2 Item_ID, etc.
Entweder per C++ das Array ausweiten (wäre empfehlenswert) oder versuchen die RPG_RT-interne Funktion dafür aufzurufen:




int eax = ShopListArrayPtr; // bin mir hierbei nicht sicher, ob das so angenommen wird; zu ätzend das selbst nachzuprüfen
int edx = (newShopListArraySize)*4; (ArraySize in Bytes)

asm volatile("call *%%esi":
: "S" (0x4027AC), "a" (eax), "d" (edx)
: "cc", "memory");
Könnte sein, dass es dort irgendwo knallt, weil der Pointer normalerweise mittels load effective address in das Register geladen wird...

Sölf
21.02.2015, 23:30
Okay, der Quickpatch geht jetzt, hatte noch ne alte Version drin.

Sölf
27.02.2015, 12:31
Haben die Gegner im 2k3 eigentlich sowas wie Aggro Verhalten? Falls ja, könnte man das durch Statusveränderungen auf den Charaktere beeinflussen? Also das ein Charakter Status X hat, wodurch er nun zu 40% angegriffen wird. Oder Status Y, dass er zu 70% angegriffen wird. Oder gibts dazu schon ein Dyn Plugin?

Corti
27.02.2015, 12:58
Standard: Reiner Zufall. Ich meine im amerikanischen Raum mal ein Plugin gesehen zu haben, dass laut Beschreibung wohl einen mit einer bestimmten Condition belegten Helden zum bevorzugten Angriffsziel macht.

Das umfangreichste mir bekannte System dieser Art ist mein eigenes aus meinem Kampfsystemspielplatzprojekt, eine Art "World of Warcraft-Aggro Light" für Rundenkampfsysteme.

Ich habe für Dark Sword ein Plugin in der Planungsphase, dass so etwas ähnliches bietet und als Teil meiner PluginSammlung veröffentlich werden soll, aber das ist Zukunftsmusik. Das überschneidet sich mit dem Thema KI und dort sehe ich noch Raum für eine Menge Spielereien, denn mit DynRPG kann man dort gut wirken.

Corti
05.03.2015, 14:13
Ich habe ein Problem mit dem ItemEquipSkillmenüfix von elvissteinjr

http://www.multimediaxis.de/threads/104116-Programmwunsch-und-erstellungsthread-2?p=3075375&viewfull=1#post3075375
https://dl.dropboxusercontent.com/u/2999010/Atelier/2k3DirectItemEquipSkillMenu.ips

Der Patch benutzt die Variablen 3386 und 3387. Der Bereich ist bei mir belegt mit einer umfangreichen Datenstruktur.
Normalerweise kann man einfach ändern durch verhexen der ips Datei.
3386 = 0x0D3A, in der IP findet man einmal 3A0D, übliche Schreibweise in IPS-Daten.

Wenn ich das jetzt ändere:
-> in Dez.65 , also 0x001A ( in IPS: 1A00) -> gibts einen Crash bei Verwendung
-> in Dez.3366 , also 0x0D26 ( in IPS 260D ) -> wird es ignoriert und weiterhin die Defaultadresse benutzt.

Ich würde das gerne verstehen.

elvissteinjr
05.03.2015, 16:42
Die Variable ID steht zweimal im Code. Einmal direkt, wie bereits richtig erkannt, und einmal als Adressenoffset zum Variablen Array.
Sprich: Ändere Offset 0xd4 in der ips Datei zu (VarID - 1) * 4, also beispielsweise dez. 256 bzw. hex 0001.

Ungetestet, sollte aber so hinhauen.

Corti
05.03.2015, 17:17
Ich versuchs mal. Danke dir :-)

Edit: hat Funktioniert mit 3366 als neue Variable. Wenn ich versuche die 65 zu benutzen gibt es weiterhin Probleme. Kurios.

elvissteinjr
06.03.2015, 19:50
Edit: hat Funktioniert mit 3366 als neue Variable. Wenn ich versuche die 65 zu benutzen gibt es weiterhin Probleme. Kurios.

Richtige Byteorder? Auf x86 sind die Werte in little endian... und natürlich 32 bit Breite.
Falls das auch nicht hilft, die 65 ist btw. 41 in hex, nicht 1A wie in deinem vorherigen Post. Also 41 00 00 00 bei 0xc9 in der ips Datei.

Ben
11.03.2015, 18:49
Ich möchte in meiner Textbox (RM2k3) im Text sehen wie weit ich schreiben kann bevor es "weggeschnitten" wird. Ich weiss nur, dass es da mal ein Programm zum Bearbeiten gab... worin ich dann Änderungen vornehmen kann... Forensuche ist ohne Ergebnis geblieben... wer kann mir helfen?

MarcL
11.03.2015, 19:15
Ich möchte in meiner Textbox (RM2k3) im Text sehen wie weit ich schreiben kann bevor es "weggeschnitten" wird. Ich weiss nur, dass es da mal ein Programm zum Bearbeiten gab... worin ich dann Änderungen vornehmen kann... Forensuche ist ohne Ergebnis geblieben... wer kann mir helfen?

Hab das erst letztes Mal irgendwo gepostet, da bin ich mal so frei, es ist immer noch bei meinen Anhängen dabei: 22076
Wenn du eine individuelle TB hast, kannste dir halt einfach merken, wie viel Zeichen in die Zeile passen, die wird in dem Programm nämlich angezeigt :)
Ich weiß garnicht wem du für dieses tolle Programm danken musst ^^; müsste fast mal nach dem Author sehen...

Cepanks
11.03.2015, 20:07
Ich möchte in meiner Textbox (RM2k3) im Text sehen wie weit ich schreiben kann bevor es "weggeschnitten" wird. Ich weiss nur, dass es da mal ein Programm zum Bearbeiten gab... worin ich dann Änderungen vornehmen kann... Forensuche ist ohne Ergebnis geblieben... wer kann mir helfen?
In diesem Thread gibt es eine Anleitung, wie das Problem mit einem Resource Editor behoben werden kann. Meinst du das?

Sölf
12.03.2015, 10:36
Gibts theoretisch eine Möglichkeit die EXP Kurven zu beeinflussen? Die vom 2k3 ist nämlich ziemlich kacke.

Mal etwas genauer: Im 2k3 kann man nur einstellen, dass jedes Level X EXP mehr braucht. Z.B. 1000 -> 1500 -> 2000 -> 2500 -> ... also immer 500 mehr pro level. Oder 800 mehr. Oder 1000 mehr. Aber ich hätte gerne etwas, dass es kein fester sondern ein steigender Wert wäre. Also z.B. 1000 -> 1500 -> 2100 -> 2800 -> 3600 -> ... also 500, 600, 700, 800, etc. Oder eben nochmal anders, z.B. ne art exponentielle Kurve oder etwas ähnliches. Ginge sowas mit Dyn?

Corti
12.03.2015, 13:02
Primary ist ein Fixwert für den Ext-Wert Pro Level, der immer da ist, als Konstante.
Secondary wird mit dem Level multipliziert.

Wenn du also einen Anstieg a la 500, 600, 700 pro Level willst, dann P=400,S=100,T=0.

Sölf
12.03.2015, 15:25
Hab mich vielleicht etwas schlecht ausgedrückt. Ich hab zur Zeit P = 250, S = 500, T = 250. Da brauch ich dann 1000, 1500, 2500, 4000, 6000... also immer 500 mehr als für das vorherige Level benötigt wurden. Es steigt halt so immer fest um diese 500 Punkte an. Aber es soll eben nicht um einen festen Wert ansteigen sondern mit jedem Level um mehr ansteigen. 500, 600, 700, 800... statt 500, 500, 500, 500. Und das geht mit dem 2k3 nicht.

http://i.imgur.com/A9EcXPb.png

Statt dem was auf dem Bild steht sollten die Werte für die Level eher sein:

1: 1000
2: 1500 (+500)
3: 2100 (+600)
4: 2800 (+700)
5: 3600 (+800)
6: 4500 (+900)
7: 5500 (+1000)
etc.

Edit:
Hier nochmal das gleiche aus dem 2k. Zwar sind die Werte da maximiert, aber da sieht man, dass es eben nicht mit jedem Level um einen fixen Wert ansteigt, sondern mit jedem level immer mehr wird:

http://i.imgur.com/yYkV7vh.png

Wäre es wie beim 2k3 würde es nach Level 2 so aussehen:

1: 50
2: 100 (+50)
3: 150 (+50)
4: 200 (+50)
5: 250 (+50)
6: 300 (+50)
7: 350 (+50)

Corti
12.03.2015, 17:45
Achso~

bugmenot
13.03.2015, 06:13
Edit: hat Funktioniert mit [irgendwas] als neue Variable. Wenn ich versuche die [irgendwas] zu benutzen gibt es weiterhin Probleme. Kurios.

Es gibt nur zwei/vier Stellen in der 2k3DirectItemEquipSkillMenu.ips die entsprechend geändert werden sollten:

Var_3386 (Item 0; Equip):
0xC9 = Var_ID; safety check, ob VarArray nicht bis zu dieser Var_ID initialisiert ist
0xD4 = (Var_ID -1)*4

Var_3387 (Skill):
0x1B = Var_ID; safety check
0x26 = (Var_ID -1)*4




also immer 500 mehr als für das vorherige Level benötigt wurden.
Dass es mit 1000 anfängt irritiert irgendwie.

Ansonsten wäre die simpelste Lösung einfach nur den Editor anzupassen:
download DBX.ini (http://share.cherrytree.at/showfile-19589/dbx.ini)
P = 0
S = 500
T = 0


Und wenn es nicht simpel sein soll, dann gibt es immernoch den Overkill:

Gibts theoretisch eine Möglichkeit die EXP Kurven zu beeinflussen?
Wenn richtig viel Einfluss da sein soll ("mehr exponentieller", eigene EXP-Listen, Ändern der EXP-Kurven während des Spielens, etc.), dann wird das (nur) über ein entsprechendes Callback gehen können. Du kannst gerne irgendwo beantragen, dass dies auf irgendeine Liste gesetzt wird, um dann in einer späteren Version aufzutauchen.

Du kannst auch einen Blick da rein werfen:
download ExpBug-in (http://share.cherrytree.at/showfile-19597/expbug_in.rar)

Frag jemanden, der mit C++ versiert ist, falls die EXP-Kurven über ein paar Textzeilen in der DynRPG.ini konfiguriert werden sollen oder ganze EXP-Sheets für jeden Helden eingelesen / bearbeitet werden sollen. Jede x-beliebige Person sollte mit z.B. Code :: Blocks und etwas Mathematik daran rumschrauben können (oder Werte aus Variablen, zB. für's Skalieren von Schwierigkeitsgraden, in die Rechnung hineinnehmen können.)


n = Level

fB(2) = EXP(Seco)*0.01 +1.5
fA(1) = EXP(Prim)

für n = 2:
dEXP(n) = fA(n) + EXP(Tert)
fA(n) = fA(n-1)

für n > 2:
dEXP(n) = fA(n) + EXP(Tert)
fA(n) = fA(n-1) * fB(n-1)
fB(n) =(fB(n-1) -1.0) * (n*0.002 +0.8) +1.0


Die Kurven im 2k haben tatsächlich etwas Exponentielles an sich.

getEXP2k(int level)
{
float E = 0;
float A = EXP(Prim);
float B = EXP(Seco) * 0.01 + 1.5;
float C = EXP(Tert);
float n = level;
int L = level;

for (int i = 0; i < L-1; i = i++)
{
E = E + A + C;
A = A * B;
B = (B - 1.0) * (n * 0.002 + 0.8) + 1.0;
}
return E;
}




n = Level

für n = 2:
fA(1) = 0
fA(n) = EXP(Seco) * (n-1)
EXP(n) = EXP(Prim) * (n-1) + fA(n) + EXP(Tert)

für n > 2:
fA(1) = 0
fA(n) = EXP(Seco) * (n-1) + fA(n-1)
EXP(n) = EXP(Prim) * (n-1) + fA(n) + EXP(Tert)


Meh.

getEXP2k3(int level)
{
float E = 0;
float A = EXP(Prim);
float B = EXP(Seco);
float C = EXP(Tert);
float D = 0;
float n = level;
int L = level;
int i = 1;
while (i > L);
{
D = B * i + D;
E = A * (n-1) + C * (n-1) + D;
}
return E;
}


Sorry, ich kann gerade nicht mit dem Auslesen von Text / Zahlen aus irgendwelchen Textdateien oder verschlüsselten Dateien (damit nicht jeder Spieler daran rumpfuschen kann) dienen. Dafür reicht bei mir weder das Verständnis für C++ noch allgemein das Verständnis für's Programmieren.
Für ein Pseudo-Callback reicht es aber aus irgendeinem Grund.

Corti
13.03.2015, 14:03
Ich habe ein Problem. Die Wettereffekte sind unter den Pictures. Über den Pictures will ich sie aber auch nicht haben.

Ich schätze mal an der Stelle nach Events/Chipset und vor den Pictures wird eine Funktion aufgerufen um die Wettereffekte zu zeichnen, sofern diese aktiviert sind. Ich würde diese Funktion gerne im Plugin zu einem von mir gewünschten Zeitpunkt aufrufen.

Makeraufrufe werden in DynRPG so gemacht.


void Map::updateEvents()
{
asm volatile("call *%%esi" : "=a" (_eax) : "S" (0x4AB8B4), "a" (events.ptr) : "edx", "ecx", "cc", "memory");
}

asm [volatile] ( AssemblerTemplate
: OutputOperands
[ : InputOperands
[ : Clobbers ] ])

Der Call kriegt "esi" mit und bezieht sich damit auf Register "S", welches in den Inputs mit einer Adresse beschrieben wird.
Als ersten Schritt müsste man also wissen, welche Adresse die Funktion zum Zeichnen der Wettereffekte hat und welche Parameter dafür notwendig sind.

Sölf
13.03.2015, 14:53
Was die Exp Kurven betrifft, es ist nichts zwingend notwendiges (man kann ja die Exp drumherum balancen), aber wenn jemand so eine Kurve wie beim 2k hinbekommen würde (oder etwas ähnliches - zumindest nicht son Murks wie beim 2k3) würde ich das sofort benutzen. Aber schonmal dan ke soweit.

Vallastheking
13.03.2015, 20:57
Ich hoffe doch, das ich jetzt nicht zur falschen Zeit frage...
Und auch nicht im falschen Thread ...

Aber, gibt es ein Dyn-plugin, womit ein script ein Screenshot machen kann, dass man dann direkt dann einbinden könnte?
Z.b. für ein Selbstgebasteltes Savesys? Ich hab ja gehört, das es für den 2k ein programm gibt, aber das man dafür
Inelukis Tastenpatch braucht. Ich nutze ja vorzugsweise den 2k3. ^^

bugmenot
13.03.2015, 22:20
Wettereffekte
Zu welchem Zeitpunkt und wie oft werden die onDrawXYZ() callbacks durchgeführt? Die Funktion zum Drüberpinseln der Wettereffekte (oberhalb von X und unterhalb von Y, zum Zeitpunkt des Aufrufes) muss in jedem Frame passieren.
Ich wollte eigentlich sowieso schauen, inwieweit man die Zeichenreihenfolgen zur Laufzeit ändern kann plus/minus entsprechende callback-Strukturen (weil jemand mal danach gefragt hatte).

Erstmal das eigentliche Zeichnen der Wettereffekte (unterhalb der Pictures, BAni, MessageBox) ausknipsen:


( *reinterpret_cast<char *> (0x4A3ECB)) = 0xEB;
( *reinterpret_cast<char *> (0x4A3ECC)) = 0x0A;

Das wirst du unter Umständen wieder entfernen müssen, wenn sich an dem Ort neuer Code befinden wird.

Update / Zeichnen von Wettereffekten je Frame erfolgt durch:


int eax = ( *reinterpret_cast<int **> (0x4CDDA8) )[0]; //ScreenEffect pointer
asm volatile("call *%%esi"
:
: "S" (0x4C33D0), "a" (eax)
: "cc", "memory");
//draws WeatherEffects on current (depends on when this is called) map drawing layer






so eine Kurve wie beim 2k
download ExpBug-in (http://share.cherrytree.at/showfile-19597/expbug_in.rar)

Entsprechende Koeffizienten sind die Selben wie beim 2k (heißt die Obergrenze für Erfahrungspunkte wird schnell mal bei Level 50 erreicht), man kann diese auch anpassen (oder einfach niedrigere Zahlen für EXP(Prim) und EXP(Sec) in der Database nutzen). Es gibt nur kleine Abweichungen von den 2k-Werten, wenn man die selben EXP(Prim) und EXP(Sec) nutzt (es musste über ganze Zahlen geregelt werden statt mit Kommazahlen).


Edit:


download ExpDetectBug-in (http://share.cherrytree.at/showfile-18961/expdetectbug_in.rar)

Gibt die Anzahl an gesamter Erfahrung aus, welche ein Held für das nächste Level benötigt.


>> DETECT

Nutzt einen Comment mit dem Inhalt:

@exp_detect [1], [2]

[1] = Hero_ID (aus dem Reiter actor/hero in der F8-Database)
[2] = Var_ID welche die benötigte Erfahrung ausgeben soll

Ersetze [x] mit Zahlen oder einer Var_ID mit einem vorangestellten "V"
Bsp.
"@exp_detect V32, 5"

gibt die Erfahrung, welche der Held aus Var[0032] benötigt um das nächste Level zu erreichen, in Variable 5 aus.


>> DETECT_ALT

@exp_detect_alt [1], [2], [3]

[1] = Hero_ID
[2] = Level von dem die benötigte Erfahrung abgefragt werden soll
[2] = Var_ID welche die benötigte Erfahrung ausgeben soll


>> ERROR MESSAGES

Ein Level kleiner als 1 wurde verwendet, wenn die Variable Null ausgibt.
Eine ungültige Hero_ID wurde verwendet, wenn die Variable -1 ausgibt.
Outputs the total amount of experience a hero requires to reach the next level.


>> DETECT

Use a comment with the contents:

@exp_detect [1], [2]

[1] = Hero_ID (from actor/hero tab in F8-database)
[2] = Var_ID to store the required experience into

Substitute [x] with numbers or a Var_ID with a "V" in front
e.g.
"@exp_detect V32, 5"

will get the experience the hero from Var[0032] requires to reach the next level and stores that value in variable 5.


>> DETECT_ALT

@exp_detect_alt [1], [2], [3]

[1] = Hero_ID
[2] = Level to get required experience from
[3] = Var_ID to store the experience needed into


>> ERROR MESSAGES

A Level smaller than 1 was used if the output in the variable is zero.
An invalid Hero_ID was used if the output in the variable is -1.
Mit einer Kombination hiervon und [irgendwas], was die Werte [irgendwo] auflistet und/oder einen Graph zeichnet, damit man die Kurvenverläufe richtig einschätzen kann. Weil die Database wird eben nicht die neuen resultierenden Werte anzeigen.




P.S.:
Kann es sein, dass GCC Probleme mit float-Multiplikation hat, wenn von einer beliebigen Anzahl an Schleifendurchläufen (oder Größe der floats?) ausgegangen wird und der Versuch da etwas möglichst effizientes zu Kompilieren in die Hose geht?



do
{ fNewExp = fNewExp + fTert + fPrim;
fPrim = fPrim * fSec; //hier knallt es ständig wegen einer "invalid floating point operation"
fSec = (fSec - fCoeffE) * ((fLevel * fCoeffC) + fCoeffD) + fCoeffE;
i = i--;
} while (i != 0);

int newExp = (int)fNewExp;

Sölf
14.03.2015, 14:21
Danke! Ich teste da mal etwas rum.

Edit: Bissel rumexperimentiert und diese Werte hier:

A = 500
B = 1500000
C = 1525
D = 800000
E = 1000000

...funktionieren ganz gut. Muss den Anfang etwas rebalancen was Exp betrifft, aber ansonsten gleichen sich meine und diese Kurve etwa bei Level 29/30 an (29 der neuen ist ziemlich genau 30 der alten - nur danach wirds natürlich sehr viel mehr). Also nochmal danke dafür. :A

Corti
14.03.2015, 21:51
@bugmenot: Funzt wunderbar! Danke:-)

MagicMaker
20.03.2015, 22:48
Da Erfahrungspunkte gerade ein echt beliebtes Thema zu sein scheinen:
Wäre es vielleicht auch drin, den aktuellen NEXT-Wert, den man auch im Spielmenü sehen kann,
in Variablen auszuwerfen?

Bei was ich mich aber ganz besonders frage, warum man es nicht auch in Vars ausgeben kann,
sind die Held-IDs auf den 4 Partyslots.

Beide Dinge würden gelegentlich so manchen unangenehmen Umweg abkürzen. Ersteres wäre
etwas dringender als zweiteres.

Was mir auch noch helfen könnte, wäre der Aufruf von Load über die bekannte BAEP-Methode
mit ExitEventProcessing bei V3350=1, ohne den Titleskip zwingend mitreinpatchen zu müssen.

bugmenot
21.03.2015, 00:46
2k v1.07?

download VarExtender[+] (http://share.cherrytree.at/showfile-19774/varextender___.rar)

Eine Erweiterung für <ChangeVariable: Other> und <ChangeVariable: Hero>

download LunarIPS (http://fusoya.eludevisibility.org/lips/)
Erster Schritt: legt euch eine Sicherungskopie eurer RPG_RT.exe an (für den Fall der Fälle)
Lunar IPS öffnen -> apply IPS patch -> .ips-Datei (den Patch) wählen > Dateityp: all types -> RPG_RT.exe auswählen


RPG2000.exe im Resource Hacker (oder ähnlichem Programm) öffnen, TFORMEVCMD10220 suchen und unter ComboBoxC8 (weit unten in TFORMEVCMD10220; unter Line:510) bei Items.Strings unter 'MIDI Ticks' (bzw. 'MIDI Play Pos.(Tick)') Folgendes einfügen:
'Screen Mode'
'Screen Zoom'
'This Event ID'
'Party')

außerdem, unter ComboBoxC6B (ein Stück über ComboBoxC8; unter Line:444) bei Items.Strings, unter 'Accessory No.' Folgendes einfügen:
'next Lv EXP')

Compile. Save.


Hinweise:

<>ScreenMode (Input/Output)
Wenn die angegebene Variable vorher den Inhalt Null hatte, wird ausgegeben:
1 = gerade im Fenstermodus
2 = gerade im Vollbildmodus
Wenn die angegebene Variable vorher den Inhalt 1 oder 2 hatte, wird in den dazu entsprechenden Modus gewechselt.


<>ScreenZoom (Input/Output)
Wenn die angegebene Variable vorher den Inhalt Null hatte, wird ausgegeben:
1 = gerade im kleinen Bild
2 = gerade im großen Bild
Wenn die angegebene Variable vorher den Inhalt 1 oder 2 hatte, wird in den dazu entsprechenden Zoom gewechselt.


<>Party (Input/Output)
Wenn die angegebene Variable vorher den Inhalt Null hatte, wird ausgegeben:
1..4 = momentane Partygröße (Anzahl an Helden in der Party)
Wenn die angegebene Variable vorher den Inhalt 1, 2, 3, 4 (Partyposition) hatte, wird die Hero_ID dieser Partyposition ausgegeben (oder -1 bei ungültiger Position).

An extension to <ChangeVariable: Other> and <ChangeVariable: Hero>

download LunarIPS (http://fusoya.eludevisibility.org/lips/)
First step: make a backup of your RPG_RT.exe (just in case)
open Lunar IPS -> apply IPS patch -> select the .ips file (this patch) -> file type: all types -> select the RPG_RT.exe


Open RPG2000.exe in Resource Hacker (or similar programs), search for TFORMEVCMD10220 and below ComboBoxC8 (far down into TFORMEVCMD10220; below Line:510) at Items.Strings, right below 'MIDI Ticks' (or 'MIDI Play Pos.(Tick)') add the following:
'Screen Mode'
'Screen Zoom'
'This Event ID'
'Party')

also, below ComboBoxC6B (somehwere above ComboBoxC8; below Line:444) at Items.Strings, right below 'Accessory No.' add the following:
'next Lv EXP')

Compile. Save.


Note:

<>ScreenMode (Input/Output)
If the specified variable was set to zero before, it will contain:
1 = currently in windowed mode
2 = currently in fullscreen mode
If the specified variable was set to 1 or 2 before, the ScreenMode will change to the appropriate mode.


<>ScreenZoom (Input/Output)
If the specified variable was set to zero before, it will contain:
1 = currently in small screen
2 = currently in large screen
If the specified variable was set to 1 or 2 before, the ScreenMode will change to the appropriate zoom.


<>Party (Input/Output)
If the specified variable was set to zero before, it will contain:
1..4 = current PartySize (amount of heroes in the party)
If the specified variable was set to 1, 2, 3, 4 (party position) before, it will contain the Hero_ID from that position in the party (or -1 on an invalid position).

...ersetzt die alte VarExtender.ips (es kann ruhig mit der neuen drübergepatcht werden).

MagicMaker
21.03.2015, 13:47
Wuuunderbar, funktioniert bestens. =D

Sölf
26.03.2015, 21:35
Könnte man theoretisch die Items im Inventar auf etwas anderes als 99 beschränken, z.B. auf 10 oder 20? Das ginge ja auch "ohne Probleme" (also über nen Common Event) jetzt, aber damit kann man den Spieler nicht davon abhalten einfach mehr als diese fiktive Obergrenze im Shop zu kaufen.

Edit:
Okay, nach mehrfachem rumprobieren mit MagicMaker hab ich jetzt folgenden Code und der scheint auch zu funktioniere (spontan konnte ich jedenfalls keine Fehler finden):


ChangeItemMaximum=494262,#10,49427D,#10,490234,#10,4A6251,#10,4A62E1,#10,492F99,0A,494783,0A

Daher ein Danke an ihn und... ja, hat sich soweit wohl erledigt. xD

bugmenot
26.03.2015, 23:22
[QuickPatches]
ItemCap=4A6251,14 (http://www.darkfader.net/toolbox/convert/#DByte.0),4A62E1,14 (http://www.darkfader.net/toolbox/convert/#DByte.0),490234,14 (http://www.darkfader.net/toolbox/convert/#DByte.0),492F99,14 (http://www.darkfader.net/toolbox/convert/#DByte.0),494262,14 (http://www.darkfader.net/toolbox/convert/#DByte.0),49427D,14 (http://www.darkfader.net/toolbox/convert/#DByte.0),494783,14 (http://www.darkfader.net/toolbox/convert/#DByte.0)

Die ersten zwei/drei Zahlen sind generell für das Inventar / Hinzufügen für Items. Der Rest ist für den Shop.
20 (decimal) = 14 (http://www.darkfader.net/toolbox/convert/#DByte.0) (hexadecimal)

Es wird wohl Leute geben, die mehr als 99 Items (warum auch immer) haben wollen:
Beim Standard-Shop wird es Probleme mit einem ItemCap über 127 geben (hex = 7F (http://www.darkfader.net/toolbox/convert/#DByte.0)).
Das Maximum kann nur 255 sein (hex = FF (http://www.darkfader.net/toolbox/convert/#DByte.0)), das hat mehr damit zu tun, wie die Daten des Inventars verteilt sind. Da ist nur Platz für 8bit Zahlen.

Die Itemanzahl im Itemmenü, Equipmenü, Shop muss dann auch nach links hin eingerückt werden:


[QuickPatches]
ItemAmount(X)=4A0408,73 (http://www.darkfader.net/toolbox/convert/#DByte.0),4C8A99,73 (http://www.darkfader.net/toolbox/convert/#DByte.0),493C16,6E (http://www.darkfader.net/toolbox/convert/#DByte.0),493C58,6E (http://www.darkfader.net/toolbox/convert/#DByte.0),4A1317,6E (http://www.darkfader.net/toolbox/convert/#DByte.0)



Edit:
Argh, Ninja'd.
Und Irgendwas in irgendwas übersehen. (490234 ist für den F8 BattleTest)

Sölf
26.03.2015, 23:26
Bei MMs Variante ist ja noch diese Adresse mit drin, wieso fehlt die bei dir?


490234,#10

Edit: Okay, soviel dazu. xD

MagicMaker
26.03.2015, 23:47
Und hier mal gleich für diverse Versionen die Hex-Adressen für das Item-Maximum zum manuellen Bearbeiten:

0x6FD01
0x70F77
0x70F92
0x7148F
0x7C49D
0x7C52D
0x96467
0x74C75
0x75EEB
0x75F06
0x76403
0x81459
0x814E9
0x9B923
0x92399
0x93662
0x9367D
0x93B83
0x8F634
0xA5651
0xA56E1

IndependentArt
27.03.2015, 15:37
Manche Beschränkungen des Makers scheinen ja sinnvoll, zumindest für die damalige Zeit. Andere sind weniger nachvollziehbar.

Ich denke dabei grade an die Größenbeschränkungen für Chipsets.

Vermutlich wurde darüber schon vielfach nachgedacht, aber gab es schon irgendwelche Bestrebungen etwas in die Richtung der Aufhebung der Begrenzungen zu basteln? Vielleicht sogar mit UiD Mod o.ä.?

Das würde auch die "größeren Charsets" nicht mehr so notwendig machen. aus meiner Sicht zumindest, denn das meiste was man damit macht, ist doch eher Mapping. Ein überdimensionales Charset, was herumläuft macht ja auch dahingehend weniger Sinn, weil es sich mit anderen ständig überschneidet, wenn man die Größe der Tiles überschreitet. Aber das geht nur mir so.

Cepanks
27.03.2015, 18:00
Vermutlich wurde darüber schon vielfach nachgedacht, aber gab es schon irgendwelche Bestrebungen etwas in die Richtung der Aufhebung der Begrenzungen zu basteln? Vielleicht sogar mit UiD Mod o.ä.?
Benutz eine Engine und einen Editor, die nicht aus der "damaligen Zeit" stammen und meist nicht von Enterbrain sind? :bogart:
...achso, ich habe vergessen in welchem Thema ich bin.

IndependentArt
28.03.2015, 13:43
Richtig! Wir sind hier, um einer antiquierten Engine mit endlosen chirurgischen Eingriffen zu Aktualität zu verhelfen ;)

Sölf
30.03.2015, 18:53
So, ich hätte da noch etwas. Und zwar gehts um die Verkaufspreise von Items. Standardmäßig ist der Wert ja 50% vom Einkaufspreis. Ich würde das gerne reduzieren, auf z.B. 25%.

bugmenot
30.03.2015, 22:10
Da fallen mir spontan drei Möglichkeiten ein.

Für das Beispiel da oben geht es simpel:


[QuickPatches]
QuarterSellPrice=49455C,C1FA02EB02,4932EF,C1F802EB02
Da erfolgt eine ganzzahlige Division durch eine Zweierpotenz (2^x).


Für etwas mehr Kontrolle von Kaufs- / Verkaufspreisen habe ich mal das hier (http://www.multimediaxis.de/threads/104116-Programmwunsch-und-erstellungsthread-2?p=3153386&viewfull=1#post3153386) gemacht.
Das sollte eher Anwendung dafür finden, dass man durch Fähigkeiten / eingesetzte Items einstellbare Rabatte oder mehr Geld beim Verkauf von Kram erhält.
Dann sollte aber der oben genannte QuickPatch (und FullSellPrice=49455C,9090,4932EF,9090) nicht damit verwendet werden.


Dritte Möglichkeit wäre der Zugriff auf einzelne Itempreise mittels Plugin mit RPG::items[ID]->price
(Nicht vergessen den Inhalt von DynRPG-master (http://www.multimediaxis.de/threads/134256-DynRPG-Das-RM2k3-Plugin-SDK?p=3234196&viewfull=1#post3234196) in ../CodeBlocks/MinGW/include/DynRPG einzufügen.)
Problem ist ja nur, dass hier mit einer Kopie der .ldb-Datenbank gearbeitet wird -> Änderungen wirken sich auf die gesamte Spielsession aus (auch bei F12 -> Laden/Neu) und werden wieder resettet, wenn man die RPG_RT.exe schließt und neustartet.
Edit:
Und die default-Werte müssen irgendwo zwischengelagert werden. ...oder ich muss mir etwas einfallen lassen, wie man trotzdem noch an database-default-Werte herankommt.

Sölf
30.03.2015, 22:25
Theoretisch würde mir in diesem Falle der Quickpatch reichen (zumindest wenns um ne 2er Potenz geht, und das ist 25% ja). Speziell bei mir gehts nur darum, dass Geld durch drops kommt (die ich im nachhinein anpassen kann), aber der Verkaufspreis von Ausrüstungsgegenständen zu hoch ist, weshalb neue Waffen immer sehr viel teurer sein müssen (und das wird auf Dauer echt eklig).

das blau markierte 02 ist also dann 2x2, und 03 wäre dann 2x2x2, also 8, richtig?

bugmenot
30.03.2015, 22:36
das blau markierte 02 ist also dann 2x2, und 03 wäre dann 2x2x2, also 8, richtig?
Kann man sagen.
Intern werden aber die Bits der Zahl nach rechts verschoben, dabei sinkt der Exponent mit jeder Verschiebung um 1, was im Endeffekt jedes Mal die Zahl halbiert. (+ Informationsverlust wenn zB. die originalen 2^1 und 2^0 wegfallen).


Damit mein Post jetzt nicht zu inhaltslos ist:

einer antiquierten Engine mit endlosen chirurgischen Eingriffen zu Aktualität zu verhelfen
Ich kann momentan nicht sagen, ob hier gerade nach einer Gehirntransplantation gefragt wird (denn die ganze Mapping-Engine anpassen kommt dem doch sehr nahe) oder einfach nur ein Pflaster hilft. Unbegrenzte TileSets wie mit dem RMXP könnte zig Stunden an Arbeitszeit kosten.

Stray
31.03.2015, 04:10
Ist es möglich, den RPG Maker um ein System zu erweitern, dass Reaktionen zwischen Events erkennt, also Berührungen usw. die dann auch durch Bedingungen abgefragt werden können?
Der RPG Maker kann ja soziemlich alles, nur das nicht. Eben solche Bedingungen wie: Wenn Event A > Event B berührt, mach XY.

Corti
31.03.2015, 10:00
kann man als Plugin machen. Reinhacken wurde ich das nicht.

goldenroy
03.04.2015, 18:28
Hey, ich suche nach einer Möglichkeit, das Itemmenü per Eventcode aufzurufen. Die Möglichkeiten die es bisher gibt (z.B. der DirectItemEquipMenu (http://www.multimediaxis.de/threads/104116-Programmwunsch-und-erstellungsthread-2?p=3075375&viewfull=1#post3075375)-Patch von elvissteinjr) ersetzen soweit ich weiß das Standardmenü komplett mit Item-, und/oder Equipmenü und bieten nicht nur eine Alternative (Außerdem verträgt der sich nicht mit VisuMenu (http://share.cherrytree.at/showfile-18935/visumenu.rar)von bugmenot).
Hatte da wer schon mal so was gemacht? Bei dem ganzen Zeug bzgl. des Menüs verliere ich gerne den Überblick.

bugmenot
03.04.2015, 20:10
DirectMenuPatch (http://www.multimediaxis.de/threads/104116-Programmwunsch-und-erstellungsthread-2?p=3203452&viewfull=1#post3203452)
Für den Fall, dass man das normale Menü zwischendurch wiederhaben will.

Ich hatte bei der 2k3-Version vom VisuMenu-Ding einen Fehler gemacht, wodurch es bisher inkompatibel mit DMP war.
Das hier sollte helfen (sich auch mit anderem directMenu-Zeug vertragen?):
download VisuMenu(fix) (http://share.cherrytree.at/showfile-19942/visumenu.rar)

goldenroy
03.04.2015, 23:05
Ah, vielen Dank. War ja auch schon unter dem verlinkten Post, ich hab da keinen Überblick. x3

goldenroy
04.04.2015, 17:13
Hey hey, noch was zu Menüstuff.
In den Visumenü Einstellungen gibt es ja folgendes für die EXP im Hauptmenübildschirm:

M:P:Exp(Color)=49E1A2,%0
M:P:Exp(dy)=49E1A8,%58
M:P:Exp(+y)=49E1AE,%32
M:P:Exp(x)=49E1B0,#64

Ich habe mich gefragt, ob auch entsprechendes für die Max. Exp (so wie bei HP oder MP) möglich wäre. Wenn man nicht die sechs- oder siebenstelligen Zahlen für die EXP verwendet, von denen der Maker ausgeht, gibts da viel ungenutzen Platz
(XXX/_____YYY quasi).

bugmenot
04.04.2015, 18:48
Für HP und MP wird ein und der selbe Wert für die Stringlänge verwendet.



[QuickPatches]
M:P:Exp(/size)=49E369,37
M:P:HP/MP(/size)=49E382,34
S:H|M|E:Exp(/size)=49F2A5,37
S:H|M|E:HP/MP(/size)=49F27A,37
Die markierten Zahlen verringern.

0x77719 = [M:P:Exp](/size)
0x77732 = [M:P:HP/MP](/size)

goldenroy
04.04.2015, 19:42
Erneut vielen Dank! Freut mich sehr, dass man nach so Kleinigkeiten fragen kann. xD

Sölf
08.04.2015, 01:05
Ich bräuchte nochmal kurz Hilfe. Items der Kategorie "Skill Scroll" sollten im Menü nicht benutzbar sein. Ich habe einige Items die Buffs verleihen, als Skill Scroll sind die aber auch außerhalb des Kampfes benutzbar, was nicht möglich sein sollte. Ist der Skill, der vom Item hevorgerufen wird, etwas was dem Gegner Schaden zufügt oder so ist er eh nicht benutzbar, aber bei Buffs (und Heilung?) geht's eben doch. Sollte sich das dann aber irgendwie mit den Skills an sich beißen (da hab ich auch einige Buffs) dürft ihr diese Anfrage gerne ignorieren.

bugmenot
08.04.2015, 15:48
Es gibt sicher irgendeine komplett umständliche / fehleranfällige Methode es auch so hinzubekommen. Hab's mal auch für 2k v1.07 gemacht (wozu auch immer).
Ich schaue mal wie man die Checkboxen entsprechend anzeigen kann, ohne ständig umherklicken zu müssen (und richtig verlinken und korrekt anzeigen). Wird wohl kaum in eine uimod reinpassen (weil alte Objekte entfernt werden müssen, komplett neue definiert werden, etc.).


SkillScrollSwitch
download SSS (http://share.cherrytree.at/showfile-20051/skillscrollswitch.rar)

Fügt zusätzliche Möglichkeiten hinzu, um die Verwendung von SkillScroll-Items auf dem Feld / im Kampf zu unterbinden.
Ändere kurzzeitig den ItemType zu "Switch" und entferne/setze den Haken bei "Activation"/"Available at" Field/Battle. Ändere den ItemType wieder zu "Skill Scroll".

download LunarIPS (http://fusoya.eludevisibility.org/lips/)
Erster Schritt: legt euch eine Sicherungskopie eurer RPG_RT.exe an (für den Fall der Fälle)
Lunar IPS öffnen -> apply IPS patch -> .ips-Datei (den Patch) wählen > Dateityp: all types -> RPG_RT.exe auswählen

Oder packt den Patch in den Ordner DynPatches.

Adds additional options to disable the use of SkillScroll Items on field / in battle.
Temporarily change the ItemType to "Switch" and uncheck/check "Activation"/"Available at" Field/Battle. Change the ItemType back to "Skill Scroll".

download LunarIPS (http://fusoya.eludevisibility.org/lips/)
First step: make a backup of your RPG_RT.exe (just in case)
open Lunar IPS -> apply IPS patch -> select the .ips file (this patch) -> file type: all types -> select the RPG_RT.exe

Or put this patch into your DynPatches folder.

Sölf
08.04.2015, 18:37
Funktioniert, danke! :A