Envision, Create, Share

Welcome to HBGames, a leading amateur game development forum and Discord server. All are welcome, and amongst our ranks you will find experts in their field from all aspects of video game design and development.

Sing-a-long Script help.

It's really the best name I could come up with. There is prob better, but let's not digress >_< In any case in my parody game, I finally came up to the point where this is a little musical number and I ran into a small snag. Now while you can imagine how totally awesome our singing voices are  :-\ I thought maybe I could do it all threw text. My only problem is I need it to sink up just right with the words and such.

Right now I am going to use the posted code, to just close the box after a set time, but thats rather... crap. While it would work, I was wondering if any of you super cool smarty people out there would know of a better way to get it done. Thanks in advance!

Code:
# ----------------------------
class Window_Message < Window_Selectable
  attr_accessor :autoclosetime
  attr_accessor :op
# ----------------------------
  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
    @cursor_width = 0
    @autoclosetime = -1
    @op = 255
    @refreshflag = false
    self.active = false
    self.index = -1
  end
# ----------------------------
  def dispose
    terminate_message
    $game_temp.message_window_showing = false
    if @input_number_window != nil
      @input_number_window.dispose
    end
    super
  end
# ----------------------------
  def terminate_message
    self.active = false
    self.pause = false
    self.index = -1
    self.contents.clear
    @contents_showing = 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_cancel_type = 0
    $game_temp.choice_proc = nil
    $game_temp.num_input_start = 99
    $game_temp.num_input_variable_id = 0
    $game_temp.num_input_digits_max = 0
    if @gold_window != nil
      @gold_window.dispose
      @gold_window = nil
    end
  end
