mirror of
https://github.com/infinitefusion/infinitefusion-e18.git
synced 2025-12-06 06:01:46 +00:00
Initial commit
This commit is contained in:
947
Data/Scripts/005_Map renderer/001_Tilemap_XP.rb
Normal file
947
Data/Scripts/005_Map renderer/001_Tilemap_XP.rb
Normal file
@@ -0,0 +1,947 @@
|
||||
#===============================================================================
|
||||
#
|
||||
#===============================================================================
|
||||
class CustomTilemapAutotiles
|
||||
attr_accessor :changed
|
||||
|
||||
def initialize
|
||||
@changed = true
|
||||
@tiles = [nil,nil,nil,nil,nil,nil,nil]
|
||||
end
|
||||
|
||||
def [](i)
|
||||
return @tiles[i]
|
||||
end
|
||||
|
||||
def []=(i,value)
|
||||
@tiles[i] = value
|
||||
@changed = true
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
#Console::setup_console
|
||||
class CustomTilemapSprite < Sprite
|
||||
end
|
||||
|
||||
|
||||
|
||||
#===============================================================================
|
||||
#
|
||||
#===============================================================================
|
||||
class CustomTilemap
|
||||
attr_reader :tileset
|
||||
attr_reader :autotiles
|
||||
attr_reader :map_data
|
||||
attr_reader :flash_data
|
||||
attr_reader :priorities
|
||||
attr_reader :terrain_tags
|
||||
attr_reader :visible
|
||||
attr_reader :viewport
|
||||
attr_reader :graphicsWidth
|
||||
attr_reader :graphicsHeight
|
||||
attr_accessor :ox
|
||||
attr_accessor :oy
|
||||
attr_accessor :tone
|
||||
attr_accessor :color
|
||||
|
||||
Autotiles = [
|
||||
[ [27, 28, 33, 34], [ 5, 28, 33, 34], [27, 6, 33, 34], [ 5, 6, 33, 34],
|
||||
[27, 28, 33, 12], [ 5, 28, 33, 12], [27, 6, 33, 12], [ 5, 6, 33, 12] ],
|
||||
[ [27, 28, 11, 34], [ 5, 28, 11, 34], [27, 6, 11, 34], [ 5, 6, 11, 34],
|
||||
[27, 28, 11, 12], [ 5, 28, 11, 12], [27, 6, 11, 12], [ 5, 6, 11, 12] ],
|
||||
[ [25, 26, 31, 32], [25, 6, 31, 32], [25, 26, 31, 12], [25, 6, 31, 12],
|
||||
[15, 16, 21, 22], [15, 16, 21, 12], [15, 16, 11, 22], [15, 16, 11, 12] ],
|
||||
[ [29, 30, 35, 36], [29, 30, 11, 36], [ 5, 30, 35, 36], [ 5, 30, 11, 36],
|
||||
[39, 40, 45, 46], [ 5, 40, 45, 46], [39, 6, 45, 46], [ 5, 6, 45, 46] ],
|
||||
[ [25, 30, 31, 36], [15, 16, 45, 46], [13, 14, 19, 20], [13, 14, 19, 12],
|
||||
[17, 18, 23, 24], [17, 18, 11, 24], [41, 42, 47, 48], [ 5, 42, 47, 48] ],
|
||||
[ [37, 38, 43, 44], [37, 6, 43, 44], [13, 18, 19, 24], [13, 14, 43, 44],
|
||||
[37, 42, 43, 48], [17, 18, 47, 48], [13, 18, 43, 48], [ 1, 2, 7, 8] ]
|
||||
]
|
||||
Animated_Autotiles_Frames = 5*Graphics.frame_rate/20 # Frequency of updating animated autotiles
|
||||
FlashOpacity = [100,90,80,70,80,90]
|
||||
|
||||
def initialize(viewport)
|
||||
@tileset = nil # Refers to Map Tileset Name
|
||||
@autotiles = CustomTilemapAutotiles.new
|
||||
@map_data = nil # Refers to 3D Array Of Tile Settings
|
||||
@flash_data = nil # Refers to 3D Array of Tile Flashdata
|
||||
@priorities = nil # Refers to Tileset Priorities
|
||||
@terrain_tags = nil # Refers to Tileset Terrain Tags
|
||||
@visible = true # Refers to Tileset Visibleness
|
||||
@ox = 0 # Bitmap Offsets
|
||||
@oy = 0 # Bitmap Offsets
|
||||
@plane = false
|
||||
@haveGraphicsWH = (Graphics.width!=nil rescue false)
|
||||
if @haveGraphicsWH
|
||||
@graphicsWidth = Graphics.width
|
||||
@graphicsHeight = Graphics.height
|
||||
else
|
||||
@graphicsWidth = 640
|
||||
@graphicsHeight = 480
|
||||
end
|
||||
@tileWidth = Game_Map::TILE_WIDTH rescue 32
|
||||
@tileHeight = Game_Map::TILE_HEIGHT rescue 32
|
||||
@tileSrcWidth = 32
|
||||
@tileSrcHeight = 32
|
||||
@diffsizes = (@tileWidth!=@tileSrcWidth) || (@tileHeight!=@tileSrcHeight)
|
||||
@tone = Tone.new(0,0,0,0)
|
||||
@oldtone = Tone.new(0,0,0,0)
|
||||
@color = Color.new(0,0,0,0)
|
||||
@oldcolor = Color.new(0,0,0,0)
|
||||
@selfviewport = Viewport.new(0,0,graphicsWidth,graphicsHeight)
|
||||
@viewport = (viewport) ? viewport : @selfviewport
|
||||
@tiles = []
|
||||
@autotileInfo = []
|
||||
@regularTileInfo = []
|
||||
@oldOx = 0
|
||||
@oldOy = 0
|
||||
@oldViewportOx = 0
|
||||
@oldViewportOy = 0
|
||||
@layer0 = CustomTilemapSprite.new(viewport)
|
||||
@layer0.visible = true
|
||||
@nowshown = false
|
||||
@layer0.bitmap = Bitmap.new([graphicsWidth+320,1].max,[graphicsHeight+320,1].max)
|
||||
@layer0.z = 0
|
||||
@layer0.ox = 0
|
||||
@layer0.oy = 0
|
||||
@oxLayer0 = 0
|
||||
@oyLayer0 = 0
|
||||
@flash = nil
|
||||
@oxFlash = 0
|
||||
@oyFlash = 0
|
||||
@priotiles = []
|
||||
@priotilesfast = []
|
||||
@prioautotiles = []
|
||||
@autosprites = []
|
||||
@framecount = [0,0,0,0,0,0,0,0] # For autotiles
|
||||
@tilesetChanged = true
|
||||
@flashChanged = false
|
||||
@firsttime = true
|
||||
@disposed = false
|
||||
@usedsprites = false
|
||||
@layer0clip = true
|
||||
@firsttimeflash = true
|
||||
@fullyrefreshed = false
|
||||
@fullyrefreshedautos = false
|
||||
end
|
||||
|
||||
def dispose
|
||||
return if disposed?
|
||||
@help.dispose if @help
|
||||
@help = nil
|
||||
i = 0; len = @autotileInfo.length; while i<len
|
||||
if @autotileInfo[i]
|
||||
@autotileInfo[i].dispose
|
||||
@autotileInfo[i] = nil
|
||||
end
|
||||
i += 1
|
||||
end
|
||||
i = 0; len = @regularTileInfo.length; while i<len
|
||||
if @regularTileInfo[i]
|
||||
@regularTileInfo[i].dispose
|
||||
@regularTileInfo[i] = nil
|
||||
end
|
||||
i += 1
|
||||
end
|
||||
i = 0; len = @tiles.length; while i<len
|
||||
@tiles[i].dispose
|
||||
@tiles[i] = nil
|
||||
i += 2
|
||||
end
|
||||
i = 0; len = @autosprites.length; while i<len
|
||||
@autosprites[i].dispose
|
||||
@autosprites[i] = nil
|
||||
i += 2
|
||||
end
|
||||
if @layer0
|
||||
@layer0.bitmap.dispose if !@layer0.disposed?
|
||||
@layer0.bitmap = nil if !@layer0.disposed?
|
||||
@layer0.dispose
|
||||
@layer0 = nil
|
||||
end
|
||||
if @flash
|
||||
@flash.bitmap.dispose if !@flash.disposed?
|
||||
@flash.bitmap = nil if !@flash.disposed?
|
||||
@flash.dispose
|
||||
@flash = nil
|
||||
end
|
||||
for i in 0...7
|
||||
self.autotiles[i] = nil
|
||||
end
|
||||
@tiles.clear
|
||||
@autosprites.clear
|
||||
@autotileInfo.clear
|
||||
@regularTileInfo.clear
|
||||
@tilemap = nil
|
||||
@tileset = nil
|
||||
@priorities = nil
|
||||
@selfviewport.dispose
|
||||
@selfviewport = nil
|
||||
@disposed = true
|
||||
end
|
||||
|
||||
def disposed?
|
||||
return @disposed
|
||||
end
|
||||
|
||||
def flash_data=(value)
|
||||
@flash_data = value
|
||||
@flashChanged = true
|
||||
end
|
||||
|
||||
def map_data=(value)
|
||||
@map_data = value
|
||||
@tilesetChanged = true
|
||||
end
|
||||
|
||||
def priorities=(value)
|
||||
@priorities = value
|
||||
@tilesetChanged = true
|
||||
end
|
||||
|
||||
def terrain_tags=(value)
|
||||
@terrain_tags = value
|
||||
@tilesetChanged = true
|
||||
end
|
||||
|
||||
def tileset=(value)
|
||||
@tileset = value
|
||||
@tilesetChanged = true
|
||||
end
|
||||
|
||||
def getResizeFactor
|
||||
return $ResizeFactor || 1.0
|
||||
end
|
||||
|
||||
def ox=(val)
|
||||
rf = getResizeFactor
|
||||
if rf!=1.0
|
||||
val = (val*rf).to_i
|
||||
val = (val/rf).to_i
|
||||
end
|
||||
wasshown = self.shown?
|
||||
@ox = val.floor
|
||||
@nowshown = (!wasshown && self.shown?)
|
||||
end
|
||||
|
||||
def oy=(val)
|
||||
rf = getResizeFactor
|
||||
if rf!=1.0
|
||||
val = (val*rf).to_i
|
||||
val = (val/rf).to_i
|
||||
end
|
||||
wasshown = self.shown?
|
||||
@oy = val.floor
|
||||
@nowshown = (!wasshown && self.shown?)
|
||||
end
|
||||
|
||||
def visible=(val)
|
||||
wasshown = @visible
|
||||
@visible = val
|
||||
@nowshown = (!wasshown && val)
|
||||
end
|
||||
|
||||
def shown?
|
||||
return false if !@visible
|
||||
xsize = @map_data.xsize
|
||||
xStart = @ox/@tileWidth - 1
|
||||
xStart = 0 if xStart<0
|
||||
xStart = xsize-1 if xStart>=xsize
|
||||
xEnd = (@ox+@viewport.rect.width)/@tileWidth + 1
|
||||
xEnd = 0 if xEnd<0
|
||||
xEnd = xsize-1 if xEnd>=xsize
|
||||
return false if xStart>=xEnd
|
||||
ysize = @map_data.ysize
|
||||
yStart = @oy/@tileHeight - 1
|
||||
yStart = 0 if yStart<0
|
||||
yStart = ysize-1 if yStart>=ysize
|
||||
yEnd = (@oy+@viewport.rect.height)/@tileHeight + 1
|
||||
yEnd = 0 if yEnd<0
|
||||
yEnd = ysize-1 if yEnd>=ysize
|
||||
return false if yStart>=yEnd
|
||||
return true
|
||||
end
|
||||
|
||||
def autotileNumFrames(id)
|
||||
autotile = @autotiles[id/48-1]
|
||||
return 0 if !autotile || autotile.disposed?
|
||||
frames = 1
|
||||
if autotile.height==@tileHeight
|
||||
frames = autotile.width/@tileWidth
|
||||
else
|
||||
frames = autotile.width/(3*@tileWidth)
|
||||
end
|
||||
return frames
|
||||
end
|
||||
|
||||
def autotileFrame(id)
|
||||
autotile = @autotiles[id/48-1]
|
||||
return -1 if !autotile || autotile.disposed?
|
||||
frames = 1
|
||||
if autotile.height==@tileHeight
|
||||
frames = autotile.width/@tileWidth
|
||||
else
|
||||
frames = autotile.width/(3*@tileWidth)
|
||||
end
|
||||
return (Graphics.frame_count/Animated_Autotiles_Frames)%frames
|
||||
end
|
||||
|
||||
def repaintAutotiles
|
||||
for i in 0...@autotileInfo.length
|
||||
next if !@autotileInfo[i]
|
||||
frame = autotileFrame(i)
|
||||
@autotileInfo[i].clear
|
||||
bltAutotile(@autotileInfo[i],0,0,i,frame)
|
||||
end
|
||||
end
|
||||
|
||||
def bltAutotile(bitmap,x,y,id,frame)
|
||||
return if frame<0
|
||||
autotile = @autotiles[id/48-1]
|
||||
return if !autotile || autotile.disposed?
|
||||
if autotile.height==@tileSrcHeight
|
||||
anim = frame*@tileSrcWidth
|
||||
src_rect = Rect.new(anim,0,@tileSrcWidth,@tileSrcHeight)
|
||||
if @diffsizes
|
||||
bitmap.stretch_blt(Rect.new(x,y,@tileWidth,@tileHeight),autotile,src_rect)
|
||||
else
|
||||
bitmap.blt(x,y,autotile,src_rect)
|
||||
end
|
||||
else
|
||||
anim = frame*3*@tileSrcWidth
|
||||
id %= 48
|
||||
tiles = Autotiles[id>>3][id&7]
|
||||
src = Rect.new(0,0,0,0)
|
||||
halfTileWidth = @tileWidth>>1
|
||||
halfTileHeight = @tileHeight>>1
|
||||
halfTileSrcWidth = @tileSrcWidth>>1
|
||||
halfTileSrcHeight = @tileSrcHeight>>1
|
||||
for i in 0...4
|
||||
tile_position = tiles[i] - 1
|
||||
src.set( (tile_position % 6)*halfTileSrcWidth + anim,
|
||||
(tile_position / 6)*halfTileSrcHeight, halfTileSrcWidth, halfTileSrcHeight)
|
||||
if @diffsizes
|
||||
bitmap.stretch_blt(
|
||||
Rect.new(i%2*halfTileWidth+x,i/2*halfTileHeight+y,halfTileWidth,halfTileHeight),
|
||||
autotile,src)
|
||||
else
|
||||
bitmap.blt(i%2*halfTileWidth+x,i/2*halfTileHeight+y, autotile, src)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def getAutotile(sprite,id)
|
||||
frames = @framecount[id/48-1]
|
||||
if frames<=1
|
||||
anim = 0
|
||||
else
|
||||
anim = (Graphics.frame_count/Animated_Autotiles_Frames)%frames
|
||||
end
|
||||
return if anim<0
|
||||
bitmap = @autotileInfo[id]
|
||||
if !bitmap
|
||||
bitmap = Bitmap.new(@tileWidth,@tileHeight)
|
||||
bltAutotile(bitmap,0,0,id,anim)
|
||||
@autotileInfo[id] = bitmap
|
||||
end
|
||||
sprite.bitmap = bitmap if sprite.bitmap!=bitmap
|
||||
end
|
||||
|
||||
def getRegularTile(sprite,id)
|
||||
if @diffsizes
|
||||
bitmap = @regularTileInfo[id]
|
||||
if !bitmap
|
||||
bitmap = Bitmap.new(@tileWidth,@tileHeight)
|
||||
rect = Rect.new(((id - 384)&7)*@tileSrcWidth,((id - 384)>>3)*@tileSrcHeight,
|
||||
@tileSrcWidth,@tileSrcHeight)
|
||||
bitmap.stretch_blt(Rect.new(0,0,@tileWidth,@tileHeight),@tileset,rect)
|
||||
@regularTileInfo[id] = bitmap
|
||||
end
|
||||
sprite.bitmap = bitmap if sprite.bitmap!=bitmap
|
||||
else
|
||||
sprite.bitmap = @tileset if sprite.bitmap!=@tileset
|
||||
sprite.src_rect.set(((id - 384)&7)*@tileSrcWidth,((id - 384)>>3)*@tileSrcHeight,
|
||||
@tileSrcWidth,@tileSrcHeight)
|
||||
end
|
||||
end
|
||||
|
||||
def addTile(tiles,count,xpos,ypos,id)
|
||||
terrain = @terrain_tags[id]
|
||||
priority = @priorities[id]
|
||||
if id>=384
|
||||
if count>=tiles.length
|
||||
sprite = CustomTilemapSprite.new(@viewport)
|
||||
tiles.push(sprite,0)
|
||||
else
|
||||
sprite = tiles[count]
|
||||
tiles[count+1] = 0
|
||||
end
|
||||
sprite.visible = @visible
|
||||
sprite.x = xpos
|
||||
sprite.y = ypos
|
||||
sprite.tone = @tone
|
||||
sprite.color = @color
|
||||
getRegularTile(sprite,id)
|
||||
else
|
||||
if count>=tiles.length
|
||||
sprite = CustomTilemapSprite.new(@viewport)
|
||||
tiles.push(sprite,1)
|
||||
else
|
||||
sprite = tiles[count]
|
||||
tiles[count+1] = 1
|
||||
end
|
||||
sprite.visible = @visible
|
||||
sprite.x = xpos
|
||||
sprite.y = ypos
|
||||
sprite.tone = @tone
|
||||
sprite.color = @color
|
||||
getAutotile(sprite,id)
|
||||
end
|
||||
if PBTerrain.hasReflections?(terrain)
|
||||
spriteZ = -100
|
||||
elsif $PokemonGlobal.bridge>0 && PBTerrain.isBridge?(terrain)
|
||||
spriteZ = 1
|
||||
else
|
||||
spriteZ = (priority==0) ? 0 : ypos+priority*32+32
|
||||
end
|
||||
sprite.z = spriteZ
|
||||
count += 2
|
||||
return count
|
||||
end
|
||||
|
||||
def refresh_flash
|
||||
if @flash_data && !@flash
|
||||
@flash = CustomTilemapSprite.new(viewport)
|
||||
@flash.visible = true
|
||||
@flash.z = 1
|
||||
@flash.tone = tone
|
||||
@flash.color = color
|
||||
@flash.blend_type = 1
|
||||
@flash.bitmap = Bitmap.new([graphicsWidth*2,1].max,[graphicsHeight*2,1].max)
|
||||
@firsttimeflash = true
|
||||
elsif !@flash_data && @flash
|
||||
@flash.bitmap.dispose if @flash.bitmap
|
||||
@flash.dispose
|
||||
@flash = nil
|
||||
@firsttimeflash = false
|
||||
end
|
||||
end
|
||||
|
||||
def refreshFlashSprite
|
||||
return if !@flash || @flash_data.nil?
|
||||
ptX = @ox-@oxFlash
|
||||
ptY = @oy-@oyFlash
|
||||
if !@firsttimeflash && !@usedsprites &&
|
||||
ptX>=0 && ptX+@viewport.rect.width<=@flash.bitmap.width &&
|
||||
ptY>=0 && ptY+@viewport.rect.height<=@flash.bitmap.height
|
||||
@flash.ox = 0
|
||||
@flash.oy = 0
|
||||
@flash.src_rect.set(ptX.round,ptY.round,
|
||||
@viewport.rect.width,@viewport.rect.height)
|
||||
return
|
||||
end
|
||||
width = @flash.bitmap.width
|
||||
height = @flash.bitmap.height
|
||||
bitmap = @flash.bitmap
|
||||
ysize = @map_data.ysize
|
||||
xsize = @map_data.xsize
|
||||
zsize = @map_data.zsize
|
||||
@firsttimeflash = false
|
||||
@oxFlash = @ox-(width>>2)
|
||||
@oyFlash = @oy-(height>>2)
|
||||
@flash.ox = 0
|
||||
@flash.oy = 0
|
||||
@flash.src_rect.set(width>>2,height>>2,
|
||||
@viewport.rect.width,@viewport.rect.height)
|
||||
@flash.bitmap.clear
|
||||
@oxFlash = @oxFlash.floor
|
||||
@oyFlash = @oyFlash.floor
|
||||
xStart = @oxFlash/@tileWidth
|
||||
xStart = 0 if xStart<0
|
||||
yStart = @oyFlash/@tileHeight
|
||||
yStart = 0 if yStart<0
|
||||
xEnd = xStart+(width/@tileWidth)+1
|
||||
yEnd = yStart+(height/@tileHeight)+1
|
||||
xEnd = xsize if xEnd>=xsize
|
||||
yEnd = ysize if yEnd>=ysize
|
||||
if xStart<xEnd && yStart<yEnd
|
||||
yrange = yStart...yEnd
|
||||
xrange = xStart...xEnd
|
||||
tmpcolor = Color.new(0,0,0,0)
|
||||
for y in yrange
|
||||
ypos = (y*@tileHeight)-@oyFlash
|
||||
for x in xrange
|
||||
xpos = (x*@tileWidth)-@oxFlash
|
||||
id = @flash_data[x, y, 0]
|
||||
r = (id>>8)&15
|
||||
g = (id>>4)&15
|
||||
b = (id)&15
|
||||
tmpcolor.set(r<<4,g<<4,b<<4)
|
||||
bitmap.fill_rect(xpos,ypos,@tileWidth,@tileHeight,tmpcolor)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def refresh_tileset
|
||||
i = 0; len = @regularTileInfo.length; while i<len
|
||||
if @regularTileInfo[i]
|
||||
@regularTileInfo[i].dispose
|
||||
@regularTileInfo[i] = nil
|
||||
end
|
||||
i += 1
|
||||
end
|
||||
@regularTileInfo.clear
|
||||
@priotiles.clear
|
||||
ysize = @map_data.ysize
|
||||
xsize = @map_data.xsize
|
||||
zsize = @map_data.zsize
|
||||
if xsize>100 || ysize>100
|
||||
@fullyrefreshed = false
|
||||
else
|
||||
for z in 0...zsize
|
||||
for y in 0...ysize
|
||||
for x in 0...xsize
|
||||
id = @map_data[x, y, z]
|
||||
next if id==0
|
||||
next if @priorities[id]==0 && !PBTerrain.hasReflections?(@terrain_tags[id])
|
||||
@priotiles.push([x,y,z,id])
|
||||
end
|
||||
end
|
||||
end
|
||||
@fullyrefreshed = true
|
||||
end
|
||||
end
|
||||
|
||||
def refresh_autotiles
|
||||
i = 0; len = @autotileInfo.length; while i<len
|
||||
if @autotileInfo[i]
|
||||
@autotileInfo[i].dispose
|
||||
@autotileInfo[i] = nil
|
||||
end
|
||||
i += 1
|
||||
end
|
||||
i = 0; len = @autosprites.length; while i<len
|
||||
if @autosprites[i]
|
||||
@autosprites[i].dispose
|
||||
@autosprites[i] = nil
|
||||
end
|
||||
i += 2
|
||||
end
|
||||
@autosprites.clear
|
||||
@autotileInfo.clear
|
||||
@prioautotiles.clear
|
||||
@priorect = nil
|
||||
@priorectautos = nil
|
||||
hasanimated = false
|
||||
for i in 0...7
|
||||
numframes = autotileNumFrames(48*(i+1))
|
||||
hasanimated = true if numframes>=2
|
||||
@framecount[i] = numframes
|
||||
end
|
||||
if hasanimated
|
||||
ysize = @map_data.ysize
|
||||
xsize = @map_data.xsize
|
||||
zsize = @map_data.zsize
|
||||
if xsize>100 || ysize>100
|
||||
@fullyrefreshedautos = false
|
||||
else
|
||||
for y in 0...ysize
|
||||
for x in 0...xsize
|
||||
haveautotile = false
|
||||
for z in 0...zsize
|
||||
id = @map_data[x, y, z]
|
||||
next if id==0 || id>=384
|
||||
next if @priorities[id]!=0 || PBTerrain.hasReflections?(@terrain_tags[id])
|
||||
next if @framecount[id/48-1]<2
|
||||
haveautotile = true
|
||||
break
|
||||
end
|
||||
@prioautotiles.push([x,y]) if haveautotile
|
||||
end
|
||||
end
|
||||
@fullyrefreshedautos = true
|
||||
end
|
||||
else
|
||||
@fullyrefreshedautos = true
|
||||
end
|
||||
end
|
||||
|
||||
def refreshLayer0(autotiles=false)
|
||||
return true if autotiles && !shown?
|
||||
ptX = @ox-@oxLayer0
|
||||
ptY = @oy-@oyLayer0
|
||||
if !autotiles && !@firsttime && !@usedsprites &&
|
||||
ptX>=0 && ptX+@viewport.rect.width<=@layer0.bitmap.width &&
|
||||
ptY>=0 && ptY+@viewport.rect.height<=@layer0.bitmap.height
|
||||
if @layer0clip && @viewport.ox==0 && @viewport.oy==0
|
||||
@layer0.ox = 0
|
||||
@layer0.oy = 0
|
||||
@layer0.src_rect.set(ptX.round,ptY.round,
|
||||
@viewport.rect.width,@viewport.rect.height)
|
||||
else
|
||||
@layer0.ox = ptX.round
|
||||
@layer0.oy = ptY.round
|
||||
@layer0.src_rect.set(0,0,@layer0.bitmap.width,@layer0.bitmap.height)
|
||||
end
|
||||
return true
|
||||
end
|
||||
width = @layer0.bitmap.width
|
||||
height = @layer0.bitmap.height
|
||||
bitmap = @layer0.bitmap
|
||||
ysize = @map_data.ysize
|
||||
xsize = @map_data.xsize
|
||||
zsize = @map_data.zsize
|
||||
twidth = @tileWidth
|
||||
theight = @tileHeight
|
||||
mapdata = @map_data
|
||||
if autotiles
|
||||
return true if @fullyrefreshedautos && @prioautotiles.length==0
|
||||
xStart = @oxLayer0/twidth
|
||||
xStart = 0 if xStart<0
|
||||
yStart = @oyLayer0/theight
|
||||
yStart = 0 if yStart<0
|
||||
xEnd = xStart+(width/twidth)+1
|
||||
yEnd = yStart+(height/theight)+1
|
||||
xEnd = xsize if xEnd>xsize
|
||||
yEnd = ysize if yEnd>ysize
|
||||
return true if xStart>=xEnd || yStart>=yEnd
|
||||
trans = Color.new(0,0,0,0)
|
||||
temprect = Rect.new(0,0,0,0)
|
||||
tilerect = Rect.new(0,0,twidth,theight)
|
||||
zrange = 0...zsize
|
||||
overallcount = 0
|
||||
count = 0
|
||||
if !@fullyrefreshedautos
|
||||
for y in yStart..yEnd
|
||||
for x in xStart..xEnd
|
||||
haveautotile = false
|
||||
for z in zrange
|
||||
id = mapdata[x, y, z]
|
||||
next if !id || id<48 || id>=384
|
||||
prioid = @priorities[id]
|
||||
next if prioid!=0 || PBTerrain.hasReflections?(@terrain_tags[id])
|
||||
fcount = @framecount[id/48-1]
|
||||
next if !fcount || fcount<2
|
||||
if !haveautotile
|
||||
haveautotile = true
|
||||
overallcount += 1
|
||||
xpos = (x*twidth)-@oxLayer0
|
||||
ypos = (y*theight)-@oyLayer0
|
||||
bitmap.fill_rect(xpos,ypos,twidth,theight,trans) if overallcount<=2000
|
||||
break
|
||||
end
|
||||
end
|
||||
for z in zrange
|
||||
id = mapdata[x,y,z]
|
||||
next if !id || id<48
|
||||
prioid = @priorities[id]
|
||||
next if prioid!=0 || PBTerrain.hasReflections?(@terrain_tags[id])
|
||||
if overallcount>2000
|
||||
xpos = (x*twidth)-@oxLayer0
|
||||
ypos = (y*theight)-@oyLayer0
|
||||
count = addTile(@autosprites,count,xpos,ypos,id)
|
||||
next
|
||||
elsif id>=384
|
||||
temprect.set(((id - 384)&7)*@tileSrcWidth,((id - 384)>>3)*@tileSrcHeight,
|
||||
@tileSrcWidth,@tileSrcHeight)
|
||||
xpos = (x*twidth)-@oxLayer0
|
||||
ypos = (y*theight)-@oyLayer0
|
||||
if @diffsizes
|
||||
bitmap.stretch_blt(Rect.new(xpos,ypos,twidth,theight),@tileset,temprect)
|
||||
else
|
||||
bitmap.blt(xpos,ypos,@tileset,temprect)
|
||||
end
|
||||
else
|
||||
tilebitmap = @autotileInfo[id]
|
||||
if !tilebitmap
|
||||
anim = autotileFrame(id)
|
||||
next if anim<0
|
||||
tilebitmap = Bitmap.new(twidth,theight)
|
||||
bltAutotile(tilebitmap,0,0,id,anim)
|
||||
@autotileInfo[id] = tilebitmap
|
||||
end
|
||||
xpos = (x*twidth)-@oxLayer0
|
||||
ypos = (y*theight)-@oyLayer0
|
||||
bitmap.blt(xpos,ypos,tilebitmap,tilerect)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
Graphics.frame_reset
|
||||
else
|
||||
if !@priorect || !@priorectautos ||
|
||||
@priorect[0]!=xStart || @priorect[1]!=yStart ||
|
||||
@priorect[2]!=xEnd || @priorect[3]!=yEnd
|
||||
@priorectautos = @prioautotiles.find_all { |tile|
|
||||
x = tile[0]
|
||||
y = tile[1]
|
||||
# "next" means "return" here
|
||||
next !(x<xStart || x>xEnd || y<yStart || y>yEnd)
|
||||
}
|
||||
@priorect = [xStart,yStart,xEnd,yEnd]
|
||||
end
|
||||
# echoln ["autos",@priorect,@priorectautos.length,@prioautotiles.length]
|
||||
for tile in @priorectautos
|
||||
x = tile[0]
|
||||
y = tile[1]
|
||||
overallcount+=1
|
||||
xpos = (x*twidth)-@oxLayer0
|
||||
ypos = (y*theight)-@oyLayer0
|
||||
bitmap.fill_rect(xpos,ypos,twidth,theight,trans)
|
||||
z = 0
|
||||
while z<zsize
|
||||
id = mapdata[x,y,z]
|
||||
z += 1
|
||||
next if !id || id<48
|
||||
prioid = @priorities[id]
|
||||
next if prioid!=0 || PBTerrain.hasReflections?(@terrain_tags[id])
|
||||
if id>=384
|
||||
temprect.set(((id - 384)&7)*@tileSrcWidth,((id - 384)>>3)*@tileSrcHeight,
|
||||
@tileSrcWidth,@tileSrcHeight)
|
||||
if @diffsizes
|
||||
bitmap.stretch_blt(Rect.new(xpos,ypos,twidth,theight),@tileset,temprect)
|
||||
else
|
||||
bitmap.blt(xpos,ypos,@tileset,temprect)
|
||||
end
|
||||
else
|
||||
tilebitmap = @autotileInfo[id]
|
||||
if !tilebitmap
|
||||
anim = autotileFrame(id)
|
||||
next if anim<0
|
||||
tilebitmap = Bitmap.new(twidth,theight)
|
||||
bltAutotile(tilebitmap,0,0,id,anim)
|
||||
@autotileInfo[id] = tilebitmap
|
||||
end
|
||||
bitmap.blt(xpos,ypos,tilebitmap,tilerect)
|
||||
end
|
||||
end
|
||||
end
|
||||
Graphics.frame_reset if overallcount>500
|
||||
end
|
||||
@usedsprites = false
|
||||
return true
|
||||
end
|
||||
return false if @usedsprites
|
||||
@firsttime = false
|
||||
@oxLayer0 = @ox-(width>>2)
|
||||
@oyLayer0 = @oy-(height>>2)
|
||||
if @layer0clip
|
||||
@layer0.ox = 0
|
||||
@layer0.oy = 0
|
||||
@layer0.src_rect.set(width>>2,height>>2,
|
||||
@viewport.rect.width,@viewport.rect.height)
|
||||
else
|
||||
@layer0.ox = (width>>2)
|
||||
@layer0.oy = (height>>2)
|
||||
end
|
||||
@layer0.bitmap.clear
|
||||
@oxLayer0 = @oxLayer0.round
|
||||
@oyLayer0 = @oyLayer0.round
|
||||
xStart = @oxLayer0/twidth
|
||||
xStart = 0 if xStart<0
|
||||
yStart = @oyLayer0/theight
|
||||
yStart = 0 if yStart<0
|
||||
xEnd = xStart+(width/twidth)+1
|
||||
yEnd = yStart+(height/theight)+1
|
||||
xEnd = xsize if xEnd>=xsize
|
||||
yEnd = ysize if yEnd>=ysize
|
||||
if xStart<xEnd && yStart<yEnd
|
||||
tmprect = Rect.new(0,0,0,0)
|
||||
yrange = yStart...yEnd
|
||||
xrange = xStart...xEnd
|
||||
for z in 0...zsize
|
||||
for y in yrange
|
||||
ypos = (y*theight)-@oyLayer0
|
||||
for x in xrange
|
||||
xpos = (x*twidth)-@oxLayer0
|
||||
id = mapdata[x, y, z]
|
||||
next if id==0 || @priorities[id]!=0 || PBTerrain.hasReflections?(@terrain_tags[id])
|
||||
if id>=384
|
||||
tmprect.set( ((id - 384)&7)*@tileSrcWidth,((id - 384)>>3)*@tileSrcHeight,
|
||||
@tileSrcWidth,@tileSrcHeight)
|
||||
if @diffsizes
|
||||
bitmap.stretch_blt(Rect.new(xpos,ypos,twidth,theight),@tileset,tmprect)
|
||||
else
|
||||
bitmap.blt(xpos,ypos,@tileset,tmprect)
|
||||
end
|
||||
else
|
||||
frames = @framecount[id/48-1]
|
||||
if frames<=1
|
||||
frame = 0
|
||||
else
|
||||
frame = (Graphics.frame_count/Animated_Autotiles_Frames)%frames
|
||||
end
|
||||
bltAutotile(bitmap,xpos,ypos,id,frame)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
Graphics.frame_reset
|
||||
end
|
||||
return true
|
||||
end
|
||||
|
||||
def refresh(autotiles=false)
|
||||
@oldOx = @ox
|
||||
@oldOy = @oy
|
||||
usesprites = false
|
||||
if @layer0
|
||||
@layer0.visible = @visible
|
||||
usesprites = !refreshLayer0(autotiles)
|
||||
return if autotiles && !usesprites
|
||||
else
|
||||
usesprites = true
|
||||
end
|
||||
refreshFlashSprite
|
||||
vpx = @viewport.rect.x
|
||||
vpy = @viewport.rect.y
|
||||
vpr = @viewport.rect.width+vpx
|
||||
vpb = @viewport.rect.height+vpy
|
||||
xsize = @map_data.xsize
|
||||
ysize = @map_data.ysize
|
||||
minX = (@ox/@tileWidth)-1
|
||||
minX = 0 if minX<0
|
||||
minX = xsize-1 if minX>=xsize
|
||||
maxX = ((@ox+@viewport.rect.width)/@tileWidth)+1
|
||||
maxX = 0 if maxX<0
|
||||
maxX = xsize-1 if maxX>=xsize
|
||||
minY = (@oy/@tileHeight)-1
|
||||
minY = 0 if minY<0
|
||||
minY = ysize-1 if minY>=ysize
|
||||
maxY = ((@oy+@viewport.rect.height)/@tileHeight)+1
|
||||
maxY = 0 if maxY<0
|
||||
maxY = ysize-1 if maxY>=ysize
|
||||
count = 0
|
||||
if minX<maxX && minY<maxY
|
||||
@usedsprites = usesprites || @usedsprites
|
||||
if @layer0
|
||||
@layer0.visible = false if usesprites
|
||||
end
|
||||
if @fullyrefreshed
|
||||
if !@priotilesrect || !@priotilesfast ||
|
||||
@priotilesrect[0]!=minX ||
|
||||
@priotilesrect[1]!=minY ||
|
||||
@priotilesrect[2]!=maxX ||
|
||||
@priotilesrect[3]!=maxY
|
||||
@priotilesfast = @priotiles.find_all { |tile|
|
||||
x = tile[0]
|
||||
y = tile[1]
|
||||
# "next" means "return" here
|
||||
next !(x<minX || x>maxX || y<minY || y>maxY)
|
||||
}
|
||||
@priotilesrect = [minX,minY,maxX,maxY]
|
||||
end
|
||||
# echoln [minX,minY,maxX,maxY,@priotilesfast.length,@priotiles.length]
|
||||
for prio in @priotilesfast
|
||||
xpos = (prio[0]*@tileWidth)-@ox
|
||||
ypos = (prio[1]*@tileHeight)-@oy
|
||||
count = addTile(@tiles,count,xpos,ypos,prio[3])
|
||||
end
|
||||
else
|
||||
if !@priotilesrect || !@priotilesfast ||
|
||||
@priotilesrect[0]!=minX ||
|
||||
@priotilesrect[1]!=minY ||
|
||||
@priotilesrect[2]!=maxX ||
|
||||
@priotilesrect[3]!=maxY
|
||||
@priotilesfast=[]
|
||||
for z in 0...@map_data.zsize
|
||||
for y in minY..maxY
|
||||
for x in minX..maxX
|
||||
id = @map_data[x, y, z]
|
||||
next if id==0
|
||||
next if @priorities[id]==0 && !PBTerrain.hasReflections?(@terrain_tags[id])
|
||||
@priotilesfast.push([x,y,z,id])
|
||||
end
|
||||
end
|
||||
end
|
||||
@priotilesrect = [minX,minY,maxX,maxY]
|
||||
end
|
||||
for prio in @priotilesfast
|
||||
xpos = (prio[0]*@tileWidth)-@ox
|
||||
ypos = (prio[1]*@tileHeight)-@oy
|
||||
count = addTile(@tiles,count,xpos,ypos,prio[3])
|
||||
end
|
||||
end
|
||||
end
|
||||
if count<@tiles.length
|
||||
bigchange = (count<=(@tiles.length*2/3)) && (@tiles.length*2/3)>25
|
||||
j = count; len = @tiles.length; while j<len
|
||||
sprite = @tiles[j]
|
||||
@tiles[j+1] = -1
|
||||
if bigchange
|
||||
sprite.dispose
|
||||
@tiles[j] = nil
|
||||
@tiles[j+1] = nil
|
||||
elsif !@tiles[j].disposed?
|
||||
sprite.visible = false if sprite.visible
|
||||
end
|
||||
j += 2
|
||||
end
|
||||
@tiles.compact! if bigchange
|
||||
end
|
||||
end
|
||||
|
||||
def update
|
||||
if @haveGraphicsWH
|
||||
@graphicsWidth = Graphics.width
|
||||
@graphicsHeight = Graphics.height
|
||||
end
|
||||
# Update tone
|
||||
if @oldtone!=@tone
|
||||
@layer0.tone = @tone
|
||||
@flash.tone = @tone if @flash
|
||||
for sprite in @autosprites
|
||||
sprite.tone = @tone if sprite.is_a?(Sprite)
|
||||
end
|
||||
for sprite in @tiles
|
||||
sprite.tone = @tone if sprite.is_a?(Sprite)
|
||||
end
|
||||
@oldtone = @tone.clone
|
||||
end
|
||||
# Update color
|
||||
if @oldcolor!=@color
|
||||
@layer0.color = @color
|
||||
@flash.color = @color if @flash
|
||||
for sprite in @autosprites
|
||||
sprite.color = @color if sprite.is_a?(Sprite)
|
||||
end
|
||||
for sprite in @tiles
|
||||
sprite.color = @color if sprite.is_a?(Sprite)
|
||||
end
|
||||
@oldcolor = @color.clone
|
||||
end
|
||||
# Refresh anything that has changed
|
||||
if @autotiles.changed
|
||||
refresh_autotiles
|
||||
repaintAutotiles
|
||||
end
|
||||
if @flashChanged
|
||||
refresh_flash
|
||||
end
|
||||
if @tilesetChanged
|
||||
refresh_tileset
|
||||
end
|
||||
if @flash
|
||||
@flash.opacity = FlashOpacity[(Graphics.frame_count/2) % 6]
|
||||
end
|
||||
mustrefresh = (@oldOx!=@ox || @oldOy!=@oy || @tilesetChanged || @autotiles.changed)
|
||||
if @viewport.ox!=@oldViewportOx || @viewport.oy!=@oldViewportOy
|
||||
mustrefresh = true
|
||||
@oldViewportOx = @viewport.ox
|
||||
@oldViewportOy = @viewport.oy
|
||||
end
|
||||
refresh if mustrefresh
|
||||
if (Graphics.frame_count % Animated_Autotiles_Frames == 0) || @nowshown
|
||||
repaintAutotiles
|
||||
refresh(true)
|
||||
end
|
||||
@nowshown = false
|
||||
@autotiles.changed = false
|
||||
@tilesetChanged = false
|
||||
end
|
||||
end
|
||||
447
Data/Scripts/005_Map renderer/002_Tilemap_Perspective.rb
Normal file
447
Data/Scripts/005_Map renderer/002_Tilemap_Perspective.rb
Normal file
@@ -0,0 +1,447 @@
|
||||
def bltMinimapAutotile(dstBitmap,x,y,srcBitmap,id)
|
||||
return if id>=48 || !srcBitmap || srcBitmap.disposed?
|
||||
anim=0
|
||||
cxTile=3
|
||||
cyTile=3
|
||||
tiles = TileDrawingHelper::Autotiles[id>>3][id&7]
|
||||
src=Rect.new(0,0,0,0)
|
||||
for i in 0...4
|
||||
tile_position = tiles[i] - 1
|
||||
src.set(
|
||||
tile_position % 6 * cxTile + anim,
|
||||
tile_position / 6 * cyTile, cxTile, cyTile)
|
||||
dstBitmap.blt(i%2*cxTile+x,i/2*cyTile+y, srcBitmap, src)
|
||||
end
|
||||
end
|
||||
|
||||
def passable?(passages,tile_id)
|
||||
return false if tile_id == nil
|
||||
passage = passages[tile_id]
|
||||
return (passage && passage<15)
|
||||
end
|
||||
|
||||
def getPassabilityMinimap(mapid)
|
||||
map = load_data(sprintf("Data/Map%03d.rxdata",mapid))
|
||||
tileset = $data_tilesets[map.tileset_id]
|
||||
minimap = AnimatedBitmap.new("Graphics/Pictures/minimap_tiles")
|
||||
ret = Bitmap.new(map.width*6,map.height*6)
|
||||
passtable = Table.new(map.width,map.height)
|
||||
passages = tileset.passages
|
||||
for i in 0...map.width
|
||||
for j in 0...map.height
|
||||
pass=true
|
||||
for z in [2,1,0]
|
||||
if !passable?(passages,map.data[i,j,z])
|
||||
pass=false
|
||||
break
|
||||
end
|
||||
end
|
||||
passtable[i,j]=pass ? 1 : 0
|
||||
end
|
||||
end
|
||||
neighbors=TileDrawingHelper::NeighborsToTiles
|
||||
for i in 0...map.width
|
||||
for j in 0...map.height
|
||||
if passtable[i,j]==0
|
||||
nb=TileDrawingHelper.tableNeighbors(passtable,i,j)
|
||||
tile=neighbors[nb]
|
||||
bltMinimapAutotile(ret,i*6,j*6,minimap.bitmap,tile)
|
||||
end
|
||||
end
|
||||
end
|
||||
minimap.disposes
|
||||
return ret
|
||||
end
|
||||
|
||||
|
||||
|
||||
module ScreenPosHelper
|
||||
def self.pbScreenZoomX(ch)
|
||||
zoom=1.0
|
||||
if $PokemonSystem.tilemap==2
|
||||
zoom=((ch.screen_y - 16) - (Graphics.height / 2)) *
|
||||
(Draw_Tilemap::Pitch*1.0 / (Graphics.height * 25)) + 1
|
||||
end
|
||||
return zoom*Game_Map::TILE_WIDTH/32.0
|
||||
end
|
||||
|
||||
def self.pbScreenZoomY(ch)
|
||||
zoom=1.0
|
||||
if $PokemonSystem.tilemap==2
|
||||
zoom=((ch.screen_y - 16) - (Graphics.height / 2)) *
|
||||
(Draw_Tilemap::Pitch*1.0 / (Graphics.height * 25)) + 1
|
||||
end
|
||||
return zoom*Game_Map::TILE_HEIGHT/32.0
|
||||
end
|
||||
|
||||
def self.pbScreenX(ch)
|
||||
ret=ch.screen_x
|
||||
if $PokemonSystem.tilemap==2
|
||||
widthdiv2=(Graphics.width / 2)
|
||||
ret=widthdiv2+(ret-widthdiv2)*pbScreenZoomX(ch)
|
||||
end
|
||||
return ret
|
||||
end
|
||||
|
||||
def self.pbScreenY(ch)
|
||||
ret=ch.screen_y
|
||||
if $PokemonSystem.tilemap==2 && Draw_Tilemap::Curve && Draw_Tilemap::Pitch != 0
|
||||
zoomy=pbScreenZoomY(ch)
|
||||
oneMinusZoomY=1-zoomy
|
||||
ret += (8 * oneMinusZoomY * (oneMinusZoomY /
|
||||
(2 * ((Draw_Tilemap::Pitch*1.0 / 100) / (Graphics.height*1.0 / 16.0))) + 0.5))
|
||||
end
|
||||
return ret
|
||||
end
|
||||
|
||||
@heightcache={}
|
||||
|
||||
def self.bmHeight(bm)
|
||||
h=@heightcache[bm]
|
||||
if !h
|
||||
bmap=AnimatedBitmap.new("Graphics/Characters/"+bm,0)
|
||||
h=bmap.height
|
||||
@heightcache[bm]=h
|
||||
bmap.dispose
|
||||
end
|
||||
return h
|
||||
end
|
||||
|
||||
def self.pbScreenZ(ch,height=nil)
|
||||
if height==nil
|
||||
height=0
|
||||
if ch.tile_id > 0
|
||||
height=32
|
||||
elsif ch.character_name!=""
|
||||
height=bmHeight(ch.character_name)/4
|
||||
end
|
||||
end
|
||||
ret=ch.screen_z(height)
|
||||
if $PokemonSystem.tilemap==2
|
||||
ret-=(pbScreenZoomY(ch) < 0.5 ? 1000 : 0)
|
||||
end
|
||||
return ret
|
||||
end
|
||||
end
|
||||
|
||||
###############################################
|
||||
|
||||
|
||||
|
||||
class Draw_Tilemap # This class controls a set of sprites, with
|
||||
attr_reader :tileset # different Z values, arranged into horizontal bars
|
||||
attr_reader :map_data
|
||||
attr_reader :flash_data
|
||||
attr_reader :priorities
|
||||
attr_reader :terrain_tags
|
||||
attr_reader :autotiles
|
||||
attr_accessor :bitmaps
|
||||
attr_accessor :pitch
|
||||
attr_accessor :ox
|
||||
attr_accessor :oy
|
||||
attr_accessor :visible
|
||||
attr_reader :viewport
|
||||
attr_accessor :color
|
||||
attr_accessor :tone
|
||||
StripSize = 16
|
||||
Curve = true
|
||||
Pitch = 3
|
||||
FlashOpacity = [100,90,80,70,80,90]
|
||||
|
||||
def initialize(viewport=nil)
|
||||
@tileset=nil
|
||||
@map_data=nil
|
||||
@priorities=nil
|
||||
@terrain_tags=nil
|
||||
@autotiles=[nil,nil,nil,nil,nil,nil,nil]
|
||||
@viewport=viewport
|
||||
@visible=true
|
||||
@helper=TileDrawingHelper.new(nil,@autotiles)
|
||||
@drawnstrips=[]
|
||||
@contentstrips=[]
|
||||
@disposed=false
|
||||
@bitmaps=[]
|
||||
@sprites=[]
|
||||
@ox=0
|
||||
@oy=0
|
||||
@tone=Tone.new(0,0,0,0)
|
||||
@color=Color.new(0,0,0,0)
|
||||
@flash_data=nil
|
||||
@numsprites=0
|
||||
end
|
||||
|
||||
def tileset=(value)
|
||||
@tileset=value
|
||||
@helper.tileset=value
|
||||
@doredraw=true
|
||||
end
|
||||
|
||||
def map_data=(value)
|
||||
@map_data=value
|
||||
@doredraw=true
|
||||
end
|
||||
|
||||
def flash_data=(value)
|
||||
@flash_data=value
|
||||
@doredraw=true
|
||||
end
|
||||
|
||||
def priorities=(value)
|
||||
@priorities=value
|
||||
@doredraw=true
|
||||
end
|
||||
|
||||
def terrain_tags=(value)
|
||||
@terrain_tags=value
|
||||
@doredraw=true
|
||||
end
|
||||
|
||||
def redrawmap
|
||||
# Provide blank data in proper object form
|
||||
self.clear
|
||||
xsize=@map_data.xsize
|
||||
ysize=@map_data.ysize
|
||||
# Bitmaps used for each priority's drawing. Priorities 2-5 are combined.
|
||||
@bitmaps = [Bitmap.new(xsize*32, ysize*32+StripSize),
|
||||
Bitmap.new(xsize*32, ysize*32+StripSize),
|
||||
Bitmap.new(xsize*32, ysize*32+StripSize)]
|
||||
for i in @bitmaps
|
||||
i.clear
|
||||
end
|
||||
if @flash_data
|
||||
@bitmaps.push(Bitmap.new(xsize*32, ysize*32+StripSize))
|
||||
end
|
||||
@drawnstrips.clear
|
||||
@contentstrips.clear
|
||||
# Generate blank sprites
|
||||
@sprites.clear
|
||||
@numsprites=ysize * (32 / StripSize)
|
||||
for i in 0...@map_data.zsize # For each layer
|
||||
@sprites.push([])
|
||||
@contentstrips.push([])
|
||||
end
|
||||
if @flash_data
|
||||
@sprites.push([])
|
||||
@contentstrips.push([])
|
||||
end
|
||||
end
|
||||
|
||||
def update
|
||||
oyunchanged=false
|
||||
if !@flash_data.nil? && @sprites.length>0
|
||||
flashindex=@sprites.length-1
|
||||
for j in 0...@numsprites
|
||||
sprite=@sprites[flashindex][j]
|
||||
next if !sprite.is_a?(Sprite)
|
||||
sprite.opacity=FlashOpacity[(Graphics.frame_count/2) % 6]
|
||||
end
|
||||
end
|
||||
for s in @sprites
|
||||
for sprite in s
|
||||
next if !sprite.is_a?(Sprite)
|
||||
# sprite.tone=@tone
|
||||
# sprite.color=@color
|
||||
end
|
||||
end
|
||||
if @doredraw
|
||||
@drawnstrips=[]
|
||||
redrawmap
|
||||
@doredraw=false
|
||||
elsif @oldOx==@ox && @oldOy==@oy
|
||||
return
|
||||
elsif @oldOy==@oy
|
||||
oyunchanged=true
|
||||
end
|
||||
@oldOx=@ox
|
||||
@oldOy=@oy
|
||||
@pitch = Pitch
|
||||
minvalue=[0, ((Graphics.height / 2) -
|
||||
((Graphics.height * 60) / @pitch) + @oy) / StripSize].max.to_i
|
||||
maxvalue=[@numsprites - 1,(@oy + Graphics.height) / StripSize].min.to_i
|
||||
return if minvalue>maxvalue
|
||||
for j in 0...@numsprites
|
||||
if j<minvalue || j>maxvalue
|
||||
for i in 0...@sprites.length
|
||||
sprite=@sprites[i][j]
|
||||
if sprite
|
||||
sprite.dispose if sprite.is_a?(Sprite)
|
||||
@sprites[i][j]=nil
|
||||
end
|
||||
end
|
||||
else
|
||||
drawStrip(j)
|
||||
end
|
||||
end
|
||||
vpy=@viewport.rect.y
|
||||
vpr=@viewport.rect.x+@viewport.rect.width
|
||||
vpb=@viewport.rect.y+@viewport.rect.height
|
||||
numsprites=0
|
||||
for i in @sprites
|
||||
numsprites+=i.compact.length
|
||||
end
|
||||
for j in minvalue..maxvalue
|
||||
# For each strip within the visible screen, update OX/Y
|
||||
x=Graphics.width/2
|
||||
sox=@ox+x
|
||||
y = (j * StripSize - @oy)
|
||||
zoom_x=1.0
|
||||
zoom_y=1.0
|
||||
unless @pitch == 0 # Apply X Zoom
|
||||
zoom_x = (y - Graphics.height*1.0 / 2) * (@pitch*1.0 / (Graphics.height * 25)) + 1
|
||||
if Curve # Zoom Y values same as X, and compensate
|
||||
zoom_y = zoom_x
|
||||
yadd = StripSize*1.0 * (1 - zoom_y) * ((1 - zoom_y) /
|
||||
(2 * ((@pitch*1.0 / 100) / (Graphics.height*1.0 / (StripSize * 2)))) + 0.5)
|
||||
y+=yadd
|
||||
end
|
||||
end
|
||||
xstart=(x-sox*zoom_x)
|
||||
yend=(y+(StripSize*2)*zoom_y)
|
||||
if xstart>vpr || yend<=vpy
|
||||
for i in 0...@sprites.length
|
||||
sprite=@sprites[i][j]
|
||||
if sprite.is_a?(Sprite)
|
||||
sprite.dispose
|
||||
@sprites[i][j]=nil
|
||||
end
|
||||
end
|
||||
else
|
||||
for i in 0...@sprites.length
|
||||
sprite=@sprites[i][j]
|
||||
next if !sprite
|
||||
if sprite==true
|
||||
sprite=newSprite(i,j)
|
||||
@sprites[i][j]=sprite
|
||||
end
|
||||
sprite.visible=@visible
|
||||
sprite.x = x
|
||||
sprite.ox = sox
|
||||
sprite.y = y
|
||||
sprite.zoom_x = zoom_x
|
||||
sprite.zoom_y = zoom_y
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def clear
|
||||
for i in @bitmaps
|
||||
i.dispose
|
||||
end
|
||||
@bitmaps.clear
|
||||
for i in 0...@sprites.length
|
||||
for j in 0...@sprites[i].length
|
||||
@sprites[i][j].dispose if @sprites[i][j].is_a?(Sprite)
|
||||
end
|
||||
@sprites[i].clear
|
||||
end
|
||||
@sprites.clear
|
||||
end
|
||||
|
||||
def dispose
|
||||
return if @disposed
|
||||
self.clear
|
||||
for i in 0...7
|
||||
self.autotiles[i]=nil
|
||||
end
|
||||
@helper=nil
|
||||
@sprites=nil
|
||||
@bitmaps=nil
|
||||
@disposed = true
|
||||
end
|
||||
|
||||
def disposed?
|
||||
return @disposed
|
||||
end
|
||||
|
||||
def newSprite(i,j)
|
||||
sprite=Sprite.new(@viewport)
|
||||
sprite.bitmap=@bitmaps[i]
|
||||
sprite.src_rect.set(0, j * StripSize, @map_data.xsize * 32, StripSize * 2)
|
||||
sprite.x = Graphics.width / 2
|
||||
sprite.y = -64
|
||||
sprite.z = (i * 32)
|
||||
sprite.tone=@tone
|
||||
sprite.color=@color
|
||||
if i==@bitmaps.length-1 && !@flash_data.nil?
|
||||
sprite.blend_type=1
|
||||
sprite.z=1
|
||||
sprite.opacity=FlashOpacity[(Graphics.frame_count/2) % 6]
|
||||
end
|
||||
return sprite
|
||||
end
|
||||
|
||||
def drawStrip(j)
|
||||
minY=(j*StripSize)/32
|
||||
maxY=(j*StripSize+StripSize*2)/32
|
||||
minY=0 if minY<0
|
||||
minY=@map_data.ysize-1 if minY>@map_data.ysize-1
|
||||
maxY=0 if maxY<0
|
||||
maxY=@map_data.ysize-1 if maxY>@map_data.ysize-1
|
||||
for y in minY..maxY
|
||||
if !@drawnstrips[y]
|
||||
for x in 0...@map_data.xsize
|
||||
draw_position(x, y)
|
||||
end
|
||||
@drawnstrips[y]=true
|
||||
end
|
||||
end
|
||||
for i in 0...@sprites.length # For each priority
|
||||
sprite=@sprites[i][j]
|
||||
if !sprite || (sprite!=true && sprite.disposed?)
|
||||
havecontent=false
|
||||
for y in minY..maxY
|
||||
havecontent=havecontent||@contentstrips[i][y]
|
||||
end
|
||||
sprite=(havecontent) ? true : nil
|
||||
@sprites[i][j]=sprite
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def draw_position(x, y)
|
||||
for layer in 0...@map_data.zsize
|
||||
pos = @map_data[x, y, layer]
|
||||
priopos=@priorities[pos]
|
||||
priopos=0 if !priopos
|
||||
prio=(2<priopos) ? 2 : priopos
|
||||
@contentstrips[prio][y]=true if pos>0
|
||||
@helper.bltTile(@bitmaps[prio],x*32,y*32,pos,0)
|
||||
end
|
||||
if !@flash_data.nil?
|
||||
lastlayer=@bitmaps.length-1
|
||||
id=@flash_data[x,y,0]
|
||||
r=(id>>8)&15
|
||||
g=(id>>4)&15
|
||||
b=(id)&15
|
||||
@contentstrips[lastlayer][y]=true
|
||||
color=Color.new(r*16,g*16,b*16)
|
||||
@bitmaps[lastlayer].fill_rect(x*32,y*32,32,32,color)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
class Sprite_Character
|
||||
alias perspectivetilemap_initialize initialize
|
||||
attr_accessor :character
|
||||
|
||||
def initialize(viewport, character = nil)
|
||||
@character = character
|
||||
perspectivetilemap_initialize(viewport,character)
|
||||
end
|
||||
|
||||
alias update_or :update
|
||||
|
||||
def update
|
||||
update_or
|
||||
if $PokemonSystem.tilemap==2
|
||||
self.zoom_y=ScreenPosHelper.pbScreenZoomY(@character)
|
||||
self.zoom_x=ScreenPosHelper.pbScreenZoomX(@character)
|
||||
self.x=ScreenPosHelper.pbScreenX(@character)
|
||||
self.y=ScreenPosHelper.pbScreenY(@character)
|
||||
self.z=ScreenPosHelper.pbScreenZ(@character,@ch)
|
||||
end
|
||||
end
|
||||
end
|
||||
118
Data/Scripts/005_Map renderer/003_Tilemap_Original.rb
Normal file
118
Data/Scripts/005_Map renderer/003_Tilemap_Original.rb
Normal file
@@ -0,0 +1,118 @@
|
||||
#===============================================================================
|
||||
#
|
||||
#===============================================================================
|
||||
class SynchronizedTilemapAutotilesInternal
|
||||
def initialize(oldat)
|
||||
@atdisposables = [[],[],[],[],[],[],[]]
|
||||
@atframes = [[],[],[],[],[],[],[]]
|
||||
@atframe = [-1,-1,-1,-1,-1,-1,-1]
|
||||
@autotiles = []
|
||||
@oldat = oldat
|
||||
end
|
||||
|
||||
def dispose
|
||||
for i in 0...7
|
||||
for bitmap in @atdisposables[i]
|
||||
bitmap.dispose
|
||||
end
|
||||
@atdisposables[i].clear
|
||||
@atframes[i].clear
|
||||
end
|
||||
end
|
||||
|
||||
def [](i)
|
||||
return @autotiles[i]
|
||||
end
|
||||
|
||||
def []=(i,value)
|
||||
for frame in @atdisposables[i]
|
||||
frame.dispose
|
||||
end
|
||||
@atframe[i] = -1
|
||||
@atframes[i].clear
|
||||
@atdisposables[i].clear
|
||||
if value && !value.disposed?
|
||||
if value.height==32
|
||||
frames = value.width/32
|
||||
for j in 0...frames
|
||||
@atdisposables[i][j] = Bitmap.new(32,32)
|
||||
@atdisposables[i][j].blt(0,0,value,Rect.new(j*32,0,32,32))
|
||||
@atframes[i][j] = @atdisposables[i][j]
|
||||
end
|
||||
elsif value.height==128
|
||||
frames = value.width/96
|
||||
for j in 0...frames
|
||||
@atdisposables[i][j] = Bitmap.new(96,128)
|
||||
@atdisposables[i][j].blt(0,0,value,Rect.new(j*96,0,96,128))
|
||||
@atframes[i][j] = @atdisposables[i][j]
|
||||
end
|
||||
else
|
||||
@atframes[i][0] = value
|
||||
end
|
||||
else
|
||||
@atframes[i][0] = value
|
||||
end
|
||||
@autotiles[i] = value
|
||||
sync
|
||||
end
|
||||
|
||||
def sync
|
||||
frameused = []
|
||||
for i in 0...7
|
||||
frames = [1,@atframes[i].length].max
|
||||
frame = (Graphics.frame_count/15)%frames
|
||||
if frames>1 && @atframe[i]!=frame
|
||||
@oldat[i] = @atframes[i][frame]
|
||||
@atframe[i] = frame
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
class SynchronizedTilemapAutotiles
|
||||
def initialize(autotiles)
|
||||
@autotiles = autotiles
|
||||
end
|
||||
|
||||
def [](i)
|
||||
return @autotiles[i]
|
||||
end
|
||||
|
||||
def []=(i,value)
|
||||
@autotiles[i] = value
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
class SynchronizedTilemap < Tilemap
|
||||
# This class derives from Tilemap just to synchronize
|
||||
# the tilemap animation.
|
||||
attr_accessor :numupdates
|
||||
|
||||
def initialize(viewport=nil)
|
||||
super(viewport)
|
||||
@updating = true
|
||||
@autotiles = SynchronizedTilemapAutotilesInternal.new(self.autotiles)
|
||||
@autos = SynchronizedTilemapAutotiles.new(@autotiles)
|
||||
@updating = false
|
||||
end
|
||||
|
||||
def dispose
|
||||
@autotiles.dispose
|
||||
super
|
||||
end
|
||||
|
||||
def autotiles
|
||||
return @autos if !@updating
|
||||
super
|
||||
end
|
||||
|
||||
def update
|
||||
return if disposed?
|
||||
@autotiles.sync
|
||||
super
|
||||
end
|
||||
end
|
||||
70
Data/Scripts/005_Map renderer/004_TilemapLoader.rb
Normal file
70
Data/Scripts/005_Map renderer/004_TilemapLoader.rb
Normal file
@@ -0,0 +1,70 @@
|
||||
class TilemapLoader
|
||||
def initialize(viewport)
|
||||
@viewport = viewport
|
||||
@tilemap = nil
|
||||
@color = Color.new(0,0,0,0)
|
||||
@tone = Tone.new(0,0,0,0)
|
||||
updateClass
|
||||
end
|
||||
|
||||
def updateClass
|
||||
case $PokemonSystem.tilemap
|
||||
when 1 # Custom (recommended)
|
||||
setClass(CustomTilemap)
|
||||
when 2 # Perspective
|
||||
setClass(Draw_Tilemap)
|
||||
else # Original (SynchronizedTilemap) or custom (CustomTilemap)
|
||||
if Tilemap.method_defined?(:passages)
|
||||
setClass(CustomTilemap)
|
||||
else
|
||||
setClass(($ResizeFactor==1.0) ? SynchronizedTilemap : CustomTilemap)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def setClass(cls)
|
||||
newtilemap = cls.new(@viewport)
|
||||
if @tilemap
|
||||
newtilemap.tileset = @tilemap.tileset
|
||||
newtilemap.map_data = @tilemap.map_data
|
||||
newtilemap.flash_data = @tilemap.flash_data
|
||||
newtilemap.priorities = @tilemap.priorities
|
||||
newtilemap.terrain_tags = @tilemap.terrain_tags
|
||||
newtilemap.visible = @tilemap.visible
|
||||
newtilemap.ox = @tilemap.ox
|
||||
newtilemap.oy = @tilemap.oy
|
||||
for i in 0...7
|
||||
newtilemap.autotiles[i] = @tilemap.autotiles[i]
|
||||
end
|
||||
@tilemap.dispose
|
||||
@tilemap = newtilemap
|
||||
newtilemap.update if cls!=SynchronizedTilemap
|
||||
else
|
||||
@tilemap = newtilemap
|
||||
end
|
||||
end
|
||||
|
||||
def dispose; @tilemap.dispose; end
|
||||
def disposed?; @tilemap && @tilemap.disposed?; end
|
||||
def update; @tilemap.update; end
|
||||
def viewport; @tilemap.viewport; end
|
||||
def autotiles; @tilemap.autotiles; end
|
||||
def tileset; @tilemap.tileset; end
|
||||
def tileset=(v); @tilemap.tileset = v; end
|
||||
def map_data; @tilemap.map_data; end
|
||||
def map_data=(v); @tilemap.map_data = v; end
|
||||
def flash_data; @tilemap.flash_data; end
|
||||
def flash_data=(v); @tilemap.flash_data = v; end
|
||||
def priorities; @tilemap.priorities; end
|
||||
def priorities=(v); @tilemap.priorities = v; end
|
||||
def terrain_tags; (@tilemap.terrain_tags rescue nil); end
|
||||
def terrain_tags=(v); (@tilemap.terrain_tags = v rescue nil); end
|
||||
def visible; @tilemap.visible; end
|
||||
def visible=(v); @tilemap.visible = v; end
|
||||
def tone; (@tilemap.tone rescue @tone); end
|
||||
def tone=(value); (@tilemap.tone = value rescue nil); end
|
||||
def ox; @tilemap.ox; end
|
||||
def ox=(v); @tilemap.ox = v; end
|
||||
def oy; @tilemap.oy; end
|
||||
def oy=(v); @tilemap.oy = v; end
|
||||
end
|
||||
136
Data/Scripts/005_Map renderer/005_TileDrawingHelper.rb
Normal file
136
Data/Scripts/005_Map renderer/005_TileDrawingHelper.rb
Normal file
@@ -0,0 +1,136 @@
|
||||
class TileDrawingHelper
|
||||
attr_accessor :tileset
|
||||
attr_accessor :autotiles
|
||||
|
||||
Autotiles = [
|
||||
[ [27, 28, 33, 34], [ 5, 28, 33, 34], [27, 6, 33, 34], [ 5, 6, 33, 34],
|
||||
[27, 28, 33, 12], [ 5, 28, 33, 12], [27, 6, 33, 12], [ 5, 6, 33, 12] ],
|
||||
[ [27, 28, 11, 34], [ 5, 28, 11, 34], [27, 6, 11, 34], [ 5, 6, 11, 34],
|
||||
[27, 28, 11, 12], [ 5, 28, 11, 12], [27, 6, 11, 12], [ 5, 6, 11, 12] ],
|
||||
[ [25, 26, 31, 32], [25, 6, 31, 32], [25, 26, 31, 12], [25, 6, 31, 12],
|
||||
[15, 16, 21, 22], [15, 16, 21, 12], [15, 16, 11, 22], [15, 16, 11, 12] ],
|
||||
[ [29, 30, 35, 36], [29, 30, 11, 36], [ 5, 30, 35, 36], [ 5, 30, 11, 36],
|
||||
[39, 40, 45, 46], [ 5, 40, 45, 46], [39, 6, 45, 46], [ 5, 6, 45, 46] ],
|
||||
[ [25, 30, 31, 36], [15, 16, 45, 46], [13, 14, 19, 20], [13, 14, 19, 12],
|
||||
[17, 18, 23, 24], [17, 18, 11, 24], [41, 42, 47, 48], [ 5, 42, 47, 48] ],
|
||||
[ [37, 38, 43, 44], [37, 6, 43, 44], [13, 18, 19, 24], [13, 14, 43, 44],
|
||||
[37, 42, 43, 48], [17, 18, 47, 48], [13, 18, 43, 48], [ 1, 2, 7, 8] ]
|
||||
]
|
||||
|
||||
# converts neighbors returned from tableNeighbors to tile indexes
|
||||
NeighborsToTiles = [
|
||||
46, 44, 46, 44, 43, 41, 43, 40, 46, 44, 46, 44, 43, 41, 43, 40,
|
||||
42, 32, 42, 32, 35, 19, 35, 18, 42, 32, 42, 32, 34, 17, 34, 16,
|
||||
46, 44, 46, 44, 43, 41, 43, 40, 46, 44, 46, 44, 43, 41, 43, 40,
|
||||
42, 32, 42, 32, 35, 19, 35, 18, 42, 32, 42, 32, 34, 17, 34, 16,
|
||||
45, 39, 45, 39, 33, 31, 33, 29, 45, 39, 45, 39, 33, 31, 33, 29,
|
||||
37, 27, 37, 27, 23, 15, 23, 13, 37, 27, 37, 27, 22, 11, 22, 9,
|
||||
45, 39, 45, 39, 33, 31, 33, 29, 45, 39, 45, 39, 33, 31, 33, 29,
|
||||
36, 26, 36, 26, 21, 7, 21, 5, 36, 26, 36, 26, 20, 3, 20, 1,
|
||||
46, 44, 46, 44, 43, 41, 43, 40, 46, 44, 46, 44, 43, 41, 43, 40,
|
||||
42, 32, 42, 32, 35, 19, 35, 18, 42, 32, 42, 32, 34, 17, 34, 16,
|
||||
46, 44, 46, 44, 43, 41, 43, 40, 46, 44, 46, 44, 43, 41, 43, 40,
|
||||
42, 32, 42, 32, 35, 19, 35, 18, 42, 32, 42, 32, 34, 17, 34, 16,
|
||||
45, 38, 45, 38, 33, 30, 33, 28, 45, 38, 45, 38, 33, 30, 33, 28,
|
||||
37, 25, 37, 25, 23, 14, 23, 12, 37, 25, 37, 25, 22, 10, 22, 8,
|
||||
45, 38, 45, 38, 33, 30, 33, 28, 45, 38, 45, 38, 33, 30, 33, 28,
|
||||
36, 24, 36, 24, 21, 6, 21, 4, 36, 24, 36, 24, 20, 2, 20, 0
|
||||
]
|
||||
|
||||
def self.tableNeighbors(data,x,y)
|
||||
return 0 if x < 0 || x >= data.xsize
|
||||
return 0 if y < 0 || y >= data.ysize
|
||||
t = data[x,y]
|
||||
xp1 = [x + 1, data.xsize - 1].min
|
||||
yp1 = [y + 1, data.ysize - 1].min
|
||||
xm1 = [x - 1, 0].max
|
||||
ym1 = [y - 1, 0].max
|
||||
i = 0
|
||||
i |= 0x01 if data[ x, ym1] == t # N
|
||||
i |= 0x02 if data[xp1, ym1] == t # NE
|
||||
i |= 0x04 if data[xp1, y] == t # E
|
||||
i |= 0x08 if data[xp1, yp1] == t # SE
|
||||
i |= 0x10 if data[ x, yp1] == t # S
|
||||
i |= 0x20 if data[xm1, yp1] == t # SW
|
||||
i |= 0x40 if data[xm1, y] == t # W
|
||||
i |= 0x80 if data[xm1, ym1] == t # NW
|
||||
return i
|
||||
end
|
||||
|
||||
def self.fromTileset(tileset)
|
||||
bmtileset=pbGetTileset(tileset.tileset_name)
|
||||
bmautotiles=[]
|
||||
for i in 0...7
|
||||
bmautotiles.push(pbGetAutotile(tileset.autotile_names[i]))
|
||||
end
|
||||
return self.new(bmtileset,bmautotiles)
|
||||
end
|
||||
|
||||
def initialize(tileset,autotiles)
|
||||
@tileset = tileset
|
||||
@autotiles = autotiles
|
||||
end
|
||||
|
||||
def dispose
|
||||
@tileset.dispose if @tileset
|
||||
@tileset = nil
|
||||
for i in 0...@autotiles.length
|
||||
@autotiles[i].dispose
|
||||
@autotiles[i] = nil
|
||||
end
|
||||
end
|
||||
|
||||
def bltSmallAutotile(bitmap,x,y,cxTile,cyTile,id,frame)
|
||||
return if id >= 384 || frame < 0 || !@autotiles
|
||||
autotile = @autotiles[id / 48 - 1]
|
||||
return if !autotile || autotile.disposed?
|
||||
cxTile = [cxTile / 2, 1].max
|
||||
cyTile = [cyTile / 2, 1].max
|
||||
if autotile.height == 32
|
||||
anim = frame * 32
|
||||
src_rect = Rect.new(anim, 0, 32, 32)
|
||||
bitmap.stretch_blt(Rect.new(x, y, cxTile * 2, cyTile * 2), autotile, src_rect)
|
||||
else
|
||||
anim = frame * 96
|
||||
id %= 48
|
||||
tiles = TileDrawingHelper::Autotiles[id >> 3][id & 7]
|
||||
src = Rect.new(0, 0, 0, 0)
|
||||
for i in 0...4
|
||||
tile_position = tiles[i] - 1
|
||||
src.set(tile_position % 6 * 16 + anim, tile_position / 6 * 16, 16, 16)
|
||||
bitmap.stretch_blt(Rect.new(i % 2 * cxTile + x, i / 2 * cyTile + y, cxTile, cyTile),
|
||||
autotile, src)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def bltSmallRegularTile(bitmap,x,y,cxTile,cyTile,id)
|
||||
return if id < 384 || !@tileset || @tileset.disposed?
|
||||
rect = Rect.new((id - 384) % 8 * 32, (id - 384) / 8 * 32, 32, 32)
|
||||
bitmap.stretch_blt(Rect.new(x, y, cxTile, cyTile), @tileset, rect)
|
||||
end
|
||||
|
||||
def bltSmallTile(bitmap,x,y,cxTile,cyTile,id,frame=0)
|
||||
if id >= 384
|
||||
bltSmallRegularTile(bitmap, x, y, cxTile, cyTile, id)
|
||||
elsif id > 0
|
||||
bltSmallAutotile(bitmap, x, y, cxTile, cyTile, id, frame)
|
||||
end
|
||||
end
|
||||
|
||||
def bltAutotile(bitmap,x,y,id,frame)
|
||||
bltSmallAutotile(bitmap, x, y, 32, 32, id, frame)
|
||||
end
|
||||
|
||||
def bltRegularTile(bitmap,x,y,id)
|
||||
bltSmallRegularTile(bitmap, x, y, 32, 32, id)
|
||||
end
|
||||
|
||||
def bltTile(bitmap,x,y,id,frame=0)
|
||||
if id >= 384
|
||||
bltRegularTile(bitmap, x, y, id)
|
||||
elsif id > 0
|
||||
bltAutotile(bitmap, x, y, id, frame)
|
||||
end
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user