Code:
#==============================================================================
# Extra Movement Frames v. 1.0
# Author: modern algebra (rmrk.net)
# Date: January 20, 2008
#------------------------------------------------------------------------------
# Instructions:
# Insert this script above main in the database. To add a character with
# extra movement frames, simply rename the character graphic to something
# of the form:
# !$%[<number of movement frames>]<Regular name>
#
# Example: !$%[4]001-Fighter01
# That would make the graphic 001-Fighter01 be interpreted as having 4 frames
#------------------------------------------------------------------------------
# ** Game_Character
#------------------------------------------------------------------------------
# Summary of changes:
# aliased methods - update_animation
# new class variables - height divisor, width divisor
# new methods - calculate_divisors
#==============================================================================
class Game_Character
#--------------------------------------------------------------------------
# * Public Instance Variables
#--------------------------------------------------------------------------
attr_reader :height_divisor # The height of a single frame
attr_reader :width_divisor # number of frames in the x direction
#--------------------------------------------------------------------------
# * Calculate Divisors
#--------------------------------------------------------------------------
# Sets up the instance variables required
#--------------------------------------------------------------------------
def calculate_divisors
return unless @previous_character.nil? || @previous_character != @character_name
bitmap = Cache.character (@character_name)
sign = @character_name[/^[\!\$].[\%]\[\d*\]/]
if !sign.nil? && sign.size > 5
@original_pattern = 0
@width_divisor = sign[4, sign.size - 5].to_i
@height_divisor = 4
elsif !sign.nil? && sign.include? ('$')
@width_divisor = 3
@height_divisor = 4
else
@width_divisor = 12
@height_divisor = 8
end
@previous_character = @character_name
end
#--------------------------------------------------------------------------
# * Update Animation
#--------------------------------------------------------------------------
# Change the hard coded values to ones dependent on character graphic format
#--------------------------------------------------------------------------
alias ma_extra_movement_frames_anim_upd update_animation
def update_animation
saved_anime_count = @anime_count
pattern_original = @pattern
speed = @move_speed + (dash? ? 1 : 0)
ma_extra_movement_frames_anim_upd
if (saved_anime_count > (18 - speed * 2)) && (@step_anime || (@stop_count <= 0))
@pattern = (pattern_original + 1) % @width_divisor
end
end
end
#==============================================================================
# * Sprite Character
#------------------------------------------------------------------------------
# Summary of changes:
# aliased methods - update_src_rect, update_bitmap
#==============================================================================
class Sprite_Character
#--------------------------------------------------------------------------
# * Update Src Rect
#--------------------------------------------------------------------------
# Interpret multiple movement frames: Changed pattern
#--------------------------------------------------------------------------
alias ma_extra_movement_frames_src_rect_upd update_src_rect
def update_src_rect
if @tile_id == 0
ma_extra_movement_frames_src_rect_upd
index = @character.character_index
pattern = @character.pattern < @character.width_divisor ? @character.pattern : 1
sx = (index % 4 * 3 + pattern) * @cw
sy = (index / 4 * 4 + (@character.direction - 2) / 2) * @ch
self.src_rect.set(sx, sy, @cw, @ch)
end
end
#--------------------------------------------------------------------------
# * Update Bitmap
#--------------------------------------------------------------------------
# Change hard coded values to ones dependent on character graphic
#--------------------------------------------------------------------------
alias ma_extra_movement_frames_bmp_upd update_bitmap
def update_bitmap
@character.calculate_divisors
saved_tile_id = @tile_id
saved_character_name = @character_name
saved_character_index = @character_index
ma_extra_movement_frames_bmp_upd
if saved_tile_id != @character.tile_id or
saved_character_name != @character.character_name or
saved_character_index != @character.character_index
unless @tile_id > 0
@cw = bitmap.width / @character.width_divisor
@ch = bitmap.height / @character.height_divisor
self.ox = @cw / 2
self.oy = @ch
end
end
end
end
#==============================================================================
# ** Window Base
#------------------------------------------------------------------------------
# Summary of changes:
# overwritten methods - draw_character
#==============================================================================
class Window_Base
#--------------------------------------------------------------------------
# * Draw Charater (overwritten for extra movement frames)
# character_name : the name of the character file
# character_index : the index of the character in the file
# x : the x position to draw
# y : the y position to draw
#--------------------------------------------------------------------------
def draw_character(character_name, character_index, x, y)
return if character_name == nil
bitmap = Cache.character(character_name)
sign = character_name[/^[\!\$].[\%]\[\d*\]/]
if !sign.nil? && sign.size > 5
cw = bitmap.width / sign[4, sign.size - 5].to_i
ch = bitmap.height / 4
elsif sign != nil and sign.include?('$')
cw = bitmap.width / 3
ch = bitmap.height / 4
else
cw = bitmap.width / 12
ch = bitmap.height / 8
end
n = character_index
src_rect = Rect.new((n%4*3+1)*cw, (n/4*4)*ch, cw, ch)
self.contents.blt(x - cw / 2, y - ch, bitmap, src_rect)
end
end