🤔 Para Refletir :
"O poder da criação está em suas mãos, escreva sua própria história e abra as portas para aventuras inesquecíveis."
- Versyoh

RPG Maker XP RMXP - Moveto Message System 1.0

Moveto Masculino

Novato
Membro
Membro
Vou tentar brincar de novo de criar jogos, mas dessa vez é mais sério. Eu cresci.
Juntou-se
07 de Abril de 2026
Postagens
1
Bravecoins
0
Área
Pixel Art
Motor de jogo
RPG Maker XP
E aí pessoal, Moveto falando.
É a primeira vez que faço um script e mando para algum lugar, é algo bem simples, há melhores, mas talvez eu possa ir atualizando esse de alguma maneira né? hehehe.

Descrição Simples
Bem, este é meu sistema de mensagens simples, ele vai mostrando letra por letra e soltando uns blips a cada letra, também é possível mudar o pitch do som selecionado, tem como usar pausas e cores personalizadas (Cores personalizadas você já adiciona no Window_Base).
Os comandos deixarei no inicio do script, para caso alguém se perca no caminho :alien:

Aviso
No meu projeto não houve nenhum erro até agora, mas pode ser que algumas coisas não funcionem do jeito que seja, se houver algum problema, me mandem que tentarei arrumar.

O Que Diabos Tem No Script?
O script conta com os seguintes sistemas (além do que ele normalmente já é):

Mudança de pitch na mensagem; use \p[n] para mudar de pitch (n é o valor do pitch, 100 é o normal)

Mudança do som na letra; use \s[n] para mudar o som (n é o nome do arquivo do som na pasta SE)

Mudança de cores; use \c[n] para mudar a cor (n é o número da cor correspondente de Window_Base)

Pausa do texto por 1 segundo; use \. para pausar por 1 segundo

Mudança de local do botão pause na mensagem; no script, mexa apenas
em PAUSE_ICON_X_OFFSET = 0 ou no Y para mudar o ícone de pause da mensagem

Reset das modificações na mensagem; use \r para a mensagem voltar ao normal.

Condições do Uso
Você pode modificar do jeito que quiser, usar para seus projetos comerciais e públicos (obvio).
Se quiser e puder, dê os devidos créditos, não é obrigado, mas melhora o reconhecimento (y)

Como Usar e Instalar?
Apenas coloque o script acima de Main, de resto, apenas modificações básicas e pessoais.
Ruby:
#==============================================================================
# ** Moveto Message System 1.0 **
# - Esse é um sistema simples de mensagem feito por mim, para um
# projeto pequeno que estou desenvolvendo, futuramente irei atualizar isso
# para uso maior.
#==============================================================================
# ** Como Usar **
# \p[valor do pitch] 100 é normal, 50 é grave e 150 é agudo.
# \s[nome do áudio] o arquivo de áudio deve estar na pasta SE
# \c[número da cor] a cor fica no Window_Base original ou em outro custom
# \. dá uma pequena pausa entre o texto
# \r reseta a caixa de diálogo (tira os efeitos)
#==============================================================================

class Game_System
  attr_accessor :talk_pitch
  attr_accessor :text_speed
end

class Window_Message < Window_Selectable

  TALK_SE_NAME = "Talk" # Coloca o nome só do arquivo do áudio da pasta SE
  TALK_SE_VOL  = 80 # Volume principal do blip de texto

  # Local do ícone de pausa da mensagem
  PAUSE_ICON_X_OFFSET = 220 # Aqui muda horizontalmente
  PAUSE_ICON_Y_OFFSET = 0 # Aqui muda verticalmente

  def initialize
    super(80, 304, 480, 160)
    self.contents = Bitmap.new(width - 32, height - 32)
    self.visible = false
    self.z = 9998

    @fade_in = false
    @fade_out = false
    @contents_showing = false

    @text = ""
    @text_chars = []
    @text_index = 0
    @wait_count = 0

    @x = 0
    @y = 0

    @cursor_width = 0

    $game_system.talk_pitch ||= 100
    $game_system.text_speed ||= 2

    self.active = false
    self.index = -1

    create_pause_sprite
  end

  #--------------------------------------------------------------------------
  def create_pause_sprite
    @pause_sprite = Sprite.new
    @pause_sprite.bitmap = Bitmap.new(16, 16)
    @pause_sprite.z = self.z + 1
    @pause_sprite.visible = false

    @pause_frame = 0
  end

  #--------------------------------------------------------------------------
 def update_pause_sprite
  return if @pause_sprite.nil?

  if @contents_showing && @text_index >= @text_chars.size
    @pause_sprite.visible = true

    base_x = self.x + self.width / 2 - 8
    base_y = self.y + self.height - 16

    @pause_sprite.x = base_x + PAUSE_ICON_X_OFFSET
    @pause_sprite.y = base_y + PAUSE_ICON_Y_OFFSET

    @pause_frame = (@pause_frame + 1) % 40
    frame = @pause_frame / 10

    sx = 160 + (frame % 2) * 16
    sy = 64  + (frame / 2) * 16

    @pause_sprite.bitmap.clear
    @pause_sprite.bitmap.blt(0, 0, self.windowskin, Rect.new(sx, sy, 16, 16))
  else
    @pause_sprite.visible = false
  end
end

  #--------------------------------------------------------------------------
  def terminate_message
    self.active = false
    self.pause = false
    self.index = -1
    self.contents.clear
    self.cursor_rect.empty

    @contents_showing = false
    @pause_sprite.visible = false

    if $game_temp.message_proc != nil
      $game_temp.message_proc.call
    end

    $game_temp.message_text = nil
    $game_temp.message_proc = nil

    $game_temp.choice_start = 99
    $game_temp.choice_max = 0
    $game_temp.choice_proc = nil
  end

  #--------------------------------------------------------------------------
  def start_message
    @text = $game_temp.message_text.clone
    @text.gsub!(/\\\\/) { "\000" }

    @text_chars = @text.split(//)

    self.contents.clear
    self.contents.font.color = normal_color

    @text_index = 0
    @wait_count = 0
    @x = 0
    @y = 0
    @cursor_width = 0

    @contents_showing = true
  end

  #--------------------------------------------------------------------------
  def play_talk_se
    return if TALK_SE_NAME == ""

    pitch = $game_system.talk_pitch || 100
    se = RPG::AudioFile.new(TALK_SE_NAME, TALK_SE_VOL, pitch)
    $game_system.se_play(se)
  end

  #--------------------------------------------------------------------------
  def current_speed
    return 0 if Input.press?(Input::C)
    return $game_system.text_speed
  end

  #--------------------------------------------------------------------------
  def current_text
    @text_chars[@text_index..-1].join
  end

  #--------------------------------------------------------------------------
  def process_character
    return if @text_index >= @text_chars.size

    text = current_text

    if text =~ /\A\\[pP]\[(\d+)\]/
      $game_system.talk_pitch = $1.to_i
      @text_index += $&.size
      return
    end

    if text =~ /\A\\[sS]\[(\d+)\]/
      $game_system.text_speed = $1.to_i
      @text_index += $&.size
      return
    end

    if text =~ /\A\\[cC]\[(\d+)\]/
      self.contents.font.color = text_color($1.to_i)
      @text_index += $&.size
      return
    end

    if text =~ /\A\\[rR]/
      self.contents.font.color = normal_color
      $game_system.talk_pitch = 100
      $game_system.text_speed = 2
      @text_index += 2
      return
    end

    if text =~ /\A\\\./
      @wait_count = 10
      @text_index += 2
      return
    end

    c = @text_chars[@text_index]
    @text_index += 1

    c = "\\" if c == "\000"

    if c == "\n"
      if @y >= $game_temp.choice_start
        @cursor_width = [@cursor_width, @x].max
      end

      @y += 1
      @x = ($game_temp.choice_start <= @y) ? 8 : 0
      return
    end

    self.contents.draw_text(@x, @y * 32, 40, 32, c)
    @x += self.contents.text_size(c).width

    play_talk_se
    @wait_count = current_speed
  end

  #--------------------------------------------------------------------------
    #Vou pedir pra você voltar
    #Vou pedir pra você ficar
    #Eu te amo
    #Eu te quero bem
  def update
    super

    update_cursor_rect
    update_pause_sprite

    if @fade_in
      self.contents_opacity += 24
      @fade_in = false if self.contents_opacity >= 255
      return
    end

    if @contents_showing

      if @wait_count > 0
        @wait_count -= 1
        return
      end

      if @text_index < @text_chars.size
        process_character
        return
      end

      self.pause = false

      if $game_temp.choice_max > 0
        @item_max = $game_temp.choice_max
        self.active = true
        self.index = 0 if self.index < 0
      else
        self.active = false
        self.index = -1
      end

      if Input.trigger?(Input::C)
        if $game_temp.choice_max > 0
          $game_system.se_play($data_system.decision_se)
          $game_temp.choice_proc.call(self.index)
        end
        terminate_message
      end

      return
    end

    if $game_temp.message_text != nil
      reset_window
      start_message
      self.visible = true
      self.contents_opacity = 0
      @fade_in = true
      return
    end

    if self.visible
      @fade_out = true
      self.opacity -= 48
      if self.opacity <= 0
        self.visible = false
        @fade_out = false
        $game_temp.message_window_showing = false
      end
    end
  end

  #--------------------------------------------------------------------------
  def update_cursor_rect
    if $game_temp.choice_max > 0 && @index >= 0
      n = $game_temp.choice_start + @index
      width = (@cursor_width > 0) ? @cursor_width : (self.width - 32)
      self.cursor_rect.set(8, n * 32, width, 32)
    else
      self.cursor_rect.empty
    end
  end

  #--------------------------------------------------------------------------
  def reset_window
    # Aqui muda a posição da mensagem em relação à tela do jogo de forma vertical
    case $game_system.message_position
    when 0 then self.y = 16 # Cima
    when 1 then self.y = 160 # Meio
    when 2 then self.y = 304 # Baixo
    end

    self.opacity = ($game_system.message_frame == 0) ? 255 : 0
    self.back_opacity = 255
  end

end

Espero que gostem (y)
 
Voltar
Topo Inferior