REVOLUTION PATCH für RM2k3
Anmerkung: Das Ding braucht ein Bild namens „loading.png“ im Ordner „Title“, was es beim Laden anzeigt.
[05.06.2011 22:34:36] Cherry: die rpg_rt und die revhelper.dll gehören ins Projekt.
[05.06.2011 22:34:53] Cherry: die andere exe ist ein Zusatzprogramm mit dem du Messages und Choices mit mehr als 4 Zeilen eingeben kannst.
[05.06.2011 22:35:01] Cherry: die kann der Patch nämlich Verarbeiten, der Maker aber nicht^^
[18:15:35] Cherry: okaaayy.
[18:15:49] Cherry: ich erklär in der Reihenfolge die mir einfällt.
[18:15:57] Cherry: frag wenn was unklar ist und notier dir, was du brauchst.
[18:16:04] MajinSonic: okay...^^ich sicher mir dann alles in einer datei :D
[18:18:14] Cherry: mal schauen was ich mir da so aus den Fingern sauge.
[18:18:24] Cherry: ok, was ist anders?
[18:18:32] MajinSonic: und ich bin gespannt was das teil drauf hat :D
[18:18:45] Cherry: ...das Menü lass ich mal weg
[18:18:48] Cherry: ...das KS auch.
[18:19:04] Cherry: moment noch kurz
[18:19:45] Cherry: so
[18:20:14] Cherry: Du hast Maus.
[18:20:29] Cherry: Variable 3372: X
Variable 3373: Y
[18:20:44] Cherry: Du hast die ganze Tastatur.
[18:21:20 | Bearbeitet 18:22:56] Cherry: Variable 3371 ist dafür zuständig.
[18:21:40] Cherry: damit kannst du entweder die ganze Tastatur abfragen (bringt dann aber nur was wenn nur eine Taste gedrückt ist), oder Tasten einzeln.
[18:22:22] Cherry: es funktioniert immer gleich: Du machst Change Variable und schreibst den Tastencode den du abfragen willst, in die Variable - oder 0 um die ganze Tastatur abzufragen. Danach enthält die Variable entweder den Tastencode der gedrückten Taste, oder 0 wenn sie nicht gedrückt ist.
[18:22:28] Cherry: Tastencodes: Google nach Virtual Key Codes.
[18:23:03] Cherry: hab mich oben gerade korrigiert. Tastatur ist Var 3371, nicht 3374
[18:23:34] Cherry: außerdem tolle Picturefunktionen.
[18:23:42] Cherry: nutzt du den Ultimate?
[18:24:04] MajinSonic: nein den normalen, mit dem ultimate komme ich nicht so ganz klar ;)
[18:24:22] Cherry: das musst du mir jetzt aber erklären :) Was daran ist unklar?
[18:25:05] MajinSonic: Ich bin in den rm2k3 zu sehr eingelebt und das layout des normalen finde ich übersichtlicher :D nich schlagen bitte ;)
[18:25:11] Cherry: nene, wollt es nur wissen.
[18:25:44] Cherry: naja, ohne Ultimate ist das jetzt etwas komplizierter, mehr Bilder nutzen zu können, du musst die Anleitung vom PicPointerPatch befolgen (die ganz unten - "damit man im rm2k(3) überhaupt so hohe Picture-IDs nutzen kann", etc.)
[18:25:48] Cherry:
http://www.multimediaxis.de/threads/...riable-angeben
[18:25:59] MajinSonic: okay
[18:26:05] Cherry: du hast nämlich Picture IDs 1-9999
[18:26:12] Cherry: wobei die aber spezielle Funktionen haben.
[18:27:02] Cherry: hier die Aufschlüsselung:
[18:33:02] MajinSonic: *abwart*
[18:35:11] Cherry: sorry, Telefonat
[18:36:02] Cherry: Panorama <<< Tileset unter Hero/auf gleicher Höhe <<< PICTURES 127-499 (flüchtig) <<< PICTURES 500-999 (permanent) <<< Events unter Hero <<< PICTURES 1000-1499 (flüchtig) <<< PICTURES 1500-1999 (permanent) <<< Events auf gleicher Höhe wie Hero <<< PICTURES 2000-2499 (flüchtig) <<< PICTURES 2500-2999 (permanent) <<< Tileset über Hero <<< PICTURES 3000-3499 (flüchtig) <<< PICTURES 3500-3999 (permanent) <<< Events über Hero <<< PICTURES 4000-4499 (flüchtig) <<< PICTURES 4500-4999 (permanent) <<< Wettereffekte <<< PICTURES 1-126 (flüchtig) <<< PICTURES 5000-5499 (flüchtig) <<< PICTURES 5500-5999 (permanent) <<< Animationen <<< PICTURES 6000-6499 (flüchtig) <<< PICTURES 6500-6999 (permanent) <<< Fenster, wie z.B. die Messagebox <<< PICTURES 7000-7499 (flüchtig) <<< PICTURES 7500-7999 (permanent) <<< Timer
Die Pictures 8000-9999 sind nur im Kampf sichtbar, betreffen dich also nicht.
Flüchtig bedeutet, die Pictures werden bei einem Mapwechsel gelöscht, permanent bedeutet, sie bleiben. Dass 1-126 nicht dem normalen System folgen, hat Kompatibilitätsgründe: Wenn jemand den Patch in ein bestehendes Projekt tut, sollen die Bilder ja nicht auf einmal zwischen dem Tileset und den Events unter dem Helden sein, sondern da wo sie immer sind.
[18:37:10] Cherry: (und bisher konnte man im RM2k3 nur 126 Bilder verwenden - 50 normalerweise, und die zusätzlichen 76 durch Hyper Patcher 2)
[18:37:53] MajinSonic: huii...is ja ne latte..aber ich denke, ich verstehe...
[18:37:57] MajinSonic: was gibts noch ?
[18:37:58] MajinSonic: ^^
[18:38:11] Cherry: viel.
[18:38:18] Cherry: wollte nur mal abwarten bis du gelesen hast
[18:38:46] Cherry: Pictures können auch angezeigt/bewegt/gelöscht werden während eine Messagebox aktiv ist.
[18:38:54] Cherry: (also wie beim UnlockPics-Patch)
[18:39:36] MajinSonic: du meinst um einen fog effekt flüssiger zu halten
[18:39:40] MajinSonic: z.B.
[18:39:41] MajinSonic: ^^
[18:39:42] Cherry: ja, oder um sonstwas zu tun.
[18:39:45] Cherry: animierte Faces, etc.
[18:40:08] Cherry: einen eigenen "Pfeil-nach-unten"-Cursor... (geht mithilfe der Funktionen die du noch erfahren wirst)
[18:40:15] Cherry: ok auch neu:
[18:40:22] Cherry: Wenn ein Fehler passiert, wird das Spiel nicht geschlossen sondern nur neu gestartet.
[18:40:36] Cherry: ist der Fehler ein Datei-nicht-gefunden-Fehler, passiert gar nix, außer dass eine Nachricht erscheint.
[18:40:47] Cherry: es wird ein Dummybild geladen
[18:41:31] Cherry: F11 öffnet im Testplay das Speichermenü.
[18:41:41] Cherry: "Input Variable" nimmt den Variableninhalt als Startwert.
[18:42:22] Cherry: Du kannst Messages und Choices mit mehr als 4 Zeilen verwenden. (Aber nur wenn du die Messageboxgröße änderst, später dazu mehr).
[18:42:36] Cherry: Damit du derartige Monstermessages/-choices in den MAKER kriegst, gibt es revmsgedit.exe
[18:43:34] MajinSonic: Die hattest du mir doch gestern schonmal geschickt, oder?
[18:43:39] Cherry: ja
[18:43:53] MajinSonic: ja hatte ich mal reingeschaut aber noch nicht mit gespielt :D
[18:44:15] Cherry: kleine Nebensächlichkeit: Wenn man ESC drückt wenn eine Choice aktiv ist wo als Default "Ignore" eingestellt ist, macht es Dädäät.
[18:44:19] Cherry: (Cancelsound)
[18:44:35] Cherry: ok jetzt kommen wir zum interessanten.
[18:44:44] Cherry: Wenn Switch 3366 on ist, werden alle aktiven Move Routes angehalten.
[18:45:22] Cherry: Wenn Switch 3369 an ist, kann der Held nicht durch den Spieler bewegt werden.
[18:45:36] Cherry: Wenn Switch 3370 an ist, ist eine Messagebox offen.
[18:47:44] Cherry: Wenn Switch 3371 an ist, wird die Messagebox ohne Rahmen und Hintergrund dargestellt, auch wenn bei Message Display Options "Opaque" eingestellt ist. Sinn der Sache ist, dass nämlich "Transparent" in den Message Display Options beim 2k3 einen Nebeneffekt hat: Sind die transparenten Fenster aktiv (kann man in der Database unter Battle Layout - blöde Stelle, ich weiß - einstellen), erscheinen dann nämlich viele Fenster nur mit Rahmen, aber komplett ohne Hintergrund. Um das zu vermeiden, gibts den Switch stattdessen, der betrifft wirklich nur die MEssagebox
[18:48:01] Cherry: Wenn Switch 3372 an ist, werden Choices nicht links eingerückt.
[18:48:25] Cherry: Wenn Switch 3373 an ist, ist die Breite des Auswahlrechtecks bei Choices nicht so breit wie das Fenster, sondern so breit wie der Text den es umschließt.
[18:49:00] MajinSonic: das is geil^^
[18:49:34] Cherry: außerdem: Jedesmal wenn die Messageboxfunktion die Textanzeigefunktion callt, wird die Messagetextinfo aktualisiert.
[18:49:37] Cherry: das heißt:
[18:49:51] Cherry: die Messageboxinfo callt die Textanzeigefunktion meistens alle ZWEI Buchstaben.
[18:49:59] Cherry: Außer der Text wird recht langsam angezeigt.
[18:50:15] Cherry: jedes Mal wenn die Textanzeigefunktion aktiviert wird, passiert folgendes:
[18:51:35] Cherry: Variablen 3391 und 3392 erhalten die zwei Zeichen, die gerade angezeigt werden (3392 = 0 wenn nur eines angezeigt wird.) Zeichencodes => Google nach ASCII Codes.
Variable 3393 erhält die aktuelle Zeile, 3394 die aktuelle Spalte in der Message. 3395 erhält die aktuelle X-Position der Zeichen die gerade angezeigt werden, relativ zum linken Rand der Messagebox. Variable 3395 erhält die aktuelle Textfarbe, Variable 3396 die aktuelle Textgeschwindigkeit.
[18:52:17] Cherry: damit kannst du z.B. Textsounds machen. Einfach checken ob 3391 ungleich 0 ist - dann wurde was angezeigt (danach selber auf 0 setzen, damit du bereit bist für das nächste Zeichen)
[18:52:44] MajinSonic: textsound...meinst du damit so ein diet diet diet geräusch bei den buchstaben?
[18:52:50] Cherry: z.B..
[18:52:54] MajinSonic: ah okay
[18:52:55] MajinSonic: ^^
[18:53:29] Cherry: OK, nun zu den FUnktionen die du callen kannst.
[18:53:39] Cherry: sagt dir Funktionsaufruf, Parameter, Rückgabewert, ... etwas?
[18:53:56] MajinSonic: Oh...öhm.... ist es schlimm wenn ich nein sage? xD
[18:54:33] Cherry:
http://de.wikipedia.org/wiki/Funktio...grammierung%29
[18:54:56] Cherry: Kapitel 2
[18:55:05] MajinSonic: in ordnung herr lehrer :D ich werd mich schlau machen ;)
[18:55:10] Cherry: sowas ähnliches.
[18:55:22] Cherry: Du kannst Funktionen aufrufen, denen Parameter mitgeben, und erhältst ggf. Rückgabewerte.
[18:55:28] Cherry: das funktioniert immer so:
[18:55:39] Cherry: die Variablen 3362 bis 3370 sind die Parametervariablen 1 bis 9.
[18:55:47] Cherry: 3362 = Param1, 3363 = Param2, ..., 3370 = Param9
[18:55:54] Cherry: die Variable 3361 ist die Kontrollvariable.
[18:56:22] Cherry: Machst du Change Variable [3361], XYZ, dann wird NICHT einfach XYZ in die Variable geschrieben, sondern die Funktion Nummer XYZ aufgerufen.
[18:57:04] Cherry: Eine Funktion ist z.B. GetFullScreenFlag (der Name ist nur zur Erklärung, er steht nirgends).
[18:57:10] Cherry: Diese Funktion hat Nummer 12.
[18:57:25] Cherry: sie nimmt keine Parameter entgegen, gibt aber in der Param1-Variable das Ergebnis zurück.
[18:57:30] Cherry: Beispiel:
[18:58:26] Cherry: <> Change Variable [3361:Control] = 12 << Aufruf von GetFullScreenFlag!
<> Conditional Branch - if Var[3362:Param1] == 1
....<> Message: Vollbildmodus aktiv.
....<>
:Else
....<> Message: Fenstermodus aktiv.
....<>
:End
[18:58:37] Cherry: klar?
[18:59:26] MajinSonic: Ich denke schon...^^
Kann ich damit manuell im spiel zwischen fenster und vollbild wechseln?
[19:00:02] Cherry: gut dass du das sagst. Nein, bis jetzt nicht. Nur abfragen OB man im Vollbild ist. Ich kann es aber noch einbauen.
[19:00:34] MajinSonic: Naja..aber bringt es was den spieler in die modis zu zwingen?
Die Abfrage wiederrum ist ne nette sache
[19:00:38] Cherry: ok.
[19:01:19] Cherry: Funktion 13: GetLargeWindowFlag
Parameter: keine
Checkt ob das Fenster groß oder klein ist (kann man ja mit F5 ändern).
Param1 wird 1, wenn es groß ist oder 0, wenn es klein ist.
[19:01:56] Cherry: Funktion 14: GetTotalPlayingTime
Parameter: keine
Gibt die Gesamtspielzeit in Sechzigstelsekunden zurück (in Variable Param1)
[19:02:15] MajinSonic: Okay... die abfragen sind gut...
Jedoch, wofür brauch ich das?
Die Spielzeit widerrum is gooiiiilll^^ :D
[19:04:06] Cherry: Funktion 18: GetSkillMP
Parameter: 1
Param1: ID des Skills
Fragt ab, wieviel MP ein Skill braucht und schreibt das Ergebnis in Param2
[19:04:34] Cherry: zur Überprüfung: Gib mir ein Beispiel wie du die Funktion verwenden würdest, um in einer Message auszugeben, wieviel MP der Skill Nummer 10 braucht.
[19:05:11] MajinSonic: Okay...^^ich versuchs mal...^^
[19:07:07] MajinSonic: <> Change Variable [3361:Control] = 18 << Aufruf von GetSkillMP
<> Conditional Branch - if Var[3363:Param1] == 1
....<> Message: "Feuerball" MP Kosten \v[3364]
....<>
:Else
....<> Nächster Zaber wird abgefragt
....<>
:End
Ich hoffe es ist so richtig.
[19:07:54] Cherry: nein.
[19:07:57] MajinSonic: ups skill nummer 10 überlesen xD^^
[19:08:44] Cherry: <> Change Variable [3362:Param1] = 10 << Parameter natürlich VOR dem Funktionsaufruf setzen, die Funktion kann ja nicht in die Zukunft schauen!
<> Change Variable [3361:Control] = 18 << Aufruf von GetSKillMP
<> Message: MP-Kosten sind \v[3363]
[19:09:01] Cherry: klar?
[19:09:25] MajinSonic: Achso okay... Also hab ich nur was vedreht XD ^^
[19:09:39] MajinSonic: wird wohl etwas dauern, bis ich mich da eingearbeitet habe^^und ob ich alle funktionen wirklich verwende ist die andere sache
[19:09:43] Cherry: du hast nebenbei noch die Variablennummer um 1 verschoben.
[19:09:54] Cherry: eh nicht, aber bevor ich erkläre sollte Verständnis da sein^^
[19:10:06] Cherry: ok.
[19:10:06] MajinSonic: oh XD ich bin ein Naturtalent...^^
[19:14:13] MajinSonic: Gibt es u.A. noch "leichtere" dinge ?;)
[19:14:15] MajinSonic: *gg*
[19:14:31] Cherry: Funktion 20: GetStringLength
Param1: Stringtyp
Param2: ID
Überprüft die Länge eines Strings und speichert die Länge in Param3.
Stringtyp kann sein [MERK DIR DAS, es kommt noch mehrmals vor]
1 = Name eines Helden (ID = Helden-ID)
2 = Name eines Skills (ID = Skill-ID)
3 = Beschreibung eines Skills (ID = Skill-ID)
4 = Name eines Items (ID = Item-ID)
5 = Beschreibung eines Items (ID = Item-ID)
7 = Name des aktuellen Zustands eines Helden (ID = Helden-ID)
[19:14:40] Cherry: du brauchst die Funktion später, wenn du eines dieser Dinge anzeigen willst.
[19:14:59] MajinSonic: okay..^^
[19:15:38] Cherry: Funktion 38: GetEventLayer
Param1: Event-ID
Checkt ob ein Event auf Below Hero (0), Same Level as Hero (1) oder Above Hero (2) steht und schreibt da Ergebnis in Param2
[19:15:52] MajinSonic: uii...das is praktisch
[19:16:09] Cherry: Funktion 39: SetEventLayer
Param1: Event-ID
Param2: Layer (0, 1 oder 2)
Gegenstück zu GetEventLayer - ÄNDERT den Wert!
[19:17:27] Cherry: Übrigens, merk dir das auch: Für ALLE Dinge die eine Event-ID verlangen gilt: Event 10001 = Held, Event 10002 = Skiff, Event 10003 = Ship, Event 10004 = Airship
[19:18:05] MajinSonic: 10005 this event?
[19:18:14] Cherry: leider nicht. Bin nämlich grade draufgekommen dass das noch fehlt.
[19:18:21] Cherry: mach ich später noch.
[19:18:27] MajinSonic: ah okay...^^
[19:18:33] Cherry: noch was SEHR SEHR praktisches:
[19:18:51] Cherry: Funktion 42: DoesEventExist
Param1: Event-ID
Wenn das Event existiert, wird 1 in Param2 geschrieben, sonst 0.
[19:19:22] Cherry: Damit kann man nämlich Events ansprechen ohne Angst zu haben, dass das SPiel mit "Event script referenced an event which does not exist" abstürzt.
[19:19:34] MajinSonic: ach sowas... ja das is ärgerlich
[19:19:46] Cherry: noch etwas sehr geiles kommt jetzt:
[19:22:30] Cherry: Funktion 43: SetEventPositionOffset
Param1: Event-ID
Param2: X-Offset
Param3: Y-Offset
Ändert die Position eines Events PIXELGENAU relativ zur normalen Position.
Angenommen, ein Event steht auf Tile (013, 008). Ändere ich nun den X-Offset auf -8 und den Y-Offset auf +16 [ein Tile ist 16x16 groß!], hat das den Effekt, dass das Event aussieht, als stünde es zwischen den Tiles (012, 009) und (013, 009). Zeichne es dir auf, falls du es nicht verstehst. Wenn du aber die Tileposition des Events abfragst, kriegst du noch immer (013, 008), auch bei der Kollisionsabfrage wird dieses Feld hergenommen. Wenn du den Positionsoffset langsam immer um 1 Pixel änderst, sieht es wie eine pixelgenaue Bewegung des Events aus. (Nicht vergessen, das Event auch WIRKLICH an eine andere Position zu setzen, wenn es am nächsten Tile steht und die Kollision dann auch dort stattfinden soll!)
[19:22:50] Cherry: klar?
[19:24:34] MajinSonic: ja das ist geil...so kann ich 2 events näher aneinander rücken lassen ohne neue char posen zu machen
[19:25:03] Cherry: okay, gleich noch was geiles:
[19:28:40 | Bearbeitet 19:29:00] Cherry: Funktion 44: BetterGetEventID
Param1: X
Param2: Y
Param3: Erste Variable des Variablenblocks wo das hingespeichert werden soll
Tut im Prinzip dasselbe wie "Get Event ID" - es schaut, welches Event an Position (X, Y) steht und gibt dir die Event-ID. Nur dass diese Funktion ALLE Events an der Position findet (du kannst ja mehrere Events per Set Event Place übereinanderlegen), nicht nur eines! Dazu gibst du in Param3 an, wo er die Event-IDs dieser Events hintun soll. Beispiel:
Du setzt Param3 auf 1001.
Angenommen, auf dem abgefragten Feld stehen die Event 20, 17, 16, 12 und 3.
Dann passiert folgendes:
Variable 1001 [das hast du in Param3 angegeben] wird auf 20 gesetzt.
Variable 1002 wird auf 17 gesetzt
Variable 1003 wird auf 16 gesetzt
Variable 1004 wird auf 12 gesetzt
Variable 1005 wird auf 3 gesetzt
Variable 1006 wird auf 0 gesetzt - das passiert, damit du weißt, dass die Liste zu Ende ist.
[19:28:49] Cherry: alles klar?
[19:30:19] MajinSonic: jaalles klar...
Würde ich es 2001 setzen würden die variablen 2001-2006 verwendet werden?
[19:30:45] Cherry: ja... und würden da nicht 5 Events sein sondern 20, würde 2001-2021 verwendet werden.
[19:30:57] MajinSonic: alles klar gut...^^
[19:31:01] MajinSonic: wirklich praktisch
[19:31:09] Cherry: (also halte halt genug Platz an Variablen frei an der Stelle die du angibst!)
[19:31:25] Cherry: jetzt wird haarig:
[19:32:15] Cherry: Der Patch verwendet Heldennamen als Strings. Mit einem Zusatzpatch, den ich nicht vergessen darf dir zu sagen, kannst du längere Heldennamen eingeben. Dadurch sind die da keine Grenzen gesetzt
[19:32:54] MajinSonic: Du meinst also wenn ich sage:
"Vincent" ist maximal... könnte ich noch ein "Weynard" hinterherhauen?
[19:32:54] MajinSonic: ^^
[19:33:19] Cherry: naja, die heldennamen werden jetzt nicht mehr nur als heldennamen genutzt.
[19:33:22] Cherry: sondern allgemein für Texte.
[19:33:32] Cherry: du kannst mit einer Funktion die ich dir nachher sage Heldenamen irgendwo anzeigen.
[19:34:20] Cherry: zu der Heldennamenlänge: Wieder blöd dass du keinen Ultimate nutzt, weil damit muss man wieder mehr machen...
[19:35:30] Cherry: Du musst den Resource Hacker öffnen, die rpg2003.exe öffnen, zu RCDATA->TFORMEVCMD10610->0 gehen und nach "OverEdit1.MaxLength=12" suchen (ich glaube es war 12, vllt ist es auch was anderes, und es in "OverEdit.MaxLength=1000" ändern. Dann Compile Script anklicken und dasselbe mit RCDATA->TFORMEVCMD10620->0 machen, und speichern.
[19:35:49] Cherry: ok:
[19:36:50 | Bearbeitet 20:27:58] Cherry: Funktion 45: EvalHeroName
Param1: Helden-ID
Param2: ID der Variable für Wert 1
Param3: ID der Variable für Wert 2
Evaluiert einen Heldenname der Formatausdrücke enthält und setzt die gegebenen Werte ein.
[19:36:52] Cherry: Ok, was heißt das jetzt?
[19:37:26] MajinSonic: schreib ruhig schonmal weiter...
Ich muss rasch mit den hunden raus^^die müssen auch mal :P
[19:37:30] Cherry: kk
[19:38:49] Cherry: Zuerst eine Erklärung was Formatausdrücke sind:
[19:39:03 | Entfernt 19:39:08] Cherry: Diese Nachricht wurde entfernt
[19:46:17 | Bearbeitet 20:27:33] Cherry: Angenommen der Heldenname ist "abc". Dann ist er nachher auch "abc". Heißt er aber "Bla %d Blub %d" und ist Wert 1 = 1234 und Wert 2 = 5678, dann ist er nachher "Bla 1234 Blub 5678". Warum? %d wird durch die Werte ersetzt. Du kannst maximal zwei Werte dadurch ersetzen lassen.
Du kannst die Breite angeben. Das geht so (angenommen, Wert 1 = 1234):
%6d - Breite wird mit 6 angegeben. Ergebnis ist " 1234"
%-6d - Breite wird mit 6 angegeben, eingefüllt wird linkbündig. Ergebnis ist "1234 "
%.6d - Breite wird mit 6 angegeben, es wird mit Nullen aufgefüllt. Ergebnis ist "001234"
Ein konkretes Beispiel:
Held 8 hat den Namen "HP: %4d/%4d"
Du rufst auf:
<> Change Variable [3362:Param1] = 8 << wir nehmen den Namen von Held 8
<> Change Variable [3363:Param2] = 1001<< Wert 1 wird aus Variable 1001 bezogen
<> Change Variable [3364:Param3] = 1002 << Wert 2 wird aus Variable 1002 bezogen
<> Change Variable [1001] = 37 << Wert 1 ist 37
<> Change Variable [1002] = 144 << Wert 2 ist 144
<> Change Variable [3361:Control] = 45 << Aufruf von EvalHeroName!
<> Message: \n[8]
In der Message wird stehen: "HP: 37/ 144"
[19:47:47] Cherry: Funktion 46: CopyStringToHeroName
Param1: Helden-ID
Param2: Stringtyp [siehe Erklärung von vorhin]
Param3: String-ID [siehe Erklärung von vorhin]
Kopiert einen String in einen Heldennamen.
[19:48:27] Cherry: Funktion 47: AddCharToHeroName
Param1: Helden-ID
Param2: Zeichencode (Google nach ASCII-Code)
Fügt ein Zeichen an das Ende eines Heldennamen an.
[19:49:31] Cherry: Function 48: GetCharFromHeroName
Param1: Helden-ID
Param2: Position
Liest ein Zeichen aus einem Heldennamen aus und speichert den Zeichencode in Param3. Das erste Zeichen hat Position 0, das zweite Position 1, usw.
[19:50:12] Cherry: Function 49: CatHeroName
Param1: Helden-ID (Ziel)
Param2: Helden-ID (Quelle)
Fügt den Namen des Quellhelden an den Namen des Zielhelden an.
[19:51:58 | Bearbeitet 19:52:15] Cherry: Funktion 50: GetCameraPos
Gibt die aktuelle Position der Kamera in Param1 (X) und Param2 ( Y) zurück, in Pixeln. Dabei sind das die Koordinaten des Punktes ganz oben links im aktuellen Bildausschnitt relativ zu denen des oberen linken Ecks der Map.
[19:52:38] Cherry: Funktion 51: SetCameraPos
Param1: X
Param2: Y
Gegenstück zu GetCameraPos
[19:52:50] Cherry: Der Patch kann mit Kommazahlen rechnen.
[19:54:04] Cherry: dabei sind immer zwei Variablen im Spiel, eine enthält die Zahl vor dem Komma, eine die Zahl nach dem Komma (7 Stellen).
Ist die erste Variable z.B. 2 und die zweite 2400000, entspricht das der Zahl 2,24.
Ist eine der beiden Variablen negativ (ODER BEIDE!!), ist die gesamte Zahl negativ.
[19:55:22] Cherry: Funktion 52: SquareRoot
Param1 & Param2: Kommazahl
Berechnet die Quadratwurzel. Das Ergebnis landet wieder in Param1 & Param2.
[19:56:03] Cherry: Funktion 53: Sine
Param1 & Param2: Kommazahl
Berechnet den Sinus.
Funktion 54 berechnet den Cosinus, Funktion 55 den Tangens.
[19:57:22] Cherry: Funktion 56: FloatAdd
Param1 & Param2: Kommazahl 1
Param3 & Param4: Kommazahl 2
Addiert Kommazahl 2 zu Kommazahl 1 und speichert das Ergebnis wieder in Param1 & Param2. Funktion 57 subtrahiert, Funktion 58 multipliziert, Funktion 59 dividiert (ACHTUNG, Division durch Null erzeugt einen Fehler.)
[19:58:34] Cherry: Funktion 65: SetPictureAngle
Param1: Bild-ID
Param2 & Param3: Winkel als Kommazahl
Dreht ein Bild.
[19:59:13] Cherry: Jetzt wirds wieder nett:
[19:59:14] Cherry: Funktion 65: SetPictureAngle
Param1: Bild-ID
Param2 & Param3: Winkel als Kommazahl
Dreht ein Bild um eine bestimmte Gradzahl.
[20:01:47 | Bearbeitet 20:05:23] Cherry: Funktion 67: SetEventSpeed
Param1: Event-ID
Param2: Geschwindigkeit
Ändert die Geschwindigkeit eines Events SEHR GENAU. Die Geschwindigkeit wird in 3,75 Pixel pro Sekunde angegeben, Geschwindigkeit 8 entspricht also z.B. 30 Pixel pro Sekunde. Ist die Geschwindigkeit 0, verhält sich das Event normal (es bewegt sich so schnell wie eingestellt), ist sie -1, wird das Event komplett angehalten (es bleibt einfach auf der Stelle stehen). Die Geschwindigkeit der Laufanimation ist aber NICHT betroffen, sie wird nach wie vor durch die "normale" Eventgeschwindigkeit geregelt.
[20:03:12 | Bearbeitet 20:05:25] Cherry: Funktion 68: SetEventFrame
Param1: Event-ID
Param2: Schrittstellung
Ändert die Schrittstellung eines Events und überschreibt damit den Standard (funktioniert auch beim Helden und auch wenn sich ein Event gerade bewegt). 0 = links, 1 = Mitte, 2 = rechts. Setzt man die Schrittstellung auf -1, ist die Laufanimation wieder normal.
[20:04:28 | Bearbeitet 20:05:31] Cherry: Funktion 69: SetEventPlace
Param1: Event-ID
Param2: X
Param3: Y
Setzt ein Event an die angegeben (Tile-)Position. Funktioniert genau wie das normale Set Event Place, nur dass es auch beim Helden funktioniert ohne einen Teleport auszulösen.
[20:06:43] Cherry: Funktion 70: MoveCamera
Param1: X-Offset
Param2: Y-Offset
Param3: Geschwindigkeit
Bewegt die Kamera. Der Offset wird in PIXELN angegeben, nicht Tiles! Die Geschwindkeit wird wieder in Vielfachen von 3,75 Pixeln pro Sekunde angegeben.
[20:08:21 | Bearbeitet 20:10:10] Cherry: Funktion 73: GetPicturePalette
Param1: Bild-ID
Param2: Erste Variable des Variablenblocks für die Palette
Liest die Palette eines Bildes aus und speichert sie in 768 Variablen. immer drei Variablen entsprechen einem Paletteneintrag, die Farbwerte sind in der Reihenfolge Blau, Grün, Rot (oder Rot, Grün, Blau, ich bin mir gerade selber nicht sicher).
[20:08:48 | Bearbeitet 20:10:14] Cherry: Funktion 74: SetPicturePalette
Param1: Bild-ID
Param2: Erste Variable des Variablenblocks für die Palette
Gegenstück zu GetPicturePalette
[20:09:37 | Bearbeitet 20:10:19] Cherry: Funktion 75: GetPicturePixel
Param1: Bild-ID
Param2: X
Param3: Y
Liest den Farbindex an der Stelle (X, Y) des Bildes aus und speichert ihn in Param4.
[20:09:58 | Bearbeitet 20:10:22] Cherry: Funktion 76: SetPicturePixel
Param1: Bild-ID
Param2: X
Param3: Y
Param4: Farbindex
Gegenstück zu GetPicturePixel
[20:10:46 | Bearbeitet 20:11:16] Cherry: Funktion 77: FillPictureRect
Param1: Bild-ID
Param2: Links
Param3: Oben
Param4: Rechts
Param5: Unten
Param6: Farbindex
Füllt ein Rechteck in einem Bild mit einer Farbe aus. Rechts und Unten sind exklusiv.
[20:11:29] MajinSonic: Boah... das ist ja eine Menge... :D
Nur vieles dient der Überprüfung einiger sachen, oder?
Weil wie vorhin schon erwähnt glaube ich kaum, dass man alles brauchen wird :D *gg*
[20:11:39] Cherry: nein... alles nützlich.
[20:12:11] MajinSonic: Stimmt irgendwo ja....^^
Ich finde es schon beeindruckend, was du da raus holst :D
[20:12:45] MajinSonic: Nun funktionieren auch bildkollisionen, wenn ich das richtig sehe...
[20:14:45] Cherry: Funktion 78: CopyPictureRect
Param1: Quelle Bild-ID
Param2: Quelle Links
Param3: Quelle Oben
Param4: Quelle Rechts
Param5: Quelle Unten
Param6: Ziel Bild-ID
Param7: Ziel Links
Param8: Ziel Oben
Param9: Transparentes Farbindex
Kopiert ein Rechteck von einem Bild in ein anderes. Der angegeben transparente Farbindex wird dabei berücksichtigt. Ist er -1, wird keine Farbe transparent behandelt. Zu beachten ist, dass die Bilder dieselbe Palette haben sollten, sonst sehen die Farben natürlich strange aus
[20:15:24] Cherry: Funktion 79: DrawPictureLine
Param1: Bild-ID
Param2: Anfangspunkt X
Param3: Anfangspunkt Y
Param4: Endpunkt X
Param5: Endpunkt Y
Param6: Farbindex
Zeichnet eine Linie in ein Bild.
[20:15:47] Cherry: Funktion 80: GetPictureDimensions
Param1: Bild-ID
Fragt die Größe eines Bildes ab und speichert sie in Param2 (Breite) und Param3 (Höhe).
[20:16:15] Cherry: Funktion 81: IsMessageWaiting
Wenn die Messagebox gerade auf Enter wartet (der Pfeil nach unten blinkt), wird Param1 = 1 gesetzt, ansonsten 0.
[20:16:16] Cherry: so.
[20:16:29] Cherry: jetzt zu den Fenstermanipulationen.
[20:17:13] Cherry: da kommt jetzt der Teil, der dir was bringt, nämlich dass du eigene (auch Rahmenlose - also man sieht nur den Text) Fenster erzeugen kannst und mit der Systemfont Texte draufschreiben.
[20:18:42] Cherry: Du kannst 895 eigene Fenster erzeugen.
[20:19:15] Cherry: ein Fenster ist sowas wie die Messagebox: Rahmen, Hintergrund, Text drauf, bei Bedarf Auswahlrechteck.
[20:19:23] Cherry: wobei Rahmen und Hintergrund auch weggelassen werden können
[20:19:52] Cherry: Das Custom Window Nummer 0 hat eine Sonderposition, das ist nämlich die Messagebox!
[20:20:06] Cherry: Custom Windows funktionieren so:
[20:20:16] Cherry: du hast einen Block an Variablen, wo du die Eigenschaften des Fensters hineinschreibst.
[20:20:40] Cherry: angenommen, der Variablenblock beginne bei 2001.
[20:20:43] Cherry: dann wäre das so:
[20:21:52] Cherry: 2001 => X-Position
2002 => Y-Position
2003 => Breite
2004 => Höhe
2005 => Event-ID des Events an dem das Fenster angeheftet sein soll
ab 2006 => Texte
[20:22:02] Cherry: die Position ist von der Mitte des Fensters aus gerechnet, wie bei Bildern.
[20:22:36] Cherry: Ist die Event-ID 0, wird die Position durch die Positionsvariablen angegeben.
[20:24:05] Cherry: Gibst du da eine Event-ID an, dann folgt das Fenster dem Event. Und zwar wenn die ID mit positiven Vorzeichen ist (z.B. 12), liegt die Mitte des Fensters genau auf den Screen-X/Y-Koordinaten des Events (das unten in der Mitte des Events). Gibst du der ID ein negatives Vorzeichen (z.B. -12), dann wird die Box über dem Kopf des Events dargestellt. Würde sie dadurch nicht mehr auf den Bildschirm passen, wird sie stattdessen unter dem Event dargestellt.
[20:24:32] Cherry: Texte funktionieren so:
[20:25:22] Cherry: Jeder Text wird durch einen Block aus 7 Variablen angegeben.
[20:25:27] Cherry: in unserem vorigen Beispiel wäre das:
[20:25:48] Cherry: 2006-2012: erster Text
2013-2019: zweiter Text
2020-2026: dritter Text
...
[20:25:51] Cherry: am Ende muss eine Variable mit Wert 0 stehen.
[20:26:07] Cherry: jeder Text ist nun so aufgebaut (hier z.B. ab Variable 2006 gerechnet):
[20:29:49 | Bearbeitet 20:45:20] Cherry: 2006 => Stringtyp [siehe Erklärung oben]
2007 => String-ID [siehe Erklärung oben]
2008 => ID der Variable für Wert 1 beim Evaluieren des Strings, sofern verwendet [siehe EvalHeroName!]
2009 => ID der Variable für Wert 2 beim Evaluieren des Strings, sofern verwendet [siehe EvalHeroName!]
2010 => Farbe (1 bis 20, wie bei \c[...] bei Messages, statt 0 muss aber 20 geschrieben werden)
2011 => X-Position
2012 => Y-Position
[20:30:26] Cherry: Gibst du der Y-Position ein positives Vorzeichen, beziehen sich die Koordinaten sich auf die linke obere Ecke des Textes. Gibst du ihr ein negatives Vorzeichen, beziehen sich auf den oberen MITTLEREN Punkt des Textes.
[20:31:41] MajinSonic: boah...^^ XD
Schreibst du das alles aus dem Kopf?
ich find das total heftig was du mir alles an den kopf wirfst XD
[20:31:44] Cherry: ja
[20:32:27] Cherry: das ganze (inklusive Größenänderung, Eventverfolgen und Texte) funktioniert auch für die messagebox, sie ist Custom Window 0. Der variablenblock für die Messagebox beginnt bei 3901 (hier im Beispiel war es ja 2001).
[20:32:45] Cherry: Dazu jetzt noch etwas interessantes:
[20:33:22] Cherry: Ist Switch 3367 an, passt die Messagebox ihre Größe automatisch an ihren Inhalt an!
[20:34:18] MajinSonic: Das ist praktisch, wenn ich z.B. Items erhalte... im stil von UiD^^ ohne das ich dafür ein Picture machen muss
[20:34:24] Cherry: Ist der Switch aus, wird...
a) wenn Variable 3904 (Höhenangabe) 0 ist, alles normal gemacht
b) wenn Variable 3904 nicht 0 ist, die Positionsangaben aus den Variablen 3901 bis 3905 (im Beispiel oben waren es 2001 bis 2005, klar?) genommen
[20:35:15] Cherry: Ist der Switch an, werden die Variable 3903 und 3904 selber befüllt, und die Position aus Variablen 3901 und 3902, bzw. 3905 bezogen.
[20:35:17] Cherry: Heißt jetzt:
[20:35:44] Cherry: Wenn du z.B. Switch 3367 (Autosize) an machst und in Variable 3905 (Event dem die Box folgen soll) -10001 schreibst, ist die Box immer über dem kopf des Helden.
[20:36:19] Cherry: Switch 3368 bewirkt, dass die Box sich über den Bildschirmrand hinausbewegen kann.
ANMERKUNG:
Es gibt beim Revolution Patch drei Möglichkeiten, die normale Messsagebox zu verwenden.
1) Alles wie gehabt. In diesem Fall sind auch die Faces da wo sie immer sind.
2) Autosize - Größe passt sich an Inhalt an (so wie hier am Screen), Position wird vorgegeben (entweder durch Koordinaten oder durch ein Event). In diesem Fall erscheinen die Faces ganz links bzw. rechts, und zwar über dem Fenster (aber direkt angedockt). Sieht natürlich nur dann wirklich gut aus wenn das Face einen transparenten Hintergrund hat. Text wird dann natürlich nicht eingerückt, auch wenn ein Face links angezeigt wird.
3) Größe und Position wird vorgegeben. In diesem Fall werden die Koordinaten der Facegrafik durch 2 Variablen angegeben (3375 und 3376). Die Einstellung Face links/rechts hat dann keine Auswirkung auf die Position des Faces, sondern nur darauf, ob der Text eingerückt wird oder nicht.
ANMERKUNG ZWEI: Input Number funzt nicht mit Autosize. Da muss man die Größe der Box selber einstellen.
[20:36:26] Cherry: Okay, zurück zu den eigenen Fenstern.
[20:36:43] Cherry: Für Fenster 0 (die normale Messagebox) ist der Variablenblock ja fix: Ab 3901.
[20:36:53] Cherry: Für die anderen gibt es eine Tabelle, die ist ab Variable 3401.
[20:37:23] Cherry: Da kommen immer zwei aufeinanderfolgende Variablen rein, die gelten für ein Fenster.
[20:37:56] Cherry: 3401 => Fenster 1, Anzeigemodus
3402 => Fenster 1, Variablenblock
3403 => Fenster 2, Anzeigemodus
3404 => Fenster 2, Variablenblock
... und so weiter
[20:38:00] Cherry: am Ende muss eine Variable mit Wert 0 sein.
[20:38:40] Cherry: Anzeigemodus setzt du auf 2 (1 und 3 hat mir dir nichts zu tun, da geht es um Fenster im Kampf), den Variablenblock kannst du dir aussuchen.
[20:39:13] Cherry: Angenommen, dein Custom Window 1 soll die Positionsangabe und die Textangaben ab Variable 5001 haben.
[20:39:40] Cherry: dann schreibst du setzt du Var 3401 = 2 (ich sagte ja, immer 2) und Var 3402 = 5001.
[20:39:56] Cherry: Dann gilt für dieses Fenster die Info ab Variable 5001 - im Beispiel oben also statt 2001 dann 5001.
[20:40:39] Cherry: Es gibt jetzt noch folgende Funktionen für die Verwaltung eigener Fenster:
[20:46:39] Cherry: Funktion 21: OpenCustomWindow
Param1: Fenster-ID
Param2: Typ
Öffnet ein Fenster.
Der Typ ist einer der folgenden:
0 = Fenster hat Rahmen und Hintergrund, erscheint sofort
1 = Fenster hat Rahmen und Hintergrund, klappt auf
2 = Fenster hat keinen Rahmen und Hintergrund, erscheint sofort
3 = Fenster hat keinen Rahmen und Hintergrund, klappt auf
[20:47:02] Cherry: Funktion 22: CloseCustomWindow
Param1: Fenster-ID
Schließt ein Fenster.
[20:47:49] MajinSonic: boah...eine menge...
Ich kopiere mir alles in eine textdatei..
Es wird dauern, bis ich mich da durchgefressen habe
[20:48:01] Cherry: Funktion 23: ClearCustomWindow
Param1: Fenster-ID
Löscht den Inhalt eines Fensters. Dies ist nur notwendig, wenn eine Auswahl angezeigt wird und man den Text ändern will, ohne Auswahl wird Text bei Änderung sofort aktualisiert.
[20:48:23] Cherry: Funktion 24: IsCustomWindowOpen
Param1: Fenster-ID
Setzt Param2 auf 1 (Fenster offen) oder 0 (Fenster zu)
[20:48:56 | Bearbeitet 20:49:05] Cherry: Funktion 25: HasCustomWindowOpeningFinished
Param1: Fenster-ID
Sinnvoll, wenn man Fenster aufklappen lässt. Setzt Param2 auf 1 (Fenster fertig offen) oder 0 (Fenster noch im Aufklappen).
[20:49:40 | Bearbeitet 20:49:55] Cherry: (moment)
[20:49:46] Cherry: (moment)
[20:51:59 | Bearbeitet 20:52:20] Cherry: Funktion 26: SetCustomWindowMode
Param1: Fenster-ID
Param2: Modus
Ändert den Modus eines (offenen) Fensters.
Modus kann sein:
0 = statisch. Einfach nur da.
1 = wartet auf Enter - zeigt den blinkenden Pfeil an
2 = aktive Auswahl - hat ein blinkendes Auswahlrechteck, sollte auch auf auf/ab reagieren
3 = inaktive Auswahl - hat ein nicht blinkendes Auswahlrechteck, reagiert nicht auf auf/ab
4 = doppelte Höhe - wie 0, allerdings wird alles vertikal auf 2x vergrößert
[20:54:14] Cherry: Funktion 27: SetCustomWindowBackgroundTransparency
Param1: Fenster-ID
Param2: Hintergrund sichtbar (0) oder unsichtbar (1)
Ändert, ob das Fenster einen sichtbaren Hintergrund hat. Öffnet man zuerst ein Fenster ohne Rahmen und Hintergrund und ändert den Hintergrund dann auf sichtbar, kriegt man ein Fenster ohne Rahmen aber mit Hintergrund.
[20:54:55] Cherry: Funktion 28: SetCustomWindowChoiceCount
Param1: Fenster-ID
Param2: Anzahl Auswahlmöglichkeiten
Ändert die Anzahl an Auswahlmöglichkeiten
[20:55:39] Cherry: Funktion 29: SetCustomWindowChoicesColumns
Param1: Fenster-ID
Param2: Anzahl Auswahlspalten
Ändert die Anzahl an Auswahlspalten (das Skillfenster hat z.B. normal 2, ein normales Show Choice hat 1)
[20:56:43] Cherry: Funktion 30: SetCustomWindowChoicesPerPage
Param1: Fenster-ID
Param2: Anzahl Auswahlmöglichkeiten, die in das Fenster passen
Stellt man da weniger ein, als das Fenster überhaupt Auswahlmöglichkeiten hat, bekommt man scrollpfeile und das Fenster scrollt wenn man sich weiter runterbewegt.
[20:57:37] Cherry: Funktion 31: SetCustomWindowSelPos
Param1: Fenster-ID
Param2: X-Offset
Param3: Y-Offset
Ändert die Position des Auswahlrechtecks relativ zur normalen
[20:57:57] Cherry: Funktion 32: SetCustomWindowSelSize
Param1: Fenster-ID
Param2: Breite
Param3: Höhe
Ändert die Größe des Auswahlrechtecks
[20:58:26 | Bearbeitet 20:58:40] Cherry: Funktion 33: SetCustomWindowChoiceDefault
Param1: Fenster-ID
Param2: Standardwert
Legt fest, welchen Wert die Auswahl zurückliefern soll, wenn man ESC drückt (0 bedeutet, ESC wird ignoriert)
[20:59:27] Cherry: Funktion 34: SetCustomWindowChoiceResultVar
Param1: Fenster-ID
Param2: Variablen-ID der Variable, in die das Auswahlergebnis geschrieben werden soll
Drückt man ENTER, wird in die angegebene Variable die aktuelle Auswahlnummer geschrieben (bei ESC der Standardwert)
[20:59:59] Cherry: Funktion 35: GetCustomWindowChoice
Param1: Fenster-ID
Schreibt in Param2 die aktuelle Auswahl im Fenster (beginnend bei 1 für die erste Auswahlmöglichkeit)
[21:00:31] Cherry: Funktion 36: GetCustomWindowScrollPos
Param1: Fenster-ID
Schreibt in Param2, wie weit das Fenster nach unten gescrollt hat (wenn man mehr Auswahlmöglichkeiten als Platz hat)
[21:00:48] Cherry: Funktion 37: SetCustomWindowChoice
Param1: Fenster-ID
Param2: Auswahl
Setzt die aktuelle Auswahl
[21:01:15] Cherry: ok, das wars. Das ist alles, was der Revolution Patch kann - bis auf die Funktionen im Kampf und Menü, die hab ich dir verschwiegen, weil du sie sicher nicht brauchst.
[21:01:19] Cherry: Vielleicht eines noch:
[21:01:45] Cherry: wenn du die Messagebox auf Autosize hast ODER eine eigene Größe eingestellt hast, kannst du die überlangen Messageboxes und Choices verwenden.
[21:02:00] Cherry: dazu einfach die revmsgedit.exe starten, die Message eintippen, save to clipboard, und im Event einfügen.
[21:02:15] Cherry: wenn du eine bestehende Message ändern willst, kopierst du sie und dann load from clipboard im Message Editor.
[21:02:31] Cherry: für Choices funktioniert es genauso, dabei wird das, was in den einzelnen Choice-Abschnitten an Code drinnensteht, erhalten.
[21:02:45] Cherry: Dass der Maker für die 5. Zeile immer "Cancel" hinschreibt, ist egal. Angezeigt wird es richtig.
[21:03:01] Cherry: Der Wert, den du im Message Editor bei "Default" einstellst, ist die Zeile, die aktiviert wird, wenn man ESC drückt.
[21:03:05] Cherry: Gibst du da 0 ein, wird ESC ignoriert.
[21:03:17] Cherry: Willst du einen eigenen Bereich für ESC, gib eine Zeile ein, die es nicht gibt.
[21:03:18] Cherry: SO.
[21:03:19] Cherry: PUH.
[21:03:22] Cherry: Das war anstrengend!
[21:03:23] Cherry: :D
[21:04:06] Cherry: Ah, eines nur noch: Verwende die Variablen 3361 bis 4100 und die Switches 3371 bis 3400 nicht für was anderes.
[21:06:12] HAB ICH JETZT ECHT 3 STUNDEN GETIPPT?!
[21:06:19] Cherry: WAH.
...