Chaos Project

RPG Maker => RPG Maker Scripts => RMXP Script Database => Topic started by: fugibo on March 15, 2008, 08:09:17 pm

Title: [XP] Window_Message Mod v 1.00
Post by: fugibo on March 15, 2008, 08:09:17 pm
Window_Message Mod
Authors: LongFellow
Version: 1.00
Type: Message System Add-On
Key Term: Message Add-on



Introduction

A mod of the default Window_Message class. NOT a Custom Message System.


Features




Screenshots

n/a


Script

Here lie the script: ShowHide

#============================================================================
# Window_Message Mod v 1.00
# by WcW
#
# Introduction:
#   This script will rewrite the Window_Message class so that it is slightly
# faster, and so that it will have some new functions.
#
# Features:
# - Slightly optimized code from the default Window_Message
# - Can now display current amount of gold and names of armors, weapons, and
#   items
# - Can format text to be bold or italic
#
# Instructions:
#   Paste this script into your script editor above main. Also, hit Ctrl + F and
# type in CONFIG with a '[' and ']' surrounding it, which will take you to the
# config section. There you can change a few options with the script.
#   To use, when you are using Display Text in events, you can enter several new
# commands:
# - <g> Will display the current amount of gold in the party.
# - <w [i]> Replace [i] with the number of a weapon in your database, and this
#   will display its name. A nice way to conserve space.
# - <a [i]> Same as above, but for armors.
# - <im [i]> Same as above, but from items.
# - <i> Will make any text after it italicized.
# - </i> Stops italicized text.
# - <b> Will make any text after it bold.
# - </b> stops bold text.
#
# Compatibility:
#   Incompatible with Custom Message Systems. Test with Tons of Add-Ons v 6.13b.
# If you find any compatibility issues, please contact me at
# http://forum.chaos-project.com/
#
# Credits:
# - WcW, for scripting it
# - Blizzard, for helping me learn to script and teaching me many valuable
#   things.
#
# Author's Notes:
# Remember to use </i> and </b> at the end of every event that has Display
# Messages and italics/bold, as if you don't the next message box will pop up
# with italics or bold. Which you don't want.
#   To quoth the Blizzard,
# "N-Joy!"
#
#============================================================================

