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.

[Resolved] Help with Slipknot's Message System

Hello,

I'm using Slipknot's Letter by Letter Message Window. I did some changes to it, so the size of the window is now 608x160. This is because I think facesets look better this way. But I want that the windows size is normal 480x160 when the faceset is not used. I have no idea how I could do that. The edit that needs to be done would be something like this (I think):

Code:
if [the faceset is shown] # This is the line I can't do
self.width, self.height = 608, 160
else
self.width, self height = 480, 160
end
But I just can't figure out what the first line could be. The script looks like this:

Code:
#==============================================================================
# ** Letter by Letter Message Window
#------------------------------------------------------------------------------
# Slipknot (dubealex.com/asylum)
# Version 1.11
# September 8, 2006
#------------------------------------------------------------------------------
# Thanks to:
#  - Dubealex, for some of the features.
#  - RPG Advocate, for the hexadecimal color.
#==============================================================================

#------------------------------------------------------------------------------
# SDK log
#------------------------------------------------------------------------------
SDK.log('Letter by Letter Message Window', 'Slipknot', '1.11', '08.09.06')

#------------------------------------------------------------------------------
# Begin SDK Enabled Check
#------------------------------------------------------------------------------
if SDK.state('Letter by Letter Message Window')

# Loads the maps' names
$data_map_infos = load_data('Data/MapInfos.rxdata')

#==============================================================================
# ** Game_Message
#------------------------------------------------------------------------------
#  This class handles the message data
#==============================================================================

class Game_Message
  #--------------------------------------------------------------------------
  # * Public Instance Variables
  #--------------------------------------------------------------------------
  attr_accessor :letter_by_letter, :speed, :can_skip, :height, :font,
    :sound_enable, :sound, :path, :face_rect, :fit, :skin, :nb_skin,
    :nbyo, :opacity, :shadow, :outline, :pause, :autoclose_frames
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize
    # Letter by letter mode
    @letter_by_letter = true
    # Lettter by letter mode's speed
    @speed = 3
    # If this option is false, the player can't skip the message
    @can_skip = true
    # Height of each line, used within the fit or above event options
    @height = 32
    # Always resize the message
    @fit = false
    # Font for the mesage text
    @font = Font.default_name
    # Sound enable
    @sound_enable = false
    # Sound for letter by letter, ['filename', vol]
    @sound = ['032-Switch01', 80]
    # Folder for the message pictures
    @path = 'Graphics/Pictures/'
    # Face rect (only the last two numbers are used)
    @face_rect = Rect.new(0, 0, 128, 128)
    # Skin for the message window, nil = default
    @skin = nil
    # Skin for the name box, nil = default
    @nb_skin = nil
    # Name box y offset
    @nbyo = 20
    # Message window's opacity
    @opacity = 160
    # Outline text
    @outline = false
    # Shadow text
    @shadow = false
    # Show or not the pause graphic
    @pause = true
    # Frames before the message autoclose
    @autoclose_frames = 8
  end
end

#==============================================================================
# ** Game_System
#------------------------------------------------------------------------------
#  Adds Game Message
#==============================================================================

class Game_System
  #--------------------------------------------------------------------------
  # * Public Instance Variables
  #--------------------------------------------------------------------------
  attr_reader :message
  #--------------------------------------------------------------------------
  # * Alias Listing
  #--------------------------------------------------------------------------
  alias slipknot_lblms_initialize initialize
  #--------------------------------------------------------------------------
  # * Load Database
  #--------------------------------------------------------------------------
  def initialize
    slipknot_lblms_initialize
    @message = Game_Message.new
  end
end

#==============================================================================
# ** Game_Event
#------------------------------------------------------------------------------
#  Adds a reader to the Event Name
#==============================================================================

class Game_Event < Game_Character
  #--------------------------------------------------------------------------
  # * Name
  #--------------------------------------------------------------------------
  def name
    @event.name
  end
end

#==============================================================================
# ** Spriteset_Map
#------------------------------------------------------------------------------
#  Adds a reader to the Character Sprites
#==============================================================================

class Spriteset_Map
  #--------------------------------------------------------------------------
  # * Public Instance Variables
  #--------------------------------------------------------------------------
  attr_reader :character_sprites
end

#==============================================================================
# ** Window_Message
#------------------------------------------------------------------------------
#  Rewrites Window_Message
#==============================================================================

class Window_Message < Window_Selectable
  #--------------------------------------------------------------------------
  # * Alias Listing
  #--------------------------------------------------------------------------
  alias slipknot_lblms_initialize initialize
  alias slipknot_lblms_terminatemessage terminate_message
  #--------------------------------------------------------------------------
  # * Initialize
  #--------------------------------------------------------------------------
  def initialize
    slipknot_lblms_initialize
    @autoclose = -1
  end
  #--------------------------------------------------------------------------
  # * Terminate Message
  #--------------------------------------------------------------------------
  def terminate_message
    slipknot_lblms_terminatemessage
    [@name_box, @picture].each do |x|
      x.dispose if x && ! x.disposed?
    end
  end
  #--------------------------------------------------------------------------
  # * Refresh
  #--------------------------------------------------------------------------
  def refresh
    self.opacity = $game_system.message_frame == 0 ? 255 : 0
    self.back_opacity = system.opacity
    unless system.fit
      # HERE THE WINDOW SIZE IS DEFINED. THIS IS WHAT I WANT:
      #
      # if [the faceset is shown]
      # self.width, self.height = 608, 160
      # else
      # self.width, self height = 480, 160
      # end

      # By now it only defines the window size
      self.width, self.height = 608, 160
      skin = system.skin ? system.skin : $game_system.windowskin_name
      self.windowskin = RPG::Cache.windowskin(skin)
      self.contents = Bitmap.new(576, 128)
    else
      contents.clear
      contents.font.color = normal_color
      contents.font.size = Font.default_size
    end
    contents.font.name = system.font
    @x = @y = @wait_count = indent = 0
    @fit_size, @sound = false, system.sound_enable
    @start_x = 4
    @cursor_width = [0, 0, 0, 0]
    @x = 8 if $game_temp.choice_start == 0
    return if ! (@text = $game_temp.message_text)
    @text.gsub!(/\\\\/) { "\000" }
    @text.gsub!(/\\[Vv]\[([0-9]+)\]/) { $game_variables[$1.to_i] }
    @text.gsub!('\$') { $game_party.gold.to_s }
    @text.gsub!(/\\[Nn]\[([0-9]+)\]/) do
      $game_actors[$1.to_i] ? $game_actors[$1.to_i].name : ''
    end
    @text.gsub!(/\\[Nn][Pp]\[([\d+])\]/) do
      $game_party.actors[$1.to_i] ? $game_party.actors[$1.to_i].name : ''
    end
    @text.gsub!(/\\[Cc]lass\[(\d+)\]/) do
      $game_actors[$1.to_i] ? $game_actors[$1.to_i].class_name : ''
    end
    @text.gsub!(/\\[Mm]ap/) { $data_map_infos[$game_map.map_id].name }
    gold_set = @text.gsub!(/\\[Gg]/, '')
    if @text[/\\[Nn]ame/]
      if @text.sub!(/\\[Nn]ame\[(.*?)\]/, '')
        name_text = $1
      elsif @text.sub!(/\\[Nn]ame/, '')
        name_text = $game_map.events[$game_system.map_interpreter.event_id].name
      end
    end
    if @text[/\\[Ff]ace/]
      # Left
      if @text.sub!(/\\[Ff]ace{(.+?)}/, '')
        face, face_name = 1, $1
      # Right
      elsif @text.sub!(/\\[Ff]ace\[(.+?)\]/, '')
        face, face_name = 2, $1
      end
    end
    picture = $1 if @text.sub!(/\\[Pp]ic\[(.+?)\]/, '')
    if @text[/\\[Pp]/]
      if @text.sub!(/\\[Pp]\[([-1,0-9]+)\]/, '')
        event = $1.to_i
      elsif @text.gsub!(/\\[Pp]/, '')
        event = $game_system.map_interpreter.event_id
      end
    end
    @text.gsub!('\$') { $game_party.gold.to_s }
    @text.gsub!(/\\[Cc]\[([0-9A-Fa-f #]+?)\]/) { "\001[#$1]" }
    @text.gsub!(/\\[Cc]/) { "\001[0]" }
    @text.gsub!(/\\[Ii]con{([IiWwAaSs])}\[(\d+)\]/) { change_icon($1, $2.to_i) }
    @text.gsub!(/\\[Ii]con\[(.*?)\]/) { "\002[#$1]" }
    @text.gsub!('\!') { "\003" }
    @text.gsub!('\.') { "\004" }
    @text.gsub!(/\\[Ss]\[([Xx\d]+)\]/) { "\005[#$1]" }
    @text.gsub!(/\\[Bb]/) { "\006" }
    @text.gsub!(/\\[Ii]/) { "\007" }
    @text.gsub!(/\\[Ff]\[(.*?)\]/) { "\010[#$1]" }
    @text.gsub!(/\\\%\[(\d+)\]/) { "\011[#$1]" }
    @text.gsub!('\%') { "\011" }
    if @fit_size = (event || system.fit)
      lines_size = [0, 0, 0, 0]
      save, lines = @text.clone, 0
      while (c = @text.slice!(/./m))
        if c == "\n"
          lines += 1
          break if lines == 4
          if lines >= $game_temp.choice_start
            lines_size[lines] += 16
          end
          next
        end
        lines_size[lines] += eval_text(c, true)
      end
    end
    if face
      if @fit_size
        mh = system.height
        fh = system.face_rect.height
        lines = (fh.to_f / mh.to_f).ceil if (lines * mh) < fh
        f_x = face == 2 ? 0 : lines_size.max + 16
        f_y = (lines * mh) <= fh ? 0 : (lines * mh - fh) / 2
        @start_x += system.face_rect.width + 4 if face == 2
        indent += system.face_rect.width + 8
      else
        # Facesetin asettelu
        # Toinen numero = X, neljäs numero = Y (vasen yläkulma, oletus 16)
        f_x, f_y = face == 2 ? 0 : 336, 0 
        @start_x += system.face_rect.width + 8 if face == 2 # original = 36
      end
      f_bitmap = RPG::Cache.load_bitmap(system.path, face_name)
    end
    if @fit_size
      @text = save
      self.height = lines * system.height + 32
      self.height += 32 if $game_temp.num_input_variable_id > 0
      self.width = lines_size.max + indent + 40
      windowskin = system.skin ? system.skin : $game_system.windowskin_name
      self.windowskin = RPG::Cache.windowskin(windowskin)
      self.contents = Bitmap.new(self.width - 32, self.height - 32)
      contents.font.name = system.font
    end
    contents.blt(f_x, f_y, f_bitmap, system.face_rect) if face
    if ! event
      h2 = self.height / 2
      self.y = $game_temp.in_battle ? 96 - h2 + system.nbyo :
        case $game_system.message_position
        when 0 then 96 - h2 + system.nbyo
        when 1 then 240 - h2
        when 2 then 384 - h2
        end
      self.x = 320 - self.width / 2
    else
      c = event > 0 ? $game_map.events[event] : $game_player
      mx, my = 636 - self.width, 476 - self.height
      fx = [[c.screen_x - self.width / 2, 4].max, mx].min
      sy = name_text ? system.nbyo + 4 : 4
      ch = [$scene.spriteset.character_sprites[event - 1].bitmap.height /
        4 + 4, 48].max
      fy = [[c.screen_y - (ch + self.height), sy].max, my].min
      self.x, self.y = fx, fy
    end
    if name_text
      @name_box = Window_NameBox.new(x, y - system.nbyo, name_text)
      @name_box.back.opacity = 0 if $game_system.message_frame == 1
    end
    if picture
      @picture = Sprite.new
      @picture.bitmap = RPG::Cache.load_bitmap(system.path, picture)
      @picture.x = self.x + self.width - @picture.bitmap.width
      @picture.y = self.y - @picture.bitmap.height
    end
    if gold_set
      @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
  end
  #--------------------------------------------------------------------------
  # * Evaluate Text
  #--------------------------------------------------------------------------
  def eval_text(c, read = false)
    case c
    when "\000"
      c = '\\'
    when "\001"
      @text.sub!(/\[(.*?)\]/, '')
      return 0 if read
      h, c = $1, $1.to_i
      contents.font.color = h.slice!(/./) == '#' ? hex_color(h) : text_color(c)
      return
    when "\002"
      @text.sub!(/\[(.*?)\]/, '')
      return 24 if read
      y = @fit_size ? system.height * @y + (system.height - 24) / 2 : 32 * @y + 4
      contents.blt(@x + @start_x, y, RPG::Cache.icon($1.to_s), Rect.new(0, 0, 24, 24))
      @x += 24
      return unless @y >= $game_temp.choice_start
      @cursor_width[@y] += 24
      return
    when "\003"
      return 0 if read
      @stop = true
      return
    when "\004"
      return 0 if read
      @wait_count += 10
      return
    when "\005"
      @text.sub!(/\[([x\d]+)\]/, '')
      if $1.downcase == 'x'
        contents.font.size = Font.default_size
      else
        contents.font.size = [[$1.to_i, 6].max, system.height].min
      end
      return 0
    when "\006"
      contents.font.bold = (! contents.font.bold)
      return 0
    when "\007"
      contents.font.italic = (! contents.font.italic)
      return 0
    when "\010"
      @text.sub!(/\[(.*?)\]/, '')
      if $1.downcase == 'x'
        contents.font.name = system.font
      else
        contents.font.name = [$1.to_s, system.font]
      end
      return 0
    when "\011"
      @text.sub!(/\[(\d+)\]/, '')
      return 0 if read
      @autoclose = $1 ? $1.to_i : system.autoclose_frames
      return
    when "\n"
      @y += 1
      @x = 0
      @x = 8 if @y >= $game_temp.choice_start
      return
    end
    w = contents.text_size(c).width
    return w if read
    y = @fit_size ? system.height * @y : 32 * @y
    if system.outline
      color = contents.font.color.dup
      contents.font.color.set(0, 0, 0, 255)
      contents.draw_text(@x + @start_x + 1, y, w * 2, system.height, c)
      contents.draw_text(@x + @start_x, y + 1, w * 2, system.height, c)
      contents.draw_text(@x + @start_x - 1, y, w * 2, system.height, c)
      contents.draw_text(@x + @start_x, y - 1, w * 2, system.height, c)
      contents.font.color = color
      contents.draw_text(@x + @start_x, y, w * 2, system.height, c)
    elsif system.shadow
      color = contents.font.color.dup
      contents.font.color.set(0, 0, 0, 192)
      contents.draw_text(@x + @start_x + 2, y + 2, w * 2, system.height, c)
      contents.font.color = color
      contents.draw_text(@x + @start_x, y, w * 2, system.height, c)
    else
      contents.draw_text(@x + @start_x, y, w * 2, system.height, c)
    end
    @sound = (system.sound_enable && c != ' ')
    @x += w
    return if @y < $game_temp.choice_start || @y > 3
    @cursor_width[@y] += w
  end
  #--------------------------------------------------------------------------
  # * Finish
  #--------------------------------------------------------------------------
  def finish
    if temp.choice_max > 0
      @item_max, self.active, self.index = temp.choice_max, true, 0
    end
    if temp.num_input_variable_id > 0
      digits_max = temp.num_input_digits_max
      number = $game_variables[temp.num_input_variable_id]
      @input_number_window = Window_InputNumber.new(digits_max)
      input_number.number = number
      input_number.x = x + 8
      input_number.y = y + temp.num_input_start * (@fit_size ? system.height : 32)
    end
  end
  #--------------------------------------------------------------------------
  # * Database Icon
  #--------------------------------------------------------------------------
  def change_icon(option, index)
    s = case option.downcase
      when 'i'  then $data_items[index]
      when 'w' then $data_weapons[index]
      when 'a'  then $data_armors[index]
      when 's'  then $data_skills[index]
      end
    return sprintf("\002[%s]%s", s.icon_name, s.name) if s.name
  end
  #--------------------------------------------------------------------------
  # * Hexadecimal Color
  #--------------------------------------------------------------------------
  def hex_color(string)
    return normal_color if string.size != 6
    r = g = b = 0
    5.times do |i|
      s = string.slice!(/./m)
      v = hex_convert(s.downcase)
      case i
      when 0 then r += v * 16
      when 1 then r += v
      when 2 then g += v * 16
      when 3 then g += v
      when 4 then b += v * 16
      when 5 then b += v
      end
    end
    return Color.new(r, g, b)
  end
  #--------------------------------------------------------------------------
  def hex_convert(c)
    return c.to_i if c[/[0-9]/]
    case c
    when 'a' then 10
    when 'b' then 11
    when 'c' then 12
    when 'd' then 13
    when 'e' then 14
    when 'f' then 15
    end
  end
  #--------------------------------------------------------------------------
  # * Game Message
  #--------------------------------------------------------------------------
  def system() $game_system.message end
  #--------------------------------------------------------------------------
  # * Game Temp
  #--------------------------------------------------------------------------
  def temp() $game_temp end
  #--------------------------------------------------------------------------
  # * Input Number Window
  #--------------------------------------------------------------------------
  def input_number() @input_number_window end
  #--------------------------------------------------------------------------
  # * Frame Update
  #--------------------------------------------------------------------------
  def update
    if @contents_showing
      super
      if @fade_in
        self.contents_opacity += 24
        if input_number
          input_number.contents_opacity += 24
        end
        @fade_in = contents_opacity != 255
        return
      end
      if @text
        if Input.trigger?(13)
          if @stop
            self.pause = @stop = false
            return
          end
          @skip = system.can_skip
        end
        return if @stop
        if @wait_count > 0 && ! @skip
          @wait_count -= 1
          return
        end
        loop do
          if (c = @text.slice!(/./m))
            eval_text(c)
            if @stop
              self.pause = system.pause
              return
            end
            if ! @skip && @sound
              Audio.se_play('Audio/SE/' + system.sound[0], system.sound[1])
              @sound = false
            end
            @wait_count += system.speed
          else
            @text = nil
            break
          end
          break if ! @skip
        end
        return if @text || @autoclose != -1
        finish
        return
      else
        if @autoclose > 0
          @autoclose -= 1
          return
        elsif @autoclose == 0
          terminate_message
          @autoclose = -1
          return
        end
      end
    end
    if input_number
      input_number.update
      if Input.trigger?(13)
        $game_system.se_play($data_system.decision_se)
        $game_variables[$game_temp.num_input_variable_id] = input_number.number
        $game_map.need_refresh = true
        input_number.dispose
        @input_number_window = nil
        terminate_message
      end
      return
    end
    if @contents_showing
      self.pause = ($game_temp.choice_max == 0) & system.pause
      if Input.trigger?(12)
        if $game_temp.choice_max > 0 && $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?(13)
        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 ! @fade_out && $game_temp.message_text
      @contents_showing = temp.message_window_showing = true
      @stop = false
      @autoclose = -1
      @skip = (! system.letter_by_letter)
      reset_window
      refresh
      @wait_count, self.visible = 0, true
      return
    end
    return if ! visible
    @fade_out = true
    self.opacity -= 48
    if self.opacity == 0
      self.visible = @fade_out = false
      $game_temp.message_window_showing = false
    end
  end
  #--------------------------------------------------------------------------
  # * Updates Cursor Rectangle
  #--------------------------------------------------------------------------
  def update_cursor_rect
    if index >= 0
      n = $game_temp.choice_start + @index
      y = (@fit_size ? system.height : 32) * n
      cursor_rect.set(4 + @start_x, y, @cursor_width.max + 8,
        @fit_size ? system.height : 32)
    else
      cursor_rect.empty
    end
  end
end

#==============================================================================
# ** Window_NameBox
#------------------------------------------------------------------------------
#  This window is used to display the box above the message.
#==============================================================================

class Window_NameBox < Sprite
  #--------------------------------------------------------------------------
  # * Public Instance Variables
  #--------------------------------------------------------------------------
  attr_reader :back
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize(x, y, text)
    dumb = Bitmap.new(160, 42)
    dumb.font.name = system.font
    size = dumb.text_size(text).width
    dumb.dispose
    @back = Window_Base.new(x, y, size + 12, 32)
    skin = system.nb_skin ? system.nb_skin : $game_system.windowskin_name
    @back.windowskin = RPG::Cache.windowskin(skin)
    viewport = Viewport.new(x + 6, y + 5, size, 22)
    @back.z = viewport.z = 9999
    super(viewport)
    self.bitmap = Bitmap.new(size, 22)
    bitmap.font.name = system.font
    bitmap.draw_text(0, 0, size, 22, text)
  end
  #--------------------------------------------------------------------------
  # * Game Message
  #--------------------------------------------------------------------------
  def system() $game_system.message end
  #--------------------------------------------------------------------------
  # * Dispose
  #--------------------------------------------------------------------------
  def dispose
    @back.dispose
    @back = nil
    super
  end
end

#==============================================================================
# ** Interpreter
#------------------------------------------------------------------------------
#  Adds a reader to the Event ID and Game Message
#==============================================================================

class Interpreter
  #--------------------------------------------------------------------------
  # * Public Instance Variables
  #--------------------------------------------------------------------------
  attr_reader :event_id
  #--------------------------------------------------------------------------
  # * Game Message
  #--------------------------------------------------------------------------
  def message
    $game_system.message
  end
end

#==============================================================================
# ** Scene_Map
#------------------------------------------------------------------------------
#  Adds a reader to the Spriteset
#==============================================================================

class Scene_Map
  #--------------------------------------------------------------------------
  # * Public Instance Variables
  #--------------------------------------------------------------------------
  attr_reader :spriteset
end

#------------------------------------------------------------------------------
# End SDK Enabled Test
#------------------------------------------------------------------------------
end
 
I think this should do it. sub returns the replacement string if found, returns nil otherwise,

if @text.sub(/\\[Ff]ace{(.+?)}/, '') != nil

although it looks like @text gets loaded further down, so we may need

if $game_temp.message_text.sub(/\\[Ff]ace{(.+?)}/, '') != nil


It look like there is a "fit" parameter, have you tried setting this to true?
 
It works. This line saved me:

although it looks like @text gets loaded further down, so we may need
I didn't notice that myself. So all I did was to load the $game_temp.message_text to @text, and test the @text:

Code:
@text = $game_temp.message_text
if @text[/\\[Ff]ace/]
Thanks.
 

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