じ☆ve冰风 发表于 2026-8-2 16:04:21

Scrolling Battle Log

This script makes the messages in the battle log scroll upwards instead of the default show and pop.

It's plug and play with additional settings and free to use for both non-commercial and commercial games, but please give credit to me if you do
data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7

Spoiler: Script v1.4                Code:       
#==============================================================================
# Scrolling Battle Log v1.4
# by R_Valkyrie
#------------------------------------------------------------------------------
# Plug-n-Play.
# Free to use for non-commercial and commercial, just give credit to me.
#==============================================================================

#------------------------------------------------------------------------------
# Settings
#------------------------------------------------------------------------------

module SCROLLING_BATTLE_LOG

LOG_X = 0

LOG_Y = 0

LOG_WIDTH = 544

LOG_HEIGHT = 6   #How many lines the log will show during battle
                     #and also the fitting height for the window.
                  
LOG_OPACITY = 60   #Opacity for the backlines.

LOG_SPEED = 60   #How long the log will wait between every message.

SCROLL_SPEED = 3   #How fast the log will scroll. Set to 0 for instant scroll.

TEXT_FONT = ""   #Type the font name within the "" if you want to use
                     #a different font for your log or leave it blank if not.
                  
TEXT_SIZE = 0      #Type the size of the font. Set to 0 for default font size.
                  
TEXT_ALIGNMENT = 0 #Alignment for the displayed text.
                     # 0 = right, 1 = center, 2 = left.
                  
TEXT_BOLD = false#Set to true if you want a bold font.

USE_WINDOW = false #Set to true if you want to show a window
                     #instead of the lines.

end

#------------------------------------------------------------------------------
# Don't edit anything below this line unless you know what you're doing.
#------------------------------------------------------------------------------

class Window_BattleLog < Window_Selectable
include SCROLLING_BATTLE_LOG
def initialize
    super(LOG_X, LOG_Y, LOG_WIDTH, window_height)
    self.z = 200
    self.opacity = 0
    self.arrows_visible = false
    self.contents.font.name = TEXT_FONT unless TEXT_FONT == ""
    self.contents.font.size = TEXT_SIZE unless TEXT_SIZE == 0
    self.contents.font.bold = TEXT_BOLD
    @lines = []
    @num_wait = 0
    create_back_bitmap
    create_back_sprite
    refresh
end
def max_line_number
    return 500
end
def line_height
    lh = (TEXT_SIZE == 0 ? Font.default_size : TEXT_SIZE) + 2
    return lh
end
def clear
    self.oy = 0
    @lines.clear
    refresh
end
def back_one
    #
end
def add_text(text)
    if @lines.size > (LOG_HEIGHT - 1)
      distance = line_height
      speed = SCROLL_SPEED == 0 ? line_height : SCROLL_SPEED
      until distance == 0 do
      self.oy += distance < speed ? distance : speed
      distance -= distance < speed ? distance : speed
      Graphics.update
      end
    end
    @lines.push(text)
    refresh
end
def refresh
    draw_background if @lines.size < (LOG_HEIGHT + 1)
    contents.clear
    @lines.size.times {|i| draw_line(i) }
end
def back_opacity
    USE_WINDOW ? 0 : LOG_OPACITY
end
def draw_line(line_number)
    rect = item_rect_for_text(line_number)
    contents.clear_rect(rect)
    text_width = LOG_WIDTH - (standard_padding * 2)
    ta = TEXT_ALIGNMENT
    wx = ta == 2 ? -2 : rect.x
    draw_text(wx, rect.y, text_width, line_height, @lines, ta)
end
def message_speed
    return LOG_SPEED
end
def wait_and_clear
    #
end
def display_current_state(subject)
    unless subject.most_important_state_text.empty?
      add_text(subject.name + subject.most_important_state_text)
      wait
    end
end
def display_action_results(target, item)
    if target.result.used
      display_critical(target, item)
      display_damage(target, item)
      display_affected_status(target, item)
      display_failure(target, item)
    end
end
def display_affected_status(target, item)
    if target.result.status_affected?
      display_changed_states(target)
      display_changed_buffs(target)
    end
end
def display_auto_affected_status(target)
    if target.result.status_affected?
      display_affected_status(target, nil)
    end
end
def display_added_states(target)
    target.result.added_state_objects.each do |state|
      state_msg = target.actor? ? state.message1 : state.message2
      target.perform_collapse_effect if state.id == target.death_state_id
      next if state_msg.empty?
      add_text(target.name + state_msg)
      wait
      wait_for_effect
    end
end
def display_removed_states(target)
    target.result.removed_state_objects.each do |state|
      next if state.message4.empty?
      add_text(target.name + state.message4)
      wait
    end
end
def display_buffs(target, buffs, fmt)
    buffs.each do |param_id|
      add_text(sprintf(fmt, target.name, Vocab::param(param_id)))
      wait
    end
end
end

class Window_DummyLog < Window_BattleLog
def max_line_number
    return LOG_HEIGHT
end
def add_text(text)
    #
end
end

class Scene_Battle < Scene_Base
include SCROLLING_BATTLE_LOG
alias update_message_open_and_clear_log update_message_open
def update_message_open
    if $game_message.busy?
      @log_window.clear
      @log_window.close
      @dummy_window.close
    end
    update_message_open_and_clear_log
end
alias create_all_windows_with_dummy create_all_windows
def create_all_windows
    create_dummy_window
    create_all_windows_with_dummy
end
def create_dummy_window
    @dummy_window = Window_DummyLog.new
    @dummy_window.z = 199
    @dummy_window.openness = 0
    @dummy_window.opacity = 255
end
alias turn_start_with_dummy turn_start
def turn_start
    @log_window.open
    @dummy_window.open if USE_WINDOW == true
    turn_start_with_dummy
end
def turn_end
    all_battle_members.each do |battler|
      battler.on_turn_end
      refresh_status
      @log_window.display_auto_affected_status(battler)
    end
    @log_window.clear
    @dummy_window.close
    BattleManager.turn_end
    process_event
    start_party_command_selection
end
def process_action
    return if scene_changing?
    if !@subject || !@subject.current_action
      @subject = BattleManager.next_subject
    end
    return turn_end unless @subject
    if @subject.current_action
      @subject.current_action.prepare
      if @subject.current_action.valid?
      @status_window.open
      @log_window.open
      @dummy_window.open if USE_WINDOW == true
      execute_action
      end
      @subject.remove_current_action
    end
    process_action_end unless @subject.current_action
end
end




本贴来自国际rpgmaker官方论坛作者:R_Valkyrie处,因国际论坛即将永久关站,为了存档多年珍贵资料,署名转载到本论坛存档,由于官方帖子为英文原帖,需要中文翻译请点击论坛顶部切换语言为中文就可以将帖子翻译成中文浏览,方便大家随时查看,原文地址:https://forums.rpgmakerweb.com/threads/scrolling-battle-log.93999/
页: [1]
查看完整版本: Scrolling Battle Log