This repository has been archived by the owner on Aug 1, 2021. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathtechtree.rb
executable file
·97 lines (84 loc) · 2.21 KB
/
techtree.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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#! /usr/bin/env ruby
# encoding: utf-8
require 'bundler'
Bundler.setup
Bundler.require
require 'delegate'
require 'yaml'
require 'set'
require 'pry'
%w(item craft database graph optimizer solver addons).each do |mod|
symbol = mod.gsub(/(?:\A|_)(.)/){ |m| $1.upcase }.to_sym
autoload symbol, "./lib/#{mod}.rb"
end
autoload :ItemResolver, './lib/resolvers'
autoload :CraftResolver, './lib/resolvers'
require './lib/errors'
DB = Database.new
def gather_files paths, files
[ paths.map { |pth| Dir.glob("#{pth}/*.yml") },
files
].flatten
end
paths = ['db/**']
files = []
gather_files(paths, files).each do |filename|
puts filename
DB.load_definitions YAML.load_file(filename)
end
DB.fixup_pending
DB.detect_name_clashes
DB.fill_reverse
DB.classify_tiers if ARGV.include? '--tiers'
DB.dump_graph File.open('techtree.dot', 'w')
def build_solutions names
names.map do |name|
if name =~ /(.+?)\*(\d+)/
[$1, $2.to_i]
else
[name, 1]
end
end
end
def solve *names
if names.last.is_a? Hash
options = names.pop
else
options = {}
end
if names.last.is_a? Database
db = names.pop
else
db = DB
end
puts "Using #{db} (#{db.size})"
item_resolver = make_item_resolver(options)
solutions = build_solutions(names).map { |name, count| item_resolver.new(db.find(name), count).resolve }
result = Solver.new(solutions, options).solve
if result.valid
result.describe
else
false
end
end
def make_item_resolver options
item_resolver_options = options.select { |key, val| Addons.item_resolver_modules.include? key.to_s }
craft_resolver_options = options.select { |key, val| Addons.craft_resolver_modules.include? key.to_s }
mir, mcr = nil
mir = Class.new(ItemResolver) do
@@craft_constructor = Proc.new { |*args| mcr.new(*args) }
end
while item_resolver_options.size > 0
mir = Addons.build_resolver :item_resolver, mir, item_resolver_options
end
mcr = Class.new(CraftResolver) do
@@item_constructor = Proc.new { |*args| mir.new(*args) }
end
while craft_resolver_options.size > 0
mcr = Addons.build_resolver :craft_resolver, mcr, craft_resolver_options
end
mir
end
# solve 'molten redstone*1000'
vdb = DB.filter_clusters 'vanilla'
binding.pry