#----------------------------------------------------------------------------
# * Message Window
#----------------------------------------------------------------------------
class Window_Message < Window_Selectable
 # [CONFIG]
 DisGLet = false # If true, will display "G" beside the amount of
                           # gold when you use <g>.
 Font = "Arial" # The default font for the message window
 Size = 22 # The default font size for the message window
 #--------------------------------------------------------------------------
 # * Initialize
 #--------------------------------------------------------------------------
 def initialize
   super(80, 304, 480, 160)
   self.contents = Bitmap.new(width - 32, height - 32)
   self.contents.font.name = [Font, "Arial"]
   self.contents.font.size = Size
   self.visible = false
   self.z = 9998
   @fade_in = false
   @fade_out = false
   @contents_showing = false
   @cursor_width = 0
   self.active = false
   self.index = -1
 end
 #--------------------------------------------------------------------------
 # * Dispose
 #--------------------------------------------------------------------------
 def dispose
   terminate_message
   $game_temp.message_window_showing = false
   @input_number_window.dispose if @input_number_window != nil
   super
 end
 #--------------------------------------------------------------------------
 # * Terminate Message
 #--------------------------------------------------------------------------
 def terminate_message
   self.active = false
   self.pause = false
   self.index = -1
   self.contents.clear
   # Clear showing flag
   @contents_showing = false
   # Call message callback
   $game_temp.message_proc.call if $game_temp.message_proc != nil
   # Clear variables related to text, choices, and number input
   $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
   # Close gold window
   if @gold_window != nil
     @gold_window.dispose
     @gold_window = nil
   end
 end
 #--------------------------------------------------------------------------
 # * Refresh
 #--------------------------------------------------------------------------
 def refresh
   self.contents.clear
   self.contents.font.color = normal_color
   x = y = 0
   @cursor_width = 0
   # Indent if choice
   if $game_temp.choice_start == 0
     x = 8
   end
   # If waiting for a message to be displayed
   if $game_temp.message_text != nil
     text = $game_temp.message_text
     # Control text processing
     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]+)\]/) {
       $game_actors[$1.to_i] != nil ? $game_actors[$1.to_i].name : ""
     }
     # Change "\\" to "\000" for convenience
     text.gsub!(/\\\\/) { "\000" }
     # Change "\C" to "\001" and "\G" to "\002"
     text.gsub!(/\\[Cc]\[([0-9]+)\]/) { "\001[#{$1}]" }
     text.gsub!(/\\[Gg]/) { "\002" }
     # WcW additions:
     
     # Changes <g> to the current amount of gold the player has.
     g = $game_party.gold.to_s
     text.gsub!(/<g>/i) { DisGLet ? g+"G" : g }
     # Changes <w [i]> to the name of the weapon i in the database
     text.gsub!(/<w ([0-9]+)>/i) { $data_weapons[$1.to_i].name }
     # Changes <a [i]> to the name of the armor i in the database
     text.gsub!(/<a ([0-9]+)>/i) { $data_armors[$1.to_i].name }
     # Changes <im [i]> to the name of the item i in the database
     text.gsub!(/<im ([0-9]+)>/i) { $data_items[$1.to_i].name }
     
     phase = 0
     old = []
     # Get 1 text character in c (loop until unable to get text)
     while ((c = text.slice!(/./m)) != nil) # < reminds of me of an example
                                            # out of The C Programming Language
       case phase
       when 0
         # If \\
         if c == "\000"
           # Return to original text
           c = "\\"
         end
         # If \C[n]
         if c == "\001"
           # Change text color
           text.sub!(/\[([0-9]+)\]/, "")
           color = $1.to_i
           if color >= 0 and color <= 7
             self.contents.font.color = text_color(color)
           end
           # go to next text
           next
         end
         # If \G
         if c == "\002"
           # Make gold window
           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
           # go to next text
           next
         end
         # If new line text
         if c == "\n"
           # Update cursor width if choice
           if y >= $game_temp.choice_start
             @cursor_width = [@cursor_width, x].max
           end
           # Add 1 to y
           y += 1
           x = 0
           # Indent if choice
           if y >= $game_temp.choice_start
             x = 8
           end
           # go to next text
           next
         end
         if c == "<"
           phase = 1
           old = ['<']
           next
         end
         # Draw text
         self.contents.draw_text(4 + x, 32 * y, 40, 32, c)
         # Add x to drawn text width
         x += self.contents.text_size(c).width
       when 1
         old.push c
         if c =~ /i/i
           self.contents.font.italic = true
           next
         elsif c =~ /b/i
           self.contents.font.bold = true
           next
         elsif c == "/"
           phase = 2
           next
         elsif c == ">"
           phase = 0
           next
         else
           phase = 0
           str = ""
           old.each {|char| str << char}
           self.contents.draw_text(4 + x, 32 *y, 40, 32, str)
           x += self.contents.text_size(str).width
         end
       when 2
         old.push c
         if c =~ /i/i
           self.contents.font.italic = false
           next
         elsif c =~ /b/i
           self.contents.font.bold = false
         elsif c== ">"
           phase = 0
         else
           phase = 0
           str = ""
           old.each {|char| str << char}
           self.contents.draw_text(4 + x, 32 *y, 40, 32, str)
           x += self.contents.text_size(str).width
         end
       end
     end
   end
   # If choice
   if $game_temp.choice_max > 0
     @item_max = $game_temp.choice_max
     self.active = true
     self.index = 0
   end
   # If number input
   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
 #--------------------------------------------------------------------------
 # * Set Window Position and Opacity Level
 #--------------------------------------------------------------------------
 def reset_window
   self.y = $game_temp.in_battle ? 16 :
     case $game_system.message_position
     when 0 #up
       self.y = 16
     when 1 # middle
       self.y = 160
     when 2 # down
       self.y = 304
     end
   self.opacity = $game_system.message_frame == 0 ? 255 : 0
   self.back_opacity = 160
 end
 #--------------------------------------------------------------------------
 # * Frame Update
 #--------------------------------------------------------------------------
 def update
   super
   # If fade in
   if @fade_in
     self.contents_opacity += 24
     @input_number_window.contents_opacity += 24 if @input_number_window != nil
     @fade_in = false if self.contents_opacity == 255
     return
   end
   # If inputting number
   if @input_number_window != nil
     @input_number_window.update
     # Confirm
     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
       # Dispose of number input window
       @input_number_window.dispose
       @input_number_window = nil
       terminate_message
     end
     return
   end
   # If message is being displayed
   if @contents_showing
     # If choice isn't being displayed, show pause sign
     if $game_temp.choice_max == 0
       self.pause = true
     end
     # Cancel
     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
     # Confirm
     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 display wait message or choice exists when not fading out
   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
     @input_number_window.contents_opacity = 0 if @input_number_window != nil
     @fade_in = true
     return
   end
   # If message which should be displayed is not shown, but window is visible
   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
 #--------------------------------------------------------------------------
 # * Update Cursor Rect
 #--------------------------------------------------------------------------
 def update_cursor_rect
   return self.cursor_rect.set(8, ($game_temp.choice_start + @index) * 32,
       @cursor_width, 32) if @index >= 0
   self.cursor_rect.empty
 end
end



Instructions

Inside the script :P


Compatibility

Incompatible with Custom Message Systems. Tested with Tons of Add-On's v 6.13b.


Credits and Thanks




Author's Notes

To quoth the Blizzard,
"N-Joy!"
Title: Re: [XP] Window_Message Mod v 1.00
Post by: Juan on March 16, 2008, 05:59:38 pm
Pretty good mod.
Title: Re: [XP] Window_Message Mod v 1.00
Post by: fugibo on March 16, 2008, 07:28:01 pm
thanks :P
Title: Re: [XP] Window_Message Mod v 1.00
Post by: Juan on March 16, 2008, 10:43:07 pm
Heres a suggestion map name feature?
Title: Re: [XP] Window_Message Mod v 1.00
Post by: Blizzard on March 17, 2008, 05:48:23 am
QuoteBlizzard, for teaching me so much about RGSS and computers in general

Lol, you don't have to put that in every script you make. xD
Title: Re: [XP] Window_Message Mod v 1.00
Post by: Flermza on March 17, 2008, 07:59:48 am
Good script, WcW.
Title: Re: [XP] Window_Message Mod v 1.00
Post by: fugibo on March 17, 2008, 03:33:59 pm
I do anyway :P
Title: Re: [XP] Window_Message Mod v 1.00
Post by: Fantasist on March 19, 2008, 04:29:44 pm
I could learn from this, nicely done :)