Stat Distribution

0 Members and 1 Guest are viewing this topic.

pokeball TDSOffline
***
Rep:
Level 84
-T D S-
Silver - GIAW 11 (Hard)Silver - Game In A Week VII
Stat Distribution
Version: 1.8
Author: TDS
Date: August 18, 2012

Version History


  • 1.0 2012.08.18 - Public Release
  • 1.8 2013.06.25 - Bug Fixes & Updates

Description


This script allows you to set and change an actor stats.

Features

  • Change character stats(Parameters).
  • Setting unique stat boosting caps for characters.
  • Setting unique stat increases for characters.

Screenshots



Instructions

Instructions are on the script.

Script


Code: [Select]
#==============================================================================
# ** TDS Stat Distribution
#    Ver: 1.8
#------------------------------------------------------------------------------
#  * Description:
#  This script allows you to set and change a character's parameters from a
#  custom menu.
#------------------------------------------------------------------------------
#  * Features:
#  Change character stats(Parameters).
#  Setting unique stat boosting caps for characters.
#  Setting unique stat increases for characters.
#------------------------------------------------------------------------------
#  * Instructions:
#
#  To gain or lose parameter points, use this in a script call from an event:
#
#    gain_param_points(actor_id, value)
#    lose_param_points(actor_id, value)
#
#    actor_id = ID of actor to gain or lose param points
#    value = amount of param points to gain or lose
#
#    Example:
#
#    gain_param_points(1, 100)   
#
#    lose_param_points(1, 50)
#
#  To set the amount of parameter change points obtained for a character, add this
#  to to the actor's note box:
#
#    <Level_UP_Change_Points: V>
#
#    V = Amount of points to gain everytime the actor levels up.
#
#    Example:
#
#    <Level_UP_Change_Points: 10>
#
#  To set the parameters that can be changed on a character add this to the
#  actor's note box:
#
#    <Change_PARAMS: P, P, P, P, P>
#
#    P = Parameter ID. The Id of the parameter from 0 to 7.
#   
#    Example:
#
#    <Change_PARAMS: 0, 1, 2, 3, 4, 5, 6, 7>
#
#  To set the amount of parameter change for spent each parameter point add this
#  to the actor's note box:
#
#    <PARAM_"PNAME"_Value: Value>
#
#    "PNAME" = Parameter short name. (HP, MP, ATK, DEF, MAT, MDF, AGI, LUK)
#    Value = Parameter change value. (Amount to increase per point)
#
#    Example:
#
#    <PARAM_HP_Value: 10>
#    <PARAM_ATK_Value: 1>
#
#  To set the parameter cap for a character, add this to the actor's note box:
#
#    <PARAM_"PNAME"_Cap: Value>
#
#    "PNAME" = Parameter short name. (HP, MP, ATK, DEF, MAT, MDF, AGI, LUK)
#    Value = Parameter cap value.
#
#    Example:
#
#    <PARAM_HP_Cap: 9999>
#    <PARAM_ATK_Cap: 300>
#------------------------------------------------------------------------------
#  * Notes:
#  Paremeter ID List:
#    0: HP - Hit Points  (HP)
#    1: MP - Magic Ponts (MP)
#    2: Attack  (ATK)
#    3: Defense (DEF)
#    4: Magic Attack Power  (MAT)
#    5: Magic Defense Power (MDF)
#    6: Agility (AGI)
#    7: Luck (LUK)
#------------------------------------------------------------------------------
# WARNING:
#
# Do not release, distribute or change my work without my expressed written
# consent, doing so violates the terms of use of this work.
#
# I also reserve the right to deny permission to any individual or group from
# using any of my work.
#
# If you really want to share my work please just post a link to the original
# site.
#
# * Not Knowing English or understanding these terms will not excuse you in any
#   way from the consequenses.
#==============================================================================
# * Import to Global Hash *
#==============================================================================
($imported ||= {})[:TDS_Stat_Distribution] = true

#==============================================================================
# ** TDS
#------------------------------------------------------------------------------
#  A module containing TDS data structures, mostly script settings.
#==============================================================================

