RPG Maker Forums

Victor Sant is undoubtedly good with scripts, but I think he explains things as if everyone is just as good as he is.

This is his Character Control Script, it's supposed to make it so that when your character runs, walks, or is idle you can have an animation trigger for each event. This is exactly what I've been looking for, and I hope that maybe this post helps others. 

When you're walking, a specific sprite sheet with walking animations will trigger. When running, a sprite sheet with running animations will trigger, etc. At least I think that's how it works.

I've tried asking victor himself for clarifications, but it's as if he's insulted that I cant understand using only his instructions, which is ridiculous. 

What I'm pretty much wondering is, after you make the running, walking and idle sprite sheets, how in the world do you enable them in game? The only thing that makes sense to me here is adding the [wlk] suffix and the like to your sprite sheet name. That makes sense, but I know that I need to do more to activate them.

Can anyone give me some step by step instructions like: After you make your sprite sheets, do this/enable this/type this, whatever. If anyone can take the time to do this thank you so much. 

Here it is.   

#==============================================================================# ** Victor Engine - Character Control

#------------------------------------------------------------------------------

# Author : Victor Sant

#

# Version History:

#  v 1.00 - 2012.01.04 > First release

#  v 1.01 - 2012.01.07 > Added Compatibility with Visual Equipment

#  v 1.02 - 2012.01.14 > Fixed the positive sign on some Regular Expressions

#  v 1.03 - 2012.01.15 > Fixed the Regular Expressions problem with "" and “”

#  v 1.04 - 2012.07.25 > Fixed Compatibility with Visual Equipment and

#                      > Diagonal Movement

#  v 1.05 - 2012.08.02 > Compatibility with Basic Module 1.27

#------------------------------------------------------------------------------

#  This script allows to control character chaset animations. You can set

# different graphis for walking, dashing and jumping, also you can display

# pose animations with simple comment call. This allows to animate characters

# on the map without the need of long Move Route event commands.

#------------------------------------------------------------------------------

# Compatibility

#   Requires the script 'Victor Engine - Basic Module' v 1.27 or higher

#   If used with 'Victor Engine - Multi Frames' place this bellow it.

#   If used with 'Victor Engine - Visual Equip' place this bellow it.

#   If used with 'Victor Engine - Diagonal Movement' place this bellow it.

#

# * Overwrite methods

#   class Game_CharacterBase

#     def update_animation

#

# * Alias methods

#   class Game_CharacterBase

#     def update_animation

#     def init_public_members

#     def init_private_members

#     def update_anime_count

#     def update_anime_pattern

#     def move_straight(d, turn_ok = true)

#     def move_diagonal(horz, vert)

#     def update_move

#     def update_jump

#     def update_stop

#

#   class Game_Interpreter

#     def comment_call

#

#   class Sprite_Character < Sprite_Base

#     def graphic_changed?

#     def update_character_info

#     def set_bitmap_name

#     def set_bitmap_position

#

#------------------------------------------------------------------------------

# Comment calls note tags:

#  Tags to be used in events comment box, works like a script call.

#

#  <actor change pose>      <event change pose>

#  settings                 settings    

#  </actor change pose>     </event change pose>

#   Display a custom pose, the pose overide any other pose being currently

#   played, add the following values to the settings. The ID must be added, 

#   other values are optional. 

#     id: x     : actor index or event ID

#     name: "x" : pose sufix name. ("sufix")

#     loop      : pose animation loop, if added the pose will repeat.

#     lock      : position lock, can't move while playing the pose.

#     walk      : walking pose, if not set the pose will stop if walk.

#     speed: x  : pose animation speed, higher values makes the animation slow.

#     frame: x  : number of frams, can't exceed the max frames of the charset.

#

#  <actor add pose>      <event add pose>

#  settings              settings    

#  </actor add pose>     </event add pose>

#   Display a custom pose, the pose won't be displayed immediately, if there is

#   another pose being displayed, it will wait it finish before, you can

#   add multiple poses at once to make a long animation, add the following

#   values to the settings. The ID must be added, other values are optional. 

#     id: x     : actor index or event ID

#     name: "x" : pose sufix name. ("sufix")

#     loop      : pose animation loop, if added the pose will repeat.

#     lock      : position lock, can't move while playing the pose.

#     walk      : walking pose, if not set the pose will stop if walk.

#     speed: x  : pose animation speed, higher values makes the animation slow.

#     frame: x  : number of frams, can't exceed the max frames of the charset.

#

#  <actor idle stance i: "x">   <event idle stance i: "x">

#  <actor walk stance i: "x">   <event walk stance i: "x">

#  <actor dash stance i: "x">   <event dash stance i: "x">

#  <actor jump stance i: "x">   <event jump stance i: "x">

#   Change the stance for one of the default pose for the actor or event.

#     i : actor index or event ID

#     x : pose sufix name ("sufix")

#

#  <actor clear stances: i>   <event clear stances: i>

#   Clear all changed stances for the actor or event

#     i : actor index or event ID

#

#  <actor clear pose: i>   <event clear pose: i>

#   Clear halts the current pose exhibition and clear all pose waiting to be

#   played.

#     i : actor index or event ID

#

#------------------------------------------------------------------------------

# Additional instructions:

#  

#  To properly display the poses you will need a character with the poses.

#  You will need to make a new charset, with the same filename + the sufix.

#

#  So if you have a chaset named "Actor1", you will need a charset named

#  "Actor1[wlk]" (or whatever you set as the Walk sufix) if you want

#  a custom walking pose.

#

#  If a pose graphic don't exist, it will use the default graphic.



#  If you make a pose loops, it will be displayed continuously until something

#  force it to stop. It may be a movement (only if the settings doesn't include

#  the 'walk' option), a pose change, or clear pose.

#

#  Due to the animated frame, the charset may be off the tile center, you

#  can solve that by adding [x*] or [y*] to the filename, where * is a number

#  positive or negative,that way the position will be adjusted. it must be

#  added before any other sufix

#

#  if used with 'Victor Engine - Diagonal Movement' the diagonal movement

#  sufix must come before the pose sufix.

#

#  The general order for the sufixes is: filename[x*][y*][diag][pose]

#

#==============================================================================

 

#==============================================================================

# ** Victor Engine

#------------------------------------------------------------------------------

#   Setting module for the Victor Engine

#==============================================================================

 

module Victor_Engine

  #--------------------------------------------------------------------------

  # * Default waling pose sufix

  #--------------------------------------------------------------------------

  VE_DEFAULT_WALK_SUFIX = "[wlk]"

  #--------------------------------------------------------------------------

  # * Default dashing pose sufix

  #--------------------------------------------------------------------------

  VE_DEFAULT_DASH_SUFIX = "[dsh]"

  #--------------------------------------------------------------------------

  # * Default jumping pose sufix

  #--------------------------------------------------------------------------

  VE_DEFAULT_JUMP_SUFIX = "[jmp]"

  #--------------------------------------------------------------------------

  # * required

  #   This method checks for the existance of the basic module and other

  #   VE scripts required for this script to work, don't edit this

  #--------------------------------------------------------------------------

  def self.required(name, req, version, type = nil)

    if !$imported[:ve_basic_module]

      msg = "The script '%s' requires the script\n"

      msg += "'VE - Basic Module' v%s or higher above it to work properly\n"

      msg += "Go to http://victorscripts.wordpress.com/ to download this script."

      msgbox(sprintf(msg, self.script_name(name), version))

      exit

    else

      self.required_script(name, req, version, type)

    end

  end

  #--------------------------------------------------------------------------

  # * script_name

  #   Get the script name base on the imported value, don't edit this

  #--------------------------------------------------------------------------

  def self.script_name(name, ext = "VE")

    name = name.to_s.gsub("_", " ").upcase.split

    name.collect! {|char| char == ext ? "#{char} -" : char.capitalize }

    name.join(" ")

  end

end

 

$imported ||= {}

$imported[:ve_character_control] = 1.05

Victor_Engine.required:)ve_character_control, :ve_basic_module, 1.27, :above)

 

#==============================================================================

# ** Game_CharacterBase

#------------------------------------------------------------------------------

#  This class deals with characters. Common to all characters, stores basic

# data, such as coordinates and graphics. It's used as a superclass of the

# Game_Character class.

#==============================================================================

 

class Game_CharacterBase

  #--------------------------------------------------------------------------

  # * Public Instance Variables

  #--------------------------------------------------------------------------

  attr_reader   :pose_sufix

  attr_accessor :pose_list

  attr_accessor :idle_stance

  attr_accessor :walk_stance

  attr_accessor :dash_stance

  attr_accessor :jump_stance

  #--------------------------------------------------------------------------

  # * Overwrite method: update_animation

  #--------------------------------------------------------------------------

  def update_animation

    update_anime_count

    if (@pose_speed != 0 && @anime_count > @pose_speed) ||

       (@pose_speed == 0 && @anime_count > 18 - real_move_speed * 2)

      update_anime_pattern

      @anime_count = 0

      change_pose(idle_stance) if @pattern == 0 && @playing_pose && !@pose_loop

    end

  end

  #--------------------------------------------------------------------------

  # * Alias method: init_public_members

  #--------------------------------------------------------------------------

  alias :init_public_members_ve_character_control :init_public_members

  def init_public_members

    init_public_members_ve_character_control

    @pose_list  = []

    @pose_sufix = ""

    clear_stances

  end

  #--------------------------------------------------------------------------

  # * Alias method: init_private_members

  #--------------------------------------------------------------------------

  alias :init_private_members_ve_character_control :init_private_members

  def init_private_members

    init_private_members_ve_character_control

    change_pose(idle_stance)

  end

  #--------------------------------------------------------------------------

  # * Alias method: update_anime_count

  #--------------------------------------------------------------------------

  alias :update_anime_count_ve_character_control :update_anime_count

  def update_anime_count

    if @playing_pose

      @anime_count += 1.5

    else

      update_anime_count_ve_character_control

    end

  end

  #--------------------------------------------------------------------------

  # * Alias method: update_anime_pattern

  #--------------------------------------------------------------------------

  alias :update_anime_pattern_ve_character_control :update_anime_pattern

  def update_anime_pattern

    if @playing_pose

      @pattern = (@pattern + 1) % [frames, @pose_frame].min

    else

      update_anime_pattern_ve_character_control

    end

  end

  #--------------------------------------------------------------------------

  # * Alias method: move_straight

  #--------------------------------------------------------------------------

  alias :move_straight_ve_character_control :move_straight

  def move_straight(d, turn_ok = true)

    return if @pose_lock

    move_straight_ve_character_control(d, turn_ok)

    set_fixed_direction if @pose_direction

  end

  #--------------------------------------------------------------------------

  # * Alias method: move_diagonal

  #--------------------------------------------------------------------------

  alias :move_diagonal_ve_character_control :move_diagonal

  def move_diagonal(horz, vert)

    return if @pose_lock

    move_diagonal_ve_character_control(horz, vert)

    set_fixed_direction if @pose_direction

  end

  #--------------------------------------------------------------------------

  # * Alias method: update_move

  #--------------------------------------------------------------------------

  alias :update_move_ve_character_control :update_move

  def update_move

    moving_pose

    update_move_ve_character_control

  end

  #--------------------------------------------------------------------------

  # * Alias method: update_jump

  #--------------------------------------------------------------------------

  alias :update_jump_ve_character_control :update_jump

  def update_jump

    jumping_pose

    update_jump_ve_character_control

  end

  #--------------------------------------------------------------------------

  # * Alias method: update_stop

  #--------------------------------------------------------------------------

  alias :update_stop_ve_character_control :update_stop

  def update_stop

    update_stop_ve_character_control

    resting_pose

  end

  #--------------------------------------------------------------------------

  # * New method: resting_pose

  #--------------------------------------------------------------------------

  def resting_pose

    return if @stop_count <= 1 || @playing_pose

    change_pose(idle_stance) if pose_sufix != idle_stance

  end

  #--------------------------------------------------------------------------

  # * New method: jumping_pose

  #--------------------------------------------------------------------------

  def jumping_pose

    return if @pose_lock || @pose_walk

    change_pose(jump_stance) if pose_sufix != jump_stance

  end

  #--------------------------------------------------------------------------

  # * New method: moving_pose

  #--------------------------------------------------------------------------

  def moving_pose

    return if @pose_lock || @pose_walk

    @pose_list.clear

    change_pose(walk_stance) if pose_sufix != walk_stance && !dash?

    change_pose(dash_stance) if pose_sufix != dash_stance && dash?

  end

  #--------------------------------------------------------------------------

  # * New method: change_pose

  #--------------------------------------------------------------------------

  def change_pose(sufix)

    @playing_pose = false 

    reset_fixed_pose if @pose_direction

    value = {sufix: sufix, anim: 0, speed: 0, frame: frames}

    update_pose(value)

  end

  #--------------------------------------------------------------------------

  # * New method: reset_pose_index

  #--------------------------------------------------------------------------

  def reset_pose_index

    @character_index = @real_index

    @pose_index = nil

  end

  #--------------------------------------------------------------------------

  # * New method: reset_fixed_pose

  #--------------------------------------------------------------------------

  def reset_fixed_pose

    @direction = @real_direction

    @diagonal  = @real_diagonal if $imported[:ve_diagonal_move]

    @current_direction = @direction - 2 if $imported[:ve_roatation_turn]

    @final_direction   = @direction - 2 if $imported[:ve_roatation_turn]

    update_direction if $imported[:ve_roatation_turn]

    @pose_direction = nil

  end

  #--------------------------------------------------------------------------

  # * New method: update_pose

  #--------------------------------------------------------------------------

  def update_pose(pose = default_pose.dup)

    pose = get_next_pose(pose)

    @pose_sufix = pose[:sufix]

    @pose_speed = pose[:speed]

    @pose_frame = pose[:frame]

    @pose_walk  = pose[:walk]

    @pose_loop  = pose[:loop]

    @pose_lock  = pose[:lock] && @playing_pose

    @pose_direction = pose[:line] * 2 if pose[:line]

    @real_direction = @direction

    @real_diagonal  = @diagonal if $imported[:ve_diagonal_move]

    @anime_count    = 0 unless move_pose?

    @pattern        = @playing_pose ? 0 : @original_pattern

    set_fixed_direction if @pose_direction

  end

  #--------------------------------------------------------------------------

  # * New method: set_fixed_direction

  #--------------------------------------------------------------------------

  def set_fixed_direction

    @direction = @pose_direction

    @diagonal  = 0 if $imported[:ve_diagonal_move]

    @current_direction = @direction - 2 if $imported[:ve_roatation_turn]

    @final_direction   = @direction - 2 if $imported[:ve_roatation_turn]

  end

  #--------------------------------------------------------------------------

  # * New method: get_next_pose

  #--------------------------------------------------------------------------

  def get_next_pose(pose)

    if pose == default_pose && !@pose_list.empty?

      pose = @pose_list.shift

      @playing_pose = true

    end

    pose

  end

  #--------------------------------------------------------------------------

  # * New method: move_pose?

  #--------------------------------------------------------------------------

  def move_pose?

    [walk_stance, dash_stance, jump_stance].include?(pose_sufix)

  end

  #--------------------------------------------------------------------------

  # * New method: default_pose

  #--------------------------------------------------------------------------

  def default_pose

    {sufix: @idle_stance, anim: 0, speed: 0, frame: frames}

  end

  #--------------------------------------------------------------------------

  # * New method: start_pose

  #--------------------------------------------------------------------------

  def start_pose(pose)

    clear_poses

    @pose_list.push(pose)

    update_pose

  end 

  #--------------------------------------------------------------------------

  # * New method: add_pose

  #--------------------------------------------------------------------------

  def add_pose(pose)

    @pose_list.push(pose)

    update_pose unless @playing_pose

  end

  #--------------------------------------------------------------------------

  # * New method: clear_poses

  #--------------------------------------------------------------------------

  def clear_poses

    @pose_list.clear

    change_pose(idle_stance)

  end

  #--------------------------------------------------------------------------

  # * New method: clear_stances

  #--------------------------------------------------------------------------

  def clear_stances

    @idle_stance = ""

    @walk_stance = VE_DEFAULT_WALK_SUFIX

    @dash_stance = VE_DEFAULT_DASH_SUFIX

    @jump_stance = VE_DEFAULT_JUMP_SUFIX

  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

  #--------------------------------------------------------------------------

  # * Alias method: comment_call

  #--------------------------------------------------------------------------

  alias :comment_call_ve_character_control :comment_call

  def comment_call

    call_clear_pose("EVENT")

    call_clear_pose("ACTOR")

    call_change_stance("EVENT")

    call_change_stance("ACTOR")

    call_change_pose("EVENT", "ADD POSE")

    call_change_pose("ACTOR", "ADD POSE")

    call_change_pose("EVENT", "CHANGE POSE")

    call_change_pose("ACTOR", "CHANGE POSE")

    comment_call_ve_character_control

  end

  #--------------------------------------------------------------------------

  # * New method: call_clear_pose

  #--------------------------------------------------------------------------

  def call_clear_pose(type)

    note.scan(/<#{type} CLEAR POSE: (\d+)>/i) do

      subject = $game_map.events[$1.to_i] if type == "EVENT"

      subject = $game_map.actors[$1.to_i] if type == "ACTOR"

      next unless subject

      subject.clear_poses

    end

  end

  #--------------------------------------------------------------------------

  # * New method: call_clear_stances

  #--------------------------------------------------------------------------

  def call_clear_stances(type)

    note.scan(/<#{type} CLEAR STANCES: (\d+)>/i) do

      subject = $game_map.events[$1.to_i] if type == "EVENT"

      subject = $game_map.actors[$1.to_i] if type == "ACTOR"

      next unless subject

      subject.clear_stances

    end

  end

  #--------------------------------------------------------------------------

  # * New method: call_change_stance

  #--------------------------------------------------------------------------

  def call_change_stance(type)

    regexp = /<#{type} (\w+) STANCE (\d+): #{get_filename}>/i

    note.scan(regexp) do |move, id, value|

      subject = $game_map.events[id.to_i] if type == "EVENT"

      subject = $game_map.actors[id.to_i] if type == "ACTOR"

      next unless subject

      subject.idle_stance = value if move.upcase == "IDLE"

      subject.walk_stance = value if move.upcase == "WALK"

      subject.dash_stance = value if move.upcase == "DASH"

      subject.jump_stance = value if move.upcase == "JUMP"

    end

  end

  #--------------------------------------------------------------------------

  # * New method: call_change_pose

  #--------------------------------------------------------------------------

  def call_change_pose(type, add)

    note.scan(get_all_values("#{type} #{add}")) do

      value = $1.dup

      if value =~ /ID: (\d+)/i

        subject = $game_map.events[$1.to_i] if type == "EVENT"

        subject = $game_map.actors[$1.to_i] if type == "ACTOR"

        next unless subject

        stance = subject.idle_stance

        pose   = {}

        pose[:sufix] = value =~ /NAME: #{get_filename}/i ? $1 : stance

        pose[:loop]  = value =~ /LOOP/i

        pose[:lock]  = value =~ /LOCK/i

        pose[:walk]  = value =~ /WALK/i

        pose[:speed] = value =~ /SPEED: (\d+)/i   ? $1.to_i : 0

        pose[:line]  = value =~ /LINE: ([1234])/i ? $1.to_i : nil

        pose[:frame] = value =~ /FRAMES: (\d+)/i  ? $1.to_i : subject.frames

        subject.start_pose(pose) if add.upcase == "CHANGE POSE"

        subject.add_pose(pose)   if add.upcase == "ADD POSE"

      end

    end

  end

end

 

#==============================================================================

# ** Sprite_Character

#------------------------------------------------------------------------------

#  This sprite is used to display characters. It observes a instance of the

# Game_Character class and automatically changes sprite conditions.

#==============================================================================

 

class Sprite_Character < Sprite_Base

  #--------------------------------------------------------------------------

  # * Alias method: graphic_changed?

  #--------------------------------------------------------------------------

  alias :graphic_changed_ve_character_control? :graphic_changed?

  def graphic_changed?

    graphic_changed_ve_character_control? ||

    @pose_sufix != @character.pose_sufix

  end

  #--------------------------------------------------------------------------

  # * Alias method: update_character_info

  #--------------------------------------------------------------------------

  alias :update_character_info_ve_character_control :update_character_info

  def update_character_info

    update_character_info_ve_character_control

    @pose_sufix = @character.pose_sufix

  end

  #--------------------------------------------------------------------------

  # * Alias method: set_bitmap_name

  #--------------------------------------------------------------------------

  alias :set_bitmap_name_ve_character_control :set_bitmap_name

  def set_bitmap_name

    sufix = ($imported[:ve_diagonal_move] ? diagonal_sufix : "") + @pose_sufix

    if $imported[:ve_visual_equip]

      return set_bitmap_name_ve_character_control

    elsif character_exist?(@character_name + sufix)

      return @character_name + sufix

    elsif character_exist?(@character_name + @pose_sufix)

      return @character_name + @pose_sufix

    else

      return set_bitmap_name_ve_character_control

    end

  end

  #--------------------------------------------------------------------------

  # * Alias method: set_bitmap_position

  #--------------------------------------------------------------------------

  alias :set_bitmap_position_ve_character_control :set_bitmap_position

  def set_bitmap_position

    set_bitmap_position_ve_character_control

    self.ox -= (@character_name[/\[x([+-]?\d+)\]/i] ? $1.to_i : 0)

    self.oy -= (@character_name[/\[y([+-]?\d+)\]/i] ? $1.to_i : 0)

  end

end

 

#==============================================================================

# ** Window_Base

#------------------------------------------------------------------------------

#  This is a superclass of all windows in the game.

#==============================================================================

 

class Window_Base < Window

  #--------------------------------------------------------------------------

  # * Alias method: draw_character

  #--------------------------------------------------------------------------

  alias :draw_character_ve_character_control :draw_character

  def draw_character(character_name, character_index, x, y, parts = nil)

    return unless character_name

    x += (character_name[/\[x([+-]?\d+)\]/i] ? $1.to_i : 0)

    y += (character_name[/\[y([+-]?\d+)\]/i] ? $1.to_i : 0)

    args = [character_name, character_index, x, y]

    args.push(parts) if $imported[:ve_visual_equip]

    draw_character_ve_character_control(*args)

  end

end
 

 

Latest Threads

Latest Profile Posts

Our latest feature is an interview with... me?!

People4_2 (Capelet off and on) added!

Just beat the last of us 2 last night and starting jedi: fallen order right now, both use unreal engine & when I say i knew 80% of jedi's buttons right away because they were the same buttons as TLOU2 its ridiculous, even the same narrow hallway crawl and barely-made-it jump they do. Unreal Engine is just big budget RPG Maker the way they make games nearly identical at its core lol.
Can someone recommend some fun story-heavy RPGs to me? Coming up with good gameplay is a nightmare! I was thinking of making some gameplay platforming-based, but that doesn't work well in RPG form*. I also was thinking of removing battles, but that would be too much like OneShot. I don't even know how to make good puzzles!
one bad plugin combo later and one of my followers is moonwalking off the screen on his own... I didn't even more yet on the new map lol.

Forum statistics

Threads
106,034
Messages
1,018,447
Members
137,820
Latest member
georg09byron
Top