Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 20 von 21

Thema: RPG Maker Vx Ace: Yanfly Combat Log editieren?

  1. #1

    RPG Maker Vx Ace: Yanfly Combat Log editieren?

    Tach Community. Ich will gern Yanflys Combat Log in meinem Projekt verwenden.

    das hier: https://yanflychannel.wordpress.com/...t-log-display/

    Jetzt hat das Skript jedoch zwei kleine "Kinderkrankheiten". Ich brauch jemand, der mir hilft, das nach meinen wünschen anzupassen. Also folgendes:

    1.) Das Skript loggt wirklich jeden Spielzug mit. Bei 20+ Spielzügen geht das ganz schön an die Performance und allein der Aufruf des Logs dauert sehr lange, weil alle Spielzüge von 1 bis X mitgeloggt werden. Vielleicht wäre es eine Lösung, nur die letzten 10 Logs anzuzeigen.

    2.) Wenn man den Log aufruft, muss man jede einzelne Zeile runtergehen. Man drückt also ganz schön oft die Pfeiltaste runter, bis man mal alles durchgesehen hat. Wäre es hier vielleicht möglich eine Scrollfunktion einzubauen, sodaß man einfach bequem runterscrollen kann per Tastendruck wie man es eben auch im Browserfenster macht?

    Das wärs.

    Hoffentlich kann jemand helfen.

    Danach lass ich euch auch mal für eine Weile in Ruhe :3

    Ken der Combatkot

    Geändert von Ken der Kot (05.09.2018 um 19:02 Uhr)

  2. #2
    Keiner da, der mir diesbezüglich etwas Support gewährleisten würde?

  3. #3
    Bump!

  4. #4
    Bump!

  5. #5
    Wenn dir bisher niemand eine Antwort gegeben hat, dann bringt es auch nicht viel, den Thread nach oben zu bumpen - mal davon abgesehen, dass das hier nicht gern gesehen wird. Ein Bump ist okay, wenn der Thread droht, auf der zweiten Seite zu verschwinden und das Problem dann noch nicht gelöst ist.

  6. #6
    Ok, um mal Input zu liefern: Was ich selbst versucht habe:

    Folgende Stelle

    Code:
    #--------------------------------------------------------------------------
      # item_max
      #--------------------------------------------------------------------------
      def item_max; return @data.size; end
    ändern zu
    Code:
    #--------------------------------------------------------------------------
      # item_max
      #--------------------------------------------------------------------------
      def item_max; return 10; end
    was aber nicht klappt, denn dann zeigt das Log gar keinen Text mehr an.

    Blöderweise war das das naheliegendste und alle weiteren Operationen führen dazu, daß mir das Ding crasht wie ein Flugzeug bei einer Bruchlandung.

    Kann es sein, daß das Skript gar keine Methode zur Einstellung des Limits hat? Ich dachte eig, daß das durch "Item_max" definiert ist. Kann sich aber auch auf eingesetzte Items im Kampf beziehen. Jetzt bin ich nicht sicher, ob ich an der Methode überhaupt rumoperieren soll oder ob mir das alles kaputt macht.

    Naja, wer helfen will -> Hut ab!

    Ich mach hier solange mal selber Trial und Error.

    Ken der planlose Kot

  7. #7
    Nur letzte 10 Logs anzeigen müsste trivial sein, die andere Aufgabe ziemlich kompliziert, da es von Window_Selectable abhängt, was das generische Auswahlfenster ist.

    Man könnte z.B. alles außer den letzten 10 Logs wegwerfen... Wenn man den Code für durchgeht, erreicht man diese Zeile her: https://github.com/Archeia/YEARepo/b...isplay.rb#L327

    Da könnte man z.B. mit einem Slice die letzten 10 Elemente nehmen, also in Zeile 328 schreiben:

    Code:
    @data = @data.last(10)
    Aber kein Plan ob das Steinzeit-Ruby 1.9 schon die last-Methode hat, Stand der Technik ist Ruby 2.4


    Und dein Code der es einfach auf 10 hardcoded kann nicht gehen, weil du dann für die Fälle wenn nur 0-9 Elemente drin sind außerhalb der Array-Grenzen indizierst -> CRASH

    Geändert von Ghabry (03.09.2018 um 16:08 Uhr)

  8. #8
    Danke, Ghabry. Es passiert was, allerdings nicht das, was ich will. Nämlich: Es zeigt dann nur die letzten 10 Zeilen des Logs an und nicht die letzten 10 Logs (also die Logs der einzelnen Turns 1 bis 10) als Gesamtpaket. Aber ich glaub wir sind nah an der Lösung des Problems.

    Geändert von Ken der Kot (03.09.2018 um 16:16 Uhr)

  9. #9
    Zu Punkt 2: Ich kann mich auch irren, aber hat Window_Selectable nicht von Haus aus Scrollsupport? Probier mal "L" und "R" (Sollte Bild ↑ und Bild ↓ bei der Standard-Tastaturbelegung sein). Stimme dir aber zu, so wie es jetzt ist, ist es aber wohl ziemlich hässlich zu bedienen ist, verstehe auch nicht, warum das Ding überhaupt mit einem Window_Selectable realisiert wurde.

    Edit: Okay, hat es wohl nicht und scheint sowieso nicht so zu funktionieren wie ich dachte sondern einfach "seitenweise" zu springen...

    Zitat Zitat von Ghabry Beitrag anzeigen
    Aber kein Plan ob das Steinzeit-Ruby 1.9 schon die last-Methode hat, Stand der Technik ist Ruby 2.4
    Die hatte selbst Ruby 1.8 schon

    Geändert von Cepanks (03.09.2018 um 16:41 Uhr)

  10. #10
    Oh, hab nicht richtig gelesen, diese subtile Änderung macht es direkt viel komplizierter, weil dies eindeutig nicht vorgesehen ist.

    z.B. könnte man ein neues Array einführen und dann in "turn_end" jeweils zählen, wie viele neue Zeilen pro Zug hinzugekommen sind und wenn das neue Array die Größe 11 erreicht, werden so viele Zeilen gelöscht, wie im ersten Arrayindex stehen, dann den ersten Arrayindex löschen, dadurch wirds beim nächsten "turn_end" mal wieder Größe 11 usw.

  11. #11
    Ich will halt einfach nicht, daß der Log erstmal 10 oder mehr Sekunden laden muss, wenn man ihn aufruft. Das kann passieren, wenn der Kampf schon weit fortgeschritten ist (20 oder mehr "Spielzüge"), daher dachte ich, daß es eine gute Idee wäre, die letzten Logs auf 10 zu begrenzen, damit es nicht so lange dauert, den Log aufzurufen. Ist ja echt blöd so.

  12. #12
    Zitat Zitat von Ghabry Beitrag anzeigen
    Und dein Code der es einfach auf 10 hardcoded kann nicht gehen, weil du dann für die Fälle wenn nur 0-9 Elemente drin sind außerhalb der Array-Grenzen indizierst -> CRASH
    Du kannst in Ruby auch auf nicht indizierte Werte zu greifen. Es wird einfach "nil" ausgewiesen.
    a = [1,2,3]
    p(a[4]) => nil

    @topic: ich hatte leider keine Zeit dort reinzuschauen, und nach dem der thread innerhalb - mal wieder - von weniger als 24 stunden (am wochenende) bereits gebumpt wurde, auch ehrlich gesagt 0,0 Motivation

  13. #13
    Zitat Zitat von Linkey Beitrag anzeigen
    @topic: ich hatte leider keine Zeit dort reinzuschauen, und nach dem der thread innerhalb - mal wieder - von weniger als 24 stunden (am wochenende) bereits gebumpt wurde, auch ehrlich gesagt 0,0 Motivation
    Hmmm

  14. #14
    Das in ein neues Script unter dem Original kopieren. TURNS_MAX bestimmt, wie viele Runden angezeigt werden.

    Code:
    class Window_CombatLog < Window_Selectable
      TURNS_MAX = 10
      #--------------------------------------------------------------------------
      # initialize
      #--------------------------------------------------------------------------
      def initialize
        @data = []
        @turn_data = Array.new(TURNS_MAX) { [] }
        super(0, 0, Graphics.width, Graphics.height-120)
        deactivate
        hide
      end
      
      #--------------------------------------------------------------------------
      # add_line
      #--------------------------------------------------------------------------
      def add_line(text)
        return if text == "-" && current_turn.last == "-"
        current_turn.push(text)
      end
      
      #--------------------------------------------------------------------------
      # item_max
      #--------------------------------------------------------------------------
      def item_max
        @turn_data.inject(0) { |sum, i| sum += i.size }
      end
      
      def data
        @turn_data.inject(:+)
      end
      
      #--------------------------------------------------------------------------
      # draw_item
      #--------------------------------------------------------------------------
      def draw_item(index)
        text = data[index]
        return if text.nil?
        rect = item_rect_for_text(index)
        if text == "-"
          draw_horz_line(rect.y)
        else
          draw_text_ex(rect.x, rect.y, text)
        end
      end
      
      def start_turn
        @turn_data.rotate!
        current_turn.clear
      end
      
      def current_turn
        @turn_data.last
      end
    end
    
    class Scene_Battle < Scene_Base
      #--------------------------------------------------------------------------
      # alias method: turn_start
      #--------------------------------------------------------------------------
      alias scene_battle_turn_start_cld turn_start
      def turn_start
        scene_battle_turn_start_cld
        @combatlog_window.start_turn
        @combatlog_window.add_line("-")
        text = sprintf(YEA::COMBAT_LOG::TEXT_TURN_NUMBER, $game_troop.turn_count)
        @combatlog_window.add_line(text)
        @combatlog_window.add_line("-")
      end
    end
    Mangels installiertem Maker wie immer ungetestet :3

  15. #15
    Vielen Dank, Cepanks. Habs getestet, aber das wirft mir ein "stacklevel too deep" entgegen. Woran könnte das liegen?

  16. #16
    Ist das die ganze Meldung? Schreibt er keine Zeilennummer dazu, wo der Fehler auftritt?

    Liegt aber vermutlich am doppelten alias. Enferne mal die Zeile alias scene_battle_turn_start_cld turn_start in meinem Script und schau ob es dann läuft.

  17. #17
    Ja, nun klappts danke

    Kam keine Fehlermeldung außer das was ich geschrieben hab

  18. #18
    Vielleicht kriegen wir das mit der Scrollfunktion auch hin? Oder wäre das zu schwer? Frage nur aus Intresse. Das wäre wirklich weltklasse.

  19. #19
    Gabs schon Ideen, wie man die Scrollfunktion evtl implementieren könnte? Will ja nicht bumpen, aber das wäre schon auch noch wichtig und ich wäre super dankbar.

  20. #20
    Zitat Zitat
    Will ja nicht bumpen, aber [...]
    Na wenn du es nicht willst, warum tust du es dann? Wenn es hier auf deine Frage noch keine Antwort gibt, hat das sicher seinen Grund. Dein letzter Post ist auch gerade einmal 2 Tage alt. Bitte versuch dich ein wenig zu gedulden und nicht unnötig die Threads mit so vielen inhaltslosen ein bis zweizeilern voll zu spammen, du bekommst sicher später noch eine Antwort.

    Danke!

Berechtigungen

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