Advertisement
Vendily

Klein autotile bridge/reflections fix

Aug 9th, 2020
2,791
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 24.08 KB | None | 0 0
  1. class Interpreter
  2.   alias klein_transfer_inter command_201
  3.   def command_201
  4.     $kleinAnimatedInfo.clear if $kleinAnimatedInfo
  5.     $kleinAnimatedInfo=[]
  6.     klein_transfer_inter
  7.   end
  8. end
  9.  
  10. class CustomTilemapSprite
  11.   attr_accessor :id
  12.   def id
  13.     @id=-1 if !@id
  14.     return @id
  15.   end
  16. end
  17.  
  18. class TilemapLoader
  19.   alias klein_animate_tl_initialize initialize
  20.   def initialize(viewport)
  21.     @tileset_id=$PokemonGlobal.next_tileset_id
  22.     klein_animate_tl_initialize(viewport)
  23.   end
  24.  
  25.   def setClass(cls)
  26.     if cls==CustomTilemap
  27.       newtilemap=cls.new(@viewport,@tileset_id)
  28.     else
  29.       newtilemap=cls.new(@viewport)
  30.     end
  31.     if @tilemap
  32.       newtilemap.tileset=@tilemap.tileset
  33.       newtilemap.map_data=@tilemap.map_data
  34.       newtilemap.flash_data=@tilemap.flash_data
  35.       newtilemap.priorities=@tilemap.priorities
  36.       newtilemap.terrain_tags = @tilemap.terrain_tags
  37.       newtilemap.visible=@tilemap.visible
  38.       newtilemap.ox=@tilemap.ox
  39.       newtilemap.oy=@tilemap.oy
  40.       newtilemap.tileset_id=@tileset_id
  41.       for i in 0...7
  42.         newtilemap.autotiles[i]=@tilemap.autotiles[i]
  43.       end
  44.       @tilemap.dispose
  45.       @tilemap=newtilemap
  46.       newtilemap.update if cls!=SynchronizedTilemap
  47.     else
  48.       @tilemap=newtilemap
  49.     end
  50.   end
  51. end
  52.  
  53. class Game_Map
  54.   def tileset_id
  55.     return @map.tileset_id
  56.   end
  57. end
  58.  
  59. class PokemonGlobalMetadata
  60.   attr_accessor :next_tileset_id
  61.   def next_tileset_id
  62.     @next_tileset_id=0 if !@next_tileset_id
  63.     return @next_tileset_id
  64.   end
  65. end
  66.  
  67. class Spriteset_Map
  68.   alias klein_animate_sp_initialize initialize
  69.   def initialize(map=nil)
  70.     if $PokemonGlobal && map!=nil
  71.       $PokemonGlobal.next_tileset_id=map.tileset_id
  72.     end
  73.     klein_animate_sp_initialize(map)
  74.     $PokemonGlobal.next_tileset_id=0
  75.   end
  76. end
  77.  
  78. class CustomTilemap
  79.   alias klein_animate_initialize initialize
  80.   def initialize(viewport,tileset_id)
  81.     klein_animate_initialize(viewport)
  82.     @tileset_id=tileset_id
  83.     @kleinTiles=[]
  84.     $kleinAnimatedInfo=[] if !$kleinAnimatedInfo=[]
  85.     @animateTileset=$data_tilesets[Animate_Tileset_Id]  
  86.     @animateTilesetBitmap=pbGetTileset(@animateTileset.tileset_name)
  87.     @kleinTilesInfo=[]
  88.     tilesetKleinTiles=KleinTiles[@tileset_id]
  89.     if tilesetKleinTiles!=nil
  90.       for kleinTiles in tilesetKleinTiles
  91.         @kleinTilesInfo.push([kleinTiles[0],kleinTiles[1]])
  92.       end
  93.     end
  94.   end
  95.  
  96.   def tileset_id=(value)
  97.     return if @kleinTilesInfo.length!=0
  98.     @tileset_id=value
  99.     @kleinTilesInfo.clear
  100.     tilesetKleinTiles=KleinTiles[@tileset_id]
  101.     if tilesetKleinTiles!=nil
  102.       for kleinTiles in tilesetKleinTiles
  103.         @kleinTilesInfo.push([kleinTiles[0],kleinTiles[1]])
  104.       end
  105.     end
  106.   end
  107.  
  108.   alias klein_animate_dispose dispose
  109.   def dispose
  110.     klein_animate_dispose
  111.     i=0;len=@kleinTiles.length;while i<len
  112.       @kleinTiles[i].dispose
  113.       @kleinTiles[i]=nil
  114.       i+=2
  115.     end
  116.     @kleinTiles.clear
  117.   end
  118.  
  119.   def kleinTileFrame(ktb)
  120.    frame=(Graphics.frame_count/Animated_Autotiles_Frames)%ktb.length
  121.    return ktb[frame]
  122.   end
  123.  
  124.   def refreshLayer0(autotiles=false, onlykleintiles=false)
  125.     if autotiles
  126.       return true if !shown?
  127.     end
  128.     ptX=@ox-@oxLayer0
  129.     ptY=@oy-@oyLayer0
  130.     if !autotiles && !@firsttime && !@usedsprites &&
  131.        ptX>=0 && ptX+@viewport.rect.width<=@layer0.bitmap.width &&
  132.        ptY>=0 && ptY+@viewport.rect.height<=@layer0.bitmap.height
  133.       if @layer0clip && @viewport.ox==0 && @viewport.oy==0
  134.         @layer0.ox=0
  135.         @layer0.oy=0
  136.         @layer0.src_rect.set(ptX.round,ptY.round,
  137.            @viewport.rect.width,@viewport.rect.height)
  138.       else
  139.         @layer0.ox=ptX.round
  140.         @layer0.oy=ptY.round
  141.         @layer0.src_rect.set(0,0,@layer0.bitmap.width,@layer0.bitmap.height)
  142.       end
  143.       return true
  144.     end
  145.    
  146.     width=@layer0.bitmap.width
  147.     height=@layer0.bitmap.height
  148.     bitmap=@layer0.bitmap
  149.     ysize=@map_data.ysize
  150.     xsize=@map_data.xsize
  151.     zsize=@map_data.zsize
  152.     twidth=@tileWidth
  153.     theight=@tileHeight
  154.     mapdata=@map_data
  155.  
  156.     if autotiles
  157.       return true if @fullyrefreshedautos && @prioautotiles.length==0
  158.       xStart=(@oxLayer0/twidth)
  159.       xStart=0 if xStart<0
  160.       yStart=(@oyLayer0/theight)
  161.       yStart=0 if yStart<0
  162.       xEnd=xStart+(width/twidth)+1
  163.       yEnd=yStart+(height/theight)+1
  164.       xEnd=xsize if xEnd>xsize
  165.       yEnd=ysize if yEnd>ysize
  166.       return true if xStart>=xEnd || yStart>=yEnd
  167.       trans=Color.new(0,0,0,0)
  168.       temprect=Rect.new(0,0,0,0)
  169.       tilerect=Rect.new(0,0,twidth,theight)
  170.       zrange=0...zsize
  171.       overallcount=0
  172.       count=0
  173.       if !@fullyrefreshedautos
  174.         for y in yStart..yEnd
  175.           for x in xStart..xEnd
  176.             haveautotile=false
  177.             for z in zrange
  178.               id = mapdata[x, y, z]
  179.               next if !id || id<48 || id>=384
  180.               prioid=@priorities[id]
  181.               next if !prioid || prioid!=0 || PBTerrain.hasReflections?(@terrain_tags[id])
  182.               fcount=@framecount[id/48-1]
  183.               next if !fcount || fcount<2
  184.               next if onlykleintiles && !isKleinTile?(id)
  185.              
  186.               if !haveautotile
  187.                 haveautotile=true
  188.                 overallcount+=1
  189.                 xpos=(x*twidth)-@oxLayer0
  190.                 ypos=(y*theight)-@oyLayer0
  191.                 bitmap.fill_rect(xpos,ypos,twidth,theight,trans) if overallcount<=2000
  192.                 break
  193.               end
  194.             end
  195.             for z in zrange
  196.               id = mapdata[x,y,z]
  197.               next if !id || id<48
  198.               prioid=@priorities[id]
  199.               next if !prioid || prioid!=0 || PBTerrain.hasReflections?(@terrain_tags[id])
  200.               next if onlykleintiles && !isKleinTile?(id)
  201.              
  202.               if overallcount>2000
  203.                 xpos=(x*twidth)-@oxLayer0
  204.                 ypos=(y*theight)-@oyLayer0
  205.                
  206.                 count=addTile(@autosprites,count,xpos,ypos,id)
  207.                 next
  208.               elsif id>=384 && !isKleinTile?(id)
  209.                 temprect.set(((id - 384)&7)*@tileSrcWidth,((id - 384)>>3)*@tileSrcHeight,
  210.                    @tileSrcWidth,@tileSrcHeight)
  211.                 xpos=(x*twidth)-@oxLayer0
  212.                 ypos=(y*theight)-@oyLayer0
  213.                 if @diffsizes
  214.                   bitmap.stretch_blt(Rect.new(xpos,ypos,twidth,theight),@tileset,temprect)
  215.                 else
  216.                   bitmap.blt(xpos,ypos,@tileset,temprect)
  217.                 end
  218.             elsif id>=384 && isKleinTile?(id)
  219.                 # Klein tiles
  220.                 ktbitmap=nil
  221.                 ktbitmap=$kleinAnimatedInfo[id] if $kleinAnimatedInfo[id]!=nil
  222.  
  223.                 if ktbitmap==nil
  224.                   for kleinTiles in @kleinTilesInfo
  225.                     kt=kleinTiles if kleinTiles[0]+384==id
  226.                   end
  227.                   barray=[]
  228.                   for tileids in kt[1]
  229.                     barray.push(kleinTileRects(tileids+384))
  230.                   end
  231.                   $kleinAnimatedInfo[id]=barray
  232.                   ktbitmap=$kleinAnimatedInfo[id]
  233.                 end
  234.                
  235.                xpos=(x*twidth)-@oxLayer0
  236.                ypos=(y*theight)-@oyLayer0
  237.                bitmap.fill_rect(xpos,ypos,32,32,Color.new(0,0,0,0)) if z==0
  238.                bitmap.blt(xpos,ypos,@animateTilesetBitmap,kleinTileFrame(ktbitmap))
  239.             elsif id<384
  240.                 tilebitmap=@autotileInfo[id]
  241.                
  242.                 if !tilebitmap
  243.                   anim=autotileFrame(id)
  244.                   next if anim<0
  245.                   tilebitmap=Bitmap.new(twidth,theight)
  246.                   bltAutotile(tilebitmap,0,0,id,anim)
  247.                   @autotileInfo[id]=tilebitmap
  248.                 end
  249.                 xpos=(x*twidth)-@oxLayer0
  250.                 ypos=(y*theight)-@oyLayer0
  251.                 bitmap.blt(xpos,ypos,tilebitmap,tilerect)
  252.               end
  253.             end
  254.           end
  255.         end
  256.         Graphics.frame_reset
  257.       else
  258.         if !@priorect || !@priorectautos || @priorect[0]!=xStart ||
  259.            @priorect[1]!=yStart ||
  260.            @priorect[2]!=xEnd ||
  261.            @priorect[3]!=yEnd
  262.           @priorectautos=@prioautotiles.find_all{|tile|
  263.              x=tile[0]
  264.              y=tile[1]
  265.              # "next" means "return" here
  266.              next !(x<xStart||x>xEnd||y<yStart||y>yEnd)
  267.           }
  268.           @priorect=[xStart,yStart,xEnd,yEnd]
  269.         end
  270.    #   echoln ["autos",@priorect,@priorectautos.length,@prioautotiles.length]
  271.         for tile in @priorectautos
  272.           x=tile[0]
  273.           y=tile[1]
  274.           overallcount+=1
  275.           xpos=(x*twidth)-@oxLayer0
  276.           ypos=(y*theight)-@oyLayer0
  277.           bitmap.fill_rect(xpos,ypos,twidth,theight,trans)
  278.           #count=addTile(@tiles,count,xpos,ypos,tile[3])
  279.           z=0
  280.           while z<zsize
  281.             id = mapdata[x,y,z]
  282.             z+=1
  283.             next if !id || id<48
  284.             prioid=@priorities[id]
  285.             next if prioid!=0 || !prioid || PBTerrain.hasReflections?(@terrain_tags[id])
  286.             # Klein tiles
  287.             if id>=384 && !isKleinTile?(id)
  288.               temprect.set(((id - 384)&7)*@tileSrcWidth,((id - 384)>>3)*@tileSrcHeight,
  289.                  @tileSrcWidth,@tileSrcHeight)
  290.               if @diffsizes
  291.                 bitmap.stretch_blt(Rect.new(xpos,ypos,twidth,theight),@tileset,temprect)
  292.               else
  293.                 bitmap.blt(xpos,ypos,@tileset,temprect)
  294.               end
  295.             elsif id>=384 && isKleinTile?(id)
  296.                 # Klein tiles
  297.                 ktbitmap=nil
  298.                 ktbitmap=$kleinAnimatedInfo[id] if $kleinAnimatedInfo[id]!=nil
  299.  
  300.                 if ktbitmap==nil
  301.                   for kleinTiles in @kleinTilesInfo
  302.                     kt=kleinTiles if kleinTiles[0]+384==id
  303.                   end
  304.                   barray=[]
  305.                   for tileids in kt[1]
  306.                     barray.push(kleinTileRects(tileids+384))
  307.                   end
  308.                   $kleinAnimatedInfo[id]=barray
  309.                   ktbitmap=$kleinAnimatedInfo[id]
  310.                 end
  311.                
  312.                xpos=(x*twidth)-@oxLayer0
  313.                ypos=(y*theight)-@oyLayer0
  314.                bitmap.fill_rect(xpos,ypos,32,32,Color.new(0,0,0,0)) if z==0
  315.                bitmap.blt(xpos,ypos,@animateTilesetBitmap,kleinTileFrame(ktbitmap))
  316.  
  317.              elsif id<384
  318.               tilebitmap=@autotileInfo[id]
  319.               if !tilebitmap
  320.                 anim=autotileFrame(id)
  321.                 next if anim<0
  322.                 tilebitmap=Bitmap.new(twidth,theight)
  323.                 bltAutotile(tilebitmap,0,0,id,anim)
  324.                 @autotileInfo[id]=tilebitmap
  325.               end
  326.               bitmap.blt(xpos,ypos,tilebitmap,tilerect)
  327.             end
  328.           end
  329.         end
  330.         Graphics.frame_reset if overallcount>500
  331.       end
  332.       @usedsprites=false
  333.       return true
  334.     end
  335.     return false if @usedsprites
  336.     @firsttime=false
  337.     @oxLayer0=@ox-(width>>2)
  338.     @oyLayer0=@oy-(height>>2)
  339.     if @layer0clip
  340.       @layer0.ox=0
  341.       @layer0.oy=0
  342.       @layer0.src_rect.set(width>>2,height>>2,
  343.          @viewport.rect.width,@viewport.rect.height)
  344.     else
  345.       @layer0.ox=(width>>2)
  346.       @layer0.oy=(height>>2)
  347.     end
  348.     @layer0.bitmap.clear
  349.     @oxLayer0=@oxLayer0.floor
  350.     @oyLayer0=@oyLayer0.floor
  351.     xStart=(@oxLayer0/twidth)
  352.     xStart=0 if xStart<0
  353.     yStart=(@oyLayer0/theight)
  354.     yStart=0 if yStart<0
  355.     xEnd=xStart+(width/twidth)+1
  356.     yEnd=yStart+(height/theight)+1
  357.     xEnd=xsize if xEnd>=xsize
  358.     yEnd=ysize if yEnd>=ysize
  359.     if xStart<xEnd && yStart<yEnd
  360.       tmprect=Rect.new(0,0,0,0)
  361.       yrange=yStart...yEnd
  362.       xrange=xStart...xEnd
  363.       for z in 0...zsize
  364.         for y in yrange
  365.           ypos=(y*theight)-@oyLayer0
  366.           for x in xrange
  367.             xpos=(x*twidth)-@oxLayer0
  368.             id = mapdata[x, y, z]
  369.             next if id==0 || !@priorities[id] || @priorities[id]!=0 ||
  370.                PBTerrain.hasReflections?(@terrain_tags[id])
  371.             if id>=384 && !isKleinTile?(id)
  372.               tmprect.set( ((id - 384)&7)*@tileSrcWidth,((id - 384)>>3)*@tileSrcHeight,
  373.                  @tileSrcWidth,@tileSrcHeight)
  374.               if @diffsizes
  375.                 bitmap.stretch_blt(Rect.new(xpos,ypos,twidth,theight),@tileset,tmprect)
  376.               else
  377.                 bitmap.blt(xpos,ypos,@tileset,tmprect)
  378.               end
  379.             elsif id>=384 && isKleinTile?(id)
  380.                 # Klein tiles
  381.                 ktbitmap=nil
  382.                 ktbitmap=$kleinAnimatedInfo[id] if $kleinAnimatedInfo[id]!=nil
  383.  
  384.                 if ktbitmap==nil
  385.                   for kleinTiles in @kleinTilesInfo
  386.                     kt=kleinTiles if kleinTiles[0]+384==id
  387.                   end
  388.                   barray=[]
  389.                   for tileids in kt[1]
  390.                     barray.push(kleinTileRects(tileids+384))
  391.                   end
  392.                   $kleinAnimatedInfo[id]=barray
  393.                   ktbitmap=$kleinAnimatedInfo[id]
  394.                 end
  395.                
  396.                xpos=(x*twidth)-@oxLayer0
  397.                ypos=(y*theight)-@oyLayer0
  398.                bitmap.fill_rect(xpos,ypos,32,32,Color.new(0,0,0,0)) if z==0
  399.                bitmap.blt(xpos,ypos,@animateTilesetBitmap,kleinTileFrame(ktbitmap))
  400.             elsif id<384
  401.               frames=@framecount[id/48-1]
  402.               if frames<=1
  403.                 frame=0
  404.               else
  405.                 frame=(Graphics.frame_count/Animated_Autotiles_Frames)%frames
  406.               end
  407.               bltAutotile(bitmap,xpos,ypos,id,frame)
  408.             end
  409.           end
  410.         end
  411.       end
  412.       Graphics.frame_reset
  413.     end
  414.     return true
  415.   end
  416.  
  417.   def kleinTileBitmap(id)
  418.     bitmap=Bitmap.new(@tileWidth,@tileHeight)
  419.     bitmap.blt(0,0,@animateTilesetBitmap,
  420.     Rect.new(((id - 384)&7)*@tileSrcWidth,((id - 384)>>3)*@tileSrcHeight,
  421.     @tileWidth,@tileHeight))
  422.     return bitmap
  423.   end
  424.  
  425.   def kleinTileRects(id)    
  426.     return Rect.new(((id - 384)&7)*@tileSrcWidth,((id - 384)>>3)*@tileSrcHeight,
  427.     @tileWidth,@tileHeight)
  428.   end
  429.  
  430.   def isKleinTilePlusAuto?(id)
  431.     return true if id<384
  432.     for kleinTiles in @kleinTilesInfo
  433.        return true if kleinTiles[0]+384==id
  434.     end
  435.     return false
  436.   end
  437.  
  438.   def isKleinTile?(id)
  439.     for kleinTiles in @kleinTilesInfo
  440.        return true if kleinTiles[0]+384==id
  441.     end
  442.     return false
  443.   end
  444.  
  445.   def addTile(tiles,count,xpos,ypos,id)
  446.     if id>=384
  447.       if count>=tiles.length
  448.         sprite=CustomTilemapSprite.new(@viewport)
  449.         tiles.push(sprite,isKleinTile?(id) ? 3 : 0)
  450.       else
  451.         sprite=tiles[count]
  452.         tiles[count+1]=isKleinTile?(id) ? 3 : 0
  453.       end
  454.       if isKleinTile?(id)
  455.         ktbitmap=nil
  456.         ktbitmap=$kleinAnimatedInfo[id] if $kleinAnimatedInfo[id]!=nil
  457.         if ktbitmap==nil
  458.           for kleinTiles in @kleinTilesInfo
  459.             kt=kleinTiles if kleinTiles[0]+384==id
  460.           end
  461.           barray=[]
  462.           for tileids in kt[1]
  463.             barray.push(kleinTileRects(tileids+384))
  464.           end
  465.           $kleinAnimatedInfo[id]=barray
  466.           ktbitmap=$kleinAnimatedInfo[id]
  467.         end
  468.       end
  469.       sprite.visible=@visible
  470.       sprite.x=xpos
  471.       sprite.y=ypos
  472.       sprite.tone=@tone
  473.       sprite.color=@color
  474.       sprite.id=id
  475.       if isKleinTile?(id) && ktbitmap!=nil
  476.         getRegularKleinTile(sprite,id,kleinTileFrame(ktbitmap))  
  477.       else
  478.         getRegularTile(sprite,id)
  479.       end
  480.       spriteZ=(@priorities[id]==0 || !@priorities[id]) ? 0 : ypos+@priorities[id]*32+32
  481.       spriteZ=1 if @priorities[id]==4 && $PokemonGlobal && $PokemonGlobal.bridge>0
  482.       spriteZ=-100 if PBTerrain.hasReflections?(@terrain_tags[id])
  483.       sprite.z=spriteZ
  484.       count+=2
  485.     else
  486.       if count>=tiles.length
  487.         sprite=CustomTilemapSprite.new(@viewport)
  488.         tiles.push(sprite,1)
  489.       else
  490.         sprite=tiles[count]
  491.         tiles[count+1]=1
  492.       end
  493.       sprite.visible=@visible
  494.       sprite.x=xpos
  495.       sprite.y=ypos
  496.       sprite.tone=@tone
  497.       sprite.color=@color
  498.       getAutotile(sprite,id)
  499.       spriteZ=(@priorities[id]==0 || !@priorities[id]) ? 0 : ypos+@priorities[id]*32+32
  500.       spriteZ=1 if @priorities[id]==4 && $PokemonGlobal && $PokemonGlobal.bridge>0
  501.       spriteZ=-100 if PBTerrain.hasReflections?(@terrain_tags[id])
  502.       sprite.z=spriteZ
  503.       count+=2
  504.     end
  505.     return count
  506.   end
  507.  
  508.   alias klein_repaintauto repaintAutotiles
  509.   def repaintAutotiles
  510.     for s in 0...@tiles.length
  511.       next if @tiles[s+1]!=3
  512.       id=@tiles[s].id
  513.       ktbitmap=nil
  514.       ktbitmap=$kleinAnimatedInfo[id] if $kleinAnimatedInfo[id]!=nil
  515.       if ktbitmap==nil
  516.         for kleinTiles in @kleinTilesInfo
  517.           kt=kleinTiles if kleinTiles[0]+384==id
  518.         end
  519.         barray=[]
  520.         for tileids in kt[1]
  521.           barray.push(kleinTileRects(tileids+384))
  522.         end
  523.         $kleinAnimatedInfo[id]=barray
  524.         ktbitmap=$kleinAnimatedInfo[id]
  525.       end
  526.        
  527.       @tiles[s].src_rect=kleinTileFrame(ktbitmap)
  528.     end
  529.     klein_repaintauto
  530.   end
  531.  
  532.   def getRegularKleinTile(sprite,id,rect)
  533.     if sprite.bitmap!=@animateTilesetBitmap
  534.       sprite.bitmap=@animateTilesetBitmap
  535.     end
  536.     sprite.src_rect=rect
  537.   end  
  538.  
  539.   def refresh_autotiles
  540.     i=0;len=@autotileInfo.length;while i<len
  541.       if @autotileInfo[i]
  542.         @autotileInfo[i].dispose
  543.         @autotileInfo[i]=nil
  544.       end
  545.       i+=1
  546.     end
  547.     i=0;len=@autosprites.length;while i<len
  548.       if @autosprites[i]
  549.         @autosprites[i].dispose
  550.         @autosprites[i]=nil
  551.       end
  552.       i+=2
  553.     end
  554.     @autosprites.clear
  555.     @autotileInfo.clear
  556.     @prioautotiles.clear
  557.     @priorect=nil
  558.     @priorectautos=nil
  559.     hasanimated=false
  560.     for i in 0...7
  561.       numframes=autotileNumFrames(48*(i+1))
  562.       hasanimated=true if numframes>=2
  563.       @framecount[i]=numframes
  564.     end
  565.     hasanimated=true if @kleinTilesInfo.length!=0
  566.     if hasanimated
  567.       ysize=@map_data.ysize
  568.       xsize=@map_data.xsize
  569.       zsize=@map_data.zsize
  570.       if xsize>100 || ysize>100
  571.         @fullyrefreshedautos=false
  572.       else
  573.         for y in 0...ysize
  574.           for x in 0...xsize
  575.             haveautotile=false
  576.             for z in 0...zsize
  577.               id = @map_data[x, y, z]
  578.               next if id==0 || !isKleinTilePlusAuto?(id) || @priorities[id]!=0 || !@priorities[id]
  579.               next if PBTerrain.hasReflections?(@terrain_tags[id])
  580.               next if id<384 && @framecount[id/48-1]<2
  581.               haveautotile=true
  582.               break
  583.             end
  584.             @prioautotiles.push([x,y]) if haveautotile
  585.           end
  586.         end
  587.         @fullyrefreshedautos=true
  588.       end
  589.     else
  590.       @fullyrefreshedautos=true
  591.     end
  592.   end
  593. end
  594.  
  595. ################################################################################
  596. # User functions
  597. #===============================================================================
  598. #===============================================================================
  599. # Zeus81's Bitmap Exporter
  600. # This will allow to save the bitmap
  601. #===============================================================================
  602. class Bitmap
  603.   RtlMoveMemory = Win32API.new('kernel32', 'RtlMoveMemory', 'ppi', 'i')
  604.   def last_row_address
  605.     return 0 if disposed?
  606.     RtlMoveMemory.call(buf=[0].pack('L'), __id__*2+16, 4)
  607.     RtlMoveMemory.call(buf, buf.unpack('L')[0]+8 , 4)
  608.     RtlMoveMemory.call(buf, buf.unpack('L')[0]+16, 4)
  609.     buf.unpack('L')[0]
  610.   end
  611.   def bytesize
  612.     width * height * 4
  613.   end
  614.   def get_data
  615.     data = [].pack('x') * bytesize
  616.     RtlMoveMemory.call(data, last_row_address, data.bytesize)
  617.     data
  618.   end
  619.   def set_data(data)
  620.     RtlMoveMemory.call(last_row_address, data, data.bytesize)
  621.   end
  622.   def get_data_ptr
  623.     data = String.new
  624.     RtlMoveMemory.call(data.__id__*2, [0x2007].pack('L'), 4)
  625.     RtlMoveMemory.call(data.__id__*2+8, [bytesize,last_row_address].pack('L2'), 8)
  626.     def data.free() RtlMoveMemory.call(__id__*2, String.new, 16) end
  627.     return data unless block_given?
  628.     yield data ensure data.free
  629.   end
  630.   def _dump(level)
  631.     get_data_ptr do |data|
  632.       dump = Marshal.dump([width, height, Zlib::Deflate.deflate(data, 9)])
  633.       dump
  634.     end
  635.   end
  636.   def self._load(dump)
  637.     width, height, data = *Marshal.load(dump)
  638.     data.replace(Zlib::Inflate.inflate(data))
  639.     bitmap = new(width, height)
  640.     bitmap.set_data(data)
  641.     bitmap
  642.   end
  643.   def export(filename)
  644.     export_png("#{filename}.png")
  645.   end
  646.   def export_png(filename)
  647.     data, i = get_data, 0
  648.       (0).step(data.bytesize-4, 4) do |i|
  649.         data[i,3] = data[i,3].reverse!
  650.     end
  651.     deflate = Zlib::Deflate.new(9)
  652.       null_char, w4 = [].pack('x'), width*4
  653.       (data.bytesize-w4).step(0, -w4) {|i| deflate << null_char << data[i,w4]}
  654.       data.replace(deflate.finish)
  655.     deflate.close
  656.     File.open(filename, 'wb') do |file|
  657.       def file.write_chunk(chunk)
  658.         write([chunk.bytesize-4].pack('N'))
  659.         write(chunk)
  660.         write([Zlib.crc32(chunk)].pack('N'))
  661.       end
  662.       file.write("\211PNG\r\n\32\n")
  663.       file.write_chunk(['IHDR',width,height,8,6,0,0,0].pack('a4N2C5'))
  664.       file.write_chunk(data.insert(0, 'IDAT'))
  665.       file.write_chunk('IEND')
  666.     end
  667.   end
  668. end
  669.  
  670. class String
  671.   alias getbyte  []
  672.   alias setbyte  []=
  673.   alias bytesize size
  674. end
  675.  
  676. class Font
  677.   def marshal_dump()     end
  678.   def marshal_load(dump) end
  679. end
  680.  
  681. module Graphics
  682.     FindWindow             = Win32API.new('user32', 'FindWindow'            , 'pp'       , 'i')
  683.     GetDC                  = Win32API.new('user32', 'GetDC'                 , 'i'        , 'i')
  684.     ReleaseDC              = Win32API.new('user32', 'ReleaseDC'             , 'ii'       , 'i')
  685.     BitBlt                 = Win32API.new('gdi32' , 'BitBlt'                , 'iiiiiiiii', 'i')
  686.     CreateCompatibleBitmap = Win32API.new('gdi32' , 'CreateCompatibleBitmap', 'iii'      , 'i')
  687.     CreateCompatibleDC     = Win32API.new('gdi32' , 'CreateCompatibleDC'    , 'i'        , 'i')
  688.     DeleteDC               = Win32API.new('gdi32' , 'DeleteDC'              , 'i'        , 'i')
  689.     DeleteObject           = Win32API.new('gdi32' , 'DeleteObject'          , 'i'        , 'i')
  690.     GetDIBits              = Win32API.new('gdi32' , 'GetDIBits'             , 'iiiiipi'  , 'i')
  691.     SelectObject           = Win32API.new('gdi32' , 'SelectObject'          , 'ii'       , 'i')
  692.     def self.snap_to_bitmap
  693.       bitmap  = Bitmap.new(width, height)
  694.       info    = [40,width,height,1,32,0,0,0,0,0,0].pack('LllSSLLllLL')
  695.       hDC     = GetDC.call(hwnd)
  696.       bmp_hDC = CreateCompatibleDC.call(hDC)
  697.       bmp_hBM = CreateCompatibleBitmap.call(hDC, width, height)
  698.       bmp_obj = SelectObject.call(bmp_hDC, bmp_hBM)
  699.       BitBlt.call(bmp_hDC, 0, 0, width, height, hDC, 0, 0, 0xCC0020)
  700.       GetDIBits.call(bmp_hDC, bmp_hBM, 0, height, bitmap.last_row_address, info, 0)
  701.       SelectObject.call(bmp_hDC, bmp_obj)
  702.       DeleteObject.call(bmp_hBM)
  703.       DeleteDC.call(bmp_hDC)
  704.       ReleaseDC.call(hwnd, hDC)
  705.       bitmap
  706.   end
  707.    
  708.   class << self
  709.     def hwnd() @hwnd ||= FindWindow.call('RGSS Player', nil) end
  710.     def width()  640 end unless method_defined?(:width)
  711.     def height() 480 end unless method_defined?(:height)
  712.     def export(filename=Time.now.strftime("snapshot %Y-%m-%d %Hh%Mm%Ss #{frame_count}"))
  713.       bitmap = snap_to_bitmap
  714.       bitmap.export(filename)
  715.       bitmap.dispose
  716.     end
  717.     alias save     export
  718.     alias snapshot export
  719.   end
  720. end
  721.  
  722. def pbMakeNumericTileset(name)
  723.   file=sprintf("Graphics/Tilesets/"+name)
  724.   return if !FileTest.image_exist?(file)
  725.   tileset=BitmapCache.load_bitmap(file)
  726.   numericSet=tileset.clone
  727.   pbSetSystemFont(numericSet)
  728.   numericSet.font.size=21
  729.   for width in 0...numericSet.width/32
  730.     for height in 0...numericSet.height/32
  731.     number=(width+(height*8)).to_s
  732.     nsize=numericSet.text_size(number)
  733.     text=[[
  734.     number,(width+1)*32-16,height*32,2,Color.new(255,0,0),Color.new(0,0,0)
  735.     ]]
  736.     pbDrawTextPositions(numericSet,text)
  737.     end
  738.   end
  739.   numericSet.export(sprintf(name+"_numeric"))
  740.   Kernel.pbMessage(_INTL("Saved in game's folder: {1}_numeric",name))
  741. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement