Class: Cryptopunks::Generator
- Inherits:
-
Object
- Object
- Cryptopunks::Generator
- Defined in:
- lib/cryptopunks/generator.rb
Instance Method Summary collapse
- #build_attributes_by_name(recs) ⇒ Object
-
#build_recs(recs) ⇒ Object
build and normalize (meta data) records.
-
#find(q, gender: nil) ⇒ Object
gender (m/f) required for attributes!!!.
-
#find_meta(q, gender: nil) ⇒ Object
gender (m/f) required for attributes!!!.
- #generate_image(*values, background: nil) ⇒ Object (also: #generate)
-
#initialize(image_path = "./spritesheet.png", meta_path = "./spritesheet.csv") ⇒ Generator
constructor
A new instance of Generator.
- #normalize_gender(str) ⇒ Object
-
#normalize_key(str) ⇒ Object
static helpers - (turn into “true” static self.class methods - why? why not?).
- #spritesheet ⇒ Object (also: #sheet)
- #to_recs(*values) ⇒ Object
Constructor Details
#initialize(image_path = "./spritesheet.png", meta_path = "./spritesheet.csv") ⇒ Generator
Returns a new instance of Generator.
103 104 105 106 107 108 109 110 111 112 |
# File 'lib/cryptopunks/generator.rb', line 103 def initialize( image_path="./spritesheet.png", ="./spritesheet.csv" ) @sheet = Pixelart::ImageComposite.read( image_path ) recs = CsvHash.read( ) @recs = build_recs( recs ) ## lookup by "case/space-insensitive" name / key @attributes_by_name = build_attributes_by_name( @recs ) end |
Instance Method Details
#build_attributes_by_name(recs) ⇒ Object
48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
# File 'lib/cryptopunks/generator.rb', line 48 def build_attributes_by_name( recs ) h = {} recs.each_with_index do |rec| key = normalize_key( rec.name ) key << "_(#{rec.gender})" if rec.attribute? if h[ key ] puts "!!! ERROR - attribute name is not unique:" pp rec puts "duplicate:" pp h[key] exit 1 end h[ key ] = rec end ## pp h h end |
#build_recs(recs) ⇒ Object
build and normalize (meta data) records
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 98 |
# File 'lib/cryptopunks/generator.rb', line 68 def build_recs( recs ) ## build and normalize (meta data) records ## sort by id recs = recs.sort do |l,r| l['id'].to_i( 10 ) <=> r['id'].to_i( 10 ) # use base10 (decimal) end ## assert all recs are in order by id (0 to size) recs.each_with_index do |rec, exp_id| id = rec['id'].to_i(10) if id != exp_id puts "!! ERROR - meta data record ids out-of-order - expected id #{exp_id}; got #{id}" exit 1 end end ## convert to "wrapped / immutable" kind-of struct recs = recs.map do |rec| id = rec['id'].to_i( 10 ) name = rec['name'] gender = normalize_gender( rec['gender'] ) type = rec['type'] Metadata::Sprite.new( id: id, name: name, type: type, gender: gender) end recs end |
#find(q, gender: nil) ⇒ Object
gender (m/f) required for attributes!!!
138 139 140 141 142 143 |
# File 'lib/cryptopunks/generator.rb', line 138 def find( q, gender: nil ) ## gender (m/f) required for attributes!!! rec = ( q, gender: gender ) ## return image if record found rec ? @sheet[ rec.id ] : nil end |
#find_meta(q, gender: nil) ⇒ Object
gender (m/f) required for attributes!!!
122 123 124 125 126 127 128 129 130 131 132 133 134 135 |
# File 'lib/cryptopunks/generator.rb', line 122 def ( q, gender: nil ) ## gender (m/f) required for attributes!!! key = normalize_key( q ) ## normalize q(uery) string/symbol key << "_(#{normalize_gender( gender )})" if gender rec = @attributes_by_name[ key ] if rec puts " lookup >#{key}< => #{rec.id}: #{rec.name} / #{rec.type} (#{rec.gender})" # pp rec else puts "!! WARN - no lookup found for key >#{key}<" end rec end |
#generate_image(*values, background: nil) ⇒ Object Also known as: generate
179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 |
# File 'lib/cryptopunks/generator.rb', line 179 def generate_image( *values, background: nil ) ids = if values[0].is_a?( Integer ) ## assume integer number (indexes) values else ## assume strings (names) to_recs( *values ).map { |rec| rec.id } end punk = Pixelart::Image.new( 24, 24 ) if background ## for now assume background is (simply) color punk.compose!( Pixelart::Image.new( 24, 24, background ) ) end ids.each do |id| punk.compose!( @sheet[ id ] ) end punk end |
#normalize_gender(str) ⇒ Object
40 41 42 43 44 45 |
# File 'lib/cryptopunks/generator.rb', line 40 def normalize_gender( str ) ## e.g. Female => f ## F => f ## always return f or m str.downcase[0] end |
#normalize_key(str) ⇒ Object
static helpers - (turn into “true” static self.class methods - why? why not?)
36 37 38 |
# File 'lib/cryptopunks/generator.rb', line 36 def normalize_key( str ) str.downcase.gsub(/[ ()°_-]/, '').strip end |
#spritesheet ⇒ Object Also known as: sheet
115 |
# File 'lib/cryptopunks/generator.rb', line 115 def spritesheet() @sheet; end |
#to_recs(*values) ⇒ Object
148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 |
# File 'lib/cryptopunks/generator.rb', line 148 def to_recs( *values ) archetype_name = values[0] ### todo/fix: check for nil/not found!!!! archetype = ( archetype_name ) if archetype.nil? puts "!! ERROR - archetype >#{archetype}< not found; sorry" exit 1 end recs = [archetype] attribute_names = values[1..-1] ## note: attribute lookup requires gender from archetype!!!! attribute_gender = archetype.gender attribute_names.each do |attribute_name| attribute = ( attribute_name, gender: attribute_gender ) if attribute.nil? puts "!! ERROR - attribute >#{attribute_name}< for (#{attribute_gender}) not found; sorry" exit 1 end recs << attribute end recs end |