#==============================================================================# ** 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 [url=http://victorscripts.wordpress.com/][URL="http://victorscripts.wordpress.com/%5B/url%5D"]http://victorscripts.wordpress.com/[/url][/URL] 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(" ") endend$imported ||= {}$imported[:ve_character_control] = 1.05Victor_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 endend#==============================================================================# ** 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 endend#==============================================================================# ** 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) endend#==============================================================================# ** 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) endend