Hallo allerseits!
Da ich seit Ewigkeiten nicht mehr wirklich gemakert habe und mich eben aber doch die Lust überfiel, mal wieder rumzuspielen, habe ich mich mal an einem Rennscript versucht.
(Mindest-)Anforderungen dabei waren:

  • Der Charakter soll beim Rennen ein anderes Charset verwenden
  • Der Charakter soll wenn er steht wieder zum normale Charset wechseln
  • Nicht passierbare Tiles und Events lassen ihn ebenfalls zurückwechseln
  • Es soll "sumpfige" Tiles geben, in denen ein Char zwar gehen, aber nicht rennen kann
  • Das Ganze soll mit der SHIFT-Taste funktionieren, da ich für ENTER noch andere Ideen habe


Das habe ich soweit auch alles umgesetzt bekommen, wüsste jetzt aber - rein aus Neugier/perfektionismus - ob es eventuell effizientere Wege gibt als meinen:

Zitat Zitat von EasyEventExporter
- SCRIPT -
<> Change Variable: [22-27] = 0
<> Change Variable: [28] = 1
<> Comment: __________________________________________________
<> Comment:
<> Comment: SHIFT gedrückt?
<> Comment: __________________________________________________
<> Comment:
<> Key Input Processing: Var. [22], Keys: Shift
<> Fork Condition: If Variable [22] == 7 then ...
. <> Comment: __________________________________________________
. <> Comment:
. <> Comment: Richtungstaste gedrückt?
. <> Comment: __________________________________________________
. <> Comment:
. <> Key Input Processing: Var. [23], Keys: Down, Left, Right, Up
. <> Fork Condition: If Variable [23] > 0 then ...
. . <> Fork Condition: If Variable [23] <= 4 then ...
. . . <> Comment: __________________________________________________
. . . <> Comment:
. . . <> Comment: Nächstes Tile?
. . . <> Comment: __________________________________________________
. . . <> Comment:
. . . <> Change Variable: [24] = X position on map (tiles) of hero
. . . <> Change Variable: [25] = Y position on map (tiles) of hero
. . . <> Fork Condition: If Variable [23] == 1 then ...
. . . . <> Change Variable: [25] += 1
. . . . <>
. . . : Else ...
. . . . <> Fork Condition: If Variable [23] == 2 then ...
. . . . . <> Change Variable: [24] -= 1
. . . . . <>
. . . . : Else ...
. . . . . <> Fork Condition: If Variable [23] == 3 then ...
. . . . . . <> Change Variable: [24] += 1
. . . . . . <>
. . . . . : Else ...
. . . . . . <> Fork Condition: If Variable [23] == 4 then ...
. . . . . . . <> Change Variable: [25] -= 1
. . . . . . . <>
. . . . . . : End of fork
. . . . . . <>
. . . . . : End of fork
. . . . . <>
. . . . : End of fork
. . . . <>
. . . : End of fork
. . . <> Comment: __________________________________________________
. . . <> Comment:
. . . <> Comment: Blockierendes Event?
. . . <> Comment: __________________________________________________
. . . <> Comment:
. . . <> Get Event ID: (V[24], V[25]), Store in var. [27]
. . . <> Fork Condition: If Variable [27] > 0 then ...
. . . . <> Call Event: Map Event V[27], Page V[28]
. . . . <> Fork Condition: If Variable [27] == 9999 then ...
. . . . . <> Comment: Event ist nicht passierbar
. . . . . <> Jump To Label: 1
. . . . . <>
. . . . : End of fork
. . . . <>
. . . : End of fork
. . . <> Comment: __________________________________________________
. . . <> Comment:
. . . <> Comment: Terrain?
. . . <> Comment: __________________________________________________
. . . <> Comment:
. . . <> Get Terrain ID: (V[24], V[25]), Store in var. [26]
. . . <> Fork Condition: If Variable [26] == 1 then ...
. . . . <> Comment: Passierbar
. . . . <> Change Hero Graphic: Hero #1 -> Rem_new #1
. . . . <> Move Event: Hero, Frq 8, Pattern: Dec spd, Dec spd, Dec spd, Dec spd, Dec spd, Dec spd, Dec spd, Dec spd, Inc spd, Inc spd, Inc spd
. . . . <>
. . . : Else ...
. . . . <> Comment: Geblockt
. . . . <> Jump To Label: 1
. . . . <>
. . . : End of fork
. . . <>
. . : Else ...
. . . <> Jump To Label: 1
. . . <>
. . : End of fork
. . <>
. : Else ...
. . <> Jump To Label: 1
. . <>
. : End of fork
. <>
: Else ...
. <> Jump To Label: 1
. <>
: End of fork
<> Jump To Label: 2
<> Label: 1
<> Change Hero Graphic: Hero #1 -> Rem_new #0
<> Move Event: Hero, Frq 8, Pattern: Dec spd, Dec spd, Dec spd, Dec spd, Dec spd, Dec spd, Dec spd, Dec spd, Inc spd, Inc spd
<> Label: 2

Zunächst wird abgefragt, ob SHIFT gedrückt ist (ohne wait until key is pressed), dann, ob eine Pfeiltaste gedrückt ist (ebenfalls ohne wait until key is pressed). Dann wird geschaut,wo sich der Charakter denn hinbewegt und ob sich dort ein Event befindet. Wenn ja, wird das Event auf Seite 1 gecallt, wenn die ID 9999 zurückkommt, ist es nicht passierbar, d.h. der Charakter wird dagegenstoßen und das Charset muss gewechselt werden. Andernfalls wird das Zeilterrain abgefragt. 1 heißt passierbar (oder genauer gesagt: "Es kann gerannt werden") und das Charset wird gewechselt und die Geschwindigkeit hochgedreht, bei allem anderen sowie im Fall, dass irgendwo vorher eine Abfrage negativ ausfällt, wird der Teil am Ende des Scripts aufgerufen, der Ursprungscharset wiederherstellt und die Geschwindigkeit aufs normale setzt.

Klappt soweit alles wunderbar. Ist ein Tile zwar vom Chipset aus passierbar, vom Script her aber nicht, tritt der Sumpf-Effekt ein und der Char ist gezwungen in normalem Tempo über das Tile zu gehen. Die Sache mit den Events stört mich allerdings etwas, da das voraussetzt, dass alle Events eine entweder leere Seite 1 haben (passierbar) oder die Variable Event ID auf 9999 setzen. Ist jetzt nicht der größte Aufwand, aber lästig auf Dauer. Mir fällt aber auch keine elegantere Lösung, ohne riesige Umwege über extra Map-Events zu machen, die Listen beinhalten, was passierbar ist und was nicht und dann abgeglichen werden müssen.
Theoretisch sollte sich das Ding auch mit recht wenig Aufwand für Fälle erweitern lassen wie ein anderes Charset bei alter Geschwindigkeit oder umgekehrt, da könnte es jedoch aufgrund eines mini-Bugs Probleme geben: Im Falle von sumpfigen Gelände wechselt der Char verfrüht die Charsets. Scheinbar nimmt der Maker bereits an, dass der Char auf dem nächsten Feld ist, auch wenn der Sprite noch hinterherhinkt. Würde etwa bei einem extra Charset fürs durch-Match-waten dazu führen, dass der Char noch ein paar Pixel lang im Boden hängt. Hat jemand dazu eine Idee? ._.