# ----------------------------
  def refresh
    self.contents.clear
    self.contents.font.color = normal_color
    self.contents.font.name = "Arial"
    self.contents.font.size = 18
    x = y = 0
    @cursor_width = 0
    @autoclosetime = -1
    @refreshflag = true
    lineheight = 32
    active = ""
    a = ""
    centerflag = false
    rightflag = false
    bannerflag = false
    if $game_temp.choice_start == 0
      x = 8
    end
    if $game_temp.message_text != nil
      text = $game_temp.message_text
      begin
      last_text = text.clone
      text.gsub!(/\\[Vv]\[([0-9]+)\]/) { $game_variables[$1.to_i] }
      end until text == last_text
      text.gsub!(/\\[Nn]\[([0-9]+)\]/) do
        $game_actors[$1.to_i] != nil ? $game_actors[$1.to_i].name : ""
      end
      text.gsub!(/\\\\/) { "\000" }
      text.gsub!(/\\[Cc]\[([0-9]+)\]/) { "\001[#{$1}]" }
      text.gsub!(/\\[Gg]/) { "\002" }
       text.gsub!(/\\[Ii]\[([0-9]+)\]/) { "\003[#{$1}]" }
      text.gsub!(/\\[Ff]\[([0-9]+)\]/) { "\004[#{$1}]" }
      text.gsub!(/\\[Aa]\[([0-9]+)\]/) { "\005[#{$1}]" }
      text.gsub!(/\\[Xx]/) { "\006" }
      text.gsub!(/\\[Rr]/) { "\007" }
      text.gsub!(/\\[Dd]/) { "\011" }
      text.gsub!(/\\[Ss]\[([0-9]+)\]/) { "\023[#{$1}]" }
      text.gsub!(/\\[Bb]/) { "\017" }
      text.gsub!(/\\[Ww]\[([0-9]+)\]/) { "\014[#{$1}]" }
      text.gsub!(/\\[Mm]\[([0-9]+)\]/) { "\015[#{$1}]" }
      text.gsub!(/\\[Oo]\[([0-9]+)\]/) { "\016[#{$1}]" }
      text.gsub!(/\\[Jj]\[([0-9]+)\]/) { "\013[#{$1}]" }
      text.gsub!(/\\[Hh]\[([0-9]+)\]/) { "\021[#{$1}]" }
      text.gsub!(/\\[Kk]\[([0-9]+)\]/) { "\022[#{$1}]" }
      while ((c = text.slice!(/./m)) != nil)
        if c == "\000"
          c = "\\"
        end
        if c == "\001"
          text.sub!(/\[([0-9]+)\]/, "")
          color = $1.to_i
          if color >= 0 and color <= 7
            self.contents.font.color = text_color(color)
          end
          next
        end
        if c == "\002"
          if @gold_window == nil
            @gold_window = Window_Gold.new
            @gold_window.x = 560 - @gold_window.width
            if $game_temp.in_battle
              @gold_window.y = 192
            else
              @gold_window.y = self.y >= 128 ? 32 : 384
            end
            @gold_window.opacity = self.opacity
            @gold_window.back_opacity = self.back_opacity
          end
          next
        end
          if c == "\003"
          text.sub!(/\[([0-9]+)\]/, "")
          item_sub = $1.to_i
          c = $data_items[item_sub].name
          l = self.contents.text_size(c).width
          draw_item_name($data_items[item_sub], x, y * 32 + 1)
          x = x + l + 24
          next
        end
         if c == "\004"
          text.sub!(/\[([0-9]+)\]/, "")
          fontize = $1.to_i
          case fontize
            when 1 
              self.contents.font.name = "Arial"
            when 2 
              self.contents.font.name = "High Tower Text"
            when 3 
              self.contents.font.name = "Tw Cen MT"
            when 4 
              self.contents.font.name = "Tahoma"
          end
          next
        end
         if c == "\005"
          text.sub!(/\[([0-9]+)\]/, "")
          @autoclosetime = $1.to_i
          next
        end
        if c == "\006"
          centerflag = true
          next
        end
        if c == "\007"
          rightflag = true
          next
        end
        if c == "\011"
          self.contents.font.name = "Arial"
          self.contents.font.size = 18
          self.contents.font.color = normal_color
          lineheight = 32
          next
        end
        if c == "\014"
          text.sub!(/\[([0-9]+)\]/, "")
          w_sub = $1.to_i
          c = $data_weapons[w_sub].name
          l = self.contents.text_size(c).width
          bitmap = RPG::Cache.icon($data_weapons[w_sub].icon_name)
          self.contents.blt(x+4, y * 32+ 4, bitmap, Rect.new(0, 0, 24, 24))
          x += 28
          self.contents.draw_text(x+4, 32 * y, l+32, lineheight, c)
          x = x + l
          next
        end
          if c == "\015"
          text.sub!(/\[([0-9]+)\]/, "")
          a_sub = $1.to_i
          c = $data_armors[a_sub].name
          l = self.contents.text_size(c).width
          bitmap = RPG::Cache.icon($data_armors[a_sub].icon_name)
          self.contents.blt(x+4, y * 32+ 4, bitmap, Rect.new(0, 0, 24, 24))
          x += 28
          self.contents.draw_text(x+4, 32 * y, l+32, lineheight, c)
          x = x + l
          next
        end
          if c == "\016"
          text.sub!(/\[([0-9]+)\]/, "")
          @op = $1.to_i
          next
        end
         if c == "\017"
          bannerflag = true
          next
        end
        if c == "\018"
          text.sub!(/\[([0-9]+)\]/, "")
          jump = $1.to_i	
          x += jump
          next
        end
          if c == "\021"
          text.sub!(/\[([0-9]+)\]/, "")
          lineheight = $1.to_i
          next
        end
        if c == "\022"
          text.sub!(/\[([0-9]+)\]/, "")
          skill_sub = $1.to_i
          c = $data_skills[skill_sub].name
          l = self.contents.text_size(c).width
          bitmap = RPG::Cache.icon($data_skills[skill_sub].icon_name)
          self.contents.blt(x+4, y * 32+ 4, bitmap, Rect.new(0, 0, 24, 24))
          x += 28
          self.contents.draw_text(x+4, 32 * y, l+32, lineheight, c)
          x = x + l
          next
        end
         if c == "\023"
          text.sub!(/\[([0-9]+)\]/, "")
          bigness = $1.to_i
          self.contents.font.size = bigness
          next
        end
        if c == "\n"
          if centerflag == true
            x = 448 - x
            x = x / 2
            self.contents.draw_text(x, 32 * y, 448-x, lineheight, a)
          end
          if rightflag == true
            x = 448 - x
            self.contents.draw_text(x, 32 * y, 448-x, lineheight, a)
          end
          if bannerflag == true
            x = 448 - x
            x = x / 2
            self.contents.draw_text(x, 44, 448-x, lineheight, a)
          end
          a = ""
          centerflag = false
          rightflag = false
          bannerflag = false
          if y >= $game_temp.choice_start
            @cursor_width = [@cursor_width, x].max
          end
          y += 1
          x = 0
          if y >= $game_temp.choice_start
            x = 8
          end
          next
        end
        if centerflag == false && rightflag == false && bannerflag == false
        self.contents.draw_text(4 + x, 32 * y, 40, lineheight, c)
        x += self.contents.text_size(c).width
      else
        a += c
        x += self.contents.text_size(c).width
        end
      end
    end
    if $game_temp.choice_max > 0
      @item_max = $game_temp.choice_max
      self.active = true
      self.index = 0
    end
    if $game_temp.num_input_variable_id > 0
      digits_max = $game_temp.num_input_digits_max
      number = $game_variables[$game_temp.num_input_variable_id]
      @input_number_window = Window_InputNumber.new(digits_max)
      @input_number_window.number = number
      @input_number_window.x = self.x + 8
      @input_number_window.y = self.y + $game_temp.num_input_start * 32
    end
  end
# ----------------------------
  def reset_window
    if $game_temp.in_battle
      self.y = 16
    else
      case $game_system.message_position
      when 0
        self.y = 16
      when 1
        self.y = 160
      when 2
        self.y = 304
      end
    end
    if $game_system.message_frame == 0
      self.opacity = 255
    else
      self.opacity = 0
    end
    self.back_opacity = 160
  end
# ----------------------------  
  def update
    super
    if @refreshflag && @fade_in == false
      self.contents_opacity = @op
     end
    if @autoclosetime == 0
    @autoclosetime = -1
     terminate_message
   end
    if @autoclosetime >= 1
    @autoclosetime -= 1
    end
    if @fade_in
      self.contents_opacity += 24
      if @input_number_window != nil
        @input_number_window.contents_opacity += 24
      end
      if self.contents_opacity >= @op
        @fade_in = false
      end
      return
    end
    if @input_number_window != nil
      @input_number_window.update
      if Input.trigger?(Input::C)
        $game_system.se_play($data_system.decision_se)
        $game_variables[$game_temp.num_input_variable_id] =
          @input_number_window.number
        $game_map.need_refresh = true
        @input_number_window.dispose
        @input_number_window = nil
        terminate_message
      end
      return
    end
    if @contents_showing
      if $game_temp.choice_max == 0
        self.pause = true
      end
      if Input.trigger?(Input::B)
        if $game_temp.choice_max > 0 and $game_temp.choice_cancel_type > 0
          $game_system.se_play($data_system.cancel_se)
          $game_temp.choice_proc.call($game_temp.choice_cancel_type - 1)
          terminate_message
        end
      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
        @op = 255
        terminate_message
      end
      return
    end
    if @fade_out == false and $game_temp.message_text != nil
      @contents_showing = true
      $game_temp.message_window_showing = true
      reset_window
      refresh
      Graphics.frame_reset
      self.visible = true
      self.contents_opacity = 0
      if @input_number_window != nil
        @input_number_window.contents_opacity = 0
      end
      @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
      return
    end
  end
# ----------------------------
  def update_cursor_rect
    if @index >= 0
      n = $game_temp.choice_start + @index
      self.cursor_rect.set(8, n * 32, @cursor_width, 32)
    else
      self.cursor_rect.empty
    end
  end
end
 
Hmmmm, you could write a whole new method for the Audio Module that plays some sort of Karaoke file &
dumps the text track to a FIFO buffer that you could read from your message window....
(sounds like way too much work to me... :)  )
There's a guy named, "Hans Fugal" who's done a lot of work with Ruby Audio. If you're so inclined, and have a lot more ambition than I do, Google him up, and try to contact him.

Otherwise, I think you're on the right track.  You could also look at some custom message systems (AMS, UMS). They both have a 'pause' function that you could use to further sync each word with the BGM track.
Cool idea, but it's gonna be a lot of work to get it synced up perfectly.

Be Well
 

Thank you for viewing

HBGames is a leading amateur video game development forum and Discord server open to all ability levels. Feel free to have a nosey around!

Discord

Join our growing and active Discord server to discuss all aspects of game making in a relaxed environment. Join Us

Content

  • Our Games
  • Games in Development
  • Emoji by Twemoji.
    Top