=begin
#==============================================================================
# OZ OverTiles
#==============================================================================
Solves the problem when using character overworld sprites bigger than 32x32.

=end

class Game_CharacterBase
def simple_screen_y
($game_map.adjust_y(@real_y) * 32) + 32
end
def screen_z
simple_screen_y.to_i + (@priority_type * 100)+100
end
end

#==============================================================================
# ** Spriteset_Map
#------------------------------------------------------------------------------
# This class brings together map screen sprites, tilemaps, etc. It's used
# within the Scene_Map class.
#==============================================================================

class Spriteset_Map
#--------------------------------------------------------------------------
# * Create Tilemap
#--------------------------------------------------------------------------
alias ozot_create_tilemap create_tilemap
def create_tilemap
ozot_create_tilemap
process_mapdata
@spr_over = Spriteset_OverMap.new(@over_data,@tilemap.bitmaps,@viewport1)
end
#~ #--------------------------------------------------------------------------
#~ # * Create Airship Shadow Sprite (you can try and mess up with this, I don't want to :V
#~ #--------------------------------------------------------------------------
#~ def create_shadow
#~ @shadow_sprite = Sprite.new(@viewport1)
#~ @shadow_sprite.bitmap = Cache.system("Shadow")
#~ @shadow_sprite.ox = @shadow_sprite.bitmap.width / 2
#~ @shadow_sprite.oy = @shadow_sprite.bitmap.height
#~ @shadow_sprite.z = 180
#~ end
#--------------------------------------------------------------------------
# * Free
#--------------------------------------------------------------------------
alias ozot_dispose dispose
def dispose
ozot_dispose
@spr_over.dispose
end
#--------------------------------------------------------------------------
# * Update Tilemap
#--------------------------------------------------------------------------
alias ozot_update_tilemap update_tilemap
def update_tilemap
ozot_update_tilemap
process_mapdata
@spr_over.map_data = @over_data
@spr_over.bitmaps = @tilemap.bitmaps
#@spr_over.refresh
@spr_over.update
end

def process_mapdata
@over_data = $game_map.data.dup
@over_data.xsize.times{|x|
@over_data.ysize.times{|y|
flag = $game_map.tileset.flags[$game_map.data]
# : No effect on passage
if (flag & 0x10 == 0) && ($game_map.data != 0)
@over_data = 0
#elsif (flag & 0x10 != 0) && ($game_map.data != 0)
# $game_map.data = 0
#p @over_data
end
}
}
end
end

class Spriteset_OverMap
attr_accessor :bitmaps

def initialize(map_data,bitmaps,viewport)
@map_data = map_data
@bitmaps = bitmaps
@vport = viewport
#create sprites
create_sprites
refresh
end
def map_data=(n)
@map_data = n
end
def vport=(n)
@vport=n
@sprites.each{|s| s.viewport=@vport}
end
def vport
@vport
end

def create_sprites
h_size = (Graphics.height/32) + 2
@sprites = Array.new(h_size) {|i|
s = Sprite.new(@vport); s.y = (i*32)
s.bitmap = Bitmap.new(Graphics.width+64,32)
s.ox = s.oy = 32 ; s.z = s.y.to_i+200
s
}
end

def update
#update sprites, refresh if necessary
update_sprites
refresh if need_refresh?
end

def update_sprites
dx= $game_map.display_x * 32
dx= dx>0 ? dx%32 : dx%-32
dy= $game_map.display_y * 32
dy= dy>0 ? dy%32 : dy%-32
@sprites.each_with_index{|s,i|
s.x = -dx
s.y = (i*32)-dy
s.z = s.y.to_i+200
s.update
}
end

def refresh
@actual_ox = ($game_map.display_x)
@actual_oy = ($game_map.display_y)

@map_data
@sprites.size.times{|y|
yy=@actual_oy+y-1
next if (yy==-1)
t = (Graphics.width+64)/32
@sprites.bitmap.clear
t.times{|x|
xx = @actual_ox+x-1
id = @map_data
next if id==nil
#blit each tile
i=id/256
ii=id%256
b=@bitmaps
off= ii>127 ? 256 : 0
r=Rect.new( (ii%8*32)+off, ((ii/8)%16)*32, 32,32)
@sprites.bitmap.blt(x*32,0,b,r)
}
}
end

def need_refresh?
(@actual_ox != $game_map.display_x) || (@actual_oy != $game_map.display_y)
end

def dispose
#dispose all sprites
@sprites.each{|s| s.dispose; s=nil}
end
end