IceDragon200

ISS VX Tilemap

Nov 6th, 2011
223
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 16.74 KB | None | 0 0
  1. # // Started : 07/13/2011
  2. # // Modified: 07/14/2011
  3. # // Waterfalls need to be coded properly
  4.  
  5. # // Credit to FenixFyreX
  6. module TilesetRanges
  7.  
  8.   # A1
  9.   A1 = [
  10.     [0,(2048...2096)],[1,(2096...2144)],[1,(2144...2192)],[1,(2192...2240)],
  11.     [0,(2240...2288)],[0,(2288...2336)],[0,(2336...2384)],[0,(2384...2432)],
  12.     [0,(2432...2480)],[0,(2480...2528)],[0,(2528...2576)],[0,(2576...2624)],
  13.     [0,(2624...2672)],[0,(2672...2720)],[0,(2720...2768)],[0,(2768...2816)]
  14.   ]
  15.  
  16.   # A2
  17.  
  18.   A2_1 = [
  19.     [0,(2816...2864)],[1,(2864...2912)],[1,(2912...2960)],[0,(2960...3008)],
  20.     [1,(3008...3056)],[1,(3056...3104)],[0,(3104...3152)],[0,(3152...3200)]
  21.   ]
  22.   A2_2 = [
  23.     [0,(3200...3248)],[1,(3248...3296)],[1,(3296...3344)],[0,(3344...3392)],
  24.     [1,(3392...3440)],[1,(3440...3488)],[0,(3488...3536)],[0,(3536...3584)]
  25.   ]
  26.   A2_3 = [
  27.     [0,(3584...3632)],[1,(3632...3680)],[1,(3680...3728)],[0,(3728...3776)],
  28.     [1,(3776...3824)],[1,(3824...3872)],[0,(3872...3920)],[0,(3920...3968)]
  29.   ]
  30.   A2_4 = [
  31.     [0,(3968...4016)],[1,(4016...4064)],[1,(4064...4112)],[0,(4112...4160)],
  32.     [1,(4160...4208)],[1,(4208...4256)],[0,(4256...4304)],[0,(4304...4352)]
  33.   ]
  34.  
  35.   A2 = A2_1 + A2_2 + A2_3 + A2_4
  36.  
  37.   # A3
  38.  
  39.   A3 = []
  40.   for i in 0...32
  41.     n = 4352 + (48*i)
  42.     n2 = n+48
  43.     A3 << [0,n...n2]
  44.   end
  45.  
  46.   # A4
  47.  
  48.   A4 = []
  49.   for i in 0...48
  50.     n = 5888 + (48*i)
  51.     n2 = n+48
  52.     A4 << [0,n...n2]
  53.   end
  54.  
  55.   # A5
  56.  
  57.   A5 = []
  58.   for i in 1536...1664
  59.     A5 << [0,i...i+1]
  60.   end
  61.  
  62.   # B
  63.  
  64.   B = []
  65.   for i in 0...256
  66.     B << [2,i...i+1]
  67.   end
  68.  
  69.   # C
  70.  
  71.   C = []
  72.   for i in 256...512
  73.     C << [2,i...i+1]
  74.   end
  75.  
  76.   # D
  77.  
  78.   D = []
  79.   for i in 512...768
  80.     D << [2,i...i+1]
  81.   end
  82.  
  83.   # E
  84.  
  85.   E = []
  86.   for i in 768...1024
  87.     E << [2,i...i+1]
  88.   end
  89.  
  90.  
  91.   # // IceDragon Bit
  92.   A = A1 + A2 + A3 + A4 + A5
  93.  
  94.   AA= A.build_from { |e| e[1] }
  95.  
  96. end
  97.  
  98. # // IceDragon
  99. module ISS ; end
  100. module ISS::TilemapSettings
  101.  
  102.   Vector2 = Struct.new(:p1, :p2)
  103.  
  104.   TILESIZE          = Vector2.new(32, 32)
  105.   SEGMENT_SIZE      = Vector2.new(16, 16)
  106.   AUTOTILE_SIZE1    = Vector2.new(64, 96)
  107.   AUTOTILE_SIZE2    = Vector2.new(64, 64)
  108.   # // 64x96
  109.   AUTOTILE_SEGMENTS = []
  110.  
  111.   AUTOTILE_SEGMENTS[0]  = [19, 18, 15, 14]
  112.   AUTOTILE_SEGMENTS[1]  = [ 3, 18, 15, 14]
  113.   AUTOTILE_SEGMENTS[2]  = [19,  4, 15, 14]
  114.   AUTOTILE_SEGMENTS[3]  = [ 3,  4, 15, 14]
  115.   AUTOTILE_SEGMENTS[4]  = [19, 18, 15,  8]
  116.   AUTOTILE_SEGMENTS[5]  = [ 3, 18, 15,  8]
  117.   AUTOTILE_SEGMENTS[6]  = [19,  4, 15,  8]
  118.   AUTOTILE_SEGMENTS[7]  = [ 3,  4, 15,  8]
  119.   AUTOTILE_SEGMENTS[8]  = [19, 18,  7, 14]
  120.   AUTOTILE_SEGMENTS[9]  = [ 3, 18,  7, 14]
  121.   AUTOTILE_SEGMENTS[10] = [19,  4,  7, 14]
  122.   AUTOTILE_SEGMENTS[11] = [ 3,  4,  7, 14]
  123.   AUTOTILE_SEGMENTS[12] = [19, 18,  7,  8]
  124.   AUTOTILE_SEGMENTS[13] = [ 3, 18,  7,  8]
  125.   AUTOTILE_SEGMENTS[14] = [19,  4,  7,  8]
  126.   AUTOTILE_SEGMENTS[15] = [ 3,  4,  7,  8]
  127.   AUTOTILE_SEGMENTS[16] = [17, 18, 13, 14]
  128.   AUTOTILE_SEGMENTS[17] = [17,  4, 13, 14]
  129.   AUTOTILE_SEGMENTS[18] = [17, 18, 13,  8]
  130.   AUTOTILE_SEGMENTS[19] = [17,  4, 13,  8]
  131.   AUTOTILE_SEGMENTS[20] = [11, 10, 15, 14]
  132.   AUTOTILE_SEGMENTS[21] = [11, 10, 15,  8]
  133.   AUTOTILE_SEGMENTS[22] = [11, 10,  7, 14]
  134.   AUTOTILE_SEGMENTS[23] = [11, 10,  7,  8]
  135.   AUTOTILE_SEGMENTS[24] = [19, 20, 15, 16]
  136.   AUTOTILE_SEGMENTS[25] = [19, 20,  7, 16]
  137.   AUTOTILE_SEGMENTS[26] = [ 3, 20, 15, 16]
  138.   AUTOTILE_SEGMENTS[27] = [ 3, 20,  7, 16]
  139.   AUTOTILE_SEGMENTS[28] = [19, 18, 23, 22]
  140.   AUTOTILE_SEGMENTS[29] = [ 3, 18, 23, 22]
  141.   AUTOTILE_SEGMENTS[30] = [19,  4, 23, 22]
  142.   AUTOTILE_SEGMENTS[31] = [ 3,  4, 23, 22]
  143.   AUTOTILE_SEGMENTS[32] = [17, 20, 13, 16]
  144.   AUTOTILE_SEGMENTS[33] = [11, 10, 23, 22]
  145.   AUTOTILE_SEGMENTS[34] = [ 9, 10, 13, 14]
  146.   AUTOTILE_SEGMENTS[35] = [ 9, 10, 13,  8]
  147.   AUTOTILE_SEGMENTS[36] = [11, 12, 15, 16]
  148.   AUTOTILE_SEGMENTS[37] = [11, 12,  7, 16]
  149.   AUTOTILE_SEGMENTS[38] = [19, 20, 23, 24]
  150.   AUTOTILE_SEGMENTS[39] = [ 3, 20, 23, 24]
  151.   AUTOTILE_SEGMENTS[40] = [17, 18, 21, 22]
  152.   AUTOTILE_SEGMENTS[41] = [17,  4, 21, 22]
  153.   AUTOTILE_SEGMENTS[42] = [ 9, 12, 13, 16]
  154.   AUTOTILE_SEGMENTS[43] = [ 9, 10, 21, 22]
  155.   AUTOTILE_SEGMENTS[44] = [17, 20, 21, 24]
  156.   AUTOTILE_SEGMENTS[45] = [11, 12, 23, 24]
  157.   AUTOTILE_SEGMENTS[46] = [ 9, 12, 21, 24]
  158.   # // Preview Segment
  159.   AUTOTILE_SEGMENTS[47] = [ 1,  2,  5,  6]
  160.  
  161.   # // 64x64
  162.   AUTOTILE_SEGMENTS2 = []
  163.  
  164.   AUTOTILE_SEGMENTS2[0]  = [11, 10,  7,  6]
  165.   AUTOTILE_SEGMENTS2[1]  = [ 9, 10,  5,  6]
  166.   AUTOTILE_SEGMENTS2[2]  = [ 3,  2,  7,  6]
  167.   AUTOTILE_SEGMENTS2[3]  = [ 1,  2,  5,  6]
  168.   AUTOTILE_SEGMENTS2[4]  = [11, 12,  7,  8]
  169.   AUTOTILE_SEGMENTS2[5]  = [ 9, 12,  5,  8]
  170.   AUTOTILE_SEGMENTS2[6]  = [ 3,  4,  7,  8]
  171.   AUTOTILE_SEGMENTS2[7]  = [ 1,  4,  5,  8]
  172.   AUTOTILE_SEGMENTS2[8]  = [11, 10, 15, 14]
  173.   AUTOTILE_SEGMENTS2[9]  = [ 9, 10, 13, 14]
  174.   AUTOTILE_SEGMENTS2[10] = [ 3,  2, 15, 14]
  175.   AUTOTILE_SEGMENTS2[11] = [ 1,  2, 13, 14]
  176.   AUTOTILE_SEGMENTS2[12] = [11, 12, 15, 16]
  177.   AUTOTILE_SEGMENTS2[13] = [ 9, 12, 13, 16]
  178.   AUTOTILE_SEGMENTS2[14] = [ 3,  4, 15, 16]
  179.   AUTOTILE_SEGMENTS2[15] = [ 1,  4, 13, 16]
  180.   AUTOTILE_SEGMENTS2[16] = [ 1,  1,  1,  1]
  181.   AUTOTILE_SEGMENTS2[17] = [ 1,  1,  1,  1]
  182.   AUTOTILE_SEGMENTS2[18] = [ 1,  1,  1,  1]
  183.   AUTOTILE_SEGMENTS2[19] = [ 1,  1,  1,  1]
  184.   AUTOTILE_SEGMENTS2[20] = [ 1,  1,  1,  1]
  185.   AUTOTILE_SEGMENTS2[21] = [ 1,  1,  1,  1]
  186.   AUTOTILE_SEGMENTS2[22] = [ 1,  1,  1,  1]
  187.   AUTOTILE_SEGMENTS2[23] = [ 1,  1,  1,  1]
  188.   AUTOTILE_SEGMENTS2[24] = [ 1,  1,  1,  1]
  189.   AUTOTILE_SEGMENTS2[25] = [ 1,  1,  1,  1]
  190.   AUTOTILE_SEGMENTS2[26] = [ 1,  1,  1,  1]
  191.   AUTOTILE_SEGMENTS2[27] = [ 1,  1,  1,  1]
  192.   AUTOTILE_SEGMENTS2[28] = [ 1,  1,  1,  1]
  193.   AUTOTILE_SEGMENTS2[29] = [ 1,  1,  1,  1]
  194.   AUTOTILE_SEGMENTS2[30] = [ 1,  1,  1,  1]
  195.   AUTOTILE_SEGMENTS2[31] = [ 1,  1,  1,  1]
  196.   AUTOTILE_SEGMENTS2[32] = [ 1,  1,  1,  1]
  197.   AUTOTILE_SEGMENTS2[33] = [ 1,  1,  1,  1]
  198.   AUTOTILE_SEGMENTS2[34] = [ 1,  1,  1,  1]
  199.   AUTOTILE_SEGMENTS2[35] = [ 1,  1,  1,  1]
  200.   AUTOTILE_SEGMENTS2[36] = [ 1,  1,  1,  1]
  201.   AUTOTILE_SEGMENTS2[37] = [ 1,  1,  1,  1]
  202.   AUTOTILE_SEGMENTS2[38] = [ 1,  1,  1,  1]
  203.   AUTOTILE_SEGMENTS2[39] = [ 1,  1,  1,  1]
  204.   AUTOTILE_SEGMENTS2[40] = [ 1,  1,  1,  1]
  205.   AUTOTILE_SEGMENTS2[41] = [ 1,  1,  1,  1]
  206.   AUTOTILE_SEGMENTS2[42] = [ 1,  1,  1,  1]
  207.   AUTOTILE_SEGMENTS2[43] = [ 1,  1,  1,  1]
  208.   AUTOTILE_SEGMENTS2[44] = [ 1,  1,  1,  1]
  209.   AUTOTILE_SEGMENTS2[45] = [ 1,  1,  1,  1]
  210.   AUTOTILE_SEGMENTS2[46] = [ 1,  1,  1,  1]
  211.  
  212.   AUTOTILE_SEGMENTS2[47] = [ 1,  1,  1,  1]
  213.  
  214.   # // Fix Offset
  215.   for i in 0...AUTOTILE_SEGMENTS.size
  216.     for i2 in 0...4
  217.       AUTOTILE_SEGMENTS[i][i2] -= 1
  218.     end
  219.   end  
  220.  
  221.   for i in 0...AUTOTILE_SEGMENTS2.size
  222.     for i2 in 0...4
  223.       AUTOTILE_SEGMENTS2[i][i2] -= 1
  224.     end
  225.   end
  226.  
  227.   PARENT_TILE = []
  228.  
  229.   # // Setup Parent Tiles for B to E
  230.   for i in 0...1024 #(TilesetRanges::B+TilesetRanges::C+TilesetRanges::D+TilesetRanges::E)
  231.     PARENT_TILE[i] = i
  232.   end
  233.  
  234.   # // Setup Parent Tiles for A1 to A5
  235.   for a1_set in TilesetRanges::AA
  236.     pa = a1_set.to_a[0]
  237.     for i in a1_set
  238.       PARENT_TILE[i] = pa
  239.     end
  240.   end
  241.  
  242.   # // Redo A5
  243.   TilesetRanges::A5.each { |a5_set| a5_set.each { |e| PARENT_TILE[e] = e } }
  244.  
  245.   # // Setup Autotile Indexes
  246.   AUTOTILE_INDEX = []
  247.  
  248.   16.times { |i|
  249.     AUTOTILE_INDEX[2048+(48*i)] = [0, i] # A1 [tileset_id, tileset_index]
  250.   }
  251.  
  252.   32.times { |i|
  253.     AUTOTILE_INDEX[2816+(48*i)] = [1, i] # A2 [tileset_id, tileset_index]
  254.     AUTOTILE_INDEX[4352+(48*i)] = [2, i] # A3 [tileset_id, tileset_index]
  255.   }  
  256.  
  257.   48.times { |i|
  258.     AUTOTILE_INDEX[5888+(48*i)] = [3, i] # A4 [tileset_id, tileset_index]
  259.   }  
  260.  
  261.   A4_TILE_POSITIONS = Array.new(56)
  262.   at1w, at1h = AUTOTILE_SIZE1.p1, AUTOTILE_SIZE1.p2
  263.   at2w, at2h = AUTOTILE_SIZE2.p1, AUTOTILE_SIZE2.p2  
  264.  
  265.   8.times { |i|
  266.   # // Roofs
  267.     A4_TILE_POSITIONS[i]    = Vector2.new(i*at1w, 0)
  268.     A4_TILE_POSITIONS[i+16] = Vector2.new(i*at1w, at1h+at2h)
  269.     A4_TILE_POSITIONS[i+32] = Vector2.new(i*at1w, (at1h*2)+(at2h*2))
  270.   # // Walls
  271.     A4_TILE_POSITIONS[i+8]  = Vector2.new(i*at1h, at1h)
  272.     A4_TILE_POSITIONS[i+24] = Vector2.new(i*at1h, (at1h*2)+at2h)
  273.     A4_TILE_POSITIONS[i+40] = Vector2.new(i*at1h, (at1h*3)+(at2h*2))
  274.   }
  275.  
  276.   module_function()
  277.  
  278.   def get_segment_set(tile_id)
  279.     case tileset_family(tile_id)
  280.     when :a3
  281.       return AUTOTILE_SEGMENTS2[tile_id-PARENT_TILE[tile_id]]
  282.     when :a4
  283.       tileset, index = *AUTOTILE_INDEX[PARENT_TILE[tile_id]]
  284.       roof = (index / 8) % 2 == 0
  285.       return AUTOTILE_SEGMENTS[tile_id-PARENT_TILE[tile_id]] if roof
  286.       return AUTOTILE_SEGMENTS2[tile_id-PARENT_TILE[tile_id]]
  287.     else  
  288.       return AUTOTILE_SEGMENTS[tile_id-PARENT_TILE[tile_id]]
  289.     end  
  290.   end
  291.  
  292.   def get_autotile_bit( xo, yo, bitmap, tile_bit )
  293.     bitm = Bitmap.new(SEGMENT_SIZE.p1, SEGMENT_SIZE.p2)
  294.     rect = Rect.new(
  295.      SEGMENT_SIZE.p1*(tile_bit%4)+xo, SEGMENT_SIZE.p2*(tile_bit/4)+yo, # // x, y
  296.      SEGMENT_SIZE.p1, SEGMENT_SIZE.p2) # // width, height
  297.     bitm.blt(0, 0, bitmap, rect)
  298.     return bitm
  299.   end
  300.  
  301.   def tileset_family(tile_id)
  302.     case tile_id
  303.     when 0...1024            ; return :be
  304.     when 2048...2816         ; return :a1
  305.     when 2816...4352         ; return :a2
  306.     when 4352...5888         ; return :a3
  307.     when 5888...8192         ; return :a4
  308.     when 1536...1664         ; return :a5
  309.     end  
  310.   end
  311.  
  312.   def anim_autotile?( tile_id, type )
  313.     case type
  314.     when 0 # // Normal
  315.       case tile_id
  316.       when 2048...2096, 2144...2192, 2240...2288, 2336...2384, 2432...2480,
  317.        2528...2576, 2624...2672, 2720...2768
  318.         return true
  319.       end  
  320.     when 1 # // Waterfall
  321.       case tile_id
  322.       when 2288...2336, 2384...2432, 2480...2528, 2576...2624,
  323.        2672...2720, 2768...2816
  324.         return true
  325.       end  
  326.     end
  327.     return false
  328.   end
  329.  
  330.   def get_autotile( bitmaps, tile_id )
  331.     tileset, index = *AUTOTILE_INDEX[PARENT_TILE[tile_id]]
  332.     bmp  = bitmaps[tileset]
  333.     segs = get_segment_set(tile_id)
  334.     bitm = Bitmap.new(TILESIZE.p1, TILESIZE.p2)
  335.     tf = tileset_family(tile_id)
  336.     ats  = case tf
  337.            when :be, :a1, :a2    ; [AUTOTILE_SIZE1]
  338.            when :a3              ; [AUTOTILE_SIZE2]  
  339.            when :a4              ; [] # // Unused
  340.            end  
  341.     for i in 0...segs.size
  342.       seg = segs[i]
  343.       case tf
  344.       when :a4
  345.         as  = A4_TILE_POSITIONS[index]
  346.         ab  = get_autotile_bit( as.p1, as.p2, bmp, seg )
  347.       else  
  348.         x, y = (index%8), (index/8)
  349.         as   = ats[y % ats.size]
  350.         ab  = get_autotile_bit( as.p1*x, as.p2*y, bmp, seg )
  351.       end  
  352.       bitm.blt(SEGMENT_SIZE.p1*(i%2), SEGMENT_SIZE.p2*(i/2), ab, ab.rect)
  353.       ab.dispose()
  354.     end  
  355.     return bitm
  356.   end
  357.  
  358.   def get_normaltile( bitmap, index )
  359.     bitm = Bitmap.new(TILESIZE.p1, TILESIZE.p2)
  360.     sx = (index / 128 % 2 * 8 + index % 8) * TILESIZE.p1;
  361.     sy = index % 256 / 8 % 16 * TILESIZE.p2;
  362.     rect = Rect.new(sx, sy, TILESIZE.p1, TILESIZE.p2)
  363.     bitm.blt(0, 0, bitmap, rect)
  364.     return bitm
  365.   end
  366.  
  367.   def get_a5tile( bitmap, index )
  368.     index = index-1536
  369.     bitm = Bitmap.new(TILESIZE.p1, TILESIZE.p2)
  370.     sx = TILESIZE.p1 * (index%8)
  371.     sy = TILESIZE.p2 * (index/8)
  372.     rect = Rect.new(sx, sy, TILESIZE.p1, TILESIZE.p2)
  373.     bitm.blt(0, 0, bitmap, rect)
  374.     return bitm
  375.   end
  376.  
  377.   def tileset_bitmap(bitmaps, tile_id)
  378.     set_number = tile_id / 256
  379.     return bitmaps[5] if set_number == 0
  380.     return bitmaps[6] if set_number == 1
  381.     return bitmaps[7] if set_number == 2
  382.     return bitmaps[8] if set_number == 3
  383.     return nil
  384.   end
  385.  
  386.   def get_tile_bit(bitmaps, tile_id)
  387.     #File.open("output.log", "a") { |f| f.puts("#{tile_id}") }
  388.     case tile_id
  389.     # // B..E
  390.     when 0...1024
  391.       return get_normaltile(tileset_bitmap(bitmaps, tile_id), tile_id)
  392.     when 1536...1664
  393.       return get_a5tile(bitmaps[4], tile_id)
  394.     when 2048...8192
  395.       return get_autotile(bitmaps, tile_id)
  396.     else
  397.       return Bitmap.new(32, 32)
  398.     end  
  399.     return nil
  400.   end
  401.  
  402.   def get_waterfalltile_bit( bitmaps, tile_id, frame )
  403.     return Bitmap.new(32, 32)
  404.   end
  405.  
  406. end
  407.  
  408. class ISS::Tilemap
  409.  
  410.   TILESIZE = 32
  411.  
  412.   class BitmapArray < Array
  413.    
  414.     def initialize
  415.       super(8)
  416.     end
  417.    
  418.   end
  419.  
  420.   attr_accessor :bitmaps
  421.   attr_accessor :z
  422.  
  423.   attr_reader   :viewport
  424.   attr_reader   :map_data
  425.   attr_reader   :ox, :oy
  426.   attr_reader   :passages
  427.  
  428.   def initialize( viewport=nil )
  429.     @disposed  = false
  430.     @viewport  = viewport
  431.     @bitmaps   = BitmapArray.new()
  432.     @last_data = Table.new(1, 1, 1)
  433.     @map_data  = Table.new(1, 1, 1)
  434.     @passages  = Table.new(1, 1, 1)
  435.     @layers    = []
  436.     @layers[0] = ::Plane.new(@viewport)
  437.     @layers[1] = ::Plane.new(@viewport)
  438.     @layers[2] = ::Plane.new(@viewport)
  439.     @layers[3] = ::Plane.new(@viewport) # // 200
  440.     @layer_bitmaps = []
  441.     9.times { |i|
  442.       @layer_bitmaps[i] = ::Bitmap.new(24, 24)
  443.     }
  444.     @full_redraw = true
  445.     @autotile_change = true
  446.     @at_phase = 0
  447.     @started = true
  448.     @ox, @oy = 0, 0
  449.     @z = 0
  450.     @rate = 30
  451.   end
  452.  
  453.   def ox=(new_ox)
  454.     @ox = new_ox
  455.     @layers.each { |l| l.ox = @ox }
  456.   end
  457.  
  458.   def oy=(new_oy)
  459.     @oy = new_oy
  460.     @layers.each { |l| l.oy = @oy }
  461.   end
  462.  
  463.   def viewport=(new_viewport)
  464.     @viewport = new_viewport
  465.     @layers.each { |l| l.viewport = @viewport }
  466.   end
  467.  
  468.   def map_data=(new_data)
  469.     data = @map_data
  470.     @map_data = new_data
  471.     @last_data.resize(@map_data.xsize, @map_data.ysize, @map_data.zsize)
  472.     if new_data != data
  473.       @layer_bitmaps.each { |b| b.dispose unless b.disposed?() unless b.nil?() }
  474.       @layer_bitmaps.clear()
  475.       9.times { |i|
  476.         @layer_bitmaps[i] = Bitmap.new(@map_data.xsize*TILESIZE, @map_data.ysize*TILESIZE)
  477.       }
  478.       @layers[0].bitmap = @layer_bitmaps[0+@at_phase]
  479.       @layers[1].bitmap = @layer_bitmaps[3+@at_phase]
  480.       @layers[2].bitmap = @layer_bitmaps[6+@at_phase]
  481.       redraw_map() #
  482.       @full_redraw = false
  483.     end
  484.   end
  485.  
  486.   def passages=(new_passages)
  487.     @passages = new_passages
  488.     @full_redraw = true
  489.   end
  490.  
  491.   def dispose()
  492.     @layers.each { |l| l.dispose }
  493.     @layers.clear()
  494.     @bitmaps = nil
  495.     @disposed = true
  496.   end
  497.  
  498.   def draw_tile( x, y, z, tile_id )
  499.     for i in 0...3
  500.       case z
  501.       when 0
  502.         bit  = @layer_bitmaps[i]
  503.       when 1
  504.         bit  = @layer_bitmaps[3+i]
  505.       when 2  
  506.         bit  = @layer_bitmaps[6+i]
  507.       end  
  508.       if ::ISS::TilemapSettings.anim_autotile?(tile_id, 0)
  509.         tbit = ::ISS::TilemapSettings.get_tile_bit(@bitmaps, tile_id+(i*48))
  510.       elsif ::ISS::TilemapSettings.anim_autotile?(tile_id, 1)  
  511.         tbit = ::ISS::TilemapSettings.get_waterfalltile_bit(@bitmaps, tile_id, i)
  512.       else  
  513.         tbit = ::ISS::TilemapSettings.get_tile_bit(@bitmaps, tile_id)
  514.       end  
  515.       rect = Rect.new( x*TILESIZE, y*TILESIZE, TILESIZE, TILESIZE )
  516.       bit.clear_rect( rect )
  517.       bit.blt( rect.x, rect.y, tbit, tbit.rect ) #unless tbit.nil?()
  518.       tbit.dispose()
  519.     end  
  520.   end
  521.  
  522.   def update_layers()
  523.     @layers.each { |l| l.ox, l.oy, l.z = @ox, @oy, @z }
  524.     @autotile_change = Graphics.frame_count % @rate == 0
  525.     if @autotile_change || @started
  526.       @at_phase = (@at_phase + 1) % 3
  527.       @layers[0].bitmap = @layer_bitmaps[0+@at_phase]
  528.       @layers[1].bitmap = @layer_bitmaps[3+@at_phase]
  529.       @layers[2].bitmap = @layer_bitmaps[6+@at_phase]
  530.     end
  531.     @started = false
  532.   end
  533.  
  534.   def redraw_map()
  535.     for y in 0...@map_data.ysize
  536.       for x in 0...@map_data.xsize
  537.         for z in 0...@map_data.zsize
  538.           tile  = @map_data[x, y, z]
  539.           otile = @last_data[x, y, z]
  540.           if tile != otile
  541.             draw_tile(x, y, z, tile)
  542.             @last_data[x, y, z] = tile
  543.           end  
  544.         end
  545.       end
  546.     end
  547.     @full_redraw = false
  548.   end
  549.  
  550.   def update()
  551.     update_layers()
  552.     redraw_map() if @full_redraw
  553.   end
  554.  
  555. end  
  556.  
  557. #=begin
  558. map = load_data("Data/Map016.rvdata")
  559. tilemap = Tilemap.new(Viewport.new(0, 0, 640, 480)) #Tilemap.new #ISS::Tilemap.new
  560. tilemap.bitmaps[0] = Cache.system("TileA1")
  561. tilemap.bitmaps[1] = Cache.system("TileA2")
  562. tilemap.bitmaps[2] = Cache.system("TileA3")
  563. tilemap.bitmaps[3] = Cache.system("TileA4")
  564. tilemap.bitmaps[4] = Cache.system("TileA5")
  565. tilemap.bitmaps[5] = Cache.system("TileB")
  566. tilemap.bitmaps[6] = Cache.system("TileC")
  567. tilemap.bitmaps[7] = Cache.system("TileD")
  568. tilemap.bitmaps[8] = Cache.system("TileE")
  569. tilemap.map_data = map.data
  570. tilemap.passages = Table.new(map.data.xsize, map.data.ysize, map.data.zsize)
  571. tilemap.update()
  572. #tilemap.viewport =
  573.  
  574.  
  575. for i in 0...48
  576.   map.data[(i%10)*2, (i/10)*2, 1] = (2864-48)+i
  577. end  
  578.  
  579. loop do
  580.   #map.data[0, 0, 0] = (map.data[0, 0, 0] + 1) % 9000 if Graphics.frame_count % 5 == 0
  581.   Graphics.update
  582.   #tilemap.ox += 1
  583.   #tilemap.oy += 1
  584.   tilemap.update
  585. end  
  586. #=end
  587.  
  588.  
Advertisement
Add Comment
Please, Sign In to add comment