PHP код:
#==============================================================================
# ** 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] 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
Социальные закладки