module TDS
  #============================================================================
  # ** Stat_Change_Settings
  #----------------------------------------------------------------------------
  #  This Module contains stat change settings and setting related method.
  #============================================================================ 
  module Stat_Change_Settings
    #--------------------------------------------------------------------------
    # * Constants (Features)
    #-------------------------------------------------------------------------- 
    # Parameter Full Names
    Param_Names = ["Max HP", "Max MP","Attack", "Defense", "Magic Attack",
                   "Magic Defense", "Agility", "Luck"]
    # Parameter Help Text
    Param_Help_Text = [
    "Max value of HP.",
    "Max value of MP.",
    "Affects amount of damage dealt mainly by physical attacks.",
    "Affects amount of damage suffered mainly from physical\nattacks.",
    "Affects amount of damage dealt mainly by magic attacks.",
    "Affects amount of damage suffered mainly from magic attacks.",
    "Agility AGI Determines action order during a turn.",
    "Affects chance of adding state or debuffing a parameter ",
    ]
    # Default Parameter Cap (If nil it will use default max)
    Default_Param_Cap = {} # {0 => 9999, 1 => 999}
    # Changeable Parameters (0~7)(Parameters that can be modified)
    Changeable_Param = [*0...8]
    # Parameter Points Name
    Param_Points_Name = "Param Points"
    # Level Up Parameter Change Point Gain
    Level_Up_Param_Points_Gain = 1
    # Allow for Parameter Points to be exchanged back once spent
    Allow_Param_Point_Takeback = true
    # Parameter Gradient Bar Colors
    Param_Colors = [
      [Color.new(224, 128, 64), Color.new(240, 192, 64)],
      [Color.new(64, 128, 192), Color.new(64, 192, 240)],     
      [Color.new(46, 0, 29), Color.new(221, 0, 94)],
      [Color.new(46, 21, 0), Color.new(221, 146, 0)],
      [Color.new(2, 0, 46),  Color.new(0,221, 99)],
      [Color.new(29, 0, 46), Color.new(221, 0, 213)],
      [Color.new(63, 4, 62), Color.new(80, 138, 255)], 
      [Color.new(46, 0, 37), Color.new(221, 198, 0)], 
    ]
    #--------------------------------------------------------------------------
    # * Get Parameter Full Name
    #     parameter : parameter index
    #--------------------------------------------------------------------------
    def self.param_full_name(parameter) ; Param_Names.at(parameter) end   
    #--------------------------------------------------------------------------
    # * Get Parameter Help Text
    #     parameter : parameter index
    #--------------------------------------------------------------------------
    def self.param_help_text(parameter) ; Param_Help_Text.at(parameter) end     
    #--------------------------------------------------------------------------
    # * Get Parameter Gradient Colors
    #     parameter : parameter index
    #--------------------------------------------------------------------------
    def self.param_colors(parameter) ; Param_Colors.at(parameter) end
  end
end


#==============================================================================
# ** Game_Interpreter
#------------------------------------------------------------------------------
#  An interpreter for executing event commands. This class is used within the
# Game_Map, Game_Troop, and Game_Event classes.
#==============================================================================

class Game_Interpreter
  #--------------------------------------------------------------------------
  # * Gain or Lose Parameter Points
  #     actor_id : ID of Actor
  #     value    : parameter value
  #--------------------------------------------------------------------------
  def gain_param_points(actor_id, value = 1) ; $game_actors[actor_id].add_stat_change_point(value) end
  def lose_param_points(actor_id, value = 1) ; $game_actors[actor_id].remove_stat_change_point(value) end   
end


#==============================================================================
# ** Game_Actor
#------------------------------------------------------------------------------
#  This class handles actors. It is used within the Game_Actors class
# ($game_actors) and is also referenced from the Game_Party class ($game_party).
#==============================================================================

class Game_Actor < Game_Battler
  #--------------------------------------------------------------------------
  # * Public Instance Variables
  #--------------------------------------------------------------------------
  attr_accessor :stat_change_points       # Parameters Stat Change Points 
  attr_accessor :stat_change_spent_points # Parameters Stat Change Spent Points   
  attr_accessor :stat_change_params       # Parameters That can be modified   
  attr_accessor :stat_change_cap          # Parameters Stat Change Caps
  attr_accessor :stat_change_value        # Parameters Stat Change Increase Value
  #--------------------------------------------------------------------------
  # * Alias Listing
  #--------------------------------------------------------------------------
  alias tds_status_distribution_game_actor_setup                     setup
  alias tds_status_distribution_game_actor_level_up                  level_up
  #--------------------------------------------------------------------------
  # * Setup
  #--------------------------------------------------------------------------
  def setup(*args, &block)
    # Run Original Method
    tds_status_distribution_game_actor_setup(*args, &block)
    # Initialize Stat Changes
    init_stat_changes
  end
  #--------------------------------------------------------------------------
  # * Get Base Value of Parameter with Bonus
  #--------------------------------------------------------------------------
  def param_base_with_plus(param_id) ; param_base(param_id) + @param_plus[param_id] end
  #--------------------------------------------------------------------------
  # * Level Up
  #--------------------------------------------------------------------------
  def level_up(*args, &block)
    # Run Original Method
    tds_status_distribution_game_actor_level_up(*args, &block)
    # Add Stat Point
    add_stat_change_point(@stat_change_level_points)
  end
  #--------------------------------------------------------------------------
  # * Initialize Stat Change Values
  #--------------------------------------------------------------------------
  def init_stat_changes
    # Stat Change Points
    @stat_change_points = 0
    # Stat Change Spent Points Array
    @stat_change_spent_points = Array.new(8, 0)   
    # Setup Stat Change Parameters, Values and Changes
    setup_stat_change_parameters ; setup_stat_change_values ; setup_stat_change_caps
    setup_stat_level_up_points
  end
  #--------------------------------------------------------------------------
  # * Add/Remove Stat Change Point
  #     value : parameter index
  #--------------------------------------------------------------------------
  def add_stat_change_point(value = 1) ; @stat_change_points  = [@stat_change_points + value, 0].max end 
  #--------------------------------------------------------------------------
  # * Remove Stat Change Point
  #     value : parameter index
  #-------------------------------------------------------------------------- 
  def remove_stat_change_point(value = -1) ; add_stat_change_point(-value) end     
  #--------------------------------------------------------------------------
  # * Get Cap Value for Parameter
  #     parameter : parameter index
  #--------------------------------------------------------------------------
  def param_cap(parameter) ; @stat_change_cap.at(parameter) end
  #--------------------------------------------------------------------------
  # * Get Value Increase Per Point for Parameter
  #     parameter : parameter index
  #--------------------------------------------------------------------------
  def param_increase_value(parameter) ; @stat_change_value.at(parameter) end 
  #--------------------------------------------------------------------------
  # * Setup Stat Level Up Points (Amount to gain per level)
  #--------------------------------------------------------------------------
  def setup_stat_level_up_points
    # Amount of Stat Change Points to get per level
    @stat_change_level_points = TDS::Stat_Change_Settings::Level_Up_Param_Points_Gain
    # Match Text for Parameter Change Points per level
    actor.note[/<Level_UP_Change_Points: (\d+)>/i]
    # Set Stat Change Points Per Level UP
    @stat_change_level_points = $1.to_i if !$1.nil?
  end
  #--------------------------------------------------------------------------
  # * Setup Initial Parameter Stat Change Values (Amount to increase per level)
  #--------------------------------------------------------------------------
  def setup_stat_change_parameters
    # Stat Change Parameters (Parameters that can be changed)
    @stat_change_params = TDS::Stat_Change_Settings::Changeable_Param
    # Match Text for Change Parameters
    actor.note[/<Change_PARAMS: (.+)>/i]
    # Set Change Parameters if not nil
    @stat_change_params = $1.split(/,/).collect {|id| id.to_i} if !$1.nil?
  end
  #--------------------------------------------------------------------------
  # * Setup Initial Parameter Stat Change Values (Amount to increase per level)
  #--------------------------------------------------------------------------
  def setup_stat_change_values
    # Initialize Stat Change Increase Value (Amount to increase per level)
    @stat_change_value = Array.new(8, 1)
    # Go Through Basic Parameters
    ["HP", "MP", "ATK", "DEF", "MAT", "MDF", "AGI", "LUK"].each_with_index {|param,i|
      # Match Text for Parameter cap
      actor.note[/<PARAM_#{param}_Value: (\d+)>/i]
      # Set Stat Change Cap
      @stat_change_value[i] = $1.to_i if !$1.nil?
    }   
  end
  #--------------------------------------------------------------------------
  # * Setup Initial Parameter Stat Change Caps
  #--------------------------------------------------------------------------
  def setup_stat_change_caps
    # Create Stat Change Cap Array
    @stat_change_cap = 8.times.collect {|id|
      # Get Default Parameter Cap
      cap = TDS::Stat_Change_Settings::Default_Param_Cap[id]
      # Set Cap
      cap = cap.nil? ? param_max(id) : cap
    }   
    # Go Through Basic Parameters
    ["HP", "MP", "ATK", "DEF", "MAT", "MDF", "AGI", "LUK"].each_with_index {|param,i|
      # Match Text for Parameter cap
      actor.note[/<PARAM_#{param}_Cap: (\d+)>/i]
      # Set Stat Change Cap
      @stat_change_cap[i] = $1.to_i if !$1.nil?
    }
  end
end


#==============================================================================
# ** Scene_Status_Distribution
#------------------------------------------------------------------------------
#  This class performs the status distribution processing.
#==============================================================================

class Scene_Status_Distribution < Scene_MenuBase
  #--------------------------------------------------------------------------
  # * Start Processing
  #--------------------------------------------------------------------------
  def start
    super
    # Create Windows
    create_help_window ; create_actor_status_window ; create_actor_stat_points_window
    create_controls_window ; create_status_change_window ; create_status_change_prompt_window ;
  end
  #--------------------------------------------------------------------------
  # * Create Actor Status Window
  #--------------------------------------------------------------------------
  def create_actor_status_window
    # Create Actor Status Window
    @actor_status_window = Window_Stat_Actor_Status.new(@actor)
    @actor_status_window.y = @help_window.y + @help_window.height   
  end
  #--------------------------------------------------------------------------
  # * Create Actor Stat Points Window
  #--------------------------------------------------------------------------
  def create_actor_stat_points_window
    # Create Actor Stat Point Window
    @actor_stat_points_window = Window_Stat_Actor_Points.new(@actor) 
    @actor_stat_points_window.y = @actor_status_window.y + @actor_status_window.height
  end 
  #--------------------------------------------------------------------------
  # * Create Controls Window
  #--------------------------------------------------------------------------
  def create_controls_window
    # Create Controls Window
    @controls_window = Window_Stat_Change_Controls.new
    @controls_window.y = @actor_stat_points_window.y + @actor_stat_points_window.height
  end
  #--------------------------------------------------------------------------
  # * Create Actor Status Change
  #--------------------------------------------------------------------------
  def create_status_change_window 
    # Create Status Change Window
    @status_change_window = Window_Stat_Status_Change.new(@actor)
    # Set Status Change Windows
    @status_change_window.help_window = @help_window   
    @status_change_window.point_window = @actor_stat_points_window
    # Set Status Change Window Handler
    @status_change_window.set_handler(:ok,       method(:start_stat_change_prompt))       
    @status_change_window.set_handler(:cancel,   method(:return_scene))   
    @status_change_window.set_handler(:pagedown, method(:next_actor))
    @status_change_window.set_handler(:pageup,   method(:prev_actor))
  end
  #--------------------------------------------------------------------------
  # * Create Status Change Prompt Window
  #--------------------------------------------------------------------------
  def create_status_change_prompt_window
    # Create Stat Change Prompt Window
    @stat_change_prompt_window = Window_Stat_Change_Prompt.new
    # Center Stat Change Window
    @stat_change_prompt_window.x = (Graphics.width - @stat_change_prompt_window.width) / 2
    @stat_change_prompt_window.y = (Graphics.height - @stat_change_prompt_window.height) / 2   
    # Deactivate and Close Stat Change Prompt Window
    @stat_change_prompt_window.deactivate.openness = 0
    # Set Status Change Prompt Window Handler
    @stat_change_prompt_window.set_handler(:ok,     method(:on_stat_change_prompt_ok))
    @stat_change_prompt_window.set_handler(:cancel, method(:on_stat_change_prompt_cancel))   
    @stat_change_prompt_window.set_handler(:clear, method(:on_stat_change_prompt_clear))       
  end
  #--------------------------------------------------------------------------
  # * Start Stat Change Prompt
  #--------------------------------------------------------------------------
  def start_stat_change_prompt
    # Activate and Open Stat Change Prompt Window
    @stat_change_prompt_window.activate.open   
    # Select (No)
    @stat_change_prompt_window.select(1)
  end
  #--------------------------------------------------------------------------
  # * [OK] Stat Change Prompt Command
  #--------------------------------------------------------------------------
  def on_stat_change_prompt_ok
    # Close Stat Change Prompt Window
    @stat_change_prompt_window.close   
    # Apply Stat Changes
    apply_stat_changes
  end
  #--------------------------------------------------------------------------
  # * [Cancel] Stat Change Prompt Command
  #--------------------------------------------------------------------------
  def on_stat_change_prompt_cancel
    # Close Stat Change Prompt Window
    @stat_change_prompt_window.close
    # Activate Status Change Window
    @status_change_window.activate
  end
  #--------------------------------------------------------------------------
  # * [Clear] Stat Change Prompt Command
  #--------------------------------------------------------------------------
  def on_stat_change_prompt_clear
    # Clear Status Change Stat Changes and Redraw it's contents
    @status_change_window.clear_stat_changes ; @status_change_window.refresh
    # Refresh Actor Status and Actor Stat Point Window
    @actor_status_window.refresh ; @actor_stat_points_window.refresh
    # Process Stat Change Prompt Cancel
    on_stat_change_prompt_cancel
  end
  #--------------------------------------------------------------------------
  # * Apply Stat Changes
  #--------------------------------------------------------------------------
  def apply_stat_changes
    # Apply Status Changes on Actor
    @status_change_window.apply_stat_changes
    # Refresh Actor Status and Actor Stat Point Window
    @actor_status_window.refresh ; @actor_stat_points_window.refresh
  end
  #--------------------------------------------------------------------------
  # * Change Actors
  #--------------------------------------------------------------------------
  def on_actor_change
    super
    # Set Actor for Status, Point and Status Change Windows
    @actor_status_window.actor = @actor_stat_points_window.actor =
    @status_change_window.actor = @actor
    # Reactivate Status Change Window
    @status_change_window.activate
  end
end


#==============================================================================
# ** Window_Stat_Actor_Status
#------------------------------------------------------------------------------
#  This window display actor information in the status distribution scene.
#==============================================================================

class Window_Stat_Actor_Status < Window_Base
  #--------------------------------------------------------------------------
  # * Object Initialization
  #     actor : actor object
  #--------------------------------------------------------------------------
  def initialize(actor)
    super(0, 0, 250, 200)
    # Set Actor
    @actor = actor
    refresh
  end
  #--------------------------------------------------------------------------
  # * Set Actor
  #     actor : actor object
  #--------------------------------------------------------------------------
  def actor=(actor) ; @actor = actor ; refresh end 
  #--------------------------------------------------------------------------
  # * Refresh
  #--------------------------------------------------------------------------
  def refresh
    contents.clear
    # Return if Actor is nil
    return if @actor.nil?
    # Draw Actor Face
    draw_actor_face(@actor, 0, 0)   
    # Draw Actor Name & Level
    draw_actor_name(@actor, 100, 0) ; draw_actor_level(@actor, 100, line_height)
    # Draw Actor HP & MP
    draw_actor_hp(@actor, 100, line_height * 2) ; draw_actor_mp(@actor, 100, line_height * 3)   
    # Draw Actor Parameters
    draw_parameters(0, 100)
  end
  #--------------------------------------------------------------------------
  # * Draw Parameters
  #--------------------------------------------------------------------------
  def draw_parameters(x, y)
    6.times {|i|
      # Get X And Y Coordinate Position
      x2 = x + (i % 2) * 120 ; y2 = y + (i / 2) * line_height
      # Fill Stat Back Bar
      contents.fill_rect(x2, y2 + 2, 105, 20,  Color.new(32, 32, 64, 160))
      # Draw Actor Parameters
      draw_actor_param(@actor, x2, y2, i + 2)
    }
  end
  #--------------------------------------------------------------------------
  # * Draw Parameters
  #--------------------------------------------------------------------------
  def draw_actor_param(actor, x, y, param_id)
    change_color(system_color)
    draw_text(x, y, 120, line_height, Vocab::param(param_id))
    change_color(normal_color)
    draw_text(x + 120 - 50, y, 36, line_height, actor.param(param_id), 2)
  end
  #--------------------------------------------------------------------------
  # * Draw Actor Face Graphic
  #--------------------------------------------------------------------------
  def draw_actor_face(actor, x, y, enabled = true)
    # Fill Face Back
    contents.fill_rect(x, y, 96, 96,  Color.new(32, 32, 64, 160))
    super
  end 
end


#==============================================================================
# ** Window_Stat_Actor_Points
#------------------------------------------------------------------------------
#  This window display actor parameter stat change points
#==============================================================================

class Window_Stat_Actor_Points < Window_Base
  #--------------------------------------------------------------------------
  # * Object Initialization
  #     actor : actor object
  #--------------------------------------------------------------------------
  def initialize(actor)
    super(0, 0, 250, fitting_height(1))
    # Set Actor
    @actor = actor       
    # Draw Window contents
    refresh
  end
  #--------------------------------------------------------------------------
  # * Set Actor
  #     actor : actor object
  #--------------------------------------------------------------------------
  def actor=(actor) ; @actor = actor ; refresh end
  #--------------------------------------------------------------------------
  # * Refresh
  #--------------------------------------------------------------------------
  def refresh
    # Clear Contents
    contents.clear
    # Return if Actor is nil
    return if @actor.nil?
    # Draw Actor Stat Change Points
    draw_points(@actor.stat_change_points)
  end
  #--------------------------------------------------------------------------
  # * Draw Points
  #     points : points value
  #--------------------------------------------------------------------------
  def draw_points(points)
    # Clear Contents
    contents.clear
    # Change Color to System Color
    change_color(system_color)
    # Draw Parameter Points Header
    draw_text(0, 0, 200, line_height, TDS::Stat_Change_Settings::Param_Points_Name + ":")
    # Reset Font Settings
    reset_font_settings
    # Draw Points
    draw_text(0, 0, contents_width, line_height, points, 2)       
  end
end


#==============================================================================
# ** Window_Stat_Change_Controls
#------------------------------------------------------------------------------
#  This window display the basic controls of the stat change scene.
#==============================================================================

class Window_Stat_Change_Controls < Window_Base
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize
    super(0, 0, 250, fitting_height(3))
    # Draw Window contents
    refresh
  end
  #--------------------------------------------------------------------------
  # * Refresh
  #--------------------------------------------------------------------------
  def refresh
    # Clear Contents
    contents.clear
    # Change Font Color & Draw Controls Header
    change_color(system_color) ; draw_text(0, 0, 250, 24, "Controls")
    # Reset Font Settings
    reset_font_settings
    draw_text(0, 24, 250, 24, "?: Increase Stat")   
    draw_text(0, 48, 250, 24, "?: Decrease Stat") if TDS::Stat_Change_Settings::Allow_Param_Point_Takeback
  end
end

#==============================================================================
# ** Window_Stat_Change_Prompt
#------------------------------------------------------------------------------
#  This window display a prompt before changing stats.
#==============================================================================

class Window_Stat_Change_Prompt < Window_HorzCommand
  #--------------------------------------------------------------------------
  # * Object Initialization
  #     actor : actor object
  #--------------------------------------------------------------------------
  def initialize ; super(0, 0) end
  #--------------------------------------------------------------------------
  # * Get Window Width
  #--------------------------------------------------------------------------
  def window_width ; 240 end
  #--------------------------------------------------------------------------
  # * Get Window Width
  #--------------------------------------------------------------------------
  def window_height ; fitting_height(2) end   
  #--------------------------------------------------------------------------
  # * Calculate Height of Window Contents
  #--------------------------------------------------------------------------
  def contents_height ; height - standard_padding * 2 end   
  #--------------------------------------------------------------------------
  # * Get Digit Count
  #--------------------------------------------------------------------------
  def col_max ; 3 end
  #--------------------------------------------------------------------------
  # * Get Rectangle for Displaying Items
  #--------------------------------------------------------------------------
  def item_rect(index) ; rect = super ; rect.y = line_height ; rect end   
  #--------------------------------------------------------------------------
  # * Create Command List
  #--------------------------------------------------------------------------
  def make_command_list
    # Add Yes & No and Clear Commands
    add_command("Yes", :ok) ; add_command("No", :cancel) ; add_command("Clear", :clear)
  end
  #--------------------------------------------------------------------------
  # * Refresh
  #--------------------------------------------------------------------------
  def refresh
    super
    change_color(knockout_color)
    # Prompt Message
    draw_text(0, 0, contents_width, line_height, "Change stats?", 1)
  end
end


#==============================================================================
# ** Window_Stat_Status_Change
#------------------------------------------------------------------------------
#  This window display and selects actor information in the status distribution
#  scene.
#==============================================================================

class Window_Stat_Status_Change < Window_Selectable
  #--------------------------------------------------------------------------
  # * Object Initialization
  #     actor : actor object
  #--------------------------------------------------------------------------
  def initialize(actor)
    # Set Actor
    @actor = actor       
    super(250, 72, (Graphics.width - 250), 344)
    # Clear Stat Changes
    clear_stat_changes
    # Activate and draw window contents
    activate.refresh
    # Select First
    select(0)
  end
  #--------------------------------------------------------------------------
  # * Set Actor
  #     actor : actor object
  #--------------------------------------------------------------------------
  def actor=(actor) ; @actor = actor ; clear_stat_changes ; refresh end
  #--------------------------------------------------------------------------
  # * Set Point Window
  #     window : window object
  #--------------------------------------------------------------------------
  def point_window=(window) ; @point_window = window end
  #--------------------------------------------------------------------------
  # * Clear Stat Change Related Values
  #--------------------------------------------------------------------------
  def clear_stat_changes
    # Stat Changes Array
    @stat_changes = Array.new(8, 0)
    # Temporary Spent Change Points
    @temp_spent_change_points = Array.new(8, 0)
    # Temporary Stat Change Points
    @temp_stat_change_points = 0
  end
  #--------------------------------------------------------------------------
  # * Apply Stat Changes
  #--------------------------------------------------------------------------
  def apply_stat_changes   
    # Apply Stat Changes
    @stat_changes.each_with_index {|value, i|
      # Next if value is 0
      next if value == 0
      # Get Parameter Total Value
      param_total = (@actor.param_base_with_plus(i) + value)
      param_adjust = param_total - @actor.param_cap(i)     
      # Adjust Parameter for cap if Necessary
      value -= param_adjust if param_adjust > 0
      # Add Actor Bonus Parameter
      @actor.add_param(i, value)
      # Set Actor Stat Change Spent Points
      @actor.stat_change_spent_points[i] += @temp_spent_change_points.at(i)
    }
    # Decrease Actor Stat Change Points
    @actor.stat_change_points -= @temp_stat_change_points
    # Clear Stat Changes
    clear_stat_changes
    # Activate and Refresh
    activate.refresh
  end
  #--------------------------------------------------------------------------
  # * Get Number of Items
  #--------------------------------------------------------------------------
  def item_max ; @actor.stat_change_params.size end
  #--------------------------------------------------------------------------
  # * Get Item Height
  #--------------------------------------------------------------------------
  def item_height ; 53 end
  #--------------------------------------------------------------------------
  # * Get Temporary Remaining Actor Poins
  #--------------------------------------------------------------------------
  def actor_points_left ; (@actor.stat_change_points - @temp_stat_change_points) end
  #--------------------------------------------------------------------------
  # * Get Actor Parameter ID
  #--------------------------------------------------------------------------
  def actor_param_id(index = @index) ; @actor.stat_change_params.at(index) end   
  #--------------------------------------------------------------------------
  # * Move Cursor Right
  #--------------------------------------------------------------------------
  def cursor_right(wrap = false)
    super(wrap)
    # Return if No More Points can be added
    return if (@actor.stat_change_points - @temp_stat_change_points) <= 0
    # Get Parameter Total Value
    param_total = (@actor.param_base_with_plus(actor_param_id) + @stat_changes[actor_param_id])
   
    # Return if Parameter Total with change exceeds cap
    return if param_total >= @actor.param_cap(actor_param_id)
    # Increase Parameter and Temp Stat Change Points
    @stat_changes[actor_param_id] += @actor.param_increase_value(actor_param_id) ; @temp_stat_change_points += 1   
    # Increase Temporary Spent Points
    @temp_spent_change_points[actor_param_id] += 1   
    # Redraw Current Item
    redraw_current_item
    # Draw Actor Remaining Points in point window if it's not nil
    @point_window.draw_points(actor_points_left) if !@point_window.nil?
  end
  #--------------------------------------------------------------------------
  # * Move Cursor Left
  #--------------------------------------------------------------------------
  def cursor_left(wrap = false)
    super(wrap)
    # If Parameter Point Take back is allowed
    if TDS::Stat_Change_Settings::Allow_Param_Point_Takeback
      # If Temporary Spent Change Points is less than 0
      if @temp_spent_change_points.at(actor_param_id) <= 0
        # Return if Cannot Get back anymore points
        return if (@actor.stat_change_spent_points.at(actor_param_id) + @temp_spent_change_points.at(actor_param_id)) <= 0
      end
    else
      # Return if Stat Change is 0 or less
      return if @stat_changes.at(actor_param_id) <= 0
    end
    # Decrease Stat Changes
    @stat_changes[actor_param_id] -= @actor.param_increase_value(actor_param_id) ; @temp_stat_change_points -= 1
    # Decrease Temporary Spent Points
    @temp_spent_change_points[actor_param_id] -= 1   
    # Redraw Current Item
    redraw_current_item
    # Draw Actor Remaining Points in point window if it's not nil
    @point_window.draw_points(actor_points_left) if !@point_window.nil?   
  end
  #--------------------------------------------------------------------------
  # * Processing When OK Button Is Pressed
  #--------------------------------------------------------------------------
  def process_ok
    # Return if there are no stat changes
    return if !@stat_changes.any? {|s| s != 0}
    super
  end
  #--------------------------------------------------------------------------
  # * Update Help Text
  #--------------------------------------------------------------------------
  def update_help
    super
    # Draw Parameter Help Text
    @help_window.set_text(TDS::Stat_Change_Settings.param_help_text(actor_param_id))
  end
  #--------------------------------------------------------------------------
  # * Draw Item
  #--------------------------------------------------------------------------
  def draw_item(index)
    # Reset Font Settings
    reset_font_settings
    # Get Item Rect
    rect = item_rect(index)
    rect.x += 4 ; rect.height = 24 ; rect.width -= 8
    draw_text(rect, TDS::Stat_Change_Settings.param_full_name(actor_param_id(index)))       
    rect.y += 24
    # Fill Bar Borders
    contents.fill_rect(rect, Color.new(0, 0, 0))
    rect.x += 1 ; rect.y += 1 ; rect.width -= 2 ; rect.height -= 2
    # Fill Bar Background
    contents.fill_rect(rect, gauge_back_color)   
    # Get Parameter
    parameter = @actor.param_base_with_plus(actor_param_id(index))
    # Get Parameter % Rate
    rate = parameter.to_f / @actor.param_cap(index) * 100
    # Adjust Width by Rate
    rect.width = (rect.width * rate) / 100.0
    # Fill Bar Color
    contents.gradient_fill_rect(rect, *TDS::Stat_Change_Settings.param_colors(actor_param_id(index)))
    rect.width = contents_width - 8
    # Draw Parameter Value
    draw_text(rect, parameter, 2)
    rect.y -= 24
    # If Stat Change is less than 0
    if @stat_changes.at(actor_param_id(index)) < 0   
      # Change Color to Power Down Color
      change_color(power_down_color)     
      draw_text(rect, "#{@stat_changes.at(actor_param_id(index))}", 2)
    elsif @stat_changes.at(actor_param_id(index)) > 0
      # Change Color to Power UP Color
      change_color(power_up_color)
      # Get Parameter ID
      param_id = actor_param_id(index)
      # Get Total
      total = @actor.param_base_with_plus(param_id) + @stat_changes.at(param_id)
      # Get Parameter Max
      param_max = [total, @actor.param_cap(param_id)].min - @actor.param_base_with_plus(param_id)
      # Draw Parameter Max
      draw_text(rect, "+#{param_max}", 2)     
    end   
  end
end

Add-on for menu use:

Code: [Select]
#==============================================================================
# ** Window_MenuCommand
#------------------------------------------------------------------------------
#  This command window appears on the menu screen.
#==============================================================================

class Window_MenuCommand < Window_Command
  #--------------------------------------------------------------------------
  # * Alias Listing
  #-------------------------------------------------------------------------- 
  alias tds_status_distribution_window_menucommand_add_original_commands add_original_commands
  #--------------------------------------------------------------------------
  # * For Adding Original Commands
  #--------------------------------------------------------------------------
  def add_original_commands(*args, &block)
    # Run Original Method
    tds_status_distribution_window_menucommand_add_original_commands(*args, &block)
    # Add Stat Distribution Command
    add_command("Stat Change", :stat_change)
  end
end


#==============================================================================
# ** Scene_Menu
#------------------------------------------------------------------------------
#  This class performs the menu screen processing.
#==============================================================================

class Scene_Menu < Scene_MenuBase
  #--------------------------------------------------------------------------
  # * Alias Listing
  #-------------------------------------------------------------------------- 
  alias tds_status_distribution_scene_menu_create_command_window create_command_window
  alias tds_status_distribution_scene_menu_on_personal_ok        on_personal_ok
  #--------------------------------------------------------------------------
  # * Create Command Window
  #--------------------------------------------------------------------------
  def create_command_window(*args, &block)
    # Run Original Method
    tds_status_distribution_scene_menu_create_command_window(*args, &block)
    # Set Command Window Handlers
    @command_window.set_handler(:stat_change, method(:command_personal))   
  end
  #--------------------------------------------------------------------------
  # * [OK] Personal Command
  #--------------------------------------------------------------------------
  def on_personal_ok(*args, &block)
    # Run Original Method
    tds_status_distribution_scene_menu_on_personal_ok(*args, &block)
    # Command Window Current Symbol Case
    case @command_window.current_symbol
    when :stat_change ; SceneManager.call(Scene_Status_Distribution)
    end
  end   
end


Credit


  • TDS

Thanks

  • Archeia for requesting and testing.

Support


On this topic.

Known Compatibility Issues

None that I am aware of so far.

Author's Notes


This is meant to be a simple stat/attribute changing system, so I probably won't be adding too many complex features in the future, but feel free to suggest.

Terms of Use

Only for use in non-commercial games.
« Last Edit: June 26, 2013, 02:07:27 AM by TDS »

*
Rep:
Level 97
2014 Best RPG Maker User - Engine2014 Most Unsung Member2013 Best RPG Maker User (Scripting)2012 Favorite Staff Member2012 Most Mature Member2012 Best RPG Maker User (Scripting)2012 Best MemberSecret Santa 2012 ParticipantProject of the Month winner for July 20092011 Best RPG Maker User (Scripting)2011 Best Veteran2011 Favourite Staff Member2011 Most Mature Member2011 Best Use of Avatar and Signature Space2010 Favourite Staff Member2010 Most Mature Member
That's a very pretty design TDS. It looks great!

**
Rep:
Level 66
~RTP Princess~
There seems to be an issue of the points not carrying over from a restart. So, say you have access to this screen at all times, you can't save, then come back and use it because the points you had before the save are gone after reloading. ^.^

That said, it's a very smooth, pretty script and I love it~<3



**
Rep:
Level 57
RMRK Junior
EDIT : I got this bug when my character level up, the game just crash.
« Last Edit: February 13, 2013, 02:21:43 AM by Chaos17 »

*
Rep: +0/-0Level 54
RMVXA Noodler
Dude, thank you sooooo much for this script! I've been messing around for days trying to sort out a way to increase stats via a custom shop but results were far too ineligant to be  happy with and while I'd still like a "mentor" character to be involved in the distribution process this menu window set up does exactly what I want in a perfectly simple form and for the level of customization made available is unbelievably easy to use, you ROCK man!
Courage over fear

pokeball TDSOffline
***
Rep:
Level 84
-T D S-
Silver - GIAW 11 (Hard)Silver - Game In A Week VII
Glad to see you like it and thank you for posting because it reminded that I had not updated the script on this forum.

The new version fixes a lot of the problems that had been reported.