#:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=: # Character Sprite Access # Version: 1.05 # Author : LiTTleDRAgo #:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=: ($imported||={})[:drg_character_sprite_access] = 1.05 text = "This script needs Drago - Core Engine ver 1.31 or above" ($imported[:drg_core_engine] || 0) >= 1.31 || raise(text) #============================================================================== # ** Game_Character #------------------------------------------------------------------------------ # This class deals with characters. It's used as a superclass for the # Game_Player and Game_Event classes. #============================================================================== class Game_Character #-------------------------------------------------------------------------- # ● Public Instance Variables #-------------------------------------------------------------------------- attr_sec_reader :bitmap, "SBitmap_Character.new(self)" define_method(:bitmap=) {|*args| bitmap.send(:"=",*args)} #-------------------------------------------------------------------------- # ● Saved_bitmap #-------------------------------------------------------------------------- def saved_bitmap $game_temp.event_saved_bitmap[[$game_map.map_id,@id]] ||= Array.new end end #============================================================================== # ** Game_Temp #------------------------------------------------------------------------------ # This class handles temporary data that is not included with save data. # The instance of this class is referenced by $game_temp. #============================================================================== Game_Temp.send(:attr_sec_reader, :event_saved_bitmap, "Hash.new") #============================================================================== # ** SBitmap_Character #------------------------------------------------------------------------------ # #============================================================================== class SBitmap_Character #-------------------------------------------------------------------------- # * Object Initialization #-------------------------------------------------------------------------- define_method(:initialize) { |char| @character = char } define_method(:character_sprite) { @character.character_sprite } define_method(:saved_bitmap) { @character.saved_bitmap } define_method(:get) { character_sprite.bitmap } #-------------------------------------------------------------------------- # * method_missing #-------------------------------------------------------------------------- def method_missing(val,*args) character_sprite.bitmap && (bitmap = character_sprite.bitmap.clone) if bitmap.respond_to?(:"#{val}") bitmap.send(:"#{val}",*args) reset_bitmap(1) save = [bitmap.clone, character_sprite.src_rect.clone] saved_bitmap.concat(save) << @character.tile_id character_sprite.bitmap = bitmap elsif character_sprite.respond_to?(:"#{val}") bitmap.respond_to?(:dispose) && bitmap.dispose character_sprite.send(:"#{val}",*args) else text = "Undefined method #{val} at #{@character}.bitmap" raise NoMethodError,text,caller(1) end end #-------------------------------------------------------------------------- # * = #-------------------------------------------------------------------------- define_method(:"=") do |*args| character_sprite.send(:bitmap=, *args) if args.first.is_a?(Bitmap) rect = [0, 0, args.first.width, args.first.height] @character.tile_id == 0 && @character.instance_variable_set(:@tile_id,1) character_sprite.update character_sprite.send(:bitmap=, *args) character_sprite.src_rect.set(*rect) reset_bitmap(1) save = [args.first.clone, character_sprite.src_rect.clone] saved_bitmap.concat(save) << @character.tile_id end end #-------------------------------------------------------------------------- # * reset_bitmap #-------------------------------------------------------------------------- def reset_bitmap(type=0) (s = saved_bitmap.first).respond_to?(:dispose) && (s.disposed? || s.dispose) saved_bitmap.clear if type == 0 @character.tile_id == 1 && @character.instance_variable_set(:@tile_id, 0) character_sprite.send(:instance_variable_get, :@character_name).clear end end end #============================================================================== # ** Sprite_Character #------------------------------------------------------------------------------ # #============================================================================== class Sprite_Character #-------------------------------------------------------------------------- # * Alias Method #-------------------------------------------------------------------------- alias_sec_method :drg3xd3_update, :update #-------------------------------------------------------------------------- # * Frame Update #-------------------------------------------------------------------------- def update(*args) drg3xd3_update(*args) if (@character.saved_bitmap != @saved_bitmap) && (@character.saved_bitmap.first.is_a?(Bitmap)) && (@character.saved_bitmap.first.not.disposed?) @saved_bitmap = @character.saved_bitmap @character.instance_variable_set(:@tile_id, @saved_bitmap.at(2)) drg3xd3_update(*args) self.bitmap = @saved_bitmap.first.clone self.src_rect = @saved_bitmap.at(1) end end end