#======================================================================
# 自动图块扩展 2.0 By 灯笼菜刀王
#
# 使用方法 : 在 AUTO 里备注好要当自动图块标志的图块ID后(从0开始数)
# 用该图块画地图,进游戏后就会按自动图块的规则调用对应的自动图块
#
# 备注例子: 数据库图块ID=>{2=>"自动图块名称",3=>"自动图块名字"}
# 如果在自动图块名称里加上 <n ;表示该图块可以镶套到n号笔刷内使用
#======================================================================
class Game_Map
AUTO={ #↓↓在这里标记好笔刷图块对应的自动图块名称(注意符号都要半角)↓↓
#----------------------------------------------------------------------
1=>{2=>"019-Sa_Grass02",3=>"020-Sa_Grass03<2",4=>"019-Sa_Grass02<3"},
#------------------------------------------------------------------------
} ; alias old_setup setup
def setup(map_id) ; old_setup(map_id) ;map_auto_set ;end
def auto2?(id)
return $game_temp.au[@tileset_name].find{|i| id == i[0] or
((a=(id - i[1])) > -1 and a < 48)}
end
def same?(n,od,id)
return n if id.nil?
return 0 if od[1].nil?
return n if id == od[0]
return n if ((a=(id - od[1])) > -1 and a < 48)
return 0 if od[2].nil?
return same?(n,od[2,od.size],id)
end
def tile_push_auto(ah)
rf = [] ; au = [] ;cu = [] ;ah.each{|i|
a = i[1].sub(/\<(\d+)/,"") ;cu.push([$1.to_i + 384,i[0]+384]) if $1 != nil ;
au.push([i[0] + 384]) ;rf.push(RPG::Cache.autotile(a))}
b = Bitmap.new("Graphics/Tilesets/#{@tileset_name}") ;lh = b.height
bit = Bitmap.new(256,rf.size * 192 + lh)
bit.bb(0,0,b) ;a = 0
for i in rf
bit.draw_autotile(i,lh) ;au[a][1] = lh / 32 * 8 + 384 ;
n = au[a][0] ; lh += 192 ;a += 1
pa = @passages.xsize ;@passages.resize(pa + 48) #通行度
pr = @priorities.xsize ;@priorities.resize(pr + 48) #优先级
pt = @terrain_tags.xsize ;@terrain_tags.resize(pt + 48) #地形标志
48.times do |j|
@priorities[pr + j] = @priorities[n]
@passages[pa + j] = @passages[n]
@terrain_tags[pt + j] = @terrain_tags[n]
end
end
for i in cu #[in,self]
next if (a = au.find_index{|j| j[0] == i[0]}).nil?
next if (b = au.find{|j| j[0] == i[1]}).nil?
au[a] += b[0,2]
end
$game_temp.tiles_push(@tileset_name,bit,au)
end
def map_auto_set
return if (ah=AUTO[@map.tileset_id]).nil?
$game_temp.au ||= {}
tile_push_auto(ah) if $game_temp.au[@tileset_name].nil?
f = self.data
for pag in [0,1,2]
for x in 0...f.xsize
for y in 0...f.ysize
next if (od = auto2?(f[x,y,pag])).nil?
g = [[x,y+1,8],[x+1,y,4],[x,y-1,2],[x-1,y,1]] ;b = 0
g.each{|i| b += same?(i[2],od,f[i[0],i[1],pag])}
g = [[x-1,y+1,8],[x+1,y+1,4],[x+1,y-1,2],[x-1,y-1,1]] ;c = 0
g.each{|i| c += same?(i[2],od,f[i[0],i[1],pag])}
f[x,y,pag] = get_autotile(b,c) + od[1]
end
end
end
end
def get_autotile(b, c) #获取自动元件ID By guoxiaomi (P1)
case b ; when 0b1111 ; 15 - c
when 0b1110 ; 19 - (c / 2) % 4
when 0b1101 ; 23 - (c / 4) % 4
when 0b1011 ; 27 - c / 8 - (c * 2) % 4
when 0b0111 ; 31 - c % 4
when 0b1010 ; 32
when 0b0101 ; 33
when 0b1100 ; 35 - (c / 4) % 2
when 0b1001 ; 37 - c / 8
when 0b0011 ; 39 - c % 2
when 0b0110 ; 41 - (c / 2) % 2
when 0b1000 then 42
when 0b0100 then 43
when 0b0010 then 44
when 0b0001 then 45
when 0b0000 then 46
end
end
end
class Bitmap
def bb(x,y,name,rx=0,ry=0,rw=nil,rh=nil,o=255,zmx=1.0,zmy=1.0)
if name.nil? or name == ""
a,b = rw || self.width,rh || self.height
fill_rect(x,y,a,b,Color.new(0,0,0,0)) ; return [a,b]
end
if zmx != 1.0 or zmy != 1.0
c,d = rw||name.width,rh||name.height
a = zmx.f? ? c * zmx : zmx ; b = zmy.f? ? d * zmy : zmy
stretch_blt(Rect.new(x,y,a,b),name,Rect.new(rx,ry,c,d),o)
else
a,b = rw || name.width, rh || name.height
blt(x,y,name,Rect.new(rx,ry,a,b),o)
end ; return [a,b] #返回宽和高
end
def draw_autotile(ait,ey)
dk={ #绘制, id=>[左上,右上,左下,右下]
0=>[26,27,32,33], 1=>[4,27,32,33], 2=>[26,5,32,33], 3=>[4,5,32,33],
4=>[26,27,32,11], 5=>[4,27,32,11], 6=>[26,5,32,11], 7=>[4,5,32,11],
8=>[26,27,10,33], 9=>[4,27,10,33], 10=>[26,5,10,33], 11=>[4,5,10,33],
12=>[26,27,10,11], 13=>[4,27,10,11], 14=>[26,5,10,11], 15=>[4,5,10,11],
16=>[24,25,30,31], 17=>[24,5,30,31], 18=>[24,25,30,11], 19=>[24,5,30,11],
20=>[14,15,20,21], 21=>[14,15,20,11], 22=>[14,15,10,21], 23=>[14,15,10,11],
24=>[28,29,34,35], 25=>[28,29,10,35], 26=>[4,29,34,35], 27=>[4,29,10,35],
28=>[26,27,44,45], 29=>[4,39,44,45], 30=>[38,5,44,45], 31=>[4,5,44,45],
32=>[24,29,30,35], 33=>[14,15,44,45], 34=>[12,13,18,19], 35=>[12,13,18,11],
36=>[16,17,22,23], 37=>[16,17,10,23], 38=>[40,41,46,47], 39=>[4,41,46,47],
40=>[36,37,42,43], 41=>[36,5,42,43], 42=>[12,17,18,23], 43=>[12,13,42,43],
44=>[36,41,42,47], 45=>[16,17,46,47], 46=>[12,17,42,47], 47=>[12,17,42,47]}
uf = [[0,0],[16,0],[0,16],[16,16]]
48.times do |i|
x,y = i % 8 * 32, i / 8 * 32 + ey; af = dk[i]
4.times do |j|
f = uf[j] ; a,b = af[j] % 6 * 16, af[j] / 6 * 16
self.bb(x + f[0],y + f[1],ait,a,b,16,16)
end
end ;ait.dispose
end
end
class Array
def find_index
a = 0 ;self.each{|i| return a if yield i ;a += 1} ;return nil
end
end
module RPG
module Cache
def self.tileset(filename)
if (r=$game_temp.tiles_save) != nil and r[filename] != nil ;
return r[filename].dup ;end
self.load_bitmap("Graphics/Tilesets/", filename)
end
end
end
class Game_Temp
attr_accessor :au,:tiles_save
def tiles_push(name,bit,f)
@tiles_save ||= {} ;@tiles_save[name] = bit
@au ||= {} ;@au[name] = f
end
end
#======================================================================
# 自动图块扩展 2.0 By 灯笼菜刀王
#
# 使用方法 : 在 AUTO 里备注好要当自动图块标志的图块ID后(从0开始数)
# 用该图块画地图,进游戏后就会按自动图块的规则调用对应的自动图块
#
# 备注例子: 数据库图块ID=>{2=>"自动图块名称",3=>"自动图块名字"}
# 如果在自动图块名称里加上 <n ;表示该图块可以镶套到n号笔刷内使用
#======================================================================
class Game_Map
AUTO={ #↓↓在这里标记好笔刷图块对应的自动图块名称(注意符号都要半角)↓↓
#----------------------------------------------------------------------
1=>{2=>"019-Sa_Grass02",3=>"020-Sa_Grass03<2",4=>"019-Sa_Grass02<3"},
#------------------------------------------------------------------------
} ; alias old_setup setup
def setup(map_id) ; old_setup(map_id) ;map_auto_set ;end
def auto2?(id)
return $game_temp.au[@tileset_name].find{|i| id == i[0] or
((a=(id - i[1])) > -1 and a < 48)}
end
def same?(n,od,id)
return n if id.nil?
return 0 if od[1].nil?
return n if id == od[0]
return n if ((a=(id - od[1])) > -1 and a < 48)
return 0 if od[2].nil?
return same?(n,od[2,od.size],id)
end
def tile_push_auto(ah)
rf = [] ; au = [] ;cu = [] ;ah.each{|i|
a = i[1].sub(/\<(\d+)/,"") ;cu.push([$1.to_i + 384,i[0]+384]) if $1 != nil ;
au.push([i[0] + 384]) ;rf.push(RPG::Cache.autotile(a))}
b = Bitmap.new("Graphics/Tilesets/#{@tileset_name}") ;lh = b.height
bit = Bitmap.new(256,rf.size * 192 + lh)
bit.bb(0,0,b) ;a = 0
for i in rf
bit.draw_autotile(i,lh) ;au[a][1] = lh / 32 * 8 + 384 ;
n = au[a][0] ; lh += 192 ;a += 1
pa = @passages.xsize ;@passages.resize(pa + 48) #通行度
pr = @priorities.xsize ;@priorities.resize(pr + 48) #优先级
pt = @terrain_tags.xsize ;@terrain_tags.resize(pt + 48) #地形标志
48.times do |j|
@priorities[pr + j] = @priorities[n]
@passages[pa + j] = @passages[n]
@terrain_tags[pt + j] = @terrain_tags[n]
end
end
for i in cu #[in,self]
next if (a = au.find_index{|j| j[0] == i[0]}).nil?
next if (b = au.find{|j| j[0] == i[1]}).nil?
au[a] += b[0,2]
end
$game_temp.tiles_push(@tileset_name,bit,au)
end
def map_auto_set
return if (ah=AUTO[@map.tileset_id]).nil?
$game_temp.au ||= {}
tile_push_auto(ah) if $game_temp.au[@tileset_name].nil?
f = self.data
for pag in [0,1,2]
for x in 0...f.xsize
for y in 0...f.ysize
next if (od = auto2?(f[x,y,pag])).nil?
g = [[x,y+1,8],[x+1,y,4],[x,y-1,2],[x-1,y,1]] ;b = 0
g.each{|i| b += same?(i[2],od,f[i[0],i[1],pag])}
g = [[x-1,y+1,8],[x+1,y+1,4],[x+1,y-1,2],[x-1,y-1,1]] ;c = 0
g.each{|i| c += same?(i[2],od,f[i[0],i[1],pag])}
f[x,y,pag] = get_autotile(b,c) + od[1]
end
end
end
end
def get_autotile(b, c) #获取自动元件ID By guoxiaomi (P1)
case b ; when 0b1111 ; 15 - c
when 0b1110 ; 19 - (c / 2) % 4
when 0b1101 ; 23 - (c / 4) % 4
when 0b1011 ; 27 - c / 8 - (c * 2) % 4
when 0b0111 ; 31 - c % 4
when 0b1010 ; 32
when 0b0101 ; 33
when 0b1100 ; 35 - (c / 4) % 2
when 0b1001 ; 37 - c / 8
when 0b0011 ; 39 - c % 2
when 0b0110 ; 41 - (c / 2) % 2
when 0b1000 then 42
when 0b0100 then 43
when 0b0010 then 44
when 0b0001 then 45
when 0b0000 then 46
end
end
end
class Bitmap
def bb(x,y,name,rx=0,ry=0,rw=nil,rh=nil,o=255,zmx=1.0,zmy=1.0)
if name.nil? or name == ""
a,b = rw || self.width,rh || self.height
fill_rect(x,y,a,b,Color.new(0,0,0,0)) ; return [a,b]
end
if zmx != 1.0 or zmy != 1.0
c,d = rw||name.width,rh||name.height
a = zmx.f? ? c * zmx : zmx ; b = zmy.f? ? d * zmy : zmy
stretch_blt(Rect.new(x,y,a,b),name,Rect.new(rx,ry,c,d),o)
else
a,b = rw || name.width, rh || name.height
blt(x,y,name,Rect.new(rx,ry,a,b),o)
end ; return [a,b] #返回宽和高
end
def draw_autotile(ait,ey)
dk={ #绘制, id=>[左上,右上,左下,右下]
0=>[26,27,32,33], 1=>[4,27,32,33], 2=>[26,5,32,33], 3=>[4,5,32,33],
4=>[26,27,32,11], 5=>[4,27,32,11], 6=>[26,5,32,11], 7=>[4,5,32,11],
8=>[26,27,10,33], 9=>[4,27,10,33], 10=>[26,5,10,33], 11=>[4,5,10,33],
12=>[26,27,10,11], 13=>[4,27,10,11], 14=>[26,5,10,11], 15=>[4,5,10,11],
16=>[24,25,30,31], 17=>[24,5,30,31], 18=>[24,25,30,11], 19=>[24,5,30,11],
20=>[14,15,20,21], 21=>[14,15,20,11], 22=>[14,15,10,21], 23=>[14,15,10,11],
24=>[28,29,34,35], 25=>[28,29,10,35], 26=>[4,29,34,35], 27=>[4,29,10,35],
28=>[26,27,44,45], 29=>[4,39,44,45], 30=>[38,5,44,45], 31=>[4,5,44,45],
32=>[24,29,30,35], 33=>[14,15,44,45], 34=>[12,13,18,19], 35=>[12,13,18,11],
36=>[16,17,22,23], 37=>[16,17,10,23], 38=>[40,41,46,47], 39=>[4,41,46,47],
40=>[36,37,42,43], 41=>[36,5,42,43], 42=>[12,17,18,23], 43=>[12,13,42,43],
44=>[36,41,42,47], 45=>[16,17,46,47], 46=>[12,17,42,47], 47=>[12,17,42,47]}
uf = [[0,0],[16,0],[0,16],[16,16]]
48.times do |i|
x,y = i % 8 * 32, i / 8 * 32 + ey; af = dk[i]
4.times do |j|
f = uf[j] ; a,b = af[j] % 6 * 16, af[j] / 6 * 16
self.bb(x + f[0],y + f[1],ait,a,b,16,16)
end
end ;ait.dispose
end
end
class Array
def find_index
a = 0 ;self.each{|i| return a if yield i ;a += 1} ;return nil
end
end
module RPG
module Cache
def self.tileset(filename)
if (r=$game_temp.tiles_save) != nil and r[filename] != nil ;
return r[filename].dup ;end
self.load_bitmap("Graphics/Tilesets/", filename)
end
end
end
class Game_Temp
attr_accessor :au,:tiles_save
def tiles_push(name,bit,f)
@tiles_save ||= {} ;@tiles_save[name] = bit
@au ||= {} ;@au[name] = f
end
end