Ergebnis 1 bis 7 von 7

Thema: (RGSS1) Mordechajs Scripting-Fragen

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Ich danke euch beiden sehr, es klappt einwandfrei!

  2. #2
    So. Ich habe mal wieder ein Anliegen, und zwar diesmal ein wahrscheinlich ungleich schwierigeres als zuvor.

    Ich möchte gern, und zwar je nach Event entschieden, Folgen von Show-Message-Befehlen so einrichten, dass der Spieler dabei immer noch Kontrolle über den Char hat, und die Message abbrechen kann, indem er sich zu weit vom Event wegbewegt. (A la Chrono Trigger, sagt man mir.)

    Zum Beispiel also: Der Spieler quatscht irgendnen NPC an, weil ... das macht man halt so. Und der fängt jetzt an seine Lebensgeschichte von der Wiege bis in den Sarg zu erzählen, und den Spieler nervt das. Traditionell muss er jetzt aber Message Box für Message Box einzeln nacheinander wegdrücken und läuft dabei Gefahr, den NPC am Ende nochmal zu aktivieren, der dann wieder seine ganze Lebensgeschichte erzählt. Stattdessen soll der Spieler sich frei bewegen können und einfach ein paar Tiles weiterlaufen, um dem Opi nicht mehr zuhören zu müssen.

    Es gibt bereits ein Script, das das kann, nämlich Wachungas Multiple Message Windows in der Version von Heretic86 (Code von v1.56 im Spoiler).


    Das Problem: Das nutze ich nicht, da fehlt mir zu viel und ist zu viel drin, was ich nicht gebrauchen kann. Ich arbeite stattdessen mit Hermes 0.3c (Code als Zip-Datei; sorry, aber der Code überschreitet die maximale Zeichenzahl). Neuere Versionen verursachen bei mir Kompabilitätsprobleme, bzw. sehe ich nicht ein, für den letter-by-letter speed zwei statt einen Buchstaben zu schreiben. ^^"

    Ich habe nun bereits zwei Tools, die hier, wie ich meine, hilfreich sein könnten; das ist einmal der asynchronous-Tag bei Hermes, ein andermal das Script "Event Range Conditions" von ForeverZer0. Damit -- und mit etwas Variablen- und ID-Rumgeschiebe und einem PP-Event -- kriege ich das, was ich will, für genau eine einzige Message hin und auch das nur, wenn ich am Ende der Message einen close-tag anhänge.

    Was mir jetzt also noch fehlt -- oder was insgesamt vielleicht völlig anders umgesetzt werden müsste, auch weil das Variablen-Rumgeschiebe und das PP-Event etwas aufwendig sind -- ist Folgendes:

    Der Spieler kann sich also frei bewegen, während die Message über dem Event (geschwätziger NPC) angezeigt wird, muss aber am Ende der Message mit Enter die Message schließen, bevor die nächste beginnen kann. Er soll sich aber -- um's zusätzlich kompliziert zu machen -- weiterhin bewegen können, während die Message auf den Tastendruck wartet. Und der Spieler soll weiterhin die ganze Zeit einfach weglaufen können und nach z.B. zwei Tiles Entfernung zum Event soll die Message sich automatisch schließen und das Event in seinen Ausgangszustand zurückkehren.



    Hat jemand eine Idee, wie sich das umsetzen ließe? Oder ist das ganz utopisch?
    Ich kann mit MMW einfach nichts anfangen -- außer mit diesem einen sehr essentiellen Element davon.

    Geändert von Mordechaj (09.12.2017 um 18:19 Uhr)

  3. #3
    Also da du ein Custom Script verwendest sinkt die Wahrscheinlichkeit stark, dass dir jemand helfen kann. Und das mit den "Nach 2 Tiles Entfernng schließen schließen" fällt mir spontan keine Funktion ein die das macht. Man muss vermutlich von Scene_Map aus @window_message.terminate aufrufen., aber das mit "2 Tiles entfernung" muss mal jmd. anderes liefern, zu viel Arbeit. Vermutlich Position des Events das die Message anzeigt ermitteln und dann einfach Distanz zwischen dem Event und dem Helden mit einer Metrik deiner Wahl (euklidisch oder Manhattan) berechnen.

    Damit man noch laufen kann wenn eine Message angezeigt wird, würde bei nem Standard-Message-Script folgendes reichen:
    Eventuell klappts auhc bei dem Custom script.

    In Game_Player update ersetze die unless moving? Zeile mit
    Code:
    unless moving? or ($game_system.map_interpreter.running? and not $game_temp.message_window_showing) or
               @move_route_forcing
    Das "whitelisted" den Fall "interpreter läuft UND message window ist sichtbar".

  4. #4
    Erst einmal vielen Dank! Ich kann mir schon denken und kann auf alle Fälle verstehen, dass das die Wahrscheinlichkeit senkt; vor allem, weil man sich ja da erstmal anschauen muss, was dieses Script eigentlich so gut -- was ich übrigens selbst nur in sehr begrenztem Maße verstehe (wie begrenzt, wird sich gleich noch offenbaren ^^").

    Die Entfernung kann ich beispielsweise mit Event-Scriptbefehlen aus ForeverZer0s Script (Code im Spoiler) abfragen.



    Was ich beispielsweise bisher gebastelt habe, sieht so aus:

    Das ActionButton-Event:
    Code:
    # Variable 4 = ID dieses Events
    
    Script: $game_variables[4] = @event_id
    
    # Aktiviere den dazugehörigen Parallel Process
    # (Befehl aus einem Utility Script)
    
    Script: set_self_switch('A','On',3)
    
    # Message Box über diesem Event, asynchronous
    # (die Message wird angezeigt, ohne die Steuerung zu blockieren).
    # Warte nach dem letzten Zeichen eine Sekunde (\|\|) bevor die Box
    # geschlossen wird (\^)
    
    Text: \p[,async]Tenny mucho mucho Deniro in su trucky-trailer?\|\|\^
    Das dazugehörige Parallel Process Event macht Folgendes:
    Code:
    # Prüfe, ob Player noch in der Nähe ist
    # (X-Achse: Distanz zu Event mit gespeicherter ID = 2?)
    # Wenn nicht, zeige neue Message Box.
    # Deaktiviere Parallel Process.
    
    @>Conditional Branch: Script: x_dist?(2, $game_variables[4])
      @>
     :  Else
       @>Text: \p[kill,async]Lauf nicht weg!\|\|\^
       @>Control Self Switch: A =OFF
     :  Branch End
    
    # Prüfe, ob Player noch in der Nähe ist
    # (Y-Achse: Distanz zu Event mit gespeicherter ID = 2?)
    # Wenn nicht, zeige neue Message Box.
    # Deaktiviere Parallel Process.
    
    @>Conditional Branch: Script: y_dist?(2, $game_variables[4])
      @>
     :  Else
       @>Text: \p[kill,async]Lauf nicht weg!\|\|\^
       @>Control Self Switch: A =OFF
     :  Branch End
    Das Argument "kill" im \p-Tag ruft die Event ID aus Variable 4 ab, sodass die neue Message Box den aktuell über dem entsprechenden Event aktuell angezeigten Text abbricht und ersetzt. Wenn ich nur "\p[kill,async]" angebe, liest das Hermes-Script eine leere Message und löscht nur den über dem entsprechenden Event aktuell angezeigten Text.

    Das läuft also im Prinzip genau so, wie ich es möchte (wobei meine Frage trotzdem noch ist, ob man das nicht galanter lösen könnte). Aber mit einer sehr entscheidenden Einschränkung:

    Ich kann so nur eine einzige Message über dem Event ausgeben, weil der \p[,async]-Tag dazu führt, dass das Event automatisch die darauffolgende Nachricht ebenfalls ausliest, die dann automatisch ihren Vorgänger löscht. Außerdem muss ich die Messages so automatisch enden lassen, der Spieler kann die Message-Box also nicht durch Enter-Tastendruck schließen. Wenn es also bei dieser Lösung bleiben würde -- was nicht schlimm wär --, bräuchte ich die Möglichkeit, in einer async-Message am Ende einen Tastendruck zu verlangen, mit dem dann erst die nächste Message aufgerufen wird.

    Zitat Zitat von Ghabry Beitrag anzeigen
    Damit man noch laufen kann wenn eine Message angezeigt wird, würde bei nem Standard-Message-Script folgendes reichen:
    Eventuell klappts auhc bei dem Custom script.

    In Game_Player update ersetze die unless moving? Zeile mit
    Code:
    unless moving? or ($game_system.map_interpreter.running? and not $game_temp.message_window_showing) or
               @move_route_forcing
    Das "whitelisted" den Fall "interpreter läuft UND message window ist sichtbar".
    Das bedeutet also, ich würde für prinzipiell jede Message sagen, dass sie die Steuerung nicht blockieren soll? Kann ich das auch situativ, also bspw. mit einem Script-Befehl im Event machen?
    Und: Der Effekt wäre dann, dass der Player noch bewegt werden kann; wie ist das mit dem Enter-Drücken am Ende der Nachricht? Könnte ich, als Spieler, rumlaufen und gleichzeitig durch Enterdrücken die Message Box schließen? Ich werde es bei Gelegenheit einfach mal ausprobieren, aber ich erwarte fast, dass das wie immer wird: Ich mach irgendwas kaputt und brauche Stunden, um herauszufinden, wie ich's wieder baue, sodass ich dann erst überhaupt testen kann.

    Du merkst vielleicht, mein Scripting-Wissen ist massiv eingeschränkt; ich bin schon geschmeichelt, dass du mir zutraust zu wissen, was der Unterschied zwischen euklidisch und Manhattan ist. ^^"
    Vor allem auch deshalb schonmal und nochmal: Vielen Dank!

    Geändert von Mordechaj (09.12.2017 um 18:18 Uhr)

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •