The RPG Maker Resource Kit

RMRK RPG Maker Creation => Requests => Script Request => Topic started by: Neko Hibiki on January 12, 2013, 08:55:08 AM

Title: [Conversion Request] Blackmorning's Titles for VX [VX to Ace]
Post by: Neko Hibiki on January 12, 2013, 08:55:08 AM

Script : Titles for VX, by Blackmorning

I really need this script for my game now.

I really hope somepony out there can port this for me because I need it.

Spoiler for:
Code: [Select]
#==============================================================================
# ** Titles for VX, by Blackmorning
#==============================================================================
# originally released 15/07/09
#==============================================================================
# Updated:
#==============================================================================
# 20/10/11
# -typos fixed
# -demo updated
# 14/10/11
# -cleaned up a few things, fixed a visual issue with stat changes (thx to Blood-RedItspooki)
# 28/09/10
# -added title description (only when calling Scene_Actor_Titles)
# 21/08/10
# -fixed bug with scene_actor_titles
# -fixed some issues and made more compatible with YERD SceneStatus Redux
# -added titles to end of name
# -stat change values visible when changing titles
# Idea from Eternal Symphony Scripters Team's Raise stats when Level UP by Base Job. V 1.0
#==============================================================================
=begin
call script:

Scene_Actor_Titles.new(actor_index)

-add titles to actors
  add_title(actor_id, title_id)
example
  add_title(4, 2)
adds title 2 to actor 4 

-check if title in list and assigns it to a switch
  check_titles(actor_id, title_id, switch)
example
  check_titles(4, 2, 5)
checks if actor 4 has title 2 and puts answer in switch 5
can be used without switch_id

-check actor title size and assigns it to a variable
  actor_title_list_size(actor_id, variable_id)
example 
  actor_title_list_size(4, 10)
checks title list size for actor 4 and puts answer in variable 10


=end
module BM
module TITLES
  Call_title = "Titles"
  #Name of the title
  TITLE_NAMES = {
    0 => "Normal",
    # format: title_id => "Title name"
    1 => "Noble Were",
    2 => "Smart Girl",
    3 => "Agile Girl",
  # Add more titles as you like
  }# don't remove
 
  # Add more titles as you like
 
  #Description of the title
  # will be blink if not listed
  TITLE_DESC = {# do not remove
    1 => "Those weres of noble birth",
    2 => "A girl with extra smarts",
    3 => "A girl with better agility",

  }# do not remove 
 
  COSTUMES ={
    #title_id => ["Character Name", Character Index],
    21 => ["Animal",6],
 
  }#do not remove
   
  CHANGE_STATS = true
  #titles can add or subtract from the base stats
  # will be 0 if not listed
  BASE_STAT_CHANGE = {# do not remove
  #title_id    Hp  Mp Atk Def  Int  Agi
#        1 => [ 0,  0,  0,  0,  0,   0],
#        2 => [ 0,  0,  0,  0,  0,   10],
#        3 => [10,  0,  0,  0,  0,   0],
#        4 => [ 0,  0,  0,  0,  0,   -10],
#        5 => [ 0,  0,  0,  0,  0,   10],
#        6 => [ 0,  0,  0,  5,  2,   0],
#        7 => [ 0,  0,  10,  -5,  -5,   -5],
         2 => [ 0,  0,  0,  0,  15,   0],
         3 => [ 0,  0,  0,  0,  0,   15],
  }# do not remove
 
  CHANGE_LEVELUP = false
  #titles can add or subtract from stats during level up
  # will be 0 if not listed
  LEVELUP_BONUS = { # do not remove
  #title_id    Hp  Mp Atk Def  Int  Agi
         1 => [40,  0,  0,  5,  0,   0],
         2 => [ 0,  0,  0,  0,  0,   5],
         3 => [50,  0,  0,  0,  0,   0],
         4 => [10,  0,  0,  0,  0,   0],
         5 => [ 0,  0,  0,  0,  0,   2],
         6 => [ 0,  0,  0,  2,  0,   0],
         
  }# do not remove
 
  # Title that actor starts with
  # format actor_id => title_id
  STARTING_TITLE = {# do not remove
    0 => 0,  #default if actor not assigned
    9 => 1,
    # Add more actors as you like
 
 
  }# do not remove
 
  # show title in status window
  OPTIONS={
    :show_in_status => true,
    :show_after_name => false,
    #location of actor's title
    :titles_x => 0,
    :titles_y => 350,
    # show stat change number (ie HP +10, MP -2)
    :show_stat_change => true,
    # key to press to change titles
    :titles_key => Input::X,
  }# do not remove
 
  WINDOW_OPTIONS = {
    # horizontal location of pick titles window
    :win_x => 80,
    # vertical location of pick titles window
    # :win_pos => 0  bottom
    # :win_pos => 1  top
    :win_pos => 1,
    # width of pick titles window
    :win_width => 160,
    # width of pick titles stats window
    :win_stat_width => 100,
  }# do not remove
 
  end
end
#===============================================================================
# No touching unless you know what you're doing!!
#===============================================================================
$imported = {} if $imported == nil
$imported["titles"] = true

if $imported["SceneStatusReDux"]
module YE::REDUX::STATUS
  IMPORTED_COMMANDS[400] = [false,    0, BM::TITLES::Call_title, "Scene_Actor_Titles"]
end
end
#===============================================================================
class Game_Interpreter
  include BM::TITLES
end
module BM::TITLES
  module_function
  #--------------------------------------------------------------------------
  def add_title(actor_id, title_id)
    $game_actors[actor_id].title_list(title_id)
  end
  #--------------------------------------------------------------------------
  def check_titles(actor_id, title_id, switch_id = nil)
    in_list = $game_actors[actor_id].title_list.include?(title_id)
    $game_switches[switch_id] = in_list if switch_id > 0
    return in_list
  end
  #--------------------------------------------------------------------------
  def actor_title_list_size(actor, variable_id = 0)
    title_list = $game_actors[actor].title_list
    $game_variables[variable_id] = title_list.size if variable_id > 0
    return title_list
  end
end


#===============================================================================
# Game_actor
#===============================================================================
class Game_Actor < Game_Battler
  attr_accessor :title_name
  attr_accessor :title_id
  #-----------------------------------------------------------------------------
  alias titles_setup setup unless $@
  #-----------------------------------------------------------------------------
  def setup(actor_id)
    titles_setup(actor_id)
    @title_names = Array.new
    @title_list = Array.new
    if BM::TITLES::STARTING_TITLE.include?(actor_id)
      @title_id = BM::TITLES::STARTING_TITLE[@actor_id]
    else
      @title_id = BM::TITLES::STARTING_TITLE[0]
    end
  end
  #-----------------------------------------------------------------------------
  def title_name
    return BM::TITLES::TITLE_NAMES[@title_id]
  end
  #-----------------------------------------------------------------------------
  def title_id=(new_id)
    @title_id = new_id
    if BM::TITLES::COSTUMES.include?(new_id)
      pic_name = BM::TITLES::COSTUMES[new_id][0]
      index = BM::TITLES::COSTUMES[new_id][1]
      $game_actors[@actor_id].set_graphic(pic_name, index, @face_name, @face_index)
      $game_player.refresh
    end
    return @title_id
  end
  #-----------------------------------------------------------------------------
  def title_list(id = nil)
    result = @title_list
    result << @title_id #adds current title equipped
    if id != nil #adds new title
      result << id
    end
    result.uniq! # remove all duplicates
    return result
  end
  #-----------------------------------------------------------------------------
  def base_stat_title_change(type, title = @title_id)
    if BM::TITLES::CHANGE_STATS and BM::TITLES::BASE_STAT_CHANGE.include?(title)
      amount = BM::TITLES::BASE_STAT_CHANGE[title][type]
    else
      amount = 0
    end
    return Integer(amount)
  end
  #============================================================================#
  # * Change Parameters based on Title                                         #
  #============================================================================#
  alias title_base_maxhp base_maxhp unless $@
  #--------------------------------------------------------------------------
  def base_maxhp
    n = title_base_maxhp
    n += base_stat_title_change(0)
    return Integer(n)
  end
  #--------------------------------------------------------------------------
  # * Get basic Maximum MP
  #--------------------------------------------------------------------------
  alias title_base_maxmp base_maxmp unless $@
  def base_maxmp
    n = title_base_maxmp
    n += base_stat_title_change(1)
    return Integer(n)
  end
  #--------------------------------------------------------------------------
  alias title_base_atk base_atk unless $@
  #--------------------------------------------------------------------------
  def base_atk
    n = title_base_atk
    n += base_stat_title_change(2)
    return Integer(n)
  end
  #--------------------------------------------------------------------------
  alias title_base_def base_def unless $@
  #--------------------------------------------------------------------------
  def base_def
    n = title_base_def
    n += base_stat_title_change(3)
    return Integer(n)
  end
  #--------------------------------------------------------------------------
  alias title_base_spi base_spi unless $@
  #--------------------------------------------------------------------------
  def base_spi
    n = title_base_spi
    n += base_stat_title_change(4)
    return Integer(n)
  end
  #--------------------------------------------------------------------------
  alias title_base_agi base_agi unless $@
  #--------------------------------------------------------------------------
  def base_agi
    n = title_base_agi
    n += base_stat_title_change(5)
    return Integer(n)
  end
  #---------------------------------------------------------------------------
  alias title_levelup level_up unless $@
  #---------------------------------------------------------------------------
  def level_up
    title_levelup
    id = @title_id
    if BM::TITLES::CHANGE_LEVELUP && BM::TITLES::LEVELUP_BONUS.include?(id)
      self.maxhp += BM::TITLES::LEVELUP_BONUS[id][0]
      self.maxmp += BM::TITLES::LEVELUP_BONUS[id][1]
      self.atk += BM::TITLES::LEVELUP_BONUS[id][2]
      self.def += BM::TITLES::LEVELUP_BONUS[id][3]
      self.spi += BM::TITLES::LEVELUP_BONUS[id][4]
      self.agi += BM::TITLES::LEVELUP_BONUS[id][5]
    end
  end
end
#-------------------------------------------------------------------------------
# Window_Status
#-------------------------------------------------------------------------------
class Window_Status < Window_Base
  if BM::TITLES::OPTIONS[:show_in_status]
    if BM::TITLES::OPTIONS[:show_after_name] == false or $imported["SceneStatusReDux"]
      #-----------------------------------------------------------------------------
      alias titles_refresh refresh unless $@
      #-----------------------------------------------------------------------------
      def refresh
        titles_refresh
        x = BM::TITLES::OPTIONS[:titles_x]
        y = BM::TITLES::OPTIONS[:titles_y]
        self.contents.font.color = normal_color
        draw_actor_title(@actor, x, y)
      end
      #-----------------------------------------------------------------------------
      def draw_actor_title(actor, x, y)
        self.contents.font.color = system_color
        self.contents.draw_text(x, y, 80, WLH, "Title: ", 2)
        self.contents.font.color = normal_color
        self.contents.draw_text(x + 80, y, 108, WLH, actor.title_name)
      end
      #-----------------------------------------------------------------------------
    elsif BM::TITLES::OPTIONS[:show_after_name]
      def draw_actor_name(actor, x, y)
        self.contents.font.color = hp_color(actor)
        self.contents.draw_text(x, y, 220, WLH, "#{actor.name} the #{actor.title_name}")
      end
      #-----------------------------------------------------------------------------
      alias titlesdraw_actor_class draw_actor_class unless $@
      #-----------------------------------------------------------------------------
      def draw_actor_class(actor, x, y)
        titlesdraw_actor_class(actor, x + 160, y)
      end
    end
  end
end
#==============================================================================
# Window_Titles_Stats
#==============================================================================
class Window_Titles_Stats < Window_Base
  def initialize(actor_index)
    height = 32 + WLH * 6
    super(0, 0, BM::TITLES::WINDOW_OPTIONS[:win_stat_width], height)
    self.z = 1000
    @actor = $game_party.members[actor_index]
    refresh(@actor)
  end
  #--------------------------------------------------------------------------
  def refresh(actor, clone = nil)
    self.contents.clear
    @actor = actor
    @clone = clone
    stats_compare(@actor, @clone)
  end
  #-------------------------------------------------------------------------- 
  def stats_compare(actor, clone = nil)
    return if clone == nil
    x = 0; y = 0
    w = self.contents.width 
    for i in 0..5
      case i
      when 0
        vocab = Vocab.hp
      when 1
        vocab = Vocab.mp
      when 2
        vocab = Vocab.atk
      when 3
        vocab = Vocab.def
      when 4
        vocab = Vocab.spi
      when 5
        vocab = Vocab.agi
      end
      if clone == nil
        self.contents.draw_text(x, y, w, WLH, vocab)
      else
        value1 = clone[i]
        value2 = actor.base_stat_title_change(i)
        difference = value1 - value2
        text = "+#{difference}" if difference > 0
        text = "---" if difference == 0
        self.contents.font.color = normal_color if BM::TITLES::OPTIONS[:show_stat_change]
        parameter_color(value1, value2) unless BM::TITLES::OPTIONS[:show_stat_change]
        self.contents.draw_text(x, y, w, WLH, vocab)
        parameter_color(value1, value2)
        self.contents.draw_text(x, y, w, WLH, text, 2) if BM::TITLES::OPTIONS[:show_stat_change]
      end
      y += WLH
    end
  end
  #--------------------------------------------------------------------------
  def parameter_color(value1, value2)
    if value1 > value2
      self.contents.font.color = power_up_color
    elsif value1 < value2
      self.contents.font.color = power_down_color
    else
      self.contents.font.color = normal_color
    end
  end
end
#==============================================================================
# Scene_Status
#==============================================================================
class Scene_Status < Scene_Base
  #--------------------------------------------------------------------------
  alias titles_initialize initialize unless $@
  #--------------------------------------------------------------------------
  def initialize(*args)
    titles_initialize(*args)
    @actor = $game_party.members[@actor_index]
    @titles_list_window = Window_Titles_List.new(@actor_index)
    @titles_list_window.x = BM::TITLES::WINDOW_OPTIONS[:win_x]   
    @titles_stat_window = Window_Titles_Stats.new(@actor_index)
    @titles_list_window.y = Graphics.height - @titles_list_window.height if BM::TITLES::WINDOW_OPTIONS[:win_pos] == 0
    @titles_stat_window.y = @titles_list_window.y
    @titles_stat_window.x = @titles_list_window.x + @titles_list_window.width
    hide_titles
  end
  #--------------------------------------------------------------------------
  alias titles_terminate terminate unless $@
  #--------------------------------------------------------------------------
  def terminate
    titles_terminate
    @titles_list_window.dispose
    @titles_stat_window.dispose
  end
  #--------------------------------------------------------------------------
  def clone_actor
    temp_actor = @actor.clone
    temp_actor.title_id = (@actor.title_list[@titles_list_window.index])
    chp = temp_actor.base_stat_title_change(0)
    cmp = temp_actor.base_stat_title_change(1)
    catk = temp_actor.base_stat_title_change(2)
    cdef = temp_actor.base_stat_title_change(3)
    cspi = temp_actor.base_stat_title_change(4)
    cagi = temp_actor.base_stat_title_change(5)
    @array = [chp,cmp,catk,cdef,cspi,cagi]
  end
  #--------------------------------------------------------------------------
  alias titles_update update unless $@
  #--------------------------------------------------------------------------
  def update
    super
    clone_actor
    @titles_list_window.update
    @titles_stat_window.refresh(@actor, @array)
    if @titles_list_window.active
      if Input.trigger?(BM::TITLES::OPTIONS[:titles_key])
        hide_titles
      elsif Input.trigger?(Input::C)
        if @actor.title_id == (@actor.title_list[@titles_list_window.index])
          Sound.play_buzzer
          return
        else
          Sound.play_decision
          @actor.title_id=(@actor.title_list[@titles_list_window.index])
          @status_window.refresh
          @titles_list_window.refresh
          @titles_stat_window.refresh(@actor, @array)
          return
        end
      elsif Input.trigger?(Input::B)
        hide_titles
      end
    elsif Input.trigger?(BM::TITLES::OPTIONS[:titles_key])
      show_titles
    else
      titles_update
    end
  end
  #--------------------------------------------------------------------------
  def hide_titles
    if $imported["SceneStatusReDux"] && @command_window != nil
      @command_window.active = true
    end
    @titles_list_window.active = false
    @titles_list_window.visible = false
    @titles_stat_window.visible = false
  end 
  #--------------------------------------------------------------------------
  def show_titles
    if $imported["SceneStatusReDux"]
      @command_window.active = false
    end
    @titles_list_window.active = true
    @titles_list_window.visible = true
    @titles_stat_window.visible = true
    @titles_stat_window.back_opacity = 255
    @titles_list_window.back_opacity = 255
  end
end
#============================================================================
class Window_Titles_List < Window_Command
  def initialize(actor_index)
    @actor = $game_party.members[actor_index]
    @commands = @actor.title_list
    super(BM::TITLES::WINDOW_OPTIONS[:win_width], @commands)
    self.z = 1000
  end
  #--------------------------------------------------------------------------
  # * Whether or not to display in enabled state
  #     item : item
  #--------------------------------------------------------------------------
  def selected?(title)
    return true if @actor.title_name != title
    return false
  end
  #--------------------------------------------------------------------------
  # * Draw Item
  #     index   : item number
  #     enabled : enabled flag. When false, draw semi-transparently.
  #--------------------------------------------------------------------------
  def draw_item(index)
    title = BM::TITLES::TITLE_NAMES[@commands[index]]
    return if title == nil
    selected = selected?(title)
    rect = item_rect(index)
    rect.x += 4
    rect.width -= 8
    self.contents.clear_rect(rect)
    self.contents.font.color = normal_color
    self.contents.font.color.alpha = selected ? 255 : 128
    self.contents.draw_text(rect, title)
  end
  #--------------------------------------------------------------------------
  # * Update Help Text
  #--------------------------------------------------------------------------
  def update_help
    index = @actor.title_list[@index]
    text = BM::TITLES::TITLE_DESC[index]
    @help_window.set_text(text == nil ? "" : text)
  end
end
#==============================================================================
class Scene_Actor_Titles < Scene_Base
  def initialize(actor_index)
    @actor_index = actor_index
  end
  #--------------------------------------------------------------------------
  def start
    super
    create_menu_background
    @actor = $game_party.members[@actor_index]
    @top_window = Window_Base.new(0,0,Graphics.width, 56)
    @top_window.contents.draw_text(0,0,Graphics.width-32,24,BM::TITLES::Call_title,1)
   
    @help_window = Window_Help.new
    @help_window.y = Graphics.height-56
   
    @titles_list_window = Window_Titles_List.new(@actor_index)
    @titles_list_window.active = true
    @titles_list_window.z = 120
    @titles_list_window.x = 0
    @titles_list_window.y = 56
    @titles_list_window.height = Graphics.height-56*2
    @titles_list_window.help_window = @help_window
   
    @titles_stat_window = Window_Titles_Stats.new(@actor_index)
    @titles_stat_window.z = 120
    @titles_stat_window.width = Graphics.width - @titles_list_window.width
    @titles_stat_window.x = @titles_list_window.width
    @titles_stat_window.y = @titles_list_window.y
    @titles_stat_window.height = @titles_list_window.height
  end
  #--------------------------------------------------------------------------
  def terminate
    super
    dispose_menu_background
    @top_window.dispose
    @titles_list_window.dispose
    @titles_stat_window.dispose
    @help_window.dispose
  end
  #--------------------------------------------------------------------------
  def clone_actor
    temp_actor = @actor.clone
    temp_actor.title_id=(@actor.title_list[@titles_list_window.index])
    chp = temp_actor.base_stat_title_change(0)
    cmp = temp_actor.base_stat_title_change(1)
    catk = temp_actor.base_stat_title_change(2)
    cdef = temp_actor.base_stat_title_change(3)
    cspi = temp_actor.base_stat_title_change(4)
    cagi = temp_actor.base_stat_title_change(5)
    @array = [chp,cmp,catk,cdef,cspi,cagi]
  end
  #--------------------------------------------------------------------------
  def update
    super
    clone_actor
    @titles_list_window.update
    @titles_stat_window.refresh(@actor, @array)
    if Input.trigger?(BM::TITLES::OPTIONS[:titles_key]) or Input.trigger?(Input::B)
      return_scene
    elsif Input.trigger?(Input::C)
      if @actor.title_id == (@actor.title_list[@titles_list_window.index])
        Sound.play_buzzer
        return
      else
        Sound.play_decision
        @actor.title_id=(@actor.title_list[@titles_list_window.index])
        @titles_list_window.refresh
        @titles_stat_window.refresh(@actor, @array)
        return
      end
    elsif Input.trigger?(Input::R) or Input.trigger?(Input::RIGHT)
      next_actor
    elsif Input.trigger?(Input::L) or Input.trigger?(Input::LEFT)
      prev_actor
    end
  end
  #--------------------------------------------------------------------------
  # * Switch to Next Actor Screen
  #--------------------------------------------------------------------------
  def next_actor
    @actor_index += 1
    @actor_index %= $game_party.members.size
    $scene = Scene_Actor_Titles.new(@actor_index)
  end
  #--------------------------------------------------------------------------
  # * Switch to Previous Actor Screen
  #--------------------------------------------------------------------------
  def prev_actor
    @actor_index += $game_party.members.size - 1
    @actor_index %= $game_party.members.size
    $scene = Scene_Actor_Titles.new(@actor_index)
  end
  #--------------------------------------------------------------------------
  def return_scene
    if $imported["SceneStatusReDux"] and $game_temp.status_menu_flag
      $scene = Scene_Status.new(@actor_index, $game_temp.status_menu_index)
    elsif
      $scene = Scene_Map.new
    end
  end       
end

 
   

Thank you for your time and energy. *smile*

Title: Re: [Conversion Request] Blackmorning's Titles for VX [VX to Ace]
Post by: Neko Hibiki on February 15, 2013, 07:31:37 AM

Anypony?

Please?

I really need this one.

Title: Re: [Conversion Request] Blackmorning's Titles for VX [VX to Ace]
Post by: Neko Hibiki on April 21, 2013, 11:01:25 PM

Hello?

Title: Re: [Conversion Request] Blackmorning's Titles for VX [VX to Ace]
Post by: &&&&&&&&&&&&& on April 22, 2013, 12:53:28 AM
I'll try to do something. I coded a toaster once.

Edit: Never mind. I have no clue what I'm doing. Carry on.
Title: Re: [Conversion Request] Blackmorning's Titles for VX [VX to Ace]
Post by: Neko Hibiki on July 24, 2013, 08:05:48 PM

Oh come on, isn't there anyone willing to do this n-ow?



Title: Re: [Conversion Request] Blackmorning's Titles for VX [VX to Ace]
Post by: &&&&&&&&&&&&& on July 24, 2013, 08:32:46 PM
I can't do it right now, but I can look at it later. \
Title: Re: [Conversion Request] Blackmorning's Titles for VX [VX to Ace]
Post by: Gaming Princess Luna on August 07, 2013, 12:22:31 PM
Why you wouldn't use RPG Maker VX, if that one is a easier option?
Well I guess you can use the classes as a option for titles to characters. I'm sorry I couldn't help you with this script, because I really got no idea of how to script. /)
Title: Re: [Conversion Request] Blackmorning's Titles for VX [VX to Ace]
Post by: Neko Hibiki on August 25, 2013, 05:16:23 PM
*Sigh*

No one's willing to do this any.

Well...

*Flashes around money*

I'm willing to pay for good results.

Title: Re: [Conversion Request] Blackmorning's Titles for VX [VX to Ace]
Post by: &&&&&&&&&&&&& on August 25, 2013, 05:46:26 PM
No one's willing to do this any.

I'm willing, I just don't really know how to script. I kinda know how they work, but this isn't making any sense.

Also, I can't find the original posting of the script. That would help.
Title: Re: [Conversion Request] Blackmorning's Titles for VX [VX to Ace]
Post by: Neko Hibiki on August 28, 2013, 02:01:44 AM

I'm willing, I just don't really know how to script. I kinda know how they work, but this isn't making any sense.

Also, I can't find the original posting of the script. That would help.

Here : http://www.rpgmakervx.net/index.php?showtopic=17190&st=0&p=148728&#entry148728

Title: Re: [Conversion Request] Blackmorning's Titles for VX [VX to Ace]
Post by: Neko Hibiki on November 04, 2013, 09:25:55 PM

And no one cares anymore, do they?

Title: Re: [Conversion Request] Blackmorning's Titles for VX [VX to Ace]
Post by: Acolyte on November 05, 2013, 02:34:18 AM
If it's any consolation, I never cared in the first place :V





j/k, sorry I can't help. Have you tried contacting the original script's author?
Title: Re: [Conversion Request] Blackmorning's Titles for VX [VX to Ace]
Post by: modern algebra on February 23, 2014, 11:02:01 PM
I don't know if you're still around, but Blackmorning did make this script for VX Ace and has posted that script along with some others in the Database: Blackmorning Scripts (http://rmrk.net/index.php/topic,48651.0.html).