-
Notifications
You must be signed in to change notification settings - Fork 1
/
tile_output.rb
80 lines (67 loc) · 2.04 KB
/
tile_output.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
require 'json'
class Tile
attr_reader :name, :symmetry, :edges, :weight
def initialize(name:, symmetry:, edges:, weight: 1)
@name = name
@symmetry = symmetry
@edges = edges
@weight = weight
end
def left_tile_edges_with_names
edges.rotate(1).zip(['', ' 1', ' 2', ' 3']).map {|edge, suffix| [edge, @name + suffix ]}
end
def right_tile_edges_with_names
edges.rotate(3).zip(['', ' 1', ' 2', ' 3']).map {|edge, suffix| [edge, @name + suffix ]}
end
def left_tile_edges_to_check(&block)
edges_to_check(left_tile_edges_with_names, &block)
end
def right_tile_edges_to_check(&block)
edges_to_check(right_tile_edges_with_names, &block)
end
def edges_to_check(edges, &block)
if @symmetry == 'T'
edges.values_at(0, 1, 3).each(&block)
elsif @symmetry == 'L'
edges.values_at(0, 1).each(&block)
elsif @symmetry == 'I'
edges.values_at(0, 1).each(&block)
elsif @symmetry == 'X'
edges.values_at(0).each(&block)
else
raise 'unknown symmetry'
end
end
end
json_config = File.read('tiles.json')
config = JSON.parse(json_config)
TILES = config['tiles'].map do |tile_config|
Tile.new(
name: tile_config['name'],
symmetry: tile_config['symmetry'],
edges: tile_config['edges'],
weight: tile_config.fetch('weight', 1),
)
end
output = {
path: config['path'],
tilesize: config['tilesize'],
tiles: [],
neighbors: []
}
TILES.each do |tile|
output[:tiles] << { name: tile.name, symmetry: tile.symmetry, weight: tile.weight.to_f }
end
TILES.each.with_index do |left_tile, left_tile_index|
TILES.each.with_index do |right_tile, right_tile_index|
next if left_tile_index > right_tile_index
left_tile.left_tile_edges_to_check.each do |(left_edge, left_edge_name)|
right_tile.right_tile_edges_to_check.each do |(right_edge, right_edge_name)|
if left_edge == right_edge
output[:neighbors] << { left: left_edge_name, right: right_edge_name }
end
end
end
end
end
File.write('static/tiles.json', JSON.pretty_generate(output))