You are on page 1of 10

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

# ** 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

You might also like