[XP] Window_Message Mod v 1.00

Started by fugibo, March 15, 2008, 08:09:17 pm

Previous topic - Next topic

fugibo

March 15, 2008, 08:09:17 pm Last Edit: November 11, 2009, 05:58:09 pm by game_guy
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


  • 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



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


  • WcW
  • Blizzard, for teaching me so much about RGSS and computers in general



Author's Notes

To quoth the Blizzard,
"N-Joy!"

Juan

Dropbox Who need luck when you can make your own.
3ds Friend code: ShowHide
 4468 1422  6617

fugibo


Juan

Heres a suggestion map name feature?
Dropbox Who need luck when you can make your own.
3ds Friend code: ShowHide
 4468 1422  6617

Blizzard

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
Check out Daygames and our games:

King of Booze 2      King of Booze: Never Ever
Drinking Game for Android      Never have I ever for Android
Drinking Game for iOS      Never have I ever for iOS


Quote from: winkioI do not speak to bricks, either as individuals or in wall form.

Quote from: Barney StinsonWhen I get sad, I stop being sad and be awesome instead. True story.

Flermza


fugibo


Fantasist

I could learn from this, nicely done :)
Do you like ambient/electronic music? Then you should promote a talented artist! Help out here. (I'm serious. Just listen to his work at least!)


The best of freeware reviews: Gizmo's Freeware Reviews