IceDragon200

Randomization

Sep 11th, 2011
196
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 2.74 KB | None | 0 0
  1.     def self.randomize_table( table, width, height )
  2.       newtable = table.deep_clone
  3.       tier1classes = [ 1,  6, 11]  
  4.       tier2classes = [ 2,  7, 10, 12, 14]
  5.       tier3classes = [ 3,  4,  5,  8,  9, 13, 15]
  6.       tier1_dist1  = 2 # // Tier 1 distance from another tier 1
  7.       tier2_dist1  = 3 # // Tier 2 distance from another tier 1
  8.       tier2_dist2  = 4 # // Tier 2 distance from another tier 2
  9.       tier3_dist1  = 6 # // Tier 3 distance from another tier 1
  10.       tier3_dist2  = 5 # // Tier 3 distance from another tier 2
  11.       tier3_dist3  = 6 # // Tier 3 distance from another tier 3
  12.       tier1_positions = []
  13.       tier2_positions = []
  14.       tier3_positions = []
  15.      
  16.       rngblock = proc { |x, y, dist|
  17.         rng = create_block_range( x, y, dist ) - create_block_range( x, y, dist-1 )
  18.         rng = rng.inject([]) { |r, a| r << a if a[0] >= 0 && a[1] >= 0 ; r }
  19.         rng }
  20.        
  21.       mrngblock = proc { |rs, rng, dist|
  22.         result = rng.deep_clone
  23.         rs.each { |rss|
  24.           result -= create_block_range( rss[0], rss[1], dist )
  25.           result -= [rss[0], rss[1]] }
  26.         result
  27.       }
  28.      
  29.       rngfinal = proc { |*rules|
  30.         rrange = []
  31.         rules.each { |rl|
  32.           rrange += rl[0].inject([]) { |r, a|
  33.             r | rngblock.call( a[0], a[1], rl[1] ) }
  34.         }
  35.         rules.each { |rl| rrange = mrngblock.call( rl[0], rrange, rl[1] ) }
  36.         rrange
  37.       }
  38.      
  39.       # // Tier 1
  40.       x, y = rand( width ), rand( height )
  41.       tier1_positions << [x, y]
  42.       i = tier1classes.shift
  43.       newtable[xy_from_index( x, y, width )][1] = [ClassBlock, i]
  44.       while !tier1classes.empty?()
  45.         range = rngfinal( [tier1_positions, tier1_dist1] )
  46.        
  47.         r = range.randomize()[0]
  48.         tier1_positions << [r[0], r[1]]
  49.         newtable[xy_from_index( r[0], r[1], width )][1] = [ClassBlock, tier1classes.shift]
  50.       end
  51.       # // Tier 2
  52.       while !tier2classes.empty?()
  53.         range = rngfinal( [tier1_positions, tier2_dist1],
  54.                           [tier2_positions, tier2_dist2]
  55.                         )
  56.        
  57.         r = range.randomize()[0]
  58.         tier2_positions << [r[0], r[1]]
  59.         newtable[xy_from_index( r[0], r[1], width )][1] = [ClassBlock, tier2classes.shift]
  60.       end  
  61.       # // Tier 3
  62.       while !tier3classes.empty?()
  63.         range = rngfinal( [tier1_positions, tier3_dist1],
  64.                           [tier2_positions, tier3_dist2],
  65.                           [tier3_positions, tier3_dist3]
  66.                         )
  67.        
  68.         r = range.randomize()[0]
  69.         tier3_positions << [r[0], r[1]]
  70.         newtable[xy_from_index( r[0], r[1], width )][1] = [ClassBlock, tier3classes.shift]
  71.       end
  72.     end
Advertisement
Add Comment
Please, Sign In to